acstack 0.53.1 → 0.54.1

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.
Files changed (87) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +11 -11
  3. package/agents/codex/frontend-verifier.toml +8 -7
  4. package/agents/codex/task-checker.toml +1 -1
  5. package/agents/codex/task-executor.toml +1 -1
  6. package/agents/codex/test-writer.toml +1 -1
  7. package/agents/frontend-verifier.md +8 -7
  8. package/agents/task-checker.md +1 -1
  9. package/agents/task-executor.md +1 -1
  10. package/agents/test-writer.md +1 -1
  11. package/assets/playwriter-bridge/doctor.ps1 +1 -1
  12. package/assets/playwriter-bridge/register-tasks.ps1 +4 -4
  13. package/assets/terminal-workspace/config.example.yaml +2 -2
  14. package/assets/terminal-workspace/helpers/acstack-bridge +3 -1
  15. package/assets/terminal-workspace/helpers/acstack-db +1 -1
  16. package/assets/terminal-workspace/helpers/acstack-md +4 -2
  17. package/assets/terminal-workspace/helpers/acstack-md-lib +2 -2
  18. package/assets/terminal-workspace/helpers/acstack-open +1 -1
  19. package/assets/terminal-workspace/lib/apply-herdr-numbers.sh +1 -1
  20. package/assets/terminal-workspace/lib/apply-tools.sh +1 -1
  21. package/assets/terminal-workspace/lib/apply-tuicr.sh +2 -2
  22. package/assets/terminal-workspace/lib/commands.sh +1 -1
  23. package/assets/terminal-workspace/lib/helper-install.sh +1 -1
  24. package/assets/terminal-workspace/setup.sh +6 -1
  25. package/cli/dist/index.js +713 -523
  26. package/cli/dist/index.js.map +4 -4
  27. package/cli/package.json +1 -1
  28. package/docs/config-reference.md +129 -87
  29. package/docs/dev-setups.md +4 -4
  30. package/docs/terminal-workspace.md +7 -6
  31. package/docs/workflows.md +13 -12
  32. package/examples/design-doc/acstack/README.md +3 -3
  33. package/examples/design-doc/acstack/journey.md +1 -1
  34. package/examples/design-doc/acstack/publication.md +1 -1
  35. package/hooks/context-pressure.sh +6 -2
  36. package/hooks/lib/read-guard.mjs +25 -21
  37. package/hooks/project-data.sh +5 -34
  38. package/hooks/session-start-handoff.sh +11 -22
  39. package/hooks/session-start.sh +5 -6
  40. package/orchestrator/AGENTS.md +30 -25
  41. package/package.json +1 -1
  42. package/pi/agents/frontend-verifier.md +8 -7
  43. package/pi/agents/task-checker.md +1 -1
  44. package/pi/agents/task-executor.md +1 -1
  45. package/pi/agents/test-writer.md +1 -1
  46. package/pi/extension.ts +39 -57
  47. package/profiles/fullstack-python.yaml +1 -1
  48. package/profiles/node-typescript.yaml +1 -1
  49. package/profiles/python.yaml +1 -1
  50. package/skills/archive/SKILL.md +20 -18
  51. package/skills/bootstrap/SKILL.md +6 -6
  52. package/skills/bridge/SKILL-VM.md +5 -5
  53. package/skills/bridge/SKILL-WINDOWS.md +1 -1
  54. package/skills/browser-verify/SKILL.md +6 -6
  55. package/skills/commit/SKILL.md +8 -8
  56. package/skills/compact-and-continue/SKILL.md +11 -9
  57. package/skills/design-doc/SKILL.md +8 -5
  58. package/skills/explore/SKILL.md +1 -1
  59. package/skills/grilling/SKILL.md +4 -3
  60. package/skills/handoff/SKILL.md +4 -4
  61. package/skills/host/SKILL.md +2 -2
  62. package/skills/host/detect-host.sh +8 -4
  63. package/skills/host/herdr.md +1 -1
  64. package/skills/host/install-herdr-block.sh +1 -1
  65. package/skills/host/notes.md +5 -4
  66. package/skills/host/questions.md +1 -1
  67. package/skills/host/report.md +2 -2
  68. package/skills/implement/SKILL.md +6 -5
  69. package/skills/implement/decision-log.md +10 -15
  70. package/skills/implement/design-pass.md +2 -2
  71. package/skills/map/SKILL.md +5 -3
  72. package/skills/map/frontend.md +2 -2
  73. package/skills/map/materialising.md +5 -3
  74. package/skills/map/trackers/files.md +6 -4
  75. package/skills/pre-commit-review/SKILL.md +3 -3
  76. package/skills/quick-fix/SKILL.md +1 -1
  77. package/skills/record-context/SKILL.md +6 -6
  78. package/skills/setup/SKILL.md +20 -11
  79. package/skills/setup/browser.md +2 -2
  80. package/skills/setup/first-run.md +14 -16
  81. package/skills/setup/report.md +4 -3
  82. package/skills/setup/row-fixes.md +7 -8
  83. package/skills/sync/SKILL.md +14 -12
  84. package/skills/terminal-workspace/SKILL.md +4 -4
  85. package/skills/terminal-workspace/headless-clipboard.md +1 -1
  86. package/skills/terminal-workspace/turn-off-and-update.md +1 -1
  87. package/skills/test-conventions/SKILL.md +2 -2
@@ -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 `.acstack/project.yaml`.
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 | `.acstack/.test-baseline` and referenced check logs; reuse valid evidence under the shared policy |
105
- | What the code does | the living specs in `.acstack/specs/` |
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 `.acstack/HANDOFF.md`, the `compact-and-continue` anchor.
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
@@ -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
- `.acstack/project.yaml`. Read [`notes.md`](notes.md) when the user asks why.
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
- 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
- has_frontend="true"
252
- fi
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 ----------------------------------------------------------------
@@ -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
- `~/.config/acstack/terminal-workspace.yaml`. A machine that has run it needs
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 ~/.config/acstack/terminal-workspace.yaml."
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
@@ -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 `~/.config/acstack/config.json`, or under
20
- `$XDG_CONFIG_HOME` when you set that environment variable. Run
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 `.acstack/project.yaml`.
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 `.acstack/project.yaml` says what the
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
@@ -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 `.acstack/project.yaml` configures a frontend |
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
@@ -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
- `~/.config/acstack/config.json` is only where the file lands by default. Setting
40
- the `XDG_CONFIG_HOME` environment variable moves it. On a machine that sets that
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
- `.acstack/project.yaml`; the map skill's `trackers/` docs declare the
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 `.acstack/project.yaml` for build/test/lint commands and directory paths.
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
- `<main checkout>/.acstack/decision-logs/<name>.tsv`. A decision point is a fork chosen, a
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 how to find the main
132
- checkout, the columns, and the root ignore baseline.
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 main checkout:
22
- `<main checkout>/.acstack/decision-logs/<name>.tsv`. The `<name>` is the map name
23
- you pass to `--map`.
24
-
25
- Write it in the main checkout, never in a worktree. Removing a worktree
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
- main=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
28
+ log="$(~/.claude/acstack/bin/acstack project-data path)/decision-logs/<name>.tsv"
31
29
  ```
32
30
 
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
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 `.acstack/project.yaml` turns the gate on. Ask acstack for the answer:
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 `.acstack/project.yaml` before deriving paths
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
@@ -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
- `workflow.maps.tracker` in `.acstack/project.yaml` (`github` or `files`) records
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 .acstack/maps/` on the files
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 `.acstack/project.yaml` where the
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
@@ -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 `.acstack/project.yaml` where the frontend
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: <repository-relative-path>` in the root node body
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, the root Git ignore rules exclude `.acstack/maps/` unless the user opts in
74
- ([`trackers/files.md`](trackers/files.md) gives the reason).
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 `.acstack/maps/<name>/`, managed by the ACStack
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 root managed baseline ignores `.acstack/maps/` by default.
9
- Native exceptions after that baseline let the user opt in to tracking any part.
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 .acstack/maps/`.
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 `.acstack/project.yaml` to understand the project's directory layout, commands, and conventions.
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 .acstack/specs/ directory listing
89
+ - Check the <project folder>/specs/ directory listing
90
90
  - Read spec.md files for domains touched by the changed files
91
- (use .acstack/domain-map.yaml to map files -> domains)
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 `.acstack/project.yaml` under Build verification in
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: `.acstack/decisions/NNNN-slug.md`. The number is the highest existing number plus
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
- `.acstack/decisions/0004-invariant-tool-path.md`:
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 `.acstack/decisions/index.md` in full, with one line
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 `.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`.
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.
@@ -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 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{".acstack/project.yaml<br/>is here?"}
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
- 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.
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
- test -f .acstack/project.yaml && echo present || echo absent
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": ".acstack/domain-map.yaml maps 4 domains"}]}
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 `~/.config/acstack/config.json`.
203
- Every other key it knows goes to `.acstack/project.yaml`, and the write keeps
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
 
@@ -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 `.acstack/agent-browser.json` with the same port, the way Step 9c in `row-fixes.md` does.
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
- `.acstack/agent-browser.json`. Say that `docs/config-reference.md` documents the three
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 `.acstack/project.yaml`, so the first-run path runs Steps 3 to 6 from here.
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 `.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
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
- 8. Remove a legacy `@import` line from the project CLAUDE.md, if one is there.
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
@@ -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
- 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)
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
- `.acstack/project.yaml` configures a `frontend` block. The project has a
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
- `.acstack/domain-map.yaml` maps source paths to spec domains. Spec sync,
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 `.acstack/specs/` already holds domain directories, propose those names first
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
- Create `.acstack/` if needed, then run `~/.claude/acstack/bin/acstack project-data ensure`.
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 `.acstack/project.yaml`. With
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 `.acstack/verification/VERIFICATION-KNOWLEDGE.md` for the frontend verifier.
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
- Run `~/.claude/acstack/bin/acstack project-data ensure` after creating `.acstack/`, then write:
162
+ Write:
164
163
 
165
164
  ```markdown
166
165
  # Verification Knowledge Base