acstack 0.50.4 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +14 -7
- package/agents/codex/frontend-verifier.toml +89 -6
- package/agents/codex/task-checker.toml +83 -2
- package/agents/codex/task-executor.toml +83 -1
- package/agents/codex/test-writer.toml +77 -1
- package/agents/frontend-verifier.md +13 -6
- package/agents/task-checker.md +7 -2
- package/agents/task-executor.md +7 -1
- package/agents/test-writer.md +1 -1
- package/assets/terminal-workspace/config.example.yaml +1 -1
- package/assets/terminal-workspace/helpers/acstack-md +12 -4
- package/assets/terminal-workspace/helpers/acstack-open +10 -2
- package/cli/dist/index.js +7187 -6402
- package/cli/dist/index.js.map +4 -4
- package/cli/package.json +1 -1
- package/docs/config-reference.md +113 -14
- package/docs/dev-setups.md +4 -4
- package/docs/terminal-workspace.md +1 -1
- package/docs/workflows.md +22 -16
- package/examples/design-doc/acstack/README.md +273 -0
- package/examples/design-doc/acstack/acstack.yaml +4 -0
- package/examples/design-doc/acstack/cli.yaml +5 -0
- package/examples/design-doc/acstack/design.yaml +39 -0
- package/examples/design-doc/acstack/github.yaml +12 -0
- package/examples/design-doc/acstack/host.yaml +14 -0
- package/examples/design-doc/acstack/journey.md +85 -0
- package/examples/design-doc/acstack/publication.md +16 -0
- package/examples/design-doc/acstack/review-runtime.yaml +24 -0
- package/examples/design-doc/acstack/skills.yaml +22 -0
- package/examples/design-doc/acstack/store.yaml +11 -0
- package/examples/design-doc/acstack/user.yaml +15 -0
- package/examples/design-doc/acstack/viewer.yaml +13 -0
- package/hooks/ac-writing-style-reminder.sh +7 -18
- package/hooks/communication-standard.mjs +17 -0
- package/hooks/communication-standard.sh +6 -0
- package/hooks/context-pressure.sh +2 -2
- package/hooks/hooks.json +18 -0
- package/hooks/lib/communication-standard.mjs +16 -0
- package/hooks/project-data.sh +38 -0
- package/hooks/session-start-handoff.sh +21 -7
- package/hooks/session-start.sh +9 -2
- package/orchestrator/AGENTS.md +25 -14
- package/output-styles/ac-writing-style.md +75 -276
- package/package.json +2 -1
- package/pi/agents/frontend-verifier.md +89 -6
- package/pi/agents/task-checker.md +83 -2
- package/pi/agents/task-executor.md +83 -1
- package/pi/agents/test-writer.md +77 -1
- package/pi/extension.ts +70 -12
- package/profiles/fullstack-python.yaml +1 -1
- package/profiles/node-typescript.yaml +1 -1
- package/profiles/python.yaml +1 -1
- package/skills/archive/SKILL.md +53 -36
- package/skills/bootstrap/SKILL.md +6 -6
- package/skills/bridge/SKILL-VM.md +11 -2
- package/skills/bridge/SKILL-WINDOWS.md +3 -3
- package/skills/browser-verify/SKILL.md +14 -5
- package/skills/code-review/SKILL.md +8 -2
- package/skills/commit/SKILL.md +7 -6
- package/skills/compact-and-continue/SKILL.md +9 -8
- package/skills/design-doc/SKILL.md +238 -0
- package/skills/explore/SKILL.md +1 -1
- package/skills/grilling/SKILL.md +4 -4
- package/skills/handoff/SKILL.md +4 -4
- package/skills/host/SKILL.md +1 -1
- package/skills/host/detect-host.sh +2 -2
- package/skills/host/notes.md +2 -2
- package/skills/host/questions.md +1 -1
- package/skills/implement/SKILL.md +20 -13
- package/skills/implement/decision-log.md +9 -8
- package/skills/implement/design-pass.md +16 -2
- package/skills/map/SKILL.md +15 -71
- package/skills/map/alignment.md +18 -27
- package/skills/map/frontend.md +1 -1
- package/skills/map/materialising.md +74 -0
- package/skills/map/trackers/files.md +4 -6
- package/skills/pre-commit-review/SKILL.md +15 -9
- package/skills/pre-commit-review/auto-fix.md +1 -1
- package/skills/quick-fix/SKILL.md +1 -1
- package/skills/record-context/SKILL.md +6 -6
- package/skills/setup/SKILL.md +15 -50
- package/skills/setup/browser.md +2 -2
- package/skills/setup/first-run.md +19 -8
- package/skills/setup/report.md +3 -2
- package/skills/setup/row-fixes.md +56 -9
- package/skills/sync/SKILL.md +12 -11
- package/skills/terminal-workspace/SKILL.md +1 -1
- package/skills/test-conventions/SKILL.md +2 -2
- package/skills/visual-docs/SKILL.md +69 -235
- package/skills/writing/SKILL.md +29 -217
- package/skills/writing/examples.md +62 -129
- package/docs/adr/0001-ste-writing-standard.md +0 -16
- package/docs/adr/0002-version-gate-not-auto-bump.md +0 -35
- package/docs/adr/0003-handoff-ack-command.md +0 -19
- package/docs/adr/0004-dev-setup-per-host.md +0 -13
- package/docs/adr/0005-two-orchestrators-per-host.md +0 -25
- package/docs/adr/0006-document-opener-service.md +0 -89
- package/docs/adr/0007-lead-check-reads-the-transcript.md +0 -87
- package/docs/adr/0008-cli-audits-skill-interviews.md +0 -37
- package/docs/adr/0009-verify-the-write-not-the-writer.md +0 -51
- package/docs/adr/0010-promote-dev-to-main-by-fast-forward.md +0 -115
- package/docs/adr/0011-node-header-is-the-edge-encoding.md +0 -20
- package/docs/adr/0012-node-kind-is-a-closed-set-of-five.md +0 -31
- package/docs/adr/0013-the-diagram-renderer-is-pure.md +0 -23
- package/docs/adr/0014-reading-a-node-hides-its-generated-diagram.md +0 -29
- package/docs/adr/0015-a-node-id-links-to-its-issue-through-an-anchor.md +0 -37
- package/docs/adr/0016-the-map-root-carries-no-status-of-its-own.md +0 -21
- package/docs/adr/0017-call-impeccable-copy-only-its-questions.md +0 -13
- package/docs/adr/0018-alignment-packs-use-local-viewers.md +0 -11
- package/docs/adr/index.md +0 -18
package/skills/explore/SKILL.md
CHANGED
|
@@ -92,7 +92,7 @@ You have full context of the ACStack system. Use it naturally, don't force it.
|
|
|
92
92
|
### Check for context
|
|
93
93
|
|
|
94
94
|
At the start, quickly check what exists – maps on the configured tracker
|
|
95
|
-
(`ls acstack/maps/` on the files backend) and living specs
|
|
95
|
+
(`ls .acstack/maps/` on the files backend) and living specs
|
|
96
96
|
(`~/.claude/acstack/bin/acstack list --specs --json`).
|
|
97
97
|
|
|
98
98
|
### When no map exists
|
package/skills/grilling/SKILL.md
CHANGED
|
@@ -65,7 +65,7 @@ session.
|
|
|
65
65
|
|
|
66
66
|
## Presentation
|
|
67
67
|
|
|
68
|
-
`workflow.grilling.questions` in
|
|
68
|
+
`workflow.grilling.questions` in `.acstack/project.yaml` picks the mode:
|
|
69
69
|
|
|
70
70
|
| Value | Behaviour |
|
|
71
71
|
| ---------------- | ------------------------------------------------------------------------------------ |
|
|
@@ -108,7 +108,7 @@ the tracker's `update` and `create` operations:
|
|
|
108
108
|
|
|
109
109
|
2. Create a node for each new question the answer surfaced, with `answers`
|
|
110
110
|
naming the node that surfaced it. Mark precise questions `open`; mark the
|
|
111
|
-
rest `fog`. If fog does not change the
|
|
111
|
+
rest `fog`. If fog does not change the design, write the
|
|
112
112
|
evidence or event that reopens it.
|
|
113
113
|
|
|
114
114
|
3. Invoke the `record-context` skill for each resolution – it decides whether
|
|
@@ -127,8 +127,8 @@ belong in git:
|
|
|
127
127
|
```markdown
|
|
128
128
|
## Answer
|
|
129
129
|
|
|
130
|
-
Map nodes stay
|
|
131
|
-
|
|
130
|
+
Map nodes stay local by default under `.acstack/maps/`.
|
|
131
|
+
The user can opt in through native root `.gitignore` exceptions.
|
|
132
132
|
|
|
133
133
|
The durable output is the living specs, the architecture decision records and
|
|
134
134
|
the glossary. The `record-context` skill extracts each one as a node
|
package/skills/handoff/SKILL.md
CHANGED
|
@@ -54,7 +54,7 @@ its answer looks wrong. It says why a child must stop, and what it checks.
|
|
|
54
54
|
## First: is this yours to invoke?
|
|
55
55
|
|
|
56
56
|
If the user asked for a handoff, proceed. If you invoke it on your own
|
|
57
|
-
initiative, first read `workflow.handoff.self_invoke` from
|
|
57
|
+
initiative, first read `workflow.handoff.self_invoke` from `.acstack/project.yaml`.
|
|
58
58
|
|
|
59
59
|
If it is `false`, stop. Tell the user a handoff looks warranted and why. Ask
|
|
60
60
|
permission.
|
|
@@ -102,8 +102,8 @@ it should run the command.
|
|
|
102
102
|
| Map state and reading order | `~/.claude/acstack/bin/acstack node walk --map <name>` (reading order of the map) |
|
|
103
103
|
| What can be worked next | `~/.claude/acstack/bin/acstack node frontier --map <name>` (what is workable now) |
|
|
104
104
|
| Files in flight | `git status --short` and `git diff` |
|
|
105
|
-
| Test baseline, last result | `.test-baseline`, then run the suite |
|
|
106
|
-
| What the code does | the living specs in
|
|
105
|
+
| Test baseline, last result | `.acstack/.test-baseline`, then run the suite |
|
|
106
|
+
| What the code does | the living specs in `.acstack/specs/` |
|
|
107
107
|
|
|
108
108
|
On GitHub, `--map` refuses – pipe `gh issue list` into `--stdin` per the
|
|
109
109
|
map skill's `trackers/github.md`.
|
|
@@ -157,7 +157,7 @@ Its first line repeats the acknowledgement requirement verbatim, with
|
|
|
157
157
|
Acknowledge before any other tool call. Run ~/.claude/acstack/bin/acstack handoff ack accept --file <this-file> "<one-line reason>", or ack decline --file <this-file> "<one-line reason>". The command writes <this-file>.ack, which the sender watches.
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
This temp file is not
|
|
160
|
+
This temp file is not `.acstack/HANDOFF.md`, the `compact-and-continue` anchor.
|
|
161
161
|
Never put this line into that anchor, which has to start with `---` frontmatter.
|
|
162
162
|
|
|
163
163
|
Head the rest with the same skeleton the `compact-and-continue` anchor uses. The
|
package/skills/host/SKILL.md
CHANGED
|
@@ -29,7 +29,7 @@ Three terms, before they get used:
|
|
|
29
29
|
## Why this is per machine, not per project
|
|
30
30
|
|
|
31
31
|
The answers go to the ACStack CLI's global config, never to
|
|
32
|
-
|
|
32
|
+
`.acstack/project.yaml`. Read [`notes.md`](notes.md) when the user asks why.
|
|
33
33
|
|
|
34
34
|
## What this skill installs
|
|
35
35
|
|
|
@@ -246,8 +246,8 @@ project_root="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
|
|
246
246
|
# verification, so we look for it at column zero only - `frontend:` nested under
|
|
247
247
|
# some other key means something else entirely.
|
|
248
248
|
has_frontend="false"
|
|
249
|
-
if [ -n "$project_root" ] && [ -f "${project_root}
|
|
250
|
-
if grep -q '^frontend:' "${project_root}
|
|
249
|
+
if [ -n "$project_root" ] && [ -f "${project_root}/.acstack/project.yaml" ]; then
|
|
250
|
+
if grep -q '^frontend:' "${project_root}/.acstack/project.yaml" 2>/dev/null; then
|
|
251
251
|
has_frontend="true"
|
|
252
252
|
fi
|
|
253
253
|
fi
|
package/skills/host/notes.md
CHANGED
|
@@ -20,7 +20,7 @@ interface. That is a JSON file at `~/.config/acstack/config.json`, or under
|
|
|
20
20
|
`$XDG_CONFIG_HOME` when you set that environment variable. Run
|
|
21
21
|
`~/.claude/acstack/bin/acstack config path` to print the real location.
|
|
22
22
|
|
|
23
|
-
They do not go in
|
|
23
|
+
They do not go in `.acstack/project.yaml`.
|
|
24
24
|
|
|
25
25
|
Project concerns stay in `project.yaml`. In particular
|
|
26
26
|
`frontend.browser.mode` stays there as the *project's preference*, while
|
|
@@ -77,7 +77,7 @@ git worktrees and say so. An environment variable for an orchestrator that was
|
|
|
77
77
|
never declared is worth a warning, not a refusal.
|
|
78
78
|
|
|
79
79
|
**The host declares, the project prefers.** `host.browser.*` says what this
|
|
80
|
-
machine can do. `frontend.browser.mode` in
|
|
80
|
+
machine can do. `frontend.browser.mode` in `.acstack/project.yaml` says what the
|
|
81
81
|
project would like.
|
|
82
82
|
|
|
83
83
|
Today the only thing that compares the two is the ACStack command-line
|
package/skills/host/questions.md
CHANGED
|
@@ -22,7 +22,7 @@ What it reports, and what each field is evidence for:
|
|
|
22
22
|
| `orca_topology.serve_unit_active` | A user-level service named exactly `orca` is running, which is the shape of a machine serving Orca to a viewer elsewhere. The name is an assumption: whatever provisions the server picks it, and nothing pins it yet. A unit installed under any other name reads here as "no server". The topology recommendation below then comes out `local` when this machine has Orca, and stays empty when it does not |
|
|
23
23
|
| `claude_settings.orca_hooks_present` | `~/.claude/settings.json` mentions Orca somewhere. The match is a loose, case-insensitive search for that word anywhere in the file, so an unrelated path or permission entry containing it counts too – this is evidence that Orca has wired its hooks in, not proof |
|
|
24
24
|
| `claude_settings.backup_exists` | `~/.claude/settings.json.bak` exists |
|
|
25
|
-
| `project.root`, `project.has_frontend` | The git repository the current directory sits in, and whether its
|
|
25
|
+
| `project.root`, `project.has_frontend` | The git repository the current directory sits in, and whether its `.acstack/project.yaml` configures a frontend |
|
|
26
26
|
|
|
27
27
|
Several sections also carry a `recommended` field. That is the script's
|
|
28
28
|
mechanical reading of the evidence above it and nothing more. It is a starting
|
|
@@ -22,7 +22,7 @@ $ARGUMENTS
|
|
|
22
22
|
### 1. Find the work
|
|
23
23
|
|
|
24
24
|
Check the configured tracker for maps (`workflow.maps.tracker` in
|
|
25
|
-
|
|
25
|
+
`.acstack/project.yaml`; the map skill's `trackers/` docs declare the
|
|
26
26
|
operations – files backend shown below).
|
|
27
27
|
|
|
28
28
|
**A map exists** (or `$ARGUMENTS` names one):
|
|
@@ -40,12 +40,10 @@ off the root.
|
|
|
40
40
|
|
|
41
41
|
Before claiming one, check whether the map is ready to build from:
|
|
42
42
|
|
|
43
|
-
- If any `fog` node changes the
|
|
44
|
-
|
|
45
|
-
- If
|
|
46
|
-
|
|
47
|
-
- If a `fog` node needs later evidence and does not change the artifact, leave
|
|
48
|
-
it on the map with its reopening trigger.
|
|
43
|
+
- If any `fog` node changes the design, stop and point the user at `/acstack:map`
|
|
44
|
+
- For a bound design, require `approval.valid: true` from `acstack design-review status <entry>`
|
|
45
|
+
- If approval is invalid, return to `/acstack:design-doc` for reconciliation and exact-revision approval
|
|
46
|
+
- If a `fog` node needs later evidence without changing the design, leave it with its reopening trigger
|
|
49
47
|
|
|
50
48
|
If the frontier holds only `hitl` nodes – human in the loop, meaning a
|
|
51
49
|
person must answer them – stop and point the user at `/acstack:map`. Those
|
|
@@ -57,7 +55,7 @@ small unit of work, and nothing has to declare it small.
|
|
|
57
55
|
|
|
58
56
|
### 2. Read project configuration
|
|
59
57
|
|
|
60
|
-
Read
|
|
58
|
+
Read `.acstack/project.yaml` for build/test/lint commands and directory paths.
|
|
61
59
|
|
|
62
60
|
### 3. Create feature branch
|
|
63
61
|
|
|
@@ -104,6 +102,15 @@ Nodes describe behaviour, not paths. **Resolve paths at claim time**.
|
|
|
104
102
|
Investigate relevant source, callers, tests, and docs directly or through useful delegation.
|
|
105
103
|
Pass discovered paths and requirements to any delegated agents to avoid repeated searches.
|
|
106
104
|
|
|
105
|
+
- Before implementation, read the root node's `Design entry` reference when present
|
|
106
|
+
- Run `acstack design-review status <entry>`
|
|
107
|
+
- Require its `planning.tracker` and `planning.map` to match the active map before trusting its approval
|
|
108
|
+
- Stop on a missing or different binding; an approval for another map does not authorize this work
|
|
109
|
+
- Require `approval.valid: true`
|
|
110
|
+
- Reconcile feedback and contributions through `/acstack:design-doc` when approval is invalid
|
|
111
|
+
- Reopen review after source, saved comments, or contribution inputs change
|
|
112
|
+
- Keep unsettled requirements in design/map records; living specs describe verified implementation
|
|
113
|
+
|
|
107
114
|
### 5. Execute within the claim
|
|
108
115
|
|
|
109
116
|
Apply the shared Implementation discipline to the claimed node or bare request.
|
|
@@ -118,11 +125,11 @@ Apply the shared Implementation discipline to the claimed node or bare request.
|
|
|
118
125
|
|
|
119
126
|
|
|
120
127
|
**Decision log**: on afk nodes, append one row per decision point to
|
|
121
|
-
`<main checkout
|
|
128
|
+
`<main checkout>/.acstack/decision-logs/<name>.tsv`. A decision point is a fork chosen, a
|
|
122
129
|
unit verified, a revert, or a blocker.
|
|
123
130
|
|
|
124
131
|
Read `decision-log.md` before the first row. It holds how to find the main
|
|
125
|
-
checkout, the columns, and the
|
|
132
|
+
checkout, the columns, and the root ignore baseline.
|
|
126
133
|
|
|
127
134
|
**Parallelism**: use teams when independent nodes benefit from parallel work.
|
|
128
135
|
Assign non-overlapping files, and schedule shared-file changes sequentially.
|
|
@@ -147,14 +154,14 @@ decision landed. With a map, then:
|
|
|
147
154
|
- Classify anything the work surfaced:
|
|
148
155
|
- Agent-clearable fog gets research, tests, or a throwaway prototype.
|
|
149
156
|
- Design-changing fog becomes a `hitl` node and returns to `/acstack:map`.
|
|
150
|
-
- Local fog that does not change the
|
|
151
|
-
-
|
|
157
|
+
- Local fog that does not change the design stays inside the claim notes.
|
|
158
|
+
- Reopen design review when source, saved comments, or contribution inputs change.
|
|
152
159
|
- Recompute the frontier – resolutions unblock nodes.
|
|
153
160
|
|
|
154
161
|
### 7. Build verification
|
|
155
162
|
|
|
156
163
|
After each node (and before ending the session), run the commands from
|
|
157
|
-
|
|
164
|
+
`.acstack/project.yaml`: build, full test suite, lint and typecheck. All must
|
|
158
165
|
pass before claiming the next node.
|
|
159
166
|
|
|
160
167
|
### 8. Completion
|
|
@@ -19,7 +19,7 @@ gets no row.
|
|
|
19
19
|
## Where the log lives
|
|
20
20
|
|
|
21
21
|
The log is one file per map, in the main checkout:
|
|
22
|
-
`<main checkout
|
|
22
|
+
`<main checkout>/.acstack/decision-logs/<name>.tsv`. The `<name>` is the map name
|
|
23
23
|
you pass to `--map`.
|
|
24
24
|
|
|
25
25
|
Write it in the main checkout, never in a worktree. Removing a worktree
|
|
@@ -30,12 +30,13 @@ it. Find the main checkout from any worktree:
|
|
|
30
30
|
main=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
- The root managed baseline ignores `.acstack/decision-logs/` by default
|
|
34
|
+
- Check the main checkout's layout before creating or writing the log
|
|
35
|
+
- If it still has legacy project records, stop with an actionable migration error
|
|
36
|
+
- Tell the user to update installed tools, stop old agents and reviews, and explicitly migrate that checkout before restarting
|
|
37
|
+
- Never move another checkout's records automatically or create a partial `.acstack/` there
|
|
38
|
+
- On an already migrated main checkout, run `~/.claude/acstack/bin/acstack project-data ensure` before writing the log
|
|
39
|
+
- Do not add a nested ignore file; native exceptions in the root `.gitignore` alone control tracking
|
|
39
40
|
|
|
40
41
|
## What a row holds
|
|
41
42
|
|
|
@@ -59,4 +60,4 @@ Never edit or delete a row. A wrong call gets a new row that supersedes it,
|
|
|
59
60
|
and its `why` names the row it replaces.
|
|
60
61
|
|
|
61
62
|
`/acstack:archive` reads the log before it closes the map. It hands lasting
|
|
62
|
-
decisions to `record-context
|
|
63
|
+
decisions to `record-context` and retains the original log independently of `workflow.maps.persist`.
|
|
@@ -17,13 +17,22 @@ flowchart TD
|
|
|
17
17
|
|
|
18
18
|
## 0. Load design context before a UI edit (mandatory)
|
|
19
19
|
|
|
20
|
+
- Frontend content fills its component's available width with equal horizontal padding; text wraps only after filling that width
|
|
21
|
+
- Reuse the project's font family and a small type scale; equivalent text uses identical typography, with variations reserved for meaningful hierarchy
|
|
22
|
+
- Align related elements to shared edges or baselines; use consistent spacing and indentation to show their hierarchy
|
|
23
|
+
- Center status text and controls on the same row, including inside nested action groups; a centered parent does not align its children
|
|
24
|
+
- Use shared spacing tokens or repeated gaps and padding; avoid one-off offsets that conceal a layout error
|
|
25
|
+
- Reserve scrollbar space in scrollable panels so overflow never shifts text or changes line wrapping
|
|
26
|
+
- Render dropdown menus with shared project components and tokens, not browser-native option menus or per-screen copies
|
|
27
|
+
- Preserve keyboard navigation, screen-reader semantics, visible focus, dismissal, and viewport fit in shared dropdowns
|
|
28
|
+
|
|
20
29
|
impeccable is a third-party design plugin. It holds the project's design context, meaning the files that state the design rules and the token definitions a UI file follows.
|
|
21
30
|
|
|
22
31
|
Load that context before your first edit under `frontend.directory`. Load it once per task.
|
|
23
32
|
|
|
24
33
|
**Check the design gate first**
|
|
25
34
|
|
|
26
|
-
The design gate is the set of optional checks impeccable adds to acstack's pipeline. `workflow.design_review` in
|
|
35
|
+
The design gate is the set of optional checks impeccable adds to acstack's pipeline. `workflow.design_review` in `.acstack/project.yaml` turns the gate on. Ask acstack for the answer:
|
|
27
36
|
|
|
28
37
|
```bash
|
|
29
38
|
~/.claude/acstack/bin/acstack design-gate --json
|
|
@@ -85,7 +94,7 @@ impeccable installs its own PostToolUse hook, a check Claude Code runs right aft
|
|
|
85
94
|
- Follow the shared Implementation discipline in `orchestrator/AGENTS.md`
|
|
86
95
|
- The verification owner gathers the file list, completes static checks, and handles the detector
|
|
87
96
|
- A delegated task-checker may own this work, but its presence is optional
|
|
88
|
-
- Read
|
|
97
|
+
- Read `.acstack/project.yaml` before deriving paths
|
|
89
98
|
- This pass requires a configured `frontend`
|
|
90
99
|
- `frontend.directory` defaults to `frontend/` when omitted
|
|
91
100
|
- If the project configures no frontend, warn that `frontend.directory` is missing and skip this pass
|
|
@@ -107,6 +116,11 @@ git status --porcelain -- <frontend.directory>
|
|
|
107
116
|
|
|
108
117
|
## 2. Run the design detector
|
|
109
118
|
|
|
119
|
+
- Verify shared edges, text baselines, control centers, gaps, and padding before running the detector
|
|
120
|
+
- Check nested groups as well as their parents; a shared row must not leave status text aligned to a button's top edge
|
|
121
|
+
- Check normal, pending, error, and narrow layouts; compare bounding boxes or text baselines in the browser rather than judging a screenshot alone
|
|
122
|
+
- Verify dropdowns reuse the shared component and project tokens before running the detector
|
|
123
|
+
- Check arrow keys, Home/End, Enter/Space, Escape, Tab, focus, and viewport fit when a shared dropdown changes
|
|
110
124
|
- Check the design gate before running the detector
|
|
111
125
|
|
|
112
126
|
```bash
|
package/skills/map/SKILL.md
CHANGED
|
@@ -23,7 +23,7 @@ frontier, claim, resolve and walk.
|
|
|
23
23
|
Two backends ship in this skill's directory: `trackers/github.md` for repos
|
|
24
24
|
with GitHub auth, and `trackers/files.md` as the fallback.
|
|
25
25
|
|
|
26
|
-
`workflow.maps.tracker` in
|
|
26
|
+
`workflow.maps.tracker` in `.acstack/project.yaml` (`github` or `files`) records
|
|
27
27
|
the project's choice. If the key names a backend, read the matching doc and use
|
|
28
28
|
its operations. If the key is absent, pick at materialisation time – the moment
|
|
29
29
|
you first write the map's nodes down.
|
|
@@ -33,7 +33,7 @@ choice with the user. Then write the key, so later sessions need not re-decide.
|
|
|
33
33
|
## Which mode
|
|
34
34
|
|
|
35
35
|
One command runs two modes, and what already exists picks between them. Check
|
|
36
|
-
the configured tracker for existing maps – `ls acstack/maps/` on the files
|
|
36
|
+
the configured tracker for existing maps – `ls .acstack/maps/` on the files
|
|
37
37
|
backend, `gh label list --search "map:" --json name` on GitHub.
|
|
38
38
|
|
|
39
39
|
If `$ARGUMENTS` names a map, or exactly one exists, work its frontier – the
|
|
@@ -51,7 +51,7 @@ still one map.
|
|
|
51
51
|
|
|
52
52
|
2. **Load the frontend branch on a frontend destination.** `frontend.md`
|
|
53
53
|
beside this skill holds five more rules. Read it when the destination
|
|
54
|
-
touches `frontend.directory`, the path in
|
|
54
|
+
touches `frontend.directory`, the path in `.acstack/project.yaml` where the
|
|
55
55
|
frontend lives. Every other map skips it.
|
|
56
56
|
|
|
57
57
|
3. **Open with a breadth-first grill.** Work the conversation frontier in
|
|
@@ -64,11 +64,18 @@ still one map.
|
|
|
64
64
|
sharp. The test is whether you can *state* the question precisely, not
|
|
65
65
|
whether you can answer it.
|
|
66
66
|
|
|
67
|
-
5. **Classify fog.** Read `alignment.md`. Blocking fog changes the
|
|
68
|
-
|
|
67
|
+
5. **Classify fog.** Read `alignment.md`. Blocking fog changes the design.
|
|
68
|
+
Deferred fog does not.
|
|
69
69
|
|
|
70
70
|
### Progressive materialisation
|
|
71
71
|
|
|
72
|
+
Before deciding whether the map must persist:
|
|
73
|
+
|
|
74
|
+
- Invoke `/acstack:design-doc` for shared behavior, component boundaries, or data-flow decisions
|
|
75
|
+
- Apply that condition to conversation-only work as well as persisted maps
|
|
76
|
+
- Skip design documents when those decisions are absent, including pure copyediting
|
|
77
|
+
- When a design is required, require current design approval before implementation; changed source or contribution inputs reopen review
|
|
78
|
+
|
|
72
79
|
The machinery appears only when it must persist. After the opening grill:
|
|
73
80
|
|
|
74
81
|
- **No fog surfaced** – say so and proceed to the work
|
|
@@ -81,70 +88,7 @@ The test is mechanical. Will the fog outlive this session?
|
|
|
81
88
|
|
|
82
89
|
### Materialising
|
|
83
90
|
|
|
84
|
-
|
|
85
|
-
operation. First the root:
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
# files backend – github.md has the equivalent
|
|
89
|
-
~/.claude/acstack/bin/acstack node create --map <name> --title "<destination>" \
|
|
90
|
-
--kind destination --label "<at most four words>" --summary "<one sentence>" \
|
|
91
|
-
--body "<the destination, as settled>"
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
- The root is the destination. Pass no `--status` flag, so it opens.
|
|
95
|
-
|
|
96
|
-
The root's state follows its subtree. It stays open while any node below
|
|
97
|
-
it is open, fog or claimed. `archive` resolves it when the map clears.
|
|
98
|
-
Nothing else writes the root's status, and the frontier never returns it.
|
|
99
|
-
|
|
100
|
-
- The root counts as pinned without the flag, and on GitHub it carries the
|
|
101
|
-
`root-node` label. The walk returns pinned nodes in full at the start of
|
|
102
|
-
every session, so every session orients to the root.
|
|
103
|
-
|
|
104
|
-
- On GitHub, every node body opens with a header line that encodes its edges.
|
|
105
|
-
`trackers/github.md` holds the format. The files backend writes none.
|
|
106
|
-
|
|
107
|
-
- Every node carries a required `kind` and `label`, its short diagram name.
|
|
108
|
-
Work nodes and the destination add a one-sentence business `--summary`.
|
|
109
|
-
`trackers/files.md` holds the kinds, the caps, and the CLI's contract.
|
|
110
|
-
|
|
111
|
-
- Every node body carries a diagram, two at most. A childless `notes` node is
|
|
112
|
-
the one exception.
|
|
113
|
-
|
|
114
|
-
`visuals.md` holds which visual each kind gets, where it sits in the body,
|
|
115
|
-
and the rules a hand-drawn one follows. Read it before the first body.
|
|
116
|
-
|
|
117
|
-
- Standing preferences for the effort become one resolved node. Style rules
|
|
118
|
-
and constraints the grill surfaced go there. Create it with
|
|
119
|
-
`--answers <root id> --kind notes --label "<at most four words>" --pinned`.
|
|
120
|
-
|
|
121
|
-
- Every other surfaced question becomes a node. Give it `open` or `fog` per
|
|
122
|
-
the fog test.
|
|
123
|
-
|
|
124
|
-
Pass `--answers <id>` to name the node whose resolution surfaced it. That
|
|
125
|
-
link is the node's provenance, the trail back to the root. Pass
|
|
126
|
-
`--blocked-by` only where you genuinely cannot settle one node before
|
|
127
|
-
another.
|
|
128
|
-
|
|
129
|
-
- `mode` defaults to `hitl` – human in the loop, meaning a person answers it.
|
|
130
|
-
|
|
131
|
-
A node earns `afk` – away from keyboard, meaning an agent settles it alone
|
|
132
|
-
– only by containing no decision. Research earns it, and so does work
|
|
133
|
-
whose questions are all settled. Get this wrong and an agent quietly
|
|
134
|
-
decides something that was the human's.
|
|
135
|
-
|
|
136
|
-
- Write every title and body per the `writing` skill.
|
|
137
|
-
- Nodes describe behaviour, not file paths. A node can sit on the frontier for
|
|
138
|
-
weeks while the codebase moves – you resolve the paths at claim time.
|
|
139
|
-
|
|
140
|
-
- Draw every parent's diagram once every node exists, per Regenerating
|
|
141
|
-
diagrams below. A parent draws its subtree, so nothing can draw one earlier.
|
|
142
|
-
The root is a parent too, and it draws the whole map.
|
|
143
|
-
|
|
144
|
-
- Apply `alignment.md` after diagrams are current. Build the artifact, run the
|
|
145
|
-
review gate, and start implementation only after approval.
|
|
146
|
-
- On the files backend, suggest adding `acstack/maps/` to `.gitignore`
|
|
147
|
-
(`trackers/files.md` gives the reason).
|
|
91
|
+
Read [materialising.md](materialising.md) and follow its full procedure before creating map nodes.
|
|
148
92
|
|
|
149
93
|
## Working the frontier
|
|
150
94
|
|
|
@@ -200,12 +144,12 @@ the list, marked `skip: <reason>`.
|
|
|
200
144
|
5. **After every resolution**, in order:
|
|
201
145
|
- Invoke `record-context`
|
|
202
146
|
- Create nodes for anything the resolution surfaced
|
|
203
|
-
- Classify new fog by whether it changes the
|
|
147
|
+
- Classify new fog by whether it changes the design
|
|
204
148
|
- Create the critique node when the resolved node changed the frontend,
|
|
205
149
|
per `frontend.md`
|
|
206
150
|
- Regenerate the diagram on the resolved node's parent (see Regenerating
|
|
207
151
|
diagrams)
|
|
208
|
-
-
|
|
152
|
+
- Reopen design review when source, saved comments, or contribution inputs change
|
|
209
153
|
- Recompute the frontier
|
|
210
154
|
|
|
211
155
|
The regeneration comes after the new nodes exist. A surfaced node hangs
|
package/skills/map/alignment.md
CHANGED
|
@@ -1,38 +1,29 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Design review
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Use an authored design for shared behavior, component boundaries, and data-flow decisions; map nodes track questions and work.
|
|
4
4
|
|
|
5
5
|
## Fog classes
|
|
6
6
|
|
|
7
|
-
- Blocking fog changes the
|
|
8
|
-
- Deferred fog needs later evidence
|
|
9
|
-
- Clear blocking fog before implementation
|
|
10
|
-
-
|
|
7
|
+
- Blocking fog changes the design
|
|
8
|
+
- Deferred fog needs later evidence or sits below the design's scope
|
|
9
|
+
- Clear blocking fog before implementation
|
|
10
|
+
- Record the evidence or event that reopens deferred fog
|
|
11
11
|
- Never defer fog because asking feels inconvenient
|
|
12
12
|
|
|
13
13
|
## Review gate
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
~/.claude/acstack/bin/acstack align-viewer --map <name>
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
If the review requests changes, read the feedback file the command prints.
|
|
30
|
-
Update the map, regenerate the diagrams, and rerun the review.
|
|
31
|
-
|
|
32
|
-
Start implementation only after the reviewer approves the artifact, or after the project disables the approval gate.
|
|
15
|
+
- Follow `/acstack:design-doc` to author the design, bind the map, and record node contributions
|
|
16
|
+
- Run `~/.claude/acstack/bin/acstack design-doc <entry>` for live review
|
|
17
|
+
- Reconcile saved feedback and current contributions through `design-review reconcile`
|
|
18
|
+
- Require `approval.valid: true` from `~/.claude/acstack/bin/acstack design-review status <entry>` before implementation
|
|
19
|
+
- Approval covers the exact source, saved comments, and map contribution inputs
|
|
20
|
+
- Reopen review when those inputs change; regenerating presentation alone preserves approval
|
|
21
|
+
- Use `node walk`, `node frontier`, and `node diagram` for planning views, not architecture generation
|
|
22
|
+
- ACStack removes legacy `map --map` and `align-viewer` without aliases
|
|
23
|
+
- Use explicit `design-review migrate` for legacy feedback (see `/acstack:design-doc`)
|
|
33
24
|
|
|
34
25
|
## New fog during implementation
|
|
35
26
|
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
27
|
+
- Return design-changing fog to `/acstack:map`
|
|
28
|
+
- Keep other fog with its reopening trigger
|
|
29
|
+
- Revise the authored design and repeat reconciliation and approval when review inputs change
|
package/skills/map/frontend.md
CHANGED
|
@@ -4,7 +4,7 @@ A map whose destination changes the frontend carries five rules that no other
|
|
|
4
4
|
map loads, and this file holds all five.
|
|
5
5
|
|
|
6
6
|
`SKILL.md` decides when to read this file. The destination has to touch
|
|
7
|
-
`frontend.directory`, the path in
|
|
7
|
+
`frontend.directory`, the path in `.acstack/project.yaml` where the frontend
|
|
8
8
|
lives.
|
|
9
9
|
|
|
10
10
|
Two plugins appear in the rules below.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Materialising a map
|
|
2
|
+
|
|
3
|
+
Create map nodes with the selected tracker after charting requires persistence.
|
|
4
|
+
|
|
5
|
+
Read this procedure when [the map skill](SKILL.md#materialising) reaches materialisation, before creating any node.
|
|
6
|
+
|
|
7
|
+
Pick the tracker (see [Tracker](SKILL.md#tracker)), then create the nodes with its `create`
|
|
8
|
+
operation. First the root:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
# files backend – github.md has the equivalent
|
|
12
|
+
~/.claude/acstack/bin/acstack node create --map <name> --title "<destination>" \
|
|
13
|
+
--kind destination --label "<at most four words>" --summary "<one sentence>" \
|
|
14
|
+
--body "<the destination, as settled>"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- The root is the destination. Pass no `--status` flag, so it opens.
|
|
18
|
+
|
|
19
|
+
The root's state follows its subtree. It stays open while any node below
|
|
20
|
+
it is open, fog or claimed. `archive` resolves it when the map clears.
|
|
21
|
+
Nothing else writes the root's status, and the frontier never returns it.
|
|
22
|
+
|
|
23
|
+
- The root counts as pinned without the flag, and on GitHub it carries the
|
|
24
|
+
`root-node` label. The walk returns pinned nodes in full at the start of
|
|
25
|
+
every session, so every session orients to the root.
|
|
26
|
+
|
|
27
|
+
- On GitHub, every node body opens with a header line that encodes its edges.
|
|
28
|
+
[`trackers/github.md`](trackers/github.md) holds the format. The files backend writes none.
|
|
29
|
+
|
|
30
|
+
- Every node carries a required `kind` and `label`, its short diagram name.
|
|
31
|
+
Work nodes and the destination add a one-sentence business `--summary`.
|
|
32
|
+
[`trackers/files.md`](trackers/files.md) holds the kinds, the caps, and the CLI's contract.
|
|
33
|
+
|
|
34
|
+
- Every node body carries a diagram, two at most. A childless `notes` node is
|
|
35
|
+
the one exception.
|
|
36
|
+
|
|
37
|
+
[`visuals.md`](visuals.md) holds which visual each kind gets, where it sits in the body,
|
|
38
|
+
and the rules a hand-drawn one follows. Read it before the first body.
|
|
39
|
+
|
|
40
|
+
- Standing preferences for the effort become one resolved node. Style rules
|
|
41
|
+
and constraints the grill surfaced go there. Create it with
|
|
42
|
+
`--answers <root id> --kind notes --label "<at most four words>" --pinned`.
|
|
43
|
+
|
|
44
|
+
- Every other surfaced question becomes a node. Give it `open` or `fog` per
|
|
45
|
+
the fog test.
|
|
46
|
+
|
|
47
|
+
Pass `--answers <id>` to name the node whose resolution surfaced it. That
|
|
48
|
+
link is the node's provenance, the trail back to the root. Pass
|
|
49
|
+
`--blocked-by` only where you genuinely cannot settle one node before
|
|
50
|
+
another.
|
|
51
|
+
|
|
52
|
+
- `mode` defaults to `hitl` – human in the loop, meaning a person answers it.
|
|
53
|
+
|
|
54
|
+
A node earns `afk` – away from keyboard, meaning an agent settles it alone
|
|
55
|
+
– only by containing no decision. Research earns it, and so does work
|
|
56
|
+
whose questions are all settled. Get this wrong and an agent quietly
|
|
57
|
+
decides something that was the human's.
|
|
58
|
+
|
|
59
|
+
- Write every title and body per the `writing` skill.
|
|
60
|
+
- Nodes describe behaviour, not file paths. A node can sit on the frontier for
|
|
61
|
+
weeks while the codebase moves – you resolve the paths at claim time.
|
|
62
|
+
|
|
63
|
+
- Draw every parent's diagram once every node exists, per [Regenerating
|
|
64
|
+
diagrams](SKILL.md#regenerating-diagrams). A parent draws its subtree, so nothing can draw one earlier.
|
|
65
|
+
The root is a parent too, and it draws the whole map.
|
|
66
|
+
|
|
67
|
+
- When a design is required:
|
|
68
|
+
- Record `Design entry: <repository-relative-path>` in the root node body
|
|
69
|
+
- Bind the entry back to the map with `planning: {tracker: files | github, map: <name>}`
|
|
70
|
+
- Require `design-review status` to return that same `planning` binding before using its approval for this map
|
|
71
|
+
- Record proposals in the node body's `## Design contributions` section using the format in `/acstack:design-doc`
|
|
72
|
+
- Reconcile proposals and saved feedback explicitly; surface conflicts as decision nodes
|
|
73
|
+
- On the files backend, the root Git ignore rules exclude `.acstack/maps/` unless the user opts in
|
|
74
|
+
([`trackers/files.md`](trackers/files.md) gives the reason).
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Files tracker
|
|
2
2
|
|
|
3
3
|
The fallback backend: no auth, works offline, works on any remote. One
|
|
4
|
-
markdown file per node under
|
|
4
|
+
markdown file per node under `.acstack/maps/<name>/`, managed by the ACStack
|
|
5
5
|
CLI. Nodes here are transient working state – scratch discarded once the map
|
|
6
6
|
clears.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
The root managed baseline ignores `.acstack/maps/` by default.
|
|
9
|
+
Native exceptions after that baseline let the user opt in to tracking any part.
|
|
10
10
|
|
|
11
11
|
CLI path: `~/.claude/acstack/bin/acstack`
|
|
12
12
|
|
|
13
|
-
To enumerate a project's maps: `ls acstack/maps/`.
|
|
13
|
+
To enumerate a project's maps: `ls .acstack/maps/`.
|
|
14
14
|
|
|
15
15
|
## The four operations
|
|
16
16
|
|
|
@@ -73,5 +73,3 @@ Both commands drop every diagram block a node body holds. A diagram block is
|
|
|
73
73
|
the rendered map that sits between the `<!-- acstack:diagram -->` markers
|
|
74
74
|
`node diagram` writes. `--visuals` prints the blocks. `--json` always carries
|
|
75
75
|
the whole body.
|
|
76
|
-
|
|
77
|
-
See `docs/adr/0014-reading-a-node-hides-its-generated-diagram.md` for why.
|