acstack 0.50.3 → 0.51.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/assets/terminal-workspace/lib/apply-yazi.sh +25 -0
- package/cli/dist/index.js +10142 -9369
- 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-keys.md +1 -0
- 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 +235 -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 +2 -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
|
@@ -59,7 +59,7 @@ git status --short
|
|
|
59
59
|
git log --oneline -3 # recent context
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
Read
|
|
62
|
+
Read `.acstack/project.yaml` to understand the project's directory layout, commands, and conventions.
|
|
63
63
|
|
|
64
64
|
Categorize changed files into scopes using the project configuration:
|
|
65
65
|
|
|
@@ -78,13 +78,15 @@ Follow the shared Implementation discipline in `orchestrator/AGENTS.md` for dele
|
|
|
78
78
|
Investigate these dimensions directly or through useful delegation.
|
|
79
79
|
Discover current conventions rather than hardcoding them.
|
|
80
80
|
|
|
81
|
+
Read `../../output-styles/ac-writing-style.md` relative to this skill directory; apply its shared standard to code design as well as explanations.
|
|
82
|
+
|
|
81
83
|
**Living specs and architecture:**
|
|
82
84
|
|
|
83
85
|
```
|
|
84
86
|
Read the living specs relevant to this change:
|
|
85
|
-
- Check acstack/specs/ directory listing
|
|
87
|
+
- Check .acstack/specs/ directory listing
|
|
86
88
|
- Read spec.md files for domains touched by the changed files
|
|
87
|
-
(use acstack/domain-map.yaml to map files -> domains)
|
|
89
|
+
(use .acstack/domain-map.yaml to map files -> domains)
|
|
88
90
|
- Extract documented conventions, patterns, and requirements (FR-NNN entries)
|
|
89
91
|
Report: list of project conventions and patterns relevant to these changes.
|
|
90
92
|
```
|
|
@@ -105,7 +107,7 @@ Report: established patterns, common approaches, naming conventions observed.
|
|
|
105
107
|
```
|
|
106
108
|
For each changed file, read:
|
|
107
109
|
- The full file (to see surrounding code context)
|
|
108
|
-
-
|
|
110
|
+
- Connected callers and dependencies (read beyond signatures where needed to understand responsibilities and interface costs)
|
|
109
111
|
- Config that governs this area (linter rules, compiler config, etc.)
|
|
110
112
|
Report: local conventions, related code patterns, existing abstractions nearby.
|
|
111
113
|
```
|
|
@@ -137,14 +139,18 @@ For each finding, report:
|
|
|
137
139
|
|
|
138
140
|
```
|
|
139
141
|
Examine the diff for:
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
142
|
+
- Tangled control flow, repeated decisions, or mixed responsibilities, with concrete evidence of the complexity
|
|
143
|
+
- Incoherent boundaries or peer components at mismatched abstraction levels
|
|
144
|
+
- Interfaces that expose internals instead of hiding real complexity behind small, useful operations (deep modules)
|
|
145
|
+
- Names that misrepresent meaning, or structure driven by folder layout rather than responsibility
|
|
146
|
+
- Missing useful boundaries or pass-through layers that add no useful boundary
|
|
144
147
|
- Complex conditionals that could be simplified
|
|
145
148
|
- Code that would be hard for a new developer to understand
|
|
146
149
|
- Performance concerns (N+1 queries, unnecessary re-renders, blocking I/O)
|
|
147
150
|
|
|
151
|
+
Do not require nesting or wrappers; neither line count nor indirection measures design quality.
|
|
152
|
+
Support design findings with effects on connected callers and dependencies.
|
|
153
|
+
|
|
148
154
|
For each finding, report:
|
|
149
155
|
FILE:LINE | SEVERITY (MUST/SHOULD/CONSIDER) | WHAT | WHY | SUGGESTED FIX
|
|
150
156
|
```
|
|
@@ -175,7 +181,7 @@ Run the lint on the changed Markdown files, and on nothing else. Skip the comman
|
|
|
175
181
|
|
|
176
182
|
The lint exits 0 even when it reports findings. It groups findings by file with line numbers, then prints a summary per file. It skips `skills/writing/vocabulary.md` on purpose.
|
|
177
183
|
|
|
178
|
-
|
|
184
|
+
Review each warning in context before treating it as a defect. Preserve necessary technical terms, quotations, and wording that would lose accuracy if changed. Report confirmed clarity or convention problems as `SHOULD | PROSE`, with the `file:line` and their effect on the reader.
|
|
179
185
|
|
|
180
186
|
## Step 4: ADJACENT – Check surrounding code for rot
|
|
181
187
|
|
|
@@ -9,7 +9,7 @@ For each finding (MUST first, then SHOULD, then CONSIDER):
|
|
|
9
9
|
3. If fix breaks something, revert and try alternate approach
|
|
10
10
|
4. Move to next finding
|
|
11
11
|
|
|
12
|
-
After all fixes, run full verification using commands from
|
|
12
|
+
After all fixes, run full verification using commands from `.acstack/project.yaml`:
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
# Run the project's configured test, lint, and typecheck commands
|
|
@@ -94,7 +94,7 @@ Apply the shared policy to the minimal fix.
|
|
|
94
94
|
|
|
95
95
|
## Step 6: Verify
|
|
96
96
|
|
|
97
|
-
Run build verification using commands from
|
|
97
|
+
Run build verification using commands from `.acstack/project.yaml`:
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
100
|
# Run the project's configured test, lint, and typecheck commands
|
|
@@ -25,7 +25,7 @@ an obvious choice buries the ones that matter.
|
|
|
25
25
|
|
|
26
26
|
### Writing one
|
|
27
27
|
|
|
28
|
-
- Path:
|
|
28
|
+
- Path: `.acstack/decisions/NNNN-slug.md`. The number is the highest existing number plus
|
|
29
29
|
one, zero-padded to four digits. Create the directory lazily.
|
|
30
30
|
|
|
31
31
|
If the file for that number appeared since you scanned (a parallel teammate
|
|
@@ -41,7 +41,7 @@ an obvious choice buries the ones that matter.
|
|
|
41
41
|
|
|
42
42
|
### Example
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
`.acstack/decisions/0004-invariant-tool-path.md`:
|
|
45
45
|
|
|
46
46
|
```markdown
|
|
47
47
|
# One invariant path for the command line tool
|
|
@@ -64,7 +64,7 @@ the hook has not run. The fix is to restart the agent session.
|
|
|
64
64
|
|
|
65
65
|
### You generate the index
|
|
66
66
|
|
|
67
|
-
After writing any ADR, rewrite
|
|
67
|
+
After writing any ADR, rewrite `.acstack/decisions/index.md` in full, with one line
|
|
68
68
|
per ADR. Sort the lines by number, ascending. Each line takes its number
|
|
69
69
|
and slug from the filename, and its title from the file's first heading:
|
|
70
70
|
|
|
@@ -80,9 +80,9 @@ If you find hand edits in it, regenerate; the files are the truth.
|
|
|
80
80
|
If the decision fixed what a word means – picked between competing names,
|
|
81
81
|
sharpened a fuzzy term, coined one – record it:
|
|
82
82
|
|
|
83
|
-
- **Cross-domain terms** go in
|
|
84
|
-
- **Domain terms** go in
|
|
85
|
-
domain's `spec.md`. Find the domain in
|
|
83
|
+
- **Cross-domain terms** go in `.acstack/CONTEXT.md`.
|
|
84
|
+
- **Domain terms** go in `.acstack/specs/<domain>/CONTEXT.md`, beside that
|
|
85
|
+
domain's `spec.md`. Find the domain in `.acstack/domain-map.yaml`.
|
|
86
86
|
|
|
87
87
|
- Create both files lazily; there is no index file –
|
|
88
88
|
`domain-map.yaml` already lists every domain.
|
package/skills/setup/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: setup
|
|
3
|
-
description: Set up ACStack in a project, and change how an already configured project is set up. With no acstack/project.yaml it detects the project type, writes the config, generates the domain map and offers browser verification. With one already there it leads with the health check, then offers to fix each row that failed. Both paths end in the same check, so it is safe to run on the first day and on any day after.
|
|
3
|
+
description: Set up ACStack in a project, and change how an already configured project is set up. With no .acstack/project.yaml it detects the project type, writes the config, generates the domain map and offers browser verification. With one already there it leads with the health check, then offers to fix each row that failed. Both paths end in the same check, so it is safe to run on the first day and on any day after.
|
|
4
4
|
argument-hint: "[what to set up or change]"
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
---
|
|
@@ -18,7 +18,7 @@ join at the health check, so this skill states every fix once.
|
|
|
18
18
|
|
|
19
19
|
```mermaid
|
|
20
20
|
flowchart TD
|
|
21
|
-
HOST["Step 1<br/>declare this machine"] --> FORK{"acstack/project.yaml<br/>is here?"}
|
|
21
|
+
HOST["Step 1<br/>declare this machine"] --> FORK{".acstack/project.yaml<br/>is here?"}
|
|
22
22
|
FORK -- no --> FIRST["Steps 3 to 6<br/>detect, ask, write the config"]
|
|
23
23
|
FORK -- yes --> CHECK
|
|
24
24
|
FIRST --> CHECK["Step 7<br/>acstack config check --json"]
|
|
@@ -32,8 +32,8 @@ flowchart TD
|
|
|
32
32
|
|
|
33
33
|
Three terms, before they get used:
|
|
34
34
|
|
|
35
|
-
- A **health check** is one run of `acstack config check`. It
|
|
36
|
-
and
|
|
35
|
+
- A **health check** is one run of `acstack config check`. It reports gaps in the machine
|
|
36
|
+
and project configuration.
|
|
37
37
|
|
|
38
38
|
- A **row** is one line of that report. It carries an `id`, a `status` and a
|
|
39
39
|
`message`.
|
|
@@ -44,7 +44,6 @@ Three terms, before they get used:
|
|
|
44
44
|
The command line tool audits. This skill interviews and writes. Neither one does
|
|
45
45
|
the other's job.
|
|
46
46
|
|
|
47
|
-
See `docs/adr/0008-cli-audits-skill-interviews.md`.
|
|
48
47
|
|
|
49
48
|
## Step 1: Declare this machine
|
|
50
49
|
|
|
@@ -75,8 +74,14 @@ answers. Come back to Step 2 when it finishes.
|
|
|
75
74
|
|
|
76
75
|
## Step 2: Choose the path
|
|
77
76
|
|
|
77
|
+
Run `~/.claude/acstack/bin/acstack project-data ensure` before checking for configuration.
|
|
78
|
+
It needs no config, does nothing without `.acstack/`, and preserves user tracking exceptions.
|
|
79
|
+
|
|
80
|
+
If legacy project records remain, explain the explicit migration procedure in `docs/config-reference.md` before proceeding.
|
|
81
|
+
Never move them silently or run Git index commands.
|
|
82
|
+
|
|
78
83
|
```bash
|
|
79
|
-
test -f acstack/project.yaml && echo present || echo absent
|
|
84
|
+
test -f .acstack/project.yaml && echo present || echo absent
|
|
80
85
|
```
|
|
81
86
|
|
|
82
87
|
- **absent** – take the first-run path. Go to Step 3.
|
|
@@ -113,7 +118,7 @@ CLI. An agent testing this branch before the release runs
|
|
|
113
118
|
It prints one object to standard output and nothing else:
|
|
114
119
|
|
|
115
120
|
```json
|
|
116
|
-
{"checks": [{"id": "domain-map", "status": "pass", "message": "acstack/domain-map.yaml maps 4 domains"}]}
|
|
121
|
+
{"checks": [{"id": "domain-map", "status": "pass", "message": ".acstack/domain-map.yaml maps 4 domains"}]}
|
|
117
122
|
```
|
|
118
123
|
|
|
119
124
|
Each `status` is `pass`, `fail` or `info`. The exit codes carry the same news:
|
|
@@ -135,47 +140,7 @@ months ago deserves to hear what fails first.
|
|
|
135
140
|
|
|
136
141
|
## Step 8: Offer the rows that need a fix
|
|
137
142
|
|
|
138
|
-
|
|
139
|
-
`multiSelect: true` on Claude Code). Put one option in it per row you are going
|
|
140
|
-
to offer, and say in each description what the row reported. This is the pre-selection the user sees: only real gaps reach the menu.
|
|
141
|
-
|
|
142
|
-
Offer a row when any of these holds:
|
|
143
|
-
|
|
144
|
-
- Its `status` is `fail`.
|
|
145
|
-
- Its `id` is `preferred-browser-mode`, its `status` is `info`, and
|
|
146
|
-
`acstack/project.yaml` configures a `frontend` block. The project has a
|
|
147
|
-
frontend and has named no browser mode for it.
|
|
148
|
-
|
|
149
|
-
- Its `id` is `output-style` and its `status` is `info`. The row passes when the
|
|
150
|
-
settings files select `acstack:ac-writing-style`, so `info` means they select
|
|
151
|
-
some other style, or select none.
|
|
152
|
-
|
|
153
|
-
- Its `id` is `frontend-verification` and its `status` is `info`. The project
|
|
154
|
-
configures a frontend and `workflow.frontend_verification` is not `true`.
|
|
155
|
-
|
|
156
|
-
Each of those rules reads the `status` and the `id`. Read neither row's message
|
|
157
|
-
to decide, for the reason Step 7 gives: the message is prose and it gets
|
|
158
|
-
reworded.
|
|
159
|
-
|
|
160
|
-
Add three options at the end of the list, whatever the check reported:
|
|
161
|
-
|
|
162
|
-
- **Re-declare this machine** – invoke the `host` skill. It re-asks every axis,
|
|
163
|
-
required and optional, and starts from the current answers.
|
|
164
|
-
|
|
165
|
-
The check reports an `optional-axis:<key>` row as `info`, never as `fail`.
|
|
166
|
-
So this option is the only way one of them reaches a question.
|
|
167
|
-
|
|
168
|
-
- **Change one setting** – for a key the check has no opinion about, such as
|
|
169
|
-
`workflow.maps.persist`. Point the user at `docs/config-reference.md`, which
|
|
170
|
-
lists every key, its values and its default. Then write the key:
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
~/.claude/acstack/bin/acstack config set workflow.maps.persist true
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
Do not restate the reference here.
|
|
177
|
-
|
|
178
|
-
- **Skip** – leave everything as it is.
|
|
143
|
+
Read [Step 8 in row-fixes.md](row-fixes.md#step-8-offer-the-rows-that-need-a-fix) and build its full menu.
|
|
179
144
|
|
|
180
145
|
## Step 9: Fix one row at a time
|
|
181
146
|
|
|
@@ -209,7 +174,7 @@ Read [`browser.md`](browser.md) when the user picks the remote mode in Step 10,
|
|
|
209
174
|
|
|
210
175
|
## Step 12: Offer the terminal workspace
|
|
211
176
|
|
|
212
|
-
Read [`terminal-workspace.md`](terminal-workspace.md) on every run, after the rows
|
|
177
|
+
Read [`terminal-workspace.md`](terminal-workspace.md) on every run, after you fix the rows.
|
|
213
178
|
|
|
214
179
|
## Step 13: Offer the design review
|
|
215
180
|
|
|
@@ -235,7 +200,7 @@ Read [`report.md`](report.md) on every run, as the last step.
|
|
|
235
200
|
It reads the key to decide which one.
|
|
236
201
|
|
|
237
202
|
A `host.*` key goes to the global config at `~/.config/acstack/config.json`.
|
|
238
|
-
Every other key it knows goes to
|
|
203
|
+
Every other key it knows goes to `.acstack/project.yaml`, and the write keeps
|
|
239
204
|
the comments and the key order. It refuses a key neither schema knows, so
|
|
240
205
|
never fall back to editing the file.
|
|
241
206
|
|
package/skills/setup/browser.md
CHANGED
|
@@ -37,10 +37,10 @@ Write the answer as `remote`, `headless` or `local`. Write the port beside it:
|
|
|
37
37
|
~/.claude/acstack/bin/acstack config set frontend.browser.cdp_port 19988
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
Then write
|
|
40
|
+
Then write `.acstack/agent-browser.json` with the same port, the way Step 9c in `row-fixes.md` does.
|
|
41
41
|
|
|
42
42
|
On **Skip for now**, leave `frontend.browser` unset and write no
|
|
43
|
-
|
|
43
|
+
`.acstack/agent-browser.json`. Say that `docs/config-reference.md` documents the three
|
|
44
44
|
keys for later.
|
|
45
45
|
|
|
46
46
|
On **Headless**, no setup follows. Tell the user the frontend verifier launches
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Setup: first run
|
|
2
2
|
|
|
3
|
-
`SKILL.md` decides when to read this file: Step 2 found no
|
|
3
|
+
`SKILL.md` decides when to read this file: Step 2 found no `.acstack/project.yaml`, so the first-run path runs Steps 3 to 6 from here.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
lists every key
|
|
5
|
+
First-run setup does not migrate legacy records; use the procedure in `docs/config-reference.md`.
|
|
6
|
+
That reference also lists every configuration key.
|
|
7
7
|
|
|
8
8
|
## Step 3: Detect the project type and propose defaults
|
|
9
9
|
|
|
@@ -70,7 +70,7 @@ user did not select.
|
|
|
70
70
|
Recommend `tool`. It writes `workflow.grilling.questions`.
|
|
71
71
|
|
|
72
72
|
- Apply the shared Implementation discipline in `orchestrator/AGENTS.md` without adding workflow switches
|
|
73
|
-
- Do not offer or generate the deprecated TDD booleans
|
|
73
|
+
- Do not offer or generate the deprecated TDD booleans or retired `workflow.alignment_packs` settings
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
- **Spec sync** – ask enabled against disabled.
|
|
@@ -81,12 +81,23 @@ paths reach Step 10 through the health check.
|
|
|
81
81
|
|
|
82
82
|
## Step 6: Write the config
|
|
83
83
|
|
|
84
|
-
1. Create the
|
|
85
|
-
2.
|
|
86
|
-
3.
|
|
84
|
+
1. Create the `.acstack/` directory.
|
|
85
|
+
2. Immediately run `~/.claude/acstack/bin/acstack project-data ensure`, before writing any metadata.
|
|
86
|
+
3. Write `.acstack/project.yaml` from the profile and the answers.
|
|
87
|
+
4. Ask which project-data parts to track with a multi-select question, with nothing selected by default.
|
|
88
|
+
Offer the parts listed in `docs/config-reference.md` under "Project data stays local by default" in batches if the host limits options.
|
|
89
|
+
Include every part, not only the files setup creates today.
|
|
90
|
+
5. Leave all parts ignored when the user selects none.
|
|
91
|
+
6. Append native exceptions after existing root `.gitignore` rules, outside the managed baseline.
|
|
92
|
+
- When the user selects any part, append `!/.acstack/` once before that part's exceptions.
|
|
93
|
+
- A directory needs both `!/.acstack/specs/` and `!/.acstack/specs/**` (replace `specs` with the selected directory).
|
|
94
|
+
- A root-level file needs one exception, such as `!/.acstack/project.yaml`.
|
|
95
|
+
- Reopen parent directories before exceptions for nested files, such as `!/.acstack/verification/`.
|
|
96
|
+
- Preserve existing user rules; never force-add ignored files or change the Git index.
|
|
97
|
+
7. Leave the project CLAUDE.md alone. The SessionStart hook loads the
|
|
87
98
|
orchestrator instructions.
|
|
88
99
|
|
|
89
|
-
|
|
100
|
+
8. Remove a legacy `@import` line from the project CLAUDE.md, if one is there.
|
|
90
101
|
It points at `.../plugins/cache/ac8318740-plugins/acstack/<version>/CLAUDE.md`.
|
|
91
102
|
|
|
92
103
|
Then go to Step 7. Everything a fresh project still lacks shows up there as a
|
package/skills/setup/report.md
CHANGED
|
@@ -20,8 +20,9 @@ Browser: [project's preferred mode / not configured]
|
|
|
20
20
|
Design: [on / off / not asked]
|
|
21
21
|
Host: [orchestrators + browser modes declared / not declared]
|
|
22
22
|
Workspace: [yes / yes, n updates available / not installed / declined / not asked]
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
Tracking: [local only / user-selected parts via root .gitignore exceptions]
|
|
24
|
+
Config: .acstack/project.yaml
|
|
25
|
+
Domain map: .acstack/domain-map.yaml ([n] domains / starter – fill in)
|
|
25
26
|
Output style: acstack:ac-writing-style (global) | (project) | not set
|
|
26
27
|
|
|
27
28
|
Health check: [n] pass, [n] fail, [n] info
|
|
@@ -1,6 +1,52 @@
|
|
|
1
1
|
# Setup: row fixes
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[The setup skill](SKILL.md) loads Step 8 on every run and Step 9 for the selected row fixes.
|
|
4
|
+
|
|
5
|
+
## Step 8: Offer the rows that need a fix
|
|
6
|
+
|
|
7
|
+
Build one multi-select question in the question tool (AskUserQuestion with
|
|
8
|
+
`multiSelect: true` on Claude Code). Put one option in it per row you are going
|
|
9
|
+
to offer, and say in each description what the row reported. This is the pre-selection the user sees: only real gaps reach the menu.
|
|
10
|
+
|
|
11
|
+
Offer a row when any of these holds:
|
|
12
|
+
|
|
13
|
+
- Its `status` is `fail`.
|
|
14
|
+
- Its `id` is `preferred-browser-mode`, its `status` is `info`, and
|
|
15
|
+
`.acstack/project.yaml` configures a `frontend` block. The project has a
|
|
16
|
+
frontend and has named no browser mode for it.
|
|
17
|
+
|
|
18
|
+
- Its `id` is `output-style` and its `status` is `info`. The row passes when the
|
|
19
|
+
settings files select `acstack:ac-writing-style`, so `info` means they select
|
|
20
|
+
some other style, or select none.
|
|
21
|
+
|
|
22
|
+
- Its `id` is `frontend-verification` and its `status` is `info`. The project
|
|
23
|
+
configures a frontend and `workflow.frontend_verification` is not `true`.
|
|
24
|
+
|
|
25
|
+
Each of those rules reads the `status` and the `id`. Read neither row's message
|
|
26
|
+
to decide, for the reason Step 7 gives: the message is prose and it gets
|
|
27
|
+
reworded.
|
|
28
|
+
|
|
29
|
+
Add three options at the end of the list, whatever the check reported:
|
|
30
|
+
|
|
31
|
+
- **Re-declare this machine** – invoke the `host` skill. It re-asks every axis,
|
|
32
|
+
required and optional, and starts from the current answers.
|
|
33
|
+
|
|
34
|
+
The check reports an `optional-axis:<key>` row as `info`, never as `fail`.
|
|
35
|
+
So this option is the only way one of them reaches a question.
|
|
36
|
+
|
|
37
|
+
- **Change one setting** – for a key the check has no opinion about, such as
|
|
38
|
+
`workflow.maps.persist`. Point the user at `docs/config-reference.md`, which
|
|
39
|
+
lists every key, its values and its default. Then write the key:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
~/.claude/acstack/bin/acstack config set workflow.maps.persist true
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Do not restate the reference here.
|
|
46
|
+
|
|
47
|
+
- **Skip** – leave everything as it is.
|
|
48
|
+
|
|
49
|
+
## Step 9: Fix one row at a time
|
|
4
50
|
|
|
5
51
|
Five rows describe the machine: `required-axis`, `orchestrator`, `browser-mode`,
|
|
6
52
|
`preferred-browser-mode` and `optional-axis`. Invoke the `host` skill for each of
|
|
@@ -45,7 +91,7 @@ frontend and has not turned browser verification on. Turn it on:
|
|
|
45
91
|
|
|
46
92
|
### 9a. Generate the domain map
|
|
47
93
|
|
|
48
|
-
|
|
94
|
+
`.acstack/domain-map.yaml` maps source paths to spec domains. Spec sync,
|
|
49
95
|
`/acstack:archive`, `/acstack:bootstrap` and `/acstack:pre-commit-review` all
|
|
50
96
|
read it. Without it, every path through spec sync skips in silence, and the
|
|
51
97
|
living specs never update.
|
|
@@ -65,7 +111,7 @@ Guidance for the proposal:
|
|
|
65
111
|
- Leave tests, config, build files and docs unmapped. Consumers skip a path that
|
|
66
112
|
no domain covers.
|
|
67
113
|
|
|
68
|
-
If
|
|
114
|
+
If `.acstack/specs/` already holds domain directories, propose those names first
|
|
69
115
|
and map the paths onto them. Renaming a domain here orphans its `spec.md`.
|
|
70
116
|
|
|
71
117
|
Print the proposal and confirm it with the question tool (AskUserQuestion on Claude Code). Ask "Use this domain map,
|
|
@@ -97,23 +143,24 @@ with. Offer to install it:
|
|
|
97
143
|
npm install -g agent-browser
|
|
98
144
|
```
|
|
99
145
|
|
|
100
|
-
### 9c. Write
|
|
146
|
+
### 9c. Write the browser configuration
|
|
101
147
|
|
|
102
|
-
|
|
148
|
+
Create `.acstack/` if needed, then run `~/.claude/acstack/bin/acstack project-data ensure`.
|
|
149
|
+
Write `.acstack/agent-browser.json` to name the CDP port:
|
|
103
150
|
|
|
104
151
|
```json
|
|
105
152
|
{"cdp": "<cdp_port>"}
|
|
106
153
|
```
|
|
107
154
|
|
|
108
|
-
Take `<cdp_port>` from `frontend.browser.cdp_port` in
|
|
155
|
+
Take `<cdp_port>` from `frontend.browser.cdp_port` in `.acstack/project.yaml`. With
|
|
109
156
|
no value there, the default is `19988` under `mode: remote` and `9555` otherwise.
|
|
110
157
|
The row fails when the two files name different ports, so change one of them.
|
|
111
158
|
|
|
112
159
|
### 9d. Create the knowledge base for verification
|
|
113
160
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
161
|
+
Create `.acstack/verification/VERIFICATION-KNOWLEDGE.md` for the frontend verifier.
|
|
162
|
+
Keep helper programs in `frontend.helpers_dir`; do not move that directory or require it for metadata.
|
|
163
|
+
Run `~/.claude/acstack/bin/acstack project-data ensure` after creating `.acstack/`, then write:
|
|
117
164
|
|
|
118
165
|
```markdown
|
|
119
166
|
# Verification Knowledge Base
|
package/skills/sync/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sync
|
|
3
|
-
description: Update living specs in acstack/specs/ from recent code changes. Called automatically by /commit for retroactive spec updates. Can also be invoked manually.
|
|
3
|
+
description: Update living specs in .acstack/specs/ from recent code changes. Called automatically by /commit for retroactive spec updates. Can also be invoked manually.
|
|
4
4
|
argument-hint: "[file-paths or 'staged']"
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -15,7 +15,7 @@ You **MUST** consider the user input before proceeding (if not empty).
|
|
|
15
15
|
## Purpose
|
|
16
16
|
|
|
17
17
|
This skill analyzes code changes. It updates the cumulative living specs in
|
|
18
|
-
|
|
18
|
+
`.acstack/specs/` to reflect what changed. It is the "fast path" mechanism
|
|
19
19
|
that keeps specs current even when a workflow skips full spec planning.
|
|
20
20
|
|
|
21
21
|
## Step 1: determine change scope
|
|
@@ -81,11 +81,11 @@ domain.
|
|
|
81
81
|
5. Stage what `document` wrote
|
|
82
82
|
|
|
83
83
|
`document` writes `DESIGN.md` and `.impeccable/design.json`. Stage both
|
|
84
|
-
with the commit
|
|
84
|
+
with the commit; stage updated specs only when the user opted into tracking them.
|
|
85
85
|
|
|
86
86
|
## Step 3: map changes to domains
|
|
87
87
|
|
|
88
|
-
1. Read
|
|
88
|
+
1. Read `.acstack/domain-map.yaml`
|
|
89
89
|
2. Match changed files against domain path patterns
|
|
90
90
|
3. Group changes by domain
|
|
91
91
|
4. Skip files outside all domains (tests, config, docs)
|
|
@@ -96,7 +96,7 @@ If the diff affects no domains, report "No spec-relevant changes". Then exit.
|
|
|
96
96
|
|
|
97
97
|
For each affected domain:
|
|
98
98
|
|
|
99
|
-
1. Read
|
|
99
|
+
1. Read `.acstack/specs/[domain]/spec.md` (if it exists)
|
|
100
100
|
2. Analyze changes:
|
|
101
101
|
- New functions/endpoints/components -> ADDED requirements
|
|
102
102
|
- Modified signatures or behavior -> MODIFIED requirements
|
|
@@ -109,9 +109,9 @@ Write each functional requirement (FR) entry per the `writing` skill.
|
|
|
109
109
|
```markdown
|
|
110
110
|
### FR-014: The handoff anchor loads once
|
|
111
111
|
|
|
112
|
-
- **Description**: The SessionStart hook injects
|
|
113
|
-
compaction, then moves the file into
|
|
114
|
-
- **Behavior**: Given
|
|
112
|
+
- **Description**: The SessionStart hook injects `.acstack/HANDOFF.md` after a
|
|
113
|
+
compaction, then moves the file into `.acstack/handoffs/`.
|
|
114
|
+
- **Behavior**: Given `.acstack/HANDOFF.md` carries the `acstack_handoff`
|
|
115
115
|
marker, When a session starts with source `compact`, Then the hook injects
|
|
116
116
|
the file and retires it.
|
|
117
117
|
- **Source**: `hooks/session-start-handoff.sh`
|
|
@@ -129,8 +129,8 @@ Write each merged FR per the `writing` skill.
|
|
|
129
129
|
|
|
130
130
|
## Step 6: glossary check
|
|
131
131
|
|
|
132
|
-
Glossaries live in
|
|
133
|
-
|
|
132
|
+
Glossaries live in `.acstack/CONTEXT.md` (cross-domain terms) and
|
|
133
|
+
`.acstack/specs/[domain]/CONTEXT.md` (domain terms). If neither exists, skip.
|
|
134
134
|
|
|
135
135
|
For each glossary term, check the diff. Look for a renamed or deleted
|
|
136
136
|
identifier that matches it: function, class, table, config key, route. If
|
|
@@ -162,7 +162,8 @@ When `/commit` calls this skill:
|
|
|
162
162
|
|
|
163
163
|
1. Receives the staged diff as context
|
|
164
164
|
2. Runs silently (no user prompts)
|
|
165
|
-
3. Returns
|
|
165
|
+
3. Returns modified specs for staging only when native `.gitignore` rules allow tracking
|
|
166
|
+
- Keep ignored specs updated locally; never force-add them or change the Git index to bypass the user's choice
|
|
166
167
|
4. Adds `DESIGN.md` and `.impeccable/design.json` when Step 2 refreshed them
|
|
167
168
|
5. Outputs minimal detail so it does not interrupt the commit flow
|
|
168
169
|
|
|
@@ -58,7 +58,7 @@ flowchart TD
|
|
|
58
58
|
|
|
59
59
|
This is **machine-level, not per-project**. It installs binaries and writes
|
|
60
60
|
keybindings for the user account, so it does not belong in
|
|
61
|
-
|
|
61
|
+
`.acstack/project.yaml`.
|
|
62
62
|
|
|
63
63
|
Count components when you mean config keys, and tools when you mean binaries.
|
|
64
64
|
The config holds twelve component sections, plus an `enabled` master switch
|
|
@@ -79,6 +79,7 @@ The two files this skill works with:
|
|
|
79
79
|
- **Config**: `~/.config/acstack/terminal-workspace.yaml`, copied from `assets/terminal-workspace/config.example.yaml`
|
|
80
80
|
- **Script**: `assets/terminal-workspace/setup.sh` in this plugin
|
|
81
81
|
|
|
82
|
+
Yazi's `i` opens Markdown in Frogmouth (`pipx install frogmouth`); existing `i` bindings take precedence, and `e` keeps editing in `$EDITOR`.
|
|
82
83
|
The keys, on one page: [docs/terminal-workspace-keys.md](../../docs/terminal-workspace-keys.md).
|
|
83
84
|
|
|
84
85
|
Background and why each piece is there:
|
|
@@ -7,7 +7,7 @@ description: Test placement rules and framework conventions. Invoke before writi
|
|
|
7
7
|
|
|
8
8
|
## Decision Tree: Where Does My Test Go?
|
|
9
9
|
|
|
10
|
-
Read
|
|
10
|
+
Read `.acstack/project.yaml` for `directories.source`, `directories.tests`, and `frontend` config.
|
|
11
11
|
|
|
12
12
|
```
|
|
13
13
|
Backend code? → <tests-dir>/<mirror-source-path>/test_<module>.py
|
|
@@ -25,7 +25,7 @@ Mirror the source directory structure. Example: `src/auth/sessions.py` → `test
|
|
|
25
25
|
- Shared fixtures → `<tests-dir>/conftest.py` (Python) or shared setup files
|
|
26
26
|
- Use markers for slow/integration tests (configured in `test_markers.exclude`)
|
|
27
27
|
- Run with the `commands.test` command from project.yaml
|
|
28
|
-
- Baseline: `.test-baseline` – count must never drop
|
|
28
|
+
- Baseline: `.acstack/.test-baseline` – count must never drop
|
|
29
29
|
|
|
30
30
|
## Layer 2: Frontend Unit Tests
|
|
31
31
|
|