acstack 0.53.1 → 0.54.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 +11 -11
- package/agents/codex/frontend-verifier.toml +8 -7
- package/agents/codex/task-checker.toml +1 -1
- package/agents/codex/task-executor.toml +1 -1
- package/agents/codex/test-writer.toml +1 -1
- package/agents/frontend-verifier.md +8 -7
- package/agents/task-checker.md +1 -1
- package/agents/task-executor.md +1 -1
- package/agents/test-writer.md +1 -1
- package/assets/playwriter-bridge/doctor.ps1 +1 -1
- package/assets/playwriter-bridge/register-tasks.ps1 +4 -4
- package/assets/terminal-workspace/config.example.yaml +2 -2
- package/assets/terminal-workspace/helpers/acstack-bridge +3 -1
- package/assets/terminal-workspace/helpers/acstack-db +1 -1
- package/assets/terminal-workspace/helpers/acstack-md +4 -2
- package/assets/terminal-workspace/helpers/acstack-md-lib +2 -2
- package/assets/terminal-workspace/helpers/acstack-open +1 -1
- package/assets/terminal-workspace/lib/apply-herdr-numbers.sh +1 -1
- package/assets/terminal-workspace/lib/apply-tools.sh +1 -1
- package/assets/terminal-workspace/lib/apply-tuicr.sh +2 -2
- package/assets/terminal-workspace/lib/commands.sh +1 -1
- package/assets/terminal-workspace/lib/helper-install.sh +1 -1
- package/assets/terminal-workspace/setup.sh +6 -1
- package/cli/dist/index.js +697 -509
- package/cli/dist/index.js.map +4 -4
- package/cli/package.json +1 -1
- package/docs/config-reference.md +129 -87
- package/docs/dev-setups.md +4 -4
- package/docs/terminal-workspace.md +7 -6
- package/docs/workflows.md +13 -12
- package/examples/design-doc/acstack/README.md +3 -3
- package/examples/design-doc/acstack/journey.md +1 -1
- package/examples/design-doc/acstack/publication.md +1 -1
- package/hooks/context-pressure.sh +6 -2
- package/hooks/lib/read-guard.mjs +25 -21
- package/hooks/project-data.sh +5 -34
- package/hooks/session-start-handoff.sh +11 -22
- package/hooks/session-start.sh +5 -6
- package/orchestrator/AGENTS.md +30 -25
- package/package.json +1 -1
- package/pi/agents/frontend-verifier.md +8 -7
- package/pi/agents/task-checker.md +1 -1
- package/pi/agents/task-executor.md +1 -1
- package/pi/agents/test-writer.md +1 -1
- package/pi/extension.ts +39 -57
- 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 +20 -18
- package/skills/bootstrap/SKILL.md +6 -6
- package/skills/bridge/SKILL-VM.md +5 -5
- package/skills/bridge/SKILL-WINDOWS.md +1 -1
- package/skills/browser-verify/SKILL.md +6 -6
- package/skills/commit/SKILL.md +8 -8
- package/skills/compact-and-continue/SKILL.md +11 -9
- package/skills/design-doc/SKILL.md +8 -5
- package/skills/explore/SKILL.md +1 -1
- package/skills/grilling/SKILL.md +4 -3
- package/skills/handoff/SKILL.md +4 -4
- package/skills/host/SKILL.md +2 -2
- package/skills/host/detect-host.sh +8 -4
- package/skills/host/herdr.md +1 -1
- package/skills/host/install-herdr-block.sh +1 -1
- package/skills/host/notes.md +5 -4
- package/skills/host/questions.md +1 -1
- package/skills/host/report.md +2 -2
- package/skills/implement/SKILL.md +6 -5
- package/skills/implement/decision-log.md +10 -15
- package/skills/implement/design-pass.md +2 -2
- package/skills/map/SKILL.md +5 -3
- package/skills/map/frontend.md +2 -2
- package/skills/map/materialising.md +5 -3
- package/skills/map/trackers/files.md +6 -4
- package/skills/pre-commit-review/SKILL.md +3 -3
- package/skills/quick-fix/SKILL.md +1 -1
- package/skills/record-context/SKILL.md +6 -6
- package/skills/setup/SKILL.md +20 -11
- package/skills/setup/browser.md +2 -2
- package/skills/setup/first-run.md +14 -16
- package/skills/setup/report.md +4 -3
- package/skills/setup/row-fixes.md +7 -8
- package/skills/sync/SKILL.md +14 -12
- package/skills/terminal-workspace/SKILL.md +4 -4
- package/skills/terminal-workspace/headless-clipboard.md +1 -1
- package/skills/terminal-workspace/turn-off-and-update.md +1 -1
- package/skills/test-conventions/SKILL.md +2 -2
package/skills/handoff/SKILL.md
CHANGED
|
@@ -53,7 +53,7 @@ its answer looks wrong. It says why a child must stop, and what it checks.
|
|
|
53
53
|
## First: is this yours to invoke?
|
|
54
54
|
|
|
55
55
|
If the user asked for a handoff, proceed. If you invoke it on your own
|
|
56
|
-
initiative, first read `workflow.handoff.self_invoke` from
|
|
56
|
+
initiative, first read `workflow.handoff.self_invoke` from `project.yaml` in the folder `~/.claude/acstack/bin/acstack project-data path` prints.
|
|
57
57
|
|
|
58
58
|
If it is `false`, stop. Tell the user a handoff looks warranted and why. Ask
|
|
59
59
|
permission.
|
|
@@ -101,8 +101,8 @@ it should run the command.
|
|
|
101
101
|
| Map state and reading order | `~/.claude/acstack/bin/acstack node walk --map <name>` (reading order of the map) |
|
|
102
102
|
| What can be worked next | `~/.claude/acstack/bin/acstack node frontier --map <name>` (what is workable now) |
|
|
103
103
|
| Files in flight | `git status --short` and `git diff` |
|
|
104
|
-
| Test baseline, last result |
|
|
105
|
-
| What the code does | the living specs in
|
|
104
|
+
| Test baseline, last result | `<project folder>/.test-baseline` and referenced check logs; reuse valid evidence under the shared policy |
|
|
105
|
+
| What the code does | the living specs in `<project folder>/specs/` |
|
|
106
106
|
|
|
107
107
|
On GitHub, `--map` refuses – pipe `gh issue list` into `--stdin` per the
|
|
108
108
|
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 `<project folder>/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
|
@@ -28,8 +28,8 @@ Three terms, before they get used:
|
|
|
28
28
|
|
|
29
29
|
## Why this is per machine, not per project
|
|
30
30
|
|
|
31
|
-
The answers go to the ACStack CLI's global config, never to
|
|
32
|
-
|
|
31
|
+
The answers go to the ACStack CLI's global config, never to the
|
|
32
|
+
project's `project.yaml`. Read [`notes.md`](notes.md) when the user asks why.
|
|
33
33
|
|
|
34
34
|
## What this skill installs
|
|
35
35
|
|
|
@@ -245,11 +245,15 @@ project_root="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
|
|
245
245
|
# A top-level `frontend:` key in the project config is what turns on frontend
|
|
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
|
+
# The config lives in the repository's project folder, which the CLI reports.
|
|
248
249
|
has_frontend="false"
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
250
|
+
acstack_cli="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)/cli/bin/acstack.js"
|
|
251
|
+
project_folder=""
|
|
252
|
+
if [ -n "$project_root" ] && command -v node >/dev/null 2>&1; then
|
|
253
|
+
project_folder="$(node "$acstack_cli" project-data path 2>/dev/null || true)"
|
|
254
|
+
fi
|
|
255
|
+
if [ -n "$project_folder" ] && grep -q '^frontend:' "${project_folder}/project.yaml" 2>/dev/null; then
|
|
256
|
+
has_frontend="true"
|
|
253
257
|
fi
|
|
254
258
|
|
|
255
259
|
# --- output ----------------------------------------------------------------
|
package/skills/host/herdr.md
CHANGED
|
@@ -69,7 +69,7 @@ Copy your own if you want them. Nothing in ACStack needs any of them.
|
|
|
69
69
|
`assets/terminal-workspace/setup.sh apply` fences `[keys]`, one
|
|
70
70
|
`[[keys.command]]` per binding, and `[worktrees]` between these same two
|
|
71
71
|
markers. It takes the directory from `herdr.worktrees_directory` in
|
|
72
|
-
`~/.
|
|
72
|
+
`~/.acstack/terminal-workspace.yaml`. A machine that has run it needs
|
|
73
73
|
nothing from this installer.
|
|
74
74
|
|
|
75
75
|
The installer therefore leaves that block alone. It reports the step as skipped
|
|
@@ -348,7 +348,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
348
348
|
err "$CONFIG holds a block between these markers that this script did not write."
|
|
349
349
|
err "Besides $BLOCK_TABLE that block defines: $FOREIGN_TABLES"
|
|
350
350
|
err "terminal-workspace setup.sh writes that block, and it carries the keymap and the popup key bindings. Replacing it with the four lines this script writes would delete all of it."
|
|
351
|
-
err "setup.sh writes $BLOCK_TABLE itself, from herdr.worktrees_directory in ~/.
|
|
351
|
+
err "setup.sh writes $BLOCK_TABLE itself, from herdr.worktrees_directory in ~/.acstack/terminal-workspace.yaml."
|
|
352
352
|
refuse "set the directory there and run terminal-workspace setup.sh apply instead. Nothing has been changed."
|
|
353
353
|
fi
|
|
354
354
|
else
|
package/skills/host/notes.md
CHANGED
|
@@ -16,11 +16,12 @@ None of that is a property of the project, so none of it belongs in the
|
|
|
16
16
|
project's config file.
|
|
17
17
|
|
|
18
18
|
The answers therefore go to the global config of the ACStack command-line
|
|
19
|
-
interface. That is a JSON file at `~/.
|
|
20
|
-
`$
|
|
19
|
+
interface. That is a JSON file at `~/.acstack/config.json`, or under
|
|
20
|
+
`$ACSTACK_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 the project's `project.yaml`, which sits in the project
|
|
24
|
+
folder that `~/.claude/acstack/bin/acstack project-data path` prints.
|
|
24
25
|
|
|
25
26
|
Project concerns stay in `project.yaml`. In particular
|
|
26
27
|
`frontend.browser.mode` stays there as the *project's preference*, while
|
|
@@ -77,7 +78,7 @@ git worktrees and say so. An environment variable for an orchestrator that was
|
|
|
77
78
|
never declared is worth a warning, not a refusal.
|
|
78
79
|
|
|
79
80
|
**The host declares, the project prefers.** `host.browser.*` says what this
|
|
80
|
-
machine can do. `frontend.browser.mode` in
|
|
81
|
+
machine can do. `frontend.browser.mode` in `<project folder>/project.yaml` says what the
|
|
81
82
|
project would like.
|
|
82
83
|
|
|
83
84
|
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 `project.yaml` in the project folder 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
|
package/skills/host/report.md
CHANGED
|
@@ -36,7 +36,7 @@ Get the `Config:` line by running the command, not by writing the usual path in:
|
|
|
36
36
|
~/.claude/acstack/bin/acstack config path
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
`~/.
|
|
40
|
-
the `
|
|
39
|
+
`~/.acstack/config.json` is only where the file lands by default. Setting
|
|
40
|
+
the `ACSTACK_HOME` environment variable moves it. On a machine that sets that
|
|
41
41
|
variable, a hardcoded path in the report would point at a file that does not
|
|
42
42
|
exist.
|
|
@@ -22,7 +22,8 @@ $ARGUMENTS
|
|
|
22
22
|
### 1. Find the work
|
|
23
23
|
|
|
24
24
|
Check the configured tracker for maps (`workflow.maps.tracker` in
|
|
25
|
-
|
|
25
|
+
`<project folder>/project.yaml`, where the project folder is the path
|
|
26
|
+
`~/.claude/acstack/bin/acstack project-data path` prints; the map skill's `trackers/` docs declare the
|
|
26
27
|
operations – files backend shown below).
|
|
27
28
|
|
|
28
29
|
**A map exists** (or `$ARGUMENTS` names one):
|
|
@@ -55,7 +56,7 @@ small unit of work, and nothing has to declare it small.
|
|
|
55
56
|
|
|
56
57
|
### 2. Read project configuration
|
|
57
58
|
|
|
58
|
-
Read
|
|
59
|
+
Read `<project folder>/project.yaml` for build/test/lint commands and directory paths.
|
|
59
60
|
|
|
60
61
|
### 3. Create feature branch
|
|
61
62
|
|
|
@@ -125,11 +126,11 @@ Apply the shared Implementation discipline to the claimed node or bare request.
|
|
|
125
126
|
|
|
126
127
|
|
|
127
128
|
**Decision log**: on afk nodes, append one row per decision point to
|
|
128
|
-
`<
|
|
129
|
+
`<project folder>/decision-logs/<name>.tsv`. A decision point is a fork chosen, a
|
|
129
130
|
unit verified, a revert, or a blocker.
|
|
130
131
|
|
|
131
|
-
Read `decision-log.md` before the first row. It holds
|
|
132
|
-
|
|
132
|
+
Read `decision-log.md` before the first row. It holds where the log lives and
|
|
133
|
+
the columns.
|
|
133
134
|
|
|
134
135
|
**Parallelism**: use teams when independent nodes benefit from parallel work.
|
|
135
136
|
Assign non-overlapping files, and schedule shared-file changes sequentially.
|
|
@@ -18,25 +18,20 @@ gets no row.
|
|
|
18
18
|
|
|
19
19
|
## Where the log lives
|
|
20
20
|
|
|
21
|
-
The log is one file per map, in the
|
|
22
|
-
`<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
deletes its gitignored files, so a log there vanishes before `archive` reads
|
|
27
|
-
it. Find the main checkout from any worktree:
|
|
21
|
+
The log is one file per map, in the project folder:
|
|
22
|
+
`<project folder>/decision-logs/<name>.tsv`. The project folder is the path
|
|
23
|
+
`~/.claude/acstack/bin/acstack project-data path` prints. Every worktree of the
|
|
24
|
+
repository shares it, so a log survives when its worktree is removed and
|
|
25
|
+
`archive` can still read it. The `<name>` is the map name you pass to `--map`.
|
|
28
26
|
|
|
29
27
|
```bash
|
|
30
|
-
|
|
28
|
+
log="$(~/.claude/acstack/bin/acstack project-data path)/decision-logs/<name>.tsv"
|
|
31
29
|
```
|
|
32
30
|
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
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
|
|
31
|
+
- If `project-data path` fails because legacy project records exist, stop and pass its message on
|
|
32
|
+
- Tell the user to update installed tools, stop old agents and review servers, and run `acstack project-data migrate` before restarting
|
|
33
|
+
- Never move records automatically or create a partial project folder to work around legacy data
|
|
34
|
+
- Create `decision-logs/` in the project folder if it is missing
|
|
40
35
|
|
|
41
36
|
## What a row holds
|
|
42
37
|
|
|
@@ -32,7 +32,7 @@ Load that context before your first edit under `frontend.directory`. Load it onc
|
|
|
32
32
|
|
|
33
33
|
**Check the design gate first**
|
|
34
34
|
|
|
35
|
-
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 `<project folder>/project.yaml` turns the gate on; the project folder is the path `~/.claude/acstack/bin/acstack project-data path` prints. Ask acstack for the answer:
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
38
|
~/.claude/acstack/bin/acstack design-gate --json
|
|
@@ -94,7 +94,7 @@ impeccable installs its own PostToolUse hook, a check Claude Code runs right aft
|
|
|
94
94
|
- Follow the shared Implementation discipline in `orchestrator/AGENTS.md`
|
|
95
95
|
- The verification owner gathers the file list, completes static checks, and handles the detector
|
|
96
96
|
- A delegated task-checker may own this work, but its presence is optional
|
|
97
|
-
- Read
|
|
97
|
+
- Read `<project folder>/project.yaml` before deriving paths
|
|
98
98
|
- This pass requires a configured `frontend`
|
|
99
99
|
- `frontend.directory` defaults to `frontend/` when omitted
|
|
100
100
|
- If the project configures no frontend, warn that `frontend.directory` is missing and skip this pass
|
package/skills/map/SKILL.md
CHANGED
|
@@ -23,7 +23,9 @@ 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
|
-
|
|
26
|
+
ACStack keeps project data in the project folder, the path
|
|
27
|
+
`~/.claude/acstack/bin/acstack project-data path` prints.
|
|
28
|
+
`workflow.maps.tracker` in `<project folder>/project.yaml` (`github` or `files`) records
|
|
27
29
|
the project's choice. If the key names a backend, read the matching doc and use
|
|
28
30
|
its operations. If the key is absent, pick at materialisation time – the moment
|
|
29
31
|
you first write the map's nodes down.
|
|
@@ -33,7 +35,7 @@ choice with the user. Then write the key, so later sessions need not re-decide.
|
|
|
33
35
|
## Which mode
|
|
34
36
|
|
|
35
37
|
One command runs two modes, and what already exists picks between them. Check
|
|
36
|
-
the configured tracker for existing maps – `ls
|
|
38
|
+
the configured tracker for existing maps – `ls "$(~/.claude/acstack/bin/acstack project-data path)/maps/"` on the files
|
|
37
39
|
backend, `gh label list --search "map:" --json name` on GitHub.
|
|
38
40
|
|
|
39
41
|
If `$ARGUMENTS` names a map, or exactly one exists, work its frontier – the
|
|
@@ -51,7 +53,7 @@ still one map.
|
|
|
51
53
|
|
|
52
54
|
2. **Load the frontend branch on a frontend destination.** `frontend.md`
|
|
53
55
|
beside this skill holds five more rules. Read it when the destination
|
|
54
|
-
touches `frontend.directory`, the path in
|
|
56
|
+
touches `frontend.directory`, the path in `<project folder>/project.yaml` where the
|
|
55
57
|
frontend lives. Every other map skips it.
|
|
56
58
|
|
|
57
59
|
3. **Open with a breadth-first grill.** Work the conversation frontier in
|
package/skills/map/frontend.md
CHANGED
|
@@ -4,8 +4,8 @@ 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
|
|
8
|
-
lives.
|
|
7
|
+
`frontend.directory`, the path in `<project folder>/project.yaml` where the frontend
|
|
8
|
+
lives. The project folder is the path `acstack project-data path` prints.
|
|
9
9
|
|
|
10
10
|
Two plugins appear in the rules below.
|
|
11
11
|
|
|
@@ -65,10 +65,12 @@ operation. First the root:
|
|
|
65
65
|
The root is a parent too, and it draws the whole map.
|
|
66
66
|
|
|
67
67
|
- When a design is required:
|
|
68
|
-
- Record `Design entry: <
|
|
68
|
+
- Record `Design entry: <path>` in the root node body
|
|
69
|
+
- Write the path relative to the project folder, such as `designs/<id>/design.yaml`, or relative to the repository for a design kept in the repository
|
|
70
|
+
- ACStack resolves it against the project folder first, then the current checkout
|
|
69
71
|
- Bind the entry back to the map with `planning: {tracker: files | github, map: <name>}`
|
|
70
72
|
- Require `design-review status` to return that same `planning` binding before using its approval for this map
|
|
71
73
|
- Record proposals in the node body's `## Design contributions` section using the format in `/acstack:design-doc`
|
|
72
74
|
- Reconcile proposals and saved feedback explicitly; surface conflicts as decision nodes
|
|
73
|
-
- On the files backend,
|
|
74
|
-
([`trackers/files.md`](trackers/files.md) gives the
|
|
75
|
+
- On the files backend, nodes live in `<project folder>/maps/`, outside the repository unless the project uses tracked mode
|
|
76
|
+
([`trackers/files.md`](trackers/files.md) gives the details).
|
|
@@ -1,16 +1,18 @@
|
|
|
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 `<project folder>/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
|
-
The
|
|
9
|
-
|
|
8
|
+
The project folder is the path `~/.claude/acstack/bin/acstack project-data path`
|
|
9
|
+
prints. In global mode, the default, it sits outside the repository, so nodes
|
|
10
|
+
are never committed. In tracked mode it is the main checkout's committed
|
|
11
|
+
`.acstack/`, and the developer decides what to commit.
|
|
10
12
|
|
|
11
13
|
CLI path: `~/.claude/acstack/bin/acstack`
|
|
12
14
|
|
|
13
|
-
To enumerate a project's maps: `ls
|
|
15
|
+
To enumerate a project's maps: `ls "$(~/.claude/acstack/bin/acstack project-data path)/maps/"`.
|
|
14
16
|
|
|
15
17
|
## The four operations
|
|
16
18
|
|
|
@@ -59,7 +59,7 @@ git status --short
|
|
|
59
59
|
git log --oneline -3 # recent context
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
Read
|
|
62
|
+
Read `<project folder>/project.yaml` to understand the project's directory layout, commands, and conventions. ACStack keeps it in the project folder, the path `~/.claude/acstack/bin/acstack project-data path` prints.
|
|
63
63
|
|
|
64
64
|
Categorize changed files into scopes using the project configuration:
|
|
65
65
|
|
|
@@ -86,9 +86,9 @@ Read `../../output-styles/ac-writing-style.md` relative to this skill directory;
|
|
|
86
86
|
|
|
87
87
|
```
|
|
88
88
|
Read the living specs relevant to this change:
|
|
89
|
-
- Check
|
|
89
|
+
- Check the <project folder>/specs/ directory listing
|
|
90
90
|
- Read spec.md files for domains touched by the changed files
|
|
91
|
-
(use
|
|
91
|
+
(use <project folder>/domain-map.yaml to map files -> domains)
|
|
92
92
|
- Extract documented conventions, patterns, and requirements (FR-NNN entries)
|
|
93
93
|
Report: list of project conventions and patterns relevant to these changes.
|
|
94
94
|
```
|
|
@@ -95,7 +95,7 @@ Apply the shared policy to the minimal fix.
|
|
|
95
95
|
## Step 6: Verify
|
|
96
96
|
|
|
97
97
|
Use focused regression checks while fixing. One verification owner gathers the
|
|
98
|
-
required final checks from
|
|
98
|
+
required final checks from `project.yaml` in the project folder, the path `~/.claude/acstack/bin/acstack project-data path` prints, under Build verification in
|
|
99
99
|
`orchestrator/AGENTS.md`, reusing valid evidence rather than rerunning commands
|
|
100
100
|
for every fix or handoff.
|
|
101
101
|
|
|
@@ -25,7 +25,7 @@ an obvious choice buries the ones that matter.
|
|
|
25
25
|
|
|
26
26
|
### Writing one
|
|
27
27
|
|
|
28
|
-
- Path:
|
|
28
|
+
- Path: `<project folder>/decisions/NNNN-slug.md`, in the project folder, the path `~/.claude/acstack/bin/acstack project-data path` prints. 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
|
+
`<project folder>/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 `<project folder>/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 `<project folder>/CONTEXT.md`.
|
|
84
|
+
- **Domain terms** go in `<project folder>/specs/<domain>/CONTEXT.md`, beside that
|
|
85
|
+
domain's `spec.md`. Find the domain in `<project folder>/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
|
|
3
|
+
description: Set up ACStack in a project, and change how an already configured project is set up. With no project.yaml in the project folder 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{"
|
|
21
|
+
HOST["Step 1<br/>declare this machine"] --> FORK{"project.yaml in the<br/>project folder?"}
|
|
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"]
|
|
@@ -74,16 +74,25 @@ answers. Come back to Step 2 when it finishes.
|
|
|
74
74
|
|
|
75
75
|
## Step 2: Choose the path
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
Never move them silently or run Git index commands.
|
|
77
|
+
ACStack keeps project data in the project folder, one per repository and shared
|
|
78
|
+
by all of its worktrees. `acstack project-data path` prints its absolute path,
|
|
79
|
+
even before the folder exists. These files write its parts as
|
|
80
|
+
`<project folder>/project.yaml` and so on.
|
|
82
81
|
|
|
83
82
|
```bash
|
|
84
|
-
|
|
83
|
+
project="$(~/.claude/acstack/bin/acstack project-data path)" &&
|
|
84
|
+
{ test -f "$project/project.yaml" && echo present || echo absent; }
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
+
If `project-data path` fails, show its message and stop. Outside a Git
|
|
88
|
+
repository there is no project folder. For legacy project records, orphaned
|
|
89
|
+
entries, or conflicts, the message names the `acstack project-data` command
|
|
90
|
+
that fixes it.
|
|
91
|
+
|
|
92
|
+
For legacy records, explain the explicit migration procedure in
|
|
93
|
+
`docs/config-reference.md` before proceeding. Never move data silently or run
|
|
94
|
+
Git index commands.
|
|
95
|
+
|
|
87
96
|
- **absent** – take the first-run path. Go to Step 3.
|
|
88
97
|
- **present** – take the re-run path. Go straight to Step 7.
|
|
89
98
|
|
|
@@ -118,7 +127,7 @@ CLI. An agent testing this branch before the release runs
|
|
|
118
127
|
It prints one object to standard output and nothing else:
|
|
119
128
|
|
|
120
129
|
```json
|
|
121
|
-
{"checks": [{"id": "domain-map", "status": "pass", "message": "
|
|
130
|
+
{"checks": [{"id": "domain-map", "status": "pass", "message": "domain-map.yaml maps 4 domains"}]}
|
|
122
131
|
```
|
|
123
132
|
|
|
124
133
|
Each `status` is `pass`, `fail` or `info`. The exit codes carry the same news:
|
|
@@ -199,8 +208,8 @@ Read [`report.md`](report.md) on every run, as the last step.
|
|
|
199
208
|
- `acstack config set <key> <value>` owns the single-key change, in both files.
|
|
200
209
|
It reads the key to decide which one.
|
|
201
210
|
|
|
202
|
-
A `host.*` key goes to the global config at `~/.
|
|
203
|
-
Every other key it knows goes to
|
|
211
|
+
A `host.*` key goes to the global config at `~/.acstack/config.json`.
|
|
212
|
+
Every other key it knows goes to `<project folder>/project.yaml`, and the write keeps
|
|
204
213
|
the comments and the key order. It refuses a key neither schema knows, so
|
|
205
214
|
never fall back to editing the file.
|
|
206
215
|
|
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 `<project folder>/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
|
+
`<project folder>/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,6 +1,6 @@
|
|
|
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 `project.yaml` in the project folder, so the first-run path runs Steps 3 to 6 from here.
|
|
4
4
|
|
|
5
5
|
First-run setup does not migrate legacy records; use the procedure in `docs/config-reference.md`.
|
|
6
6
|
That reference also lists every configuration key.
|
|
@@ -81,23 +81,21 @@ paths reach Step 10 through the health check.
|
|
|
81
81
|
|
|
82
82
|
## Step 6: Write the config
|
|
83
83
|
|
|
84
|
-
1. Create the
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
|
|
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
|
|
84
|
+
1. Create the project folder:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
mkdir -p "$(~/.claude/acstack/bin/acstack project-data path)"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
2. Write `<project folder>/project.yaml` from the profile and the answers.
|
|
91
|
+
3. Ask where the project's records should live, with a structured question.
|
|
92
|
+
- **Outside the repository (Recommended)** – global mode, the default. The repository holds no ACStack files and needs no `.gitignore` rules
|
|
93
|
+
- **Committed with the repository** – tracked mode. Run `~/.claude/acstack/bin/acstack project-data mode tracked`, then tell the user to commit `.acstack/` from the main checkout
|
|
94
|
+
- Never stage or commit `.acstack/` yourself
|
|
95
|
+
4. Leave the project CLAUDE.md alone. The SessionStart hook loads the
|
|
98
96
|
orchestrator instructions.
|
|
99
97
|
|
|
100
|
-
|
|
98
|
+
5. Remove a legacy `@import` line from the project CLAUDE.md, if one is there.
|
|
101
99
|
It points at `.../plugins/cache/ac8318740-plugins/acstack/<version>/CLAUDE.md`.
|
|
102
100
|
|
|
103
101
|
Then go to Step 7. Everything a fresh project still lacks shows up there as a
|
package/skills/setup/report.md
CHANGED
|
@@ -20,9 +20,10 @@ 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
|
-
|
|
25
|
-
|
|
23
|
+
Mode: [global / tracked]
|
|
24
|
+
Project data: [absolute path from acstack project-data path]
|
|
25
|
+
Config: <project folder>/project.yaml
|
|
26
|
+
Domain map: <project folder>/domain-map.yaml ([n] domains / starter – fill in)
|
|
26
27
|
Output style: acstack:ac-writing-style (global) | (project) | not set
|
|
27
28
|
|
|
28
29
|
Health check: [n] pass, [n] fail, [n] info
|
|
@@ -12,7 +12,7 @@ Offer a row when any of these holds:
|
|
|
12
12
|
|
|
13
13
|
- Its `status` is `fail`.
|
|
14
14
|
- Its `id` is `preferred-browser-mode`, its `status` is `info`, and
|
|
15
|
-
|
|
15
|
+
`<project folder>/project.yaml` (in the project folder `acstack project-data path` prints) configures a `frontend` block. The project has a
|
|
16
16
|
frontend and has named no browser mode for it.
|
|
17
17
|
|
|
18
18
|
- Its `id` is `output-style` and its `status` is `info`. The row passes when the
|
|
@@ -91,7 +91,7 @@ frontend and has not turned browser verification on. Turn it on:
|
|
|
91
91
|
|
|
92
92
|
### 9a. Generate the domain map
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
`<project folder>/domain-map.yaml` maps source paths to spec domains. Spec sync,
|
|
95
95
|
`/acstack:archive`, `/acstack:bootstrap` and `/acstack:pre-commit-review` all
|
|
96
96
|
read it. Without it, every path through spec sync skips in silence, and the
|
|
97
97
|
living specs never update.
|
|
@@ -111,7 +111,7 @@ Guidance for the proposal:
|
|
|
111
111
|
- Leave tests, config, build files and docs unmapped. Consumers skip a path that
|
|
112
112
|
no domain covers.
|
|
113
113
|
|
|
114
|
-
If
|
|
114
|
+
If `<project folder>/specs/` already holds domain directories, propose those names first
|
|
115
115
|
and map the paths onto them. Renaming a domain here orphans its `spec.md`.
|
|
116
116
|
|
|
117
117
|
Print the proposal and confirm it with the question tool (AskUserQuestion on Claude Code). Ask "Use this domain map,
|
|
@@ -145,22 +145,21 @@ npm install -g agent-browser
|
|
|
145
145
|
|
|
146
146
|
### 9c. Write the browser configuration
|
|
147
147
|
|
|
148
|
-
|
|
149
|
-
Write `.acstack/agent-browser.json` to name the CDP port:
|
|
148
|
+
Write `<project folder>/agent-browser.json` to name the CDP port:
|
|
150
149
|
|
|
151
150
|
```json
|
|
152
151
|
{"cdp": "<cdp_port>"}
|
|
153
152
|
```
|
|
154
153
|
|
|
155
|
-
Take `<cdp_port>` from `frontend.browser.cdp_port` in
|
|
154
|
+
Take `<cdp_port>` from `frontend.browser.cdp_port` in `<project folder>/project.yaml`. With
|
|
156
155
|
no value there, the default is `19988` under `mode: remote` and `9555` otherwise.
|
|
157
156
|
The row fails when the two files name different ports, so change one of them.
|
|
158
157
|
|
|
159
158
|
### 9d. Create the knowledge base for verification
|
|
160
159
|
|
|
161
|
-
Create
|
|
160
|
+
Create `<project folder>/verification/VERIFICATION-KNOWLEDGE.md` for the frontend verifier.
|
|
162
161
|
Keep helper programs in `frontend.helpers_dir`; do not move that directory or require it for metadata.
|
|
163
|
-
|
|
162
|
+
Write:
|
|
164
163
|
|
|
165
164
|
```markdown
|
|
166
165
|
# Verification Knowledge Base
|