@aperant/framework 0.13.0 → 0.16.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.
Files changed (245) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/README.md +1 -1
  3. package/agents/apt-pr-review-crossplatform.md +189 -0
  4. package/agents/apt-pr-review-i18n.md +190 -0
  5. package/dist/cli/commands/audit-branch-current.d.mts +27 -5
  6. package/dist/cli/commands/audit-branch-current.d.mts.map +1 -1
  7. package/dist/cli/commands/audit-branch-current.mjs +3 -3
  8. package/dist/cli/commands/audit-branch-current.mjs.map +1 -1
  9. package/dist/cli/commands/event.d.mts.map +1 -1
  10. package/dist/cli/commands/event.mjs +6 -4
  11. package/dist/cli/commands/event.mjs.map +1 -1
  12. package/dist/cli/commands/fan-out.d.mts.map +1 -1
  13. package/dist/cli/commands/fan-out.mjs +3 -1
  14. package/dist/cli/commands/fan-out.mjs.map +1 -1
  15. package/dist/cli/commands/features-audit.d.mts.map +1 -1
  16. package/dist/cli/commands/features-audit.mjs +6 -1
  17. package/dist/cli/commands/features-audit.mjs.map +1 -1
  18. package/dist/cli/commands/followups.d.mts +5 -0
  19. package/dist/cli/commands/followups.d.mts.map +1 -0
  20. package/dist/cli/commands/followups.mjs +266 -0
  21. package/dist/cli/commands/followups.mjs.map +1 -0
  22. package/dist/cli/commands/health-check.d.mts.map +1 -1
  23. package/dist/cli/commands/health-check.mjs +3 -1
  24. package/dist/cli/commands/health-check.mjs.map +1 -1
  25. package/dist/cli/commands/init.d.mts.map +1 -1
  26. package/dist/cli/commands/init.mjs +30 -1
  27. package/dist/cli/commands/init.mjs.map +1 -1
  28. package/dist/cli/commands/merge-detect.d.mts +29 -0
  29. package/dist/cli/commands/merge-detect.d.mts.map +1 -0
  30. package/dist/cli/commands/merge-detect.mjs +196 -0
  31. package/dist/cli/commands/merge-detect.mjs.map +1 -0
  32. package/dist/cli/commands/merge-integrate.d.mts +28 -0
  33. package/dist/cli/commands/merge-integrate.d.mts.map +1 -0
  34. package/dist/cli/commands/merge-integrate.mjs +383 -0
  35. package/dist/cli/commands/merge-integrate.mjs.map +1 -0
  36. package/dist/cli/commands/pr-review/detect-specialists.d.mts +58 -0
  37. package/dist/cli/commands/pr-review/detect-specialists.d.mts.map +1 -0
  38. package/dist/cli/commands/pr-review/detect-specialists.mjs +984 -0
  39. package/dist/cli/commands/pr-review/detect-specialists.mjs.map +1 -0
  40. package/dist/cli/commands/pr-review.d.mts.map +1 -1
  41. package/dist/cli/commands/pr-review.mjs +11 -2
  42. package/dist/cli/commands/pr-review.mjs.map +1 -1
  43. package/dist/cli/commands/precompact-hook.d.mts.map +1 -1
  44. package/dist/cli/commands/precompact-hook.mjs +10 -6
  45. package/dist/cli/commands/precompact-hook.mjs.map +1 -1
  46. package/dist/cli/commands/roadmap.d.mts.map +1 -1
  47. package/dist/cli/commands/roadmap.mjs +24 -11
  48. package/dist/cli/commands/roadmap.mjs.map +1 -1
  49. package/dist/cli/commands/seed.d.mts.map +1 -1
  50. package/dist/cli/commands/seed.mjs +3 -1
  51. package/dist/cli/commands/seed.mjs.map +1 -1
  52. package/dist/cli/commands/state.d.mts.map +1 -1
  53. package/dist/cli/commands/state.mjs +9 -3
  54. package/dist/cli/commands/state.mjs.map +1 -1
  55. package/dist/cli/commands/statusline.d.mts.map +1 -1
  56. package/dist/cli/commands/statusline.mjs +5 -1
  57. package/dist/cli/commands/statusline.mjs.map +1 -1
  58. package/dist/cli/commands/task.d.mts.map +1 -1
  59. package/dist/cli/commands/task.mjs +126 -23
  60. package/dist/cli/commands/task.mjs.map +1 -1
  61. package/dist/cli/commands/worktree.d.mts +1 -1
  62. package/dist/cli/commands/worktree.d.mts.map +1 -1
  63. package/dist/cli/commands/worktree.mjs +282 -83
  64. package/dist/cli/commands/worktree.mjs.map +1 -1
  65. package/dist/cli/config/post-merge-sweep.d.mts.map +1 -1
  66. package/dist/cli/config/post-merge-sweep.mjs +3 -2
  67. package/dist/cli/config/post-merge-sweep.mjs.map +1 -1
  68. package/dist/cli/config/share-policy.d.mts +3 -1
  69. package/dist/cli/config/share-policy.d.mts.map +1 -1
  70. package/dist/cli/config/share-policy.mjs +16 -3
  71. package/dist/cli/config/share-policy.mjs.map +1 -1
  72. package/dist/cli/config/upgrade-gitignore.d.mts.map +1 -1
  73. package/dist/cli/config/upgrade-gitignore.mjs +27 -5
  74. package/dist/cli/config/upgrade-gitignore.mjs.map +1 -1
  75. package/dist/cli/consistency/parse-qa.mjs +12 -1
  76. package/dist/cli/consistency/parse-qa.mjs.map +1 -1
  77. package/dist/cli/consistency/parse-review.d.mts +23 -0
  78. package/dist/cli/consistency/parse-review.d.mts.map +1 -1
  79. package/dist/cli/consistency/parse-review.mjs +36 -0
  80. package/dist/cli/consistency/parse-review.mjs.map +1 -1
  81. package/dist/cli/consistency/parse-spec.d.mts +16 -0
  82. package/dist/cli/consistency/parse-spec.d.mts.map +1 -1
  83. package/dist/cli/consistency/parse-spec.mjs +44 -0
  84. package/dist/cli/consistency/parse-spec.mjs.map +1 -1
  85. package/dist/cli/coordination/agent-identity.d.mts +5 -2
  86. package/dist/cli/coordination/agent-identity.d.mts.map +1 -1
  87. package/dist/cli/coordination/agent-identity.mjs +6 -4
  88. package/dist/cli/coordination/agent-identity.mjs.map +1 -1
  89. package/dist/cli/coordination/store.d.mts +1 -1
  90. package/dist/cli/dispatch.d.mts.map +1 -1
  91. package/dist/cli/dispatch.mjs +4 -0
  92. package/dist/cli/dispatch.mjs.map +1 -1
  93. package/dist/cli/followups/derive.d.mts +63 -0
  94. package/dist/cli/followups/derive.d.mts.map +1 -0
  95. package/dist/cli/followups/derive.mjs +115 -0
  96. package/dist/cli/followups/derive.mjs.map +1 -0
  97. package/dist/cli/followups/schema.d.mts +165 -0
  98. package/dist/cli/followups/schema.d.mts.map +1 -0
  99. package/dist/cli/followups/schema.mjs +251 -0
  100. package/dist/cli/followups/schema.mjs.map +1 -0
  101. package/dist/cli/gate/context.d.mts +1 -1
  102. package/dist/cli/gate/gates/followups-adjudicated.d.mts +69 -0
  103. package/dist/cli/gate/gates/followups-adjudicated.d.mts.map +1 -0
  104. package/dist/cli/gate/gates/followups-adjudicated.mjs +141 -0
  105. package/dist/cli/gate/gates/followups-adjudicated.mjs.map +1 -0
  106. package/dist/cli/gate/gates/index.mjs +1 -0
  107. package/dist/cli/gate/gates/index.mjs.map +1 -1
  108. package/dist/cli/git/materialize-env.d.mts +39 -0
  109. package/dist/cli/git/materialize-env.d.mts.map +1 -0
  110. package/dist/cli/git/materialize-env.mjs +217 -0
  111. package/dist/cli/git/materialize-env.mjs.map +1 -0
  112. package/dist/cli/help.d.mts.map +1 -1
  113. package/dist/cli/help.mjs +9 -1
  114. package/dist/cli/help.mjs.map +1 -1
  115. package/dist/cli/install/legacy-paths.d.mts.map +1 -1
  116. package/dist/cli/install/legacy-paths.mjs +5 -0
  117. package/dist/cli/install/legacy-paths.mjs.map +1 -1
  118. package/dist/cli/roadmap/lifecycle.d.mts.map +1 -1
  119. package/dist/cli/roadmap/lifecycle.mjs +4 -1
  120. package/dist/cli/roadmap/lifecycle.mjs.map +1 -1
  121. package/dist/cli/task/ids.d.mts +9 -0
  122. package/dist/cli/task/ids.d.mts.map +1 -1
  123. package/dist/cli/task/ids.mjs +9 -0
  124. package/dist/cli/task/ids.mjs.map +1 -1
  125. package/dist/cli/task/index-md.d.mts +5 -0
  126. package/dist/cli/task/index-md.d.mts.map +1 -1
  127. package/dist/cli/task/index-md.mjs +12 -4
  128. package/dist/cli/task/index-md.mjs.map +1 -1
  129. package/dist/cli/util/io.d.mts +6 -0
  130. package/dist/cli/util/io.d.mts.map +1 -1
  131. package/dist/cli/util/io.mjs +16 -1
  132. package/dist/cli/util/io.mjs.map +1 -1
  133. package/dist/cli/util/project.d.mts +7 -2
  134. package/dist/cli/util/project.d.mts.map +1 -1
  135. package/dist/cli/util/project.mjs +11 -14
  136. package/dist/cli/util/project.mjs.map +1 -1
  137. package/dist/cli/util/state-paths.d.mts +19 -0
  138. package/dist/cli/util/state-paths.d.mts.map +1 -0
  139. package/dist/cli/util/state-paths.mjs +45 -0
  140. package/dist/cli/util/state-paths.mjs.map +1 -0
  141. package/dist/plugin/.claude-plugin/plugin.json +4 -1
  142. package/dist/plugin/agents/apt-pr-review-crossplatform.md +189 -0
  143. package/dist/plugin/agents/apt-pr-review-i18n.md +190 -0
  144. package/dist/plugin/skills/apt/SKILL.md +9 -3
  145. package/dist/plugin/skills/apt-close-task/SKILL.md +48 -0
  146. package/dist/plugin/skills/apt-debug/SKILL.md +19 -9
  147. package/dist/plugin/skills/apt-execute/SKILL.md +3 -1
  148. package/dist/plugin/skills/apt-fan-out/SKILL.md +65 -1
  149. package/dist/plugin/skills/apt-merge-conflict-resolution/SKILL.md +227 -0
  150. package/dist/plugin/skills/apt-pr-review/SCHEMA.md +4 -2
  151. package/dist/plugin/skills/apt-pr-review/SKILL.md +117 -29
  152. package/dist/plugin/skills/apt-quick/SKILL.md +24 -1
  153. package/dist/plugin/skills/apt-review/SKILL.md +6 -0
  154. package/dist/plugin/skills/apt-run/SKILL.md +1 -1
  155. package/dist/plugin/skills/apt-setup/SKILL.md +21 -3
  156. package/dist/plugin/skills/apt-ship/SKILL.md +32 -11
  157. package/dist/plugin/skills/apt-terminal/SKILL.md +8 -0
  158. package/dist/plugin/skills/apt-triage/SKILL.md +4 -0
  159. package/dist/plugin/skills/apt-verify/SKILL.md +24 -0
  160. package/dist/plugin/skills/apt-watch-ci/SKILL.md +3 -1
  161. package/dist/types/config.d.ts +33 -0
  162. package/dist/types/config.d.ts.map +1 -1
  163. package/package.json +1 -1
  164. package/prompts/conductor-framework-context.md +1 -1
  165. package/prompts/github/pr_crossplatform_agent.md +283 -0
  166. package/prompts/github/pr_i18n_agent.md +279 -0
  167. package/prompts/inbox-clarification.md +18 -11
  168. package/skills/apt/SKILL.md +9 -3
  169. package/skills/apt-close-task/SKILL.md +48 -0
  170. package/skills/apt-debug/SKILL.md +19 -9
  171. package/skills/apt-execute/SKILL.md +3 -1
  172. package/skills/apt-fan-out/SKILL.md +65 -1
  173. package/skills/apt-merge-conflict-resolution/SKILL.md +227 -0
  174. package/skills/apt-pr-review/SCHEMA.md +4 -2
  175. package/skills/apt-pr-review/SKILL.md +117 -29
  176. package/skills/apt-quick/SKILL.md +24 -1
  177. package/skills/apt-review/SKILL.md +6 -0
  178. package/skills/apt-run/SKILL.md +1 -1
  179. package/skills/apt-setup/SKILL.md +21 -3
  180. package/skills/apt-ship/SKILL.md +32 -11
  181. package/skills/apt-terminal/SKILL.md +8 -0
  182. package/skills/apt-triage/SKILL.md +4 -0
  183. package/skills/apt-verify/SKILL.md +24 -0
  184. package/skills/apt-watch-ci/SKILL.md +3 -1
  185. package/src/cli/commands/audit-branch-current.mjs +3 -3
  186. package/src/cli/commands/event.mjs +6 -4
  187. package/src/cli/commands/fan-out.mjs +3 -1
  188. package/src/cli/commands/features-audit.mjs +6 -1
  189. package/src/cli/commands/followups.mjs +303 -0
  190. package/src/cli/commands/health-check.mjs +3 -1
  191. package/src/cli/commands/init.mjs +29 -0
  192. package/src/cli/commands/merge-detect.mjs +203 -0
  193. package/src/cli/commands/merge-integrate.mjs +392 -0
  194. package/src/cli/commands/pr-review/__fixtures__/android-strings/app/src/main/res/values-fr/strings.xml +3 -0
  195. package/src/cli/commands/pr-review/__fixtures__/babel-js/package.json +4 -0
  196. package/src/cli/commands/pr-review/__fixtures__/c-ifdef/src/main.c +4 -0
  197. package/src/cli/commands/pr-review/__fixtures__/ci-matrix/.github/workflows/ci.yml +10 -0
  198. package/src/cli/commands/pr-review/__fixtures__/cmake-win/CMakeLists.txt +5 -0
  199. package/src/cli/commands/pr-review/__fixtures__/diffs/add-arb.patch +9 -0
  200. package/src/cli/commands/pr-review/__fixtures__/diffs/ci-single-os-dep.patch +13 -0
  201. package/src/cli/commands/pr-review/__fixtures__/diffs/ci-single-os-list-item-dep.patch +17 -0
  202. package/src/cli/commands/pr-review/__fixtures__/diffs/lone-weak-t.patch +8 -0
  203. package/src/cli/commands/pr-review/__fixtures__/diffs/monorepo-b.patch +7 -0
  204. package/src/cli/commands/pr-review/__fixtures__/diffs/two-weak-xpl.patch +12 -0
  205. package/src/cli/commands/pr-review/__fixtures__/dropped-underscore/src/app.js +2 -0
  206. package/src/cli/commands/pr-review/__fixtures__/electron-app/package.json +4 -0
  207. package/src/cli/commands/pr-review/__fixtures__/i18n-locale-file/src/locales/fr.json +1 -0
  208. package/src/cli/commands/pr-review/__fixtures__/monorepo/packages/a/locales/fr.json +1 -0
  209. package/src/cli/commands/pr-review/__fixtures__/monorepo/packages/b/src/index.ts +1 -0
  210. package/src/cli/commands/pr-review/__fixtures__/py-babel/pyproject.toml +3 -0
  211. package/src/cli/commands/pr-review/__fixtures__/qt-i18n-dir/i18n/app_fr.ts +11 -0
  212. package/src/cli/commands/pr-review/__fixtures__/rust-cli/Cargo.toml +7 -0
  213. package/src/cli/commands/pr-review/__fixtures__/rust-cli/src/main.rs +1 -0
  214. package/src/cli/commands/pr-review/__fixtures__/ts-dir/ts/foo.ts +3 -0
  215. package/src/cli/commands/pr-review/detect-specialists.mjs +1029 -0
  216. package/src/cli/commands/pr-review.mjs +12 -2
  217. package/src/cli/commands/precompact-hook.mjs +10 -6
  218. package/src/cli/commands/roadmap.mjs +24 -11
  219. package/src/cli/commands/seed.mjs +3 -1
  220. package/src/cli/commands/state.mjs +9 -3
  221. package/src/cli/commands/statusline.mjs +5 -1
  222. package/src/cli/commands/task.mjs +135 -23
  223. package/src/cli/commands/worktree.mjs +298 -81
  224. package/src/cli/config/post-merge-sweep.mjs +3 -2
  225. package/src/cli/config/share-policy.mjs +16 -3
  226. package/src/cli/config/upgrade-gitignore.mjs +27 -5
  227. package/src/cli/consistency/parse-qa.mjs +11 -1
  228. package/src/cli/consistency/parse-review.mjs +36 -0
  229. package/src/cli/consistency/parse-spec.mjs +43 -0
  230. package/src/cli/coordination/agent-identity.mjs +6 -4
  231. package/src/cli/dispatch.mjs +4 -0
  232. package/src/cli/followups/derive.mjs +123 -0
  233. package/src/cli/followups/schema.mjs +264 -0
  234. package/src/cli/gate/gates/followups-adjudicated.mjs +158 -0
  235. package/src/cli/gate/gates/index.mjs +1 -0
  236. package/src/cli/git/materialize-env.mjs +212 -0
  237. package/src/cli/help.mjs +9 -1
  238. package/src/cli/install/legacy-paths.mjs +5 -0
  239. package/src/cli/roadmap/lifecycle.mjs +4 -1
  240. package/src/cli/task/ids.mjs +9 -0
  241. package/src/cli/task/index-md.mjs +12 -4
  242. package/src/cli/util/io.mjs +15 -1
  243. package/src/cli/util/project.mjs +11 -14
  244. package/src/cli/util/state-paths.mjs +45 -0
  245. package/prompts/followup_planner.md +0 -399
@@ -0,0 +1,217 @@
1
+ /**
2
+ * git/materialize-env.mjs — framework-CLI env materialization seam (ID-06).
3
+ *
4
+ * Subtask 2 of `build-unified-per-project-env-secrets-ma_16-06-26` (#354). The
5
+ * third worktree-create seam: after `apt-tools worktree create --task` adds a
6
+ * worktree, write the project's stored env file blobs verbatim into it so a CLI
7
+ * verify-in-worktree run has the same env as the main checkout.
8
+ *
9
+ * This is a standalone `.mjs` mirror of the TS core `materializeProjectEnv`
10
+ * (the framework CLI cannot import the compiled `@aperant/core` helper). It is
11
+ * deliberately self-contained + best-effort: every failure path returns a
12
+ * `{ materialized: 0, ... }` envelope instead of throwing, so worktree creation
13
+ * (the parent op) is never aborted by an env hiccup.
14
+ *
15
+ * libSQL `project_env` schema (subtask 1) — keyed `(project_id, rel_path)`:
16
+ * project_id TEXT, rel_path TEXT, contents TEXT [may be safeStorage-encrypted
17
+ * on the desktop write path], classification TEXT, fingerprint TEXT, updated_at TEXT.
18
+ *
19
+ * Encryption caveat: the desktop write path wraps `contents` with Electron's
20
+ * safeStorage `CryptoProvider`, which a standalone Node CLI cannot decrypt. We
21
+ * write whatever the column holds — plaintext in self-hosted/CLI contexts
22
+ * (`CryptoProvider` absent), opaque otherwise. That mirrors the libSQL
23
+ * backend's own plaintext-fallback robustness and is the documented framework
24
+ * limitation; the desktop seams (pipeline + terminal) decrypt via the store.
25
+ */
26
+ import { createHash } from 'node:crypto';
27
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
28
+ import { homedir } from 'node:os';
29
+ import { dirname, isAbsolute, join, resolve, sep } from 'node:path';
30
+ /** Resolve the shared libSQL DB path: APERANT_DB_PATH override → ~/.aperant/data.db. */
31
+ function resolveDbPath() {
32
+ const raw = process.env.APERANT_DB_PATH;
33
+ if (raw && raw.trim().length > 0)
34
+ return raw;
35
+ return join(homedir(), '.aperant', 'data.db');
36
+ }
37
+ /**
38
+ * Reject a rel_path that is absolute or escapes the worktree root BEFORE any
39
+ * write (the traversal guard, mirroring the core `assertPathContained` choke
40
+ * point). Returns the resolved absolute target, or null when unsafe.
41
+ *
42
+ * Exported so the security-sensitive guard can be unit-tested directly: the
43
+ * libSQL-backed `materializeProjectEnvCli` can only no-op in environments where
44
+ * `@libsql/client` is unresolvable (the framework test runner), so the pure
45
+ * guard is the testable load-bearing surface.
46
+ */
47
+ export function resolveContainedTarget(worktreePath, relPath) {
48
+ if (!relPath || isAbsolute(relPath))
49
+ return null;
50
+ const base = resolve(worktreePath);
51
+ const target = resolve(base, relPath);
52
+ if (target !== base && !target.startsWith(base + sep))
53
+ return null;
54
+ return target;
55
+ }
56
+ /** sha256 hex of a file's verbatim text — drift comparison only (ID-07). */
57
+ function fingerprint(contents) {
58
+ return createHash('sha256').update(contents, 'utf-8').digest('hex');
59
+ }
60
+ /** Lazily open the shared libSQL DB, or null when absent / @libsql unavailable. */
61
+ async function openDb() {
62
+ const dbPath = resolveDbPath();
63
+ if (!existsSync(dbPath))
64
+ return null;
65
+ let createClient;
66
+ try {
67
+ ;
68
+ ({ createClient } = await import('@libsql/client'));
69
+ }
70
+ catch {
71
+ // @libsql/client not installed in this consumer — best-effort no-op.
72
+ return null;
73
+ }
74
+ try {
75
+ return createClient({ url: `file:${dbPath}` });
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ /**
82
+ * Resolve the libSQL `projects.id` for a given project root path. The desktop /
83
+ * self-hosted app keys `project_env` rows by the project's stored id, NOT its
84
+ * path; the framework CLI only knows the path, so we match it against the
85
+ * `projects.path` column. Returns null when the project is unknown to libSQL
86
+ * (e.g. a fresh repo never opened in the app) — the caller treats that as
87
+ * "no env to materialize", never an error.
88
+ */
89
+ export async function resolveProjectIdFromPath(client, projectPath) {
90
+ if (!client)
91
+ return null;
92
+ const wanted = resolve(projectPath);
93
+ try {
94
+ const result = await client.execute({ sql: 'SELECT id, path FROM projects', args: [] });
95
+ for (const row of result.rows) {
96
+ if (row.path != null && resolve(String(row.path)) === wanted) {
97
+ return String(row.id);
98
+ }
99
+ }
100
+ }
101
+ catch {
102
+ // projects table absent or unreadable — no project id.
103
+ }
104
+ return null;
105
+ }
106
+ /**
107
+ * Read every `project_env` row for a project from an open libSQL client.
108
+ * Returns `[]` (never throws) when the table is absent or projectId is null.
109
+ *
110
+ * @returns Promise<Array<{ relPath, contents, classification, fingerprint }>>
111
+ */
112
+ async function readProjectEnvRows(client, projectId) {
113
+ if (!client || !projectId)
114
+ return [];
115
+ try {
116
+ const result = await client.execute({
117
+ sql: 'SELECT rel_path, contents, classification, fingerprint FROM project_env WHERE project_id = ? ORDER BY rel_path ASC',
118
+ args: [projectId],
119
+ });
120
+ return result.rows.map((row) => ({
121
+ relPath: String(row.rel_path),
122
+ contents: row.contents == null ? '' : String(row.contents),
123
+ classification: String(row.classification),
124
+ fingerprint: String(row.fingerprint),
125
+ }));
126
+ }
127
+ catch {
128
+ // Missing table (project_env never created) or read error — no-op.
129
+ return [];
130
+ }
131
+ }
132
+ /** Close a libSQL client best-effort (never throws). */
133
+ function closeDb(client) {
134
+ try {
135
+ client?.close?.();
136
+ }
137
+ catch {
138
+ /* best-effort */
139
+ }
140
+ }
141
+ /**
142
+ * Materialize the project's stored env blobs verbatim into a worktree.
143
+ *
144
+ * @param worktreePath absolute path of the target worktree
145
+ * @param projectPath absolute path of the main project root (used to resolve
146
+ * the libSQL project id via `projects.path`)
147
+ * @param explicitProjectId optional override when the caller already knows the id
148
+ * @returns { materialized, rejected, errored } counts — never throws.
149
+ */
150
+ export async function materializeProjectEnvCli(worktreePath, projectPath, explicitProjectId) {
151
+ const client = await openDb();
152
+ try {
153
+ const projectId = explicitProjectId || (await resolveProjectIdFromPath(client, projectPath));
154
+ const rows = await readProjectEnvRows(client, projectId);
155
+ let materialized = 0;
156
+ let rejected = 0;
157
+ let errored = 0;
158
+ for (const row of rows) {
159
+ const target = resolveContainedTarget(worktreePath, row.relPath);
160
+ if (!target) {
161
+ rejected += 1;
162
+ continue;
163
+ }
164
+ try {
165
+ mkdirSync(dirname(target), { recursive: true });
166
+ writeFileSync(target, row.contents, 'utf-8');
167
+ materialized += 1;
168
+ }
169
+ catch {
170
+ errored += 1;
171
+ }
172
+ }
173
+ return { materialized, rejected, errored };
174
+ }
175
+ finally {
176
+ closeDb(client);
177
+ }
178
+ }
179
+ /**
180
+ * Detect drift for an already-materialized worktree (ID-07): compare each
181
+ * stored blob's fingerprint against the on-disk file. Returns per-file verdicts;
182
+ * `sync-env` simply re-runs `materializeProjectEnvCli` to overwrite.
183
+ *
184
+ * @returns { hasDrift, files: [{ relPath, status }] } — never throws.
185
+ */
186
+ export async function detectEnvDriftCli(worktreePath, projectPath, explicitProjectId) {
187
+ const client = await openDb();
188
+ try {
189
+ const projectId = explicitProjectId || (await resolveProjectIdFromPath(client, projectPath));
190
+ const rows = await readProjectEnvRows(client, projectId);
191
+ const files = [];
192
+ for (const row of rows) {
193
+ const target = resolveContainedTarget(worktreePath, row.relPath);
194
+ if (!target || !existsSync(target)) {
195
+ files.push({ relPath: row.relPath, status: 'missing' });
196
+ continue;
197
+ }
198
+ let onDisk;
199
+ try {
200
+ onDisk = readFileSync(target, 'utf-8');
201
+ }
202
+ catch {
203
+ files.push({ relPath: row.relPath, status: 'missing' });
204
+ continue;
205
+ }
206
+ files.push({
207
+ relPath: row.relPath,
208
+ status: fingerprint(onDisk) === row.fingerprint ? 'in-sync' : 'drifted',
209
+ });
210
+ }
211
+ return { hasDrift: files.some((f) => f.status !== 'in-sync'), files };
212
+ }
213
+ finally {
214
+ closeDb(client);
215
+ }
216
+ }
217
+ //# sourceMappingURL=materialize-env.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize-env.mjs","sourceRoot":"","sources":["../../../src/cli/git/materialize-env.mjs"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.mts","sourceRoot":"","sources":["../../src/cli/help.mjs"],"names":[],"mappings":"AAMA,kCAsIC"}
1
+ {"version":3,"file":"help.d.mts","sourceRoot":"","sources":["../../src/cli/help.mjs"],"names":[],"mappings":"AAMA,kCA8IC"}
package/dist/cli/help.mjs CHANGED
@@ -17,6 +17,9 @@ Commands:
17
17
  config upgrade-layout <dir> [--dry-run] Migrate .aperant/ folder layout to C36 shape (moves + rewrites gitignore)
18
18
  audit privacy <dir> [--scrub] C35: diff tracked .aperant/* vs share policy (exit 2 on violations; --scrub prints filter-repo commands + checklist, never executes)
19
19
  audit visibility-signals <dir> C35: structured JSON signals for /apt:setup's visibility mini-flow
20
+ merge detect <dir> [--base <ref>] [--head <ref>] Trial-merge mergeability probe (reuses audit branch-current detection); emits {mergeable, conflicts_preview?} for apt:merge-conflict-resolution
21
+ merge markers <dir> Read on-disk conflict markers from the unmerged worktree so the agent can resolve them inline; emits {conflicted, files:[{path,content}]}
22
+ merge integrate <dir> --tasks <ids> | --batch <id> [--base <ref>] Serialize a fan-out batch into base: order tasks (topological on depends_on, else stable), probe each PR's mergeability (reuses merge detect), emit an integration report for apt:fan-out §5
20
23
  state-update <dir> --field --value Update a state field
21
24
  detect-project <project-dir> Scan project for init classification
22
25
  init-state <dir> --config <json> Write config + state after init flow
@@ -72,9 +75,10 @@ Commands:
72
75
 
73
76
  standards <project-dir> [--profile <name>] [--json] [--no-color] C20: zero-orchestration read-only bundle (constitution + profile + feature registry + design tokens + taste)
74
77
 
75
- worktree create <dir> --subtask <id> --branch <name> Create isolated worktree for a subtask
78
+ worktree create <dir> --subtask <id> --branch <name> Create isolated worktree for a subtask (also materializes the project's stored env blobs into the new worktree, #354)
76
79
  worktree remove <dir> --subtask <id> [--force] Remove a subtask worktree
77
80
  worktree list <dir> List active worktrees under .aperant/worktrees/
81
+ worktree sync-env <dir> --task <id> [--scope <s>] [--project-id <id>] Re-materialize the project's stored env blobs into an existing task worktree (store is source of truth — overwrites, no merge)
78
82
 
79
83
  detect-worktree <project-dir> Check if running inside a git worktree
80
84
  template <name> Output a template (agents-greenfield, agents-brownfield, config, state, gitignore)
@@ -129,6 +133,10 @@ Commands:
129
133
  ci-watch start|stop|status|tick <dir> [--pr <N>] [...] /apt:watch-ci primitives — see SKILL.md for full flag matrix
130
134
  ci-watch sweep <dir> --orphaned [--dry-run] BUG-027: enumerate ci-watches state files, query gh per PR, remove terminal-state (MERGED|CLOSED) entries (manual GC; rate-limited)
131
135
 
136
+ followups check <dir> --task-id <id> G45: derive the expected follow-up universe (Out of Scope ∪ raw review rows ∪ qa findings) + report missing/unadjudicated/unfixed/undispositioned rows; exit 1 when the ledger is dishonest
137
+ followups disposition <dir> --task-id <id> --row <row-id> --kind <filed_task|executed_commit|parked_note|dropped_by_user> --ref <ref> [--reason <text>] G45: flip a ledger row to dispositioned (atomic; dropped_by_user requires --reason)
138
+ followups policy <dir> --task-id <id> G45: effective disposition policy (ask|file|chain + max_chain_depth) from config.followups when set, else autonomy-derived
139
+
132
140
  Flags:
133
141
  --version Print version and exit
134
142
  --help Print usage and exit
@@ -1 +1 @@
1
- {"version":3,"file":"help.mjs","sourceRoot":"","sources":["../../src/cli/help.mjs"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,UAAU,SAAS;IACxB,MAAM,IAAI,GAAG,GAAG,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAkIT,CAAA;IAEnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;AAClC,CAAC"}
1
+ {"version":3,"file":"help.mjs","sourceRoot":"","sources":["../../src/cli/help.mjs"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,UAAU,SAAS;IACxB,MAAM,IAAI,GAAG,GAAG,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA0IT,CAAA;IAEnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;AAClC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"legacy-paths.d.mts","sourceRoot":"","sources":["../../../src/cli/install/legacy-paths.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;;;;;GAMG;AAEH,gDAAgD;AAChD,mCADW,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAiJ1C;;kBAvJY,MAAM;kBACN,MAAM;;;;;qBAEN,aAAa,CAAC,MAAM,CAAC"}
1
+ {"version":3,"file":"legacy-paths.d.mts","sourceRoot":"","sources":["../../../src/cli/install/legacy-paths.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;;;;;GAMG;AAEH,gDAAgD;AAChD,mCADW,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAsJ1C;;kBA5JY,MAAM;kBACN,MAAM;;;;;qBAEN,aAAa,CAAC,MAAM,CAAC"}
@@ -100,6 +100,7 @@ export const LEGACY_INSTALL_PATHS = Object.freeze({
100
100
  'agents/apt-fan-out.md',
101
101
  'agents/apt-handoff.md',
102
102
  'agents/apt-improve.md',
103
+ 'agents/apt-merge-conflict-resolution.md',
103
104
  'agents/apt-mockup.md',
104
105
  'agents/apt-pause.md',
105
106
  'agents/apt-personas.md',
@@ -144,6 +145,7 @@ export const LEGACY_INSTALL_PATHS = Object.freeze({
144
145
  'commands/apt-fan-out.md',
145
146
  'commands/apt-handoff.md',
146
147
  'commands/apt-improve.md',
148
+ 'commands/apt-merge-conflict-resolution.md',
147
149
  'commands/apt-mockup.md',
148
150
  'commands/apt-pause.md',
149
151
  'commands/apt-personas.md',
@@ -177,7 +179,9 @@ export const LEGACY_INSTALL_PATHS = Object.freeze({
177
179
  'agents/apt-improver.md',
178
180
  'agents/apt-planner.md',
179
181
  'agents/apt-pr-review-codebase-fit.md',
182
+ 'agents/apt-pr-review-crossplatform.md',
180
183
  'agents/apt-pr-review-fixer.md',
184
+ 'agents/apt-pr-review-i18n.md',
181
185
  'agents/apt-pr-review-logic.md',
182
186
  'agents/apt-pr-review-performance.md',
183
187
  'agents/apt-pr-review-quality.md',
@@ -185,6 +189,7 @@ export const LEGACY_INSTALL_PATHS = Object.freeze({
185
189
  'agents/apt-pr-review-self-reviewer.md',
186
190
  'agents/apt-pr-review-test-integrity.md',
187
191
  'agents/apt-pr-review-validator.md',
192
+ 'agents/apt-pr-review-xplatform.md',
188
193
  'agents/apt-researcher.md',
189
194
  'agents/apt-reviewer.md',
190
195
  'agents/apt-team-docs-narrator.md',
@@ -1 +1 @@
1
- {"version":3,"file":"legacy-paths.mjs","sourceRoot":"","sources":["../../../src/cli/install/legacy-paths.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;;;;;GAMG;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACpB,4EAA4E;QAC5E,+EAA+E;QAC/E,sEAAsE;QACtE,YAAY,EAAE,QAAQ;QACtB,sEAAsE;QACtE,sDAAsD;QACtD,oEAAoE;QACpE,mEAAmE;QACnE,6BAA6B;QAC7B,YAAY,EAAE,qBAAqB;QACnC,kEAAkE;QAClE,gEAAgE;QAChE,iEAAiE;QACjE,6DAA6D;QAC7D,gEAAgE;QAChE,6BAA6B;QAC7B,cAAc,EAAE,KAAK;QACrB,qEAAqE;QACrE,oCAAoC;QACpC,2EAA2E;QAC3E,wEAAwE;QACxE,mEAAmE;QACnE,8DAA8D;QAC9D,8BAA8B;QAC9B,wEAAwE;QACxE,sEAAsE;QACtE,gDAAgD;QAChD,kEAAkE;QAClE,8BAA8B;QAC9B,mEAAmE;QACnE,oEAAoE;QACpE,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC;YAC9B,wBAAwB;YACxB,sDAAsD;YACtD,eAAe;YACf,4BAA4B;YAC5B,yBAAyB;YACzB,wBAAwB;YACxB,uBAAuB;YACvB,wBAAwB;YACxB,0BAA0B;YAC1B,2BAA2B;YAC3B,qBAAqB;YACrB,sBAAsB;YACtB,uBAAuB;YACvB,uBAAuB;YACvB,oBAAoB;YACpB,uBAAuB;YACvB,uBAAuB;YACvB,uBAAuB;YACvB,uBAAuB;YACvB,sBAAsB;YACtB,qBAAqB;YACrB,wBAAwB;YACxB,oBAAoB;YACpB,yBAAyB;YACzB,yBAAyB;YACzB,qBAAqB;YACrB,6BAA6B;YAC7B,wBAAwB;YACxB,sBAAsB;YACtB,sBAAsB;YACtB,uBAAuB;YACvB,0BAA0B;YAC1B,mBAAmB;YACnB,oBAAoB;YACpB,qBAAqB;YACrB,oBAAoB;YACpB,oBAAoB;YACpB,2BAA2B;YAC3B,wBAAwB;YACxB,sBAAsB;YACtB,sBAAsB;YACtB,sBAAsB;YACtB,4BAA4B;YAC5B,wBAAwB;YACxB,wBAAwB;YACxB,gEAAgE;YAChE,iBAAiB;YACjB,8BAA8B;YAC9B,2BAA2B;YAC3B,0BAA0B;YAC1B,yBAAyB;YACzB,0BAA0B;YAC1B,4BAA4B;YAC5B,6BAA6B;YAC7B,uBAAuB;YACvB,wBAAwB;YACxB,yBAAyB;YACzB,yBAAyB;YACzB,sBAAsB;YACtB,yBAAyB;YACzB,yBAAyB;YACzB,yBAAyB;YACzB,yBAAyB;YACzB,wBAAwB;YACxB,uBAAuB;YACvB,0BAA0B;YAC1B,sBAAsB;YACtB,2BAA2B;YAC3B,2BAA2B;YAC3B,uBAAuB;YACvB,+BAA+B;YAC/B,0BAA0B;YAC1B,wBAAwB;YACxB,wBAAwB;YACxB,yBAAyB;YACzB,4BAA4B;YAC5B,qBAAqB;YACrB,sBAAsB;YACtB,uBAAuB;YACvB,sBAAsB;YACtB,sBAAsB;YACtB,6BAA6B;YAC7B,0BAA0B;YAC1B,wBAAwB;YACxB,wBAAwB;YACxB,wBAAwB;YACxB,8BAA8B;YAC9B,0BAA0B;YAC1B,0BAA0B;YAC1B,uEAAuE;YACvE,sEAAsE;YACtE,2BAA2B;YAC3B,wBAAwB;YACxB,wBAAwB;YACxB,uBAAuB;YACvB,sCAAsC;YACtC,+BAA+B;YAC/B,+BAA+B;YAC/B,qCAAqC;YACrC,iCAAiC;YACjC,kCAAkC;YAClC,uCAAuC;YACvC,wCAAwC;YACxC,mCAAmC;YACnC,0BAA0B;YAC1B,wBAAwB;YACxB,kCAAkC;YAClC,wBAAwB;SACxB,CAAC;KACF,CAAC;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"legacy-paths.mjs","sourceRoot":"","sources":["../../../src/cli/install/legacy-paths.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;;;;;GAMG;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACpB,4EAA4E;QAC5E,+EAA+E;QAC/E,sEAAsE;QACtE,YAAY,EAAE,QAAQ;QACtB,sEAAsE;QACtE,sDAAsD;QACtD,oEAAoE;QACpE,mEAAmE;QACnE,6BAA6B;QAC7B,YAAY,EAAE,qBAAqB;QACnC,kEAAkE;QAClE,gEAAgE;QAChE,iEAAiE;QACjE,6DAA6D;QAC7D,gEAAgE;QAChE,6BAA6B;QAC7B,cAAc,EAAE,KAAK;QACrB,qEAAqE;QACrE,oCAAoC;QACpC,2EAA2E;QAC3E,wEAAwE;QACxE,mEAAmE;QACnE,8DAA8D;QAC9D,8BAA8B;QAC9B,wEAAwE;QACxE,sEAAsE;QACtE,gDAAgD;QAChD,kEAAkE;QAClE,8BAA8B;QAC9B,mEAAmE;QACnE,oEAAoE;QACpE,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC;YAC9B,wBAAwB;YACxB,sDAAsD;YACtD,eAAe;YACf,4BAA4B;YAC5B,yBAAyB;YACzB,wBAAwB;YACxB,uBAAuB;YACvB,wBAAwB;YACxB,0BAA0B;YAC1B,2BAA2B;YAC3B,qBAAqB;YACrB,sBAAsB;YACtB,uBAAuB;YACvB,uBAAuB;YACvB,oBAAoB;YACpB,uBAAuB;YACvB,uBAAuB;YACvB,uBAAuB;YACvB,uBAAuB;YACvB,yCAAyC;YACzC,sBAAsB;YACtB,qBAAqB;YACrB,wBAAwB;YACxB,oBAAoB;YACpB,yBAAyB;YACzB,yBAAyB;YACzB,qBAAqB;YACrB,6BAA6B;YAC7B,wBAAwB;YACxB,sBAAsB;YACtB,sBAAsB;YACtB,uBAAuB;YACvB,0BAA0B;YAC1B,mBAAmB;YACnB,oBAAoB;YACpB,qBAAqB;YACrB,oBAAoB;YACpB,oBAAoB;YACpB,2BAA2B;YAC3B,wBAAwB;YACxB,sBAAsB;YACtB,sBAAsB;YACtB,sBAAsB;YACtB,4BAA4B;YAC5B,wBAAwB;YACxB,wBAAwB;YACxB,gEAAgE;YAChE,iBAAiB;YACjB,8BAA8B;YAC9B,2BAA2B;YAC3B,0BAA0B;YAC1B,yBAAyB;YACzB,0BAA0B;YAC1B,4BAA4B;YAC5B,6BAA6B;YAC7B,uBAAuB;YACvB,wBAAwB;YACxB,yBAAyB;YACzB,yBAAyB;YACzB,sBAAsB;YACtB,yBAAyB;YACzB,yBAAyB;YACzB,yBAAyB;YACzB,yBAAyB;YACzB,2CAA2C;YAC3C,wBAAwB;YACxB,uBAAuB;YACvB,0BAA0B;YAC1B,sBAAsB;YACtB,2BAA2B;YAC3B,2BAA2B;YAC3B,uBAAuB;YACvB,+BAA+B;YAC/B,0BAA0B;YAC1B,wBAAwB;YACxB,wBAAwB;YACxB,yBAAyB;YACzB,4BAA4B;YAC5B,qBAAqB;YACrB,sBAAsB;YACtB,uBAAuB;YACvB,sBAAsB;YACtB,sBAAsB;YACtB,6BAA6B;YAC7B,0BAA0B;YAC1B,wBAAwB;YACxB,wBAAwB;YACxB,wBAAwB;YACxB,8BAA8B;YAC9B,0BAA0B;YAC1B,0BAA0B;YAC1B,uEAAuE;YACvE,sEAAsE;YACtE,2BAA2B;YAC3B,wBAAwB;YACxB,wBAAwB;YACxB,uBAAuB;YACvB,sCAAsC;YACtC,uCAAuC;YACvC,+BAA+B;YAC/B,8BAA8B;YAC9B,+BAA+B;YAC/B,qCAAqC;YACrC,iCAAiC;YACjC,kCAAkC;YAClC,uCAAuC;YACvC,wCAAwC;YACxC,mCAAmC;YACnC,mCAAmC;YACnC,0BAA0B;YAC1B,wBAAwB;YACxB,kCAAkC;YAClC,wBAAwB;SACxB,CAAC;KACF,CAAC;CACF,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.mts","sourceRoot":"","sources":["../../../src/cli/roadmap/lifecycle.mjs"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;SA8GC"}
1
+ {"version":3,"file":"lifecycle.d.mts","sourceRoot":"","sources":["../../../src/cli/roadmap/lifecycle.mjs"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;SAgHC"}
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { existsSync, readFileSync } from 'node:fs';
13
13
  import { join } from 'node:path';
14
+ import { resolveMainRepoRoot } from '../util/state-paths.mjs';
14
15
  import { loadRoadmapForScope, saveRoadmapForScope } from './io.mjs';
15
16
  import { applyRollup } from './rollup.mjs';
16
17
  import { syncRoadmapInProcess } from './sync.mjs';
@@ -80,7 +81,9 @@ export function applyLifecyclePhaseSideEffect(targetDir, task, spec, reasonPrefi
80
81
  if (spec.to === 'completed') {
81
82
  let stateBlob = opts.stateBlob;
82
83
  if (!stateBlob) {
83
- const statePath = join(targetDir, '.aperant', 'state.json');
84
+ // state-fork-fix: ephemeral sibling-count read resolves to the main
85
+ // board (the committable roadmapDir read above stays worktree-local).
86
+ const statePath = join(resolveMainRepoRoot(targetDir), '.aperant', 'state.json');
84
87
  if (existsSync(statePath)) {
85
88
  try {
86
89
  stateBlob = JSON.parse(readFileSync(statePath, 'utf-8'));
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.mjs","sourceRoot":"","sources":["../../../src/cli/roadmap/lifecycle.mjs"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.mjs","sourceRoot":"","sources":["../../../src/cli/roadmap/lifecycle.mjs"],"names":[],"mappings":"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"}
@@ -14,6 +14,15 @@ export function formatDateForTask(dateFormat: any, now?: Date): string;
14
14
  * generator never emits a counter or a random hash.
15
15
  */
16
16
  export function generateTaskId(description: any, config: any, now?: Date): string;
17
+ /**
18
+ * Build the `.aperant/tasks/<id>/` directory path.
19
+ *
20
+ * state-fork-fix: `tasks/` is EPHEMERAL, so callers pass the resolved main-repo
21
+ * state root (`resolveMainRepoRoot(projectDir)`) as `projectDir` — the redirect
22
+ * stays visible at each call site rather than being hidden inside this builder.
23
+ * `resolve()` is idempotent on an already-absolute root, so passing the resolved
24
+ * root is safe.
25
+ */
17
26
  export function getTaskDir(projectDir: any, taskId: any): string;
18
27
  /**
19
28
  * C28 — scope-aware proof directory.
@@ -1 +1 @@
1
- {"version":3,"file":"ids.d.mts","sourceRoot":"","sources":["../../../src/cli/task/ids.mjs"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,uEAaC;AAED;;;;;;;;GAQG;AACH,kFAUC;AAED,iEAEC;AAED;;;;;GAKG;AACH,8EAGC"}
1
+ {"version":3,"file":"ids.d.mts","sourceRoot":"","sources":["../../../src/cli/task/ids.mjs"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,uEAaC;AAED;;;;;;;;GAQG;AACH,kFAUC;AAED;;;;;;;;GAQG;AACH,iEAEC;AAED;;;;;GAKG;AACH,8EAGC"}
@@ -40,6 +40,15 @@ export function generateTaskId(description, config, now = new Date()) {
40
40
  const date = formatDateForTask(dateFormat, now);
41
41
  return `${slug}_${date}`;
42
42
  }
43
+ /**
44
+ * Build the `.aperant/tasks/<id>/` directory path.
45
+ *
46
+ * state-fork-fix: `tasks/` is EPHEMERAL, so callers pass the resolved main-repo
47
+ * state root (`resolveMainRepoRoot(projectDir)`) as `projectDir` — the redirect
48
+ * stays visible at each call site rather than being hidden inside this builder.
49
+ * `resolve()` is idempotent on an already-absolute root, so passing the resolved
50
+ * root is safe.
51
+ */
43
52
  export function getTaskDir(projectDir, taskId) {
44
53
  return join(resolve(projectDir), '.aperant', 'tasks', taskId);
45
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ids.mjs","sourceRoot":"","sources":["../../../src/cli/task/ids.mjs"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEzC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IAC7D,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACtD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACjD,QAAQ,UAAU,EAAE,CAAC;QACpB,KAAK,UAAU;YACd,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;QAC3B,KAAK,UAAU;YACd,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;QAC3B,KAAK,UAAU,CAAC;QAChB;YACC,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;IAC5B,CAAC;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IACnE,MAAM,IAAI,GACT,WAAW;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,MAAM,CAAA;IAClC,MAAM,UAAU,GAAG,MAAM,EAAE,WAAW,EAAE,WAAW,IAAI,UAAU,CAAA;IACjE,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IAC/C,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAU,EAAE,MAAM;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM;IACpD,MAAM,aAAa,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAA;IAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAA;AAC7E,CAAC"}
1
+ {"version":3,"file":"ids.mjs","sourceRoot":"","sources":["../../../src/cli/task/ids.mjs"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEzC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IAC7D,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACtD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACjD,QAAQ,UAAU,EAAE,CAAC;QACpB,KAAK,UAAU;YACd,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;QAC3B,KAAK,UAAU;YACd,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;QAC3B,KAAK,UAAU,CAAC;QAChB;YACC,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;IAC5B,CAAC;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IACnE,MAAM,IAAI,GACT,WAAW;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,MAAM,CAAA;IAClC,MAAM,UAAU,GAAG,MAAM,EAAE,WAAW,EAAE,WAAW,IAAI,UAAU,CAAA;IACjE,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IAC/C,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAA;AACzB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,UAAU,EAAE,MAAM;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM;IACpD,MAAM,aAAa,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAA;IAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAA;AAC7E,CAAC"}
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * Regenerate .aperant/tasks/INDEX.md from state.json.
3
3
  * One line per task — lightweight project task management view.
4
+ *
5
+ * state-fork-fix: both the state.json READ and the tasks/INDEX.md WRITE are
6
+ * ephemeral, so they resolve to the MAIN repo from any worktree cwd. Config
7
+ * (loadMergedProjectConfig below) stays on the raw targetDir — config.json /
8
+ * config.local.json are committable + per-device, not the ephemeral board.
4
9
  */
5
10
  export function regenerateTaskIndex(targetDir: any): void;
6
11
  //# sourceMappingURL=index-md.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-md.d.mts","sourceRoot":"","sources":["../../../src/cli/task/index-md.mjs"],"names":[],"mappings":"AAUA;;;GAGG;AACH,0DAwFC"}
1
+ {"version":3,"file":"index-md.d.mts","sourceRoot":"","sources":["../../../src/cli/task/index-md.mjs"],"names":[],"mappings":"AAWA;;;;;;;;GAQG;AACH,0DA0FC"}
@@ -5,13 +5,20 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
6
  import { loadMergedProjectConfig } from '../config/load.mjs';
7
7
  import { withFileLock } from '../util/fs-lock.mjs';
8
+ import { resolveMainRepoRoot } from '../util/state-paths.mjs';
8
9
  import { formatDateDisplay, formatTimeDisplay } from './format.mjs';
9
10
  /**
10
11
  * Regenerate .aperant/tasks/INDEX.md from state.json.
11
12
  * One line per task — lightweight project task management view.
13
+ *
14
+ * state-fork-fix: both the state.json READ and the tasks/INDEX.md WRITE are
15
+ * ephemeral, so they resolve to the MAIN repo from any worktree cwd. Config
16
+ * (loadMergedProjectConfig below) stays on the raw targetDir — config.json /
17
+ * config.local.json are committable + per-device, not the ephemeral board.
12
18
  */
13
19
  export function regenerateTaskIndex(targetDir) {
14
- const statePath = join(targetDir, '.aperant', 'state.json');
20
+ const stateRoot = resolveMainRepoRoot(targetDir);
21
+ const statePath = join(stateRoot, '.aperant', 'state.json');
15
22
  if (!existsSync(statePath))
16
23
  return;
17
24
  // AUDIT-001: read through the merged loader so per-device
@@ -87,11 +94,12 @@ export function regenerateTaskIndex(targetDir) {
87
94
  }
88
95
  }
89
96
  lines.push('', `*Auto-generated by apt-tools \u2014 ${new Date().toISOString()}*`, '');
90
- const indexPath = join(targetDir, '.aperant', 'tasks', 'INDEX.md');
91
- mkdirSync(join(targetDir, '.aperant', 'tasks'), { recursive: true });
97
+ const indexPath = join(stateRoot, '.aperant', 'tasks', 'INDEX.md');
98
+ mkdirSync(join(stateRoot, '.aperant', 'tasks'), { recursive: true });
92
99
  // Lock-protected — C28 R4. Concurrent regenerators must not interleave.
100
+ // Lock root moves with the file (state-fork-fix ID-06).
93
101
  withFileLock(indexPath, () => {
94
102
  writeFileSync(indexPath, lines.join('\n'), 'utf-8');
95
- }, { projectRoot: targetDir });
103
+ }, { projectRoot: stateRoot });
96
104
  }
97
105
  //# sourceMappingURL=index-md.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-md.mjs","sourceRoot":"","sources":["../../../src/cli/task/index-md.mjs"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-md.mjs","sourceRoot":"","sources":["../../../src/cli/task/index-md.mjs"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Read + JSON-parse a file if it exists, returning null when the file is
3
+ * absent OR unparseable (malformed JSON is a non-fatal "no document" signal
4
+ * for the callers that use this — gates / followups CLI). Never throws.
5
+ */
6
+ export function readJsonIfExists(path: any): any;
1
7
  /**
2
8
  * Read framework package.json and return a "<name> <version>" identity string.
3
9
  * Resolves relative to this module's location so the CLI keeps its own
@@ -1 +1 @@
1
- {"version":3,"file":"io.d.mts","sourceRoot":"","sources":["../../../src/cli/util/io.mjs"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,qCAKC;AAED;;;GAGG;AACH,wCAEC;AAED;;;GAGG;AACH,yCAGC"}
1
+ {"version":3,"file":"io.d.mts","sourceRoot":"","sources":["../../../src/cli/util/io.mjs"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,iDAOC;AAED;;;;GAIG;AACH,qCAKC;AAED;;;GAGG;AACH,wCAEC;AAED;;;GAGG;AACH,yCAGC"}
@@ -4,7 +4,7 @@
4
4
  * These are pure leaf helpers with zero internal dependencies. Behavior must
5
5
  * match the originals byte-for-byte; the CLI snapshot harness enforces this.
6
6
  */
7
- import { readFileSync } from 'node:fs';
7
+ import { existsSync, readFileSync } from 'node:fs';
8
8
  import { dirname, resolve } from 'node:path';
9
9
  import { fileURLToPath } from 'node:url';
10
10
  // Re-export the hardened atomic-write primitives so every existing call site
@@ -13,6 +13,21 @@ import { fileURLToPath } from 'node:url';
13
13
  export { appendJsonl, atomicWriteJson, atomicWriteText } from './atomic-write.mjs';
14
14
  const __filename = fileURLToPath(import.meta.url);
15
15
  const __dirname = dirname(__filename);
16
+ /**
17
+ * Read + JSON-parse a file if it exists, returning null when the file is
18
+ * absent OR unparseable (malformed JSON is a non-fatal "no document" signal
19
+ * for the callers that use this — gates / followups CLI). Never throws.
20
+ */
21
+ export function readJsonIfExists(path) {
22
+ if (!existsSync(path))
23
+ return null;
24
+ try {
25
+ return JSON.parse(readFileSync(path, 'utf-8'));
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
16
31
  /**
17
32
  * Read framework package.json and return a "<name> <version>" identity string.
18
33
  * Resolves relative to this module's location so the CLI keeps its own
@@ -1 +1 @@
1
- {"version":3,"file":"io.mjs","sourceRoot":"","sources":["../../../src/cli/util/io.mjs"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,6EAA6E;AAC7E,wEAAwE;AACxE,uDAAuD;AACvD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAElF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC;;;;GAIG;AACH,MAAM,UAAU,UAAU;IACzB,0EAA0E;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAA;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IACtD,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAA;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,IAAI;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,OAAO;IAC3B,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"io.mjs","sourceRoot":"","sources":["../../../src/cli/util/io.mjs"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,6EAA6E;AAC7E,wEAAwE;AACxE,uDAAuD;AACvD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAElF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAI;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAClC,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IAC/C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU;IACzB,0EAA0E;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAA;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IACtD,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAA;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,IAAI;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,OAAO;IAC3B,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChB,CAAC"}
@@ -5,8 +5,13 @@
5
5
  */
6
6
  export function findProjectRootFromPath(filePath: any): string | null;
7
7
  /**
8
- * Get the shared lock directory — uses git common dir so locks coordinate
9
- * across worktrees. Falls back to local .aperant/locks/ if not in git.
8
+ * Get the shared lock directory — resolves to the main repo's .aperant/locks/
9
+ * from any worktree so locks coordinate across worktrees. Falls back to the
10
+ * resolved local .aperant/locks/ if not in git.
11
+ *
12
+ * This is a SEPARATE policy wrapper over the shared resolveMainRepoRoot
13
+ * mechanism (state-fork-fix ID-03) — locks are short-lived and do NOT follow
14
+ * resolveStateDir's Phase-2 home relocation, so the two stay distinct.
10
15
  */
11
16
  export function getSharedLockDir(projectDir: any): string;
12
17
  //# sourceMappingURL=project.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.mts","sourceRoot":"","sources":["../../../src/cli/util/project.mjs"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,sEASC;AAED;;;GAGG;AACH,0DAYC"}
1
+ {"version":3,"file":"project.d.mts","sourceRoot":"","sources":["../../../src/cli/util/project.mjs"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,sEASC;AAED;;;;;;;;GAQG;AACH,0DAIC"}
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import { existsSync, mkdirSync } from 'node:fs';
10
10
  import { dirname, join, resolve } from 'node:path';
11
- import { detectWorktree } from '../git/worktree-detect.mjs';
11
+ import { resolveMainRepoRoot } from './state-paths.mjs';
12
12
  /**
13
13
  * Walk upward from the target path until we find a `.aperant/` directory.
14
14
  * Returns the containing project root, or null if none is found within
@@ -27,20 +27,17 @@ export function findProjectRootFromPath(filePath) {
27
27
  return null;
28
28
  }
29
29
  /**
30
- * Get the shared lock directory — uses git common dir so locks coordinate
31
- * across worktrees. Falls back to local .aperant/locks/ if not in git.
30
+ * Get the shared lock directory — resolves to the main repo's .aperant/locks/
31
+ * from any worktree so locks coordinate across worktrees. Falls back to the
32
+ * resolved local .aperant/locks/ if not in git.
33
+ *
34
+ * This is a SEPARATE policy wrapper over the shared resolveMainRepoRoot
35
+ * mechanism (state-fork-fix ID-03) — locks are short-lived and do NOT follow
36
+ * resolveStateDir's Phase-2 home relocation, so the two stay distinct.
32
37
  */
33
38
  export function getSharedLockDir(projectDir) {
34
- const wt = detectWorktree(projectDir);
35
- if (wt.is_worktree && wt.main_repo_root) {
36
- // Use main repo's .aperant/locks/ so all worktrees share the same locks
37
- const sharedDir = join(wt.main_repo_root, '.aperant', 'locks');
38
- mkdirSync(sharedDir, { recursive: true });
39
- return sharedDir;
40
- }
41
- // Not a worktree — use local
42
- const localDir = join(resolve(projectDir), '.aperant', 'locks');
43
- mkdirSync(localDir, { recursive: true });
44
- return localDir;
39
+ const sharedDir = join(resolveMainRepoRoot(projectDir), '.aperant', 'locks');
40
+ mkdirSync(sharedDir, { recursive: true });
41
+ return sharedDir;
45
42
  }
46
43
  //# sourceMappingURL=project.mjs.map