Skip to content

Commit fef446f

Browse files
feat: idb + github sync with atomic open and push to remote. (#78)
* closes #73, closes #74, closes #75.
1 parent 4587cba commit fef446f

16 files changed

Lines changed: 2459 additions & 787 deletions

.github/workflows/playwright.yml

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,25 @@ jobs:
3939
shardIndex: 1
4040
shardTotal: 1
4141
- browser: webkit
42-
jobName: E2E (Playwright, webkit, shard 1/3)
42+
jobName: E2E (Playwright, webkit, shard 1/4)
4343
workers: 1
4444
shardIndex: 1
45-
shardTotal: 3
45+
shardTotal: 4
4646
- browser: webkit
47-
jobName: E2E (Playwright, webkit, shard 2/3)
47+
jobName: E2E (Playwright, webkit, shard 2/4)
4848
workers: 1
4949
shardIndex: 2
50-
shardTotal: 3
50+
shardTotal: 4
5151
- browser: webkit
52-
jobName: E2E (Playwright, webkit, shard 3/3)
52+
jobName: E2E (Playwright, webkit, shard 3/4)
5353
workers: 1
5454
shardIndex: 3
55-
shardTotal: 3
55+
shardTotal: 4
56+
- browser: webkit
57+
jobName: E2E (Playwright, webkit, shard 4/4)
58+
workers: 1
59+
shardIndex: 4
60+
shardTotal: 4
5661

5762
steps:
5863
- name: Checkout

docs/next-steps.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,19 @@ Focused follow-up work for `@knighted/develop`.
2525
- If beneficial, introduce a configurable/hybrid strategy (for example, optimistic default with metadata fallback) without regressing current reliability.
2626
- Suggested implementation prompt:
2727
- "Evaluate and optionally optimize @knighted/develop GitHub file upsert behavior. Compare metadata-first preflight GET+PUT against optimistic PUT with retry-on-missing-sha for existing files. Keep current reliability guarantees and avoid reintroducing noisy false-positive failures. If implementing a hybrid/configurable strategy, keep defaults conservative, update docs, and validate with npm run lint plus targeted Playwright PR drawer flows."
28+
29+
5. **Remove pre-multitab component/styles compatibility paths**
30+
- Delete code paths that preserve or translate legacy single-component/single-styles storage and sync behavior from before the multitab update.
31+
- Remove backward-compatibility shims, fallback field reads, and migration glue tied to old `componentFilePath`/`stylesFilePath`-style assumptions when equivalent tab-derived data exists.
32+
- Favor one canonical tab-first data contract across local storage, IndexedDB workspace records, PR sync metadata, and commit target derivation.
33+
- Accept breaking changes for old locally stored app state to simplify maintenance and reduce branching logic.
34+
- Suggested implementation prompt:
35+
- "Remove backwards-compatibility code in @knighted/develop that supports pre-multitab component/styles storage/sync behavior. Standardize on the current tab-derived schema only, delete legacy field fallbacks and migration helpers, and update tests/docs to match the simplified contract. Validate with npm run lint and targeted Playwright suites for workspace tabs + PR drawer flows."
36+
37+
6. **Promise handling conventions (consistency of intent)**
38+
- Define a project default: use `async`/`await` with `try`/`catch` for most async control flow.
39+
- Keep Promise chains where they better express intent (for example, fire-and-forget paths with explicit `.catch()` to avoid unhandled rejections, or concise pass-through composition).
40+
- Document this as an intent-first rule so mixed syntax is acceptable only when deliberate and easy to reason about.
41+
- Add a lightweight lint/review rule to flag mixed async styles in the same flow unless there is a clear justification.
42+
- Suggested implementation prompt:
43+
- "Define and apply async handling conventions in @knighted/develop with consistency of intent: default to async/await + try/catch, allow Promise chains for explicit fire-and-forget and concise composition, and require explicit .catch on unawaited promises. Update docs and enforce via lint/review guidance without broad no-op refactors. Validate with npm run lint and targeted Playwright runs."
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# PR Drawer vs Workspace Contexts Remaining Backlog
2+
3+
This document now tracks only work not yet implemented from the original separation plan.
4+
5+
## Completed (for context)
6+
7+
1. Workspaces button and dedicated Workspaces drawer exist.
8+
2. PR drawer no longer exposes component/styles filename inputs.
9+
3. Commit targets are derived from workspace tab metadata.
10+
4. Checkbox copy uses entry-tab language.
11+
5. Confirmation summary includes a Files to commit list.
12+
13+
## Remaining Work
14+
15+
### Phase B follow-up
16+
17+
1. Add multi-select removal in Workspaces drawer.
18+
2. Add richer filtering in Workspaces drawer.
19+
3. Decide whether to keep a quick context-switch affordance in PR drawer.
20+
21+
### Phase C enhancements
22+
23+
1. Add open PR binding tools to Workspaces drawer.
24+
2. Add context health indicators in the Workspaces list (dirty, synced, drift).
25+
3. Add optional pin/favorite/recents support.
26+
4. Evaluate optional tab include/exclude toggles for commit targets.
27+
28+
### Confirmation summary UX polish
29+
30+
1. For long file lists, cap visible rows and show a +N more summary.
31+
32+
### Modularization follow-up
33+
34+
Current implementation is primarily `src/modules/workspaces-drawer/drawer.js`.
35+
36+
1. Split module if needed into smaller units:
37+
- `state.js`
38+
- `list-render.js`
39+
- `actions.js`
40+
2. Keep PR transactional logic isolated in PR modules.
41+
42+
## Validation Coverage to Keep
43+
44+
1. PR drawer tests remain focused on transactional workflows.
45+
2. Workspaces drawer tests cover search/select/delete and future multi-select behavior.
46+
3. Migration tests ensure existing stored contexts are retained.
Lines changed: 31 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,136 +1,51 @@
1-
# Render Pipeline + Multi-Tab Spec Plan
1+
# Render Pipeline + Multi-Tab Vital Remaining Spec TODOs
22

3-
This document outlines test coverage to add after the render pipeline rewrite is fully integrated with the multi-tab UX.
3+
This file tracks only high-value gaps that still need coverage.
44

5-
## Why this plan exists
5+
## Already Covered (summary)
66

7-
Current test coverage intentionally removed a subset of specs that were tightly coupled to pre-rewrite assumptions:
7+
1. Entry-tab role behavior, rename stability, and restore behavior.
8+
2. Cross-tab import graph basics, missing-module and circular-import determinism.
9+
3. Core diagnostics/status flows, including pending/error/neutral transitions.
10+
4. Workspace persistence and per-repo context/config isolation baseline.
811

9-
1. Legacy assumptions around default-export hydration behavior in preview module assembly.
10-
2. Styles diagnostics behavior that depended on old compile/lint sequencing.
11-
3. PR drawer path validation timing assumptions tied to previous field sync flow.
12+
## Vital Remaining TODOs
1213

13-
These should return as updated tests once the new pipeline contract is finalized.
14+
## 1. Default Export Support Matrix (High Risk)
1415

15-
## Proposed Test Areas
16+
Add explicit render/typecheck specs for:
1617

17-
## 1. Entry Resolution and Execution Semantics
18+
1. `export default class ...` in React mode.
19+
2. `function App() { ... } export default App` behavior.
20+
3. `const X = ...; export default X` behavior with entry-wrapper rules.
21+
4. Unsupported default-export combinations producing deterministic diagnostics.
1822

19-
Goal: Validate how preview entry is resolved from workspace tabs under the `role: entry` model.
23+
## 2. Style Compile vs Lint Contract (High Risk)
2024

21-
Add specs for:
25+
Lock down precedence and parity:
2226

23-
1. Entry selection prefers explicit `role: entry`, with documented fallback behavior only when no explicit entry is present.
24-
2. Entry rename between `App.tsx` and `App.js` keeps execution stable.
25-
3. Entry path updates preserve directory while enforcing filename convention.
26-
4. Reload restores same entry tab and executes same source.
27+
1. Less error-path parity with Sass error behavior.
28+
2. Compile diagnostics + lint diagnostics precedence/coexistence contract.
29+
3. Clearing styles diagnostics does not affect component diagnostics/status.
2730

28-
## 2. Default Export Handling in New Hydration Pipeline
31+
## 3. Status Aggregation Contract (High Risk)
2932

30-
Goal: Reintroduce export-default tests against the final module assembly support matrix.
33+
Add state-machine coverage for:
3134

32-
Add specs for:
35+
1. Multiple simultaneous error sources aggregating counts correctly.
36+
2. Clearing one scope updates only that scope and leaves other error states intact.
3337

34-
1. `export default () => ...` in entry tab with manual render.
35-
2. `export default class ...` in React mode.
36-
3. `function App() { ... } export default App` compatibility.
37-
4. `const Button = ...; export default Button` behavior when App wrapper is implicit or explicit.
38-
5. Negative cases: unsupported default-export combinations produce deterministic diagnostics.
38+
## 4. Inactive Panel Mutation Guard (Medium Risk)
3939

40-
## 3. Cross-Tab Import Graph Hydration
40+
Add keyboard/actionability spec that proves inactive editor panel input cannot mutate source.
4141

42-
Goal: Ensure workspace graph resolution works across multiple component and style tabs.
42+
## 5. Update Obsolete PR Path-Validation Section (Doc/Test Hygiene)
4343

44-
Add specs for:
44+
Old PR drawer filename-field validation cases are obsolete after tab-derived commit targets.
4545

46-
1. Entry imports sibling component tab by relative specifier.
47-
2. Nested dependency chain (A imports B imports C) hydrates in stable order.
48-
3. Missing module path reports actionable preview error including unresolved specifier.
49-
4. Circular import emits stable error (or supported behavior) without hanging.
50-
5. Windows-style and POSIX-style separators normalize consistently in lookup keys.
46+
1. Replace with tab-derived commit target validation/normalization tests.
47+
2. Remove any remaining assumptions about component/styles filename fields in PR drawer flows.
5148

52-
## 4. Styles Pipeline and Diagnostics Contract
49+
## Minimal Done Criteria
5350

54-
Goal: Lock down expected diagnostics and status transitions for style dialects.
55-
56-
Add specs for:
57-
58-
1. Sass compilation error sets diagnostics state to error with styles-scope detail.
59-
2. Less error path behavior parity with Sass.
60-
3. Switching style mode clears stale diagnostics according to final pipeline contract.
61-
4. Styles lint diagnostics and compile diagnostics coexist or prioritize per contract.
62-
5. Clearing style diagnostics does not clear unrelated component diagnostics.
63-
64-
## 5. Status and Diagnostics State Machine
65-
66-
Goal: Ensure app status text/class and diagnostics toggle class remain consistent.
67-
68-
Add specs for:
69-
70-
1. Pending to error to neutral transitions for typecheck + lint + render.
71-
2. Multiple error sources aggregate counts correctly.
72-
3. Clearing one scope updates only corresponding status/diagnostics indicators.
73-
4. Auto-render off path keeps status stable until explicit render.
74-
75-
## 6. Multi-Tab Tool Visibility and Actionability
76-
77-
Goal: Guarantee controls are actionable only for active editor tab and panel.
78-
79-
Add specs for:
80-
81-
1. Component controls hidden/inert when styles tab is active.
82-
2. Styles controls hidden/inert when component tab is active.
83-
3. Keyboard interactions in inactive panel do not mutate source.
84-
4. Tab switches maintain tool visibility state and collapse state correctly.
85-
86-
## 7. Persistence and Isolation Guarantees
87-
88-
Goal: Verify deterministic startup and no stale state bleed between sessions.
89-
90-
Add specs for:
91-
92-
1. IndexedDB workspace restore across reload preserves tabs, active tab, entry role, and paths.
93-
2. PR drawer saved config does not unexpectedly overwrite active workspace tab paths.
94-
3. New session starts clean when storage is reset in tests.
95-
4. Repository switch behavior isolates per-repo local context and config.
96-
97-
## 8. PR Drawer Path Validation and Sync
98-
99-
Goal: Revisit path validation behavior after final field sync implementation.
100-
101-
Add specs for:
102-
103-
1. Reject traversal (`../`) for component and styles paths.
104-
2. Reject trailing slash paths for component and styles fields.
105-
3. Allow dotted segments that are not traversal.
106-
4. Entry-specific filename rule enforcement (`App.tsx` or `App.js`) reflected in drawer path values.
107-
108-
## 9. Test Infrastructure Improvements
109-
110-
Goal: Keep suites stable as UX evolves.
111-
112-
Actions:
113-
114-
1. Add helper APIs for tab activation before control interactions.
115-
2. Add one reset helper per suite to clear localStorage, sessionStorage, and IndexedDB.
116-
3. Prefer role/name selectors that match active-tab semantics.
117-
4. Avoid assertions that require hidden panel controls to be clickable.
118-
119-
## Suggested Rollout Order
120-
121-
1. Entry resolution + default-export support matrix.
122-
2. Cross-tab import graph hydration.
123-
3. Styles diagnostics contract.
124-
4. Status state machine.
125-
5. PR drawer path validation synchronization.
126-
6. Persistence/isolation hardening.
127-
128-
## Definition of Done for this plan
129-
130-
Before reintroducing removed specs, the render pipeline implementation should provide a written behavior contract for:
131-
132-
1. Entry tab selection.
133-
2. Default export support matrix.
134-
3. Style compile + lint diagnostics precedence.
135-
4. Status/diagnostics state transitions.
136-
5. Path normalization and validation across workspace tabs and PR drawer fields.
51+
This plan is complete when the five sections above are covered by Playwright tests and linked from the affected suites.

0 commit comments

Comments
 (0)