@aipper/aiws 0.0.29 → 0.0.31

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 (278) hide show
  1. package/bin/aiws.js +2 -2
  2. package/dist/aiws-package.d.ts +4 -0
  3. package/dist/aiws-package.js +11 -0
  4. package/dist/aiws-package.js.map +1 -0
  5. package/dist/aiws-paths.d.ts +48 -0
  6. package/dist/aiws-paths.js +129 -0
  7. package/dist/aiws-paths.js.map +1 -0
  8. package/dist/backup.d.ts +27 -0
  9. package/dist/backup.js +125 -0
  10. package/dist/backup.js.map +1 -0
  11. package/dist/cli.d.ts +1 -0
  12. package/dist/cli.js +773 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/codex-prompts.d.ts +17 -0
  15. package/dist/codex-prompts.js +49 -0
  16. package/dist/codex-prompts.js.map +1 -0
  17. package/dist/codex-skills.d.ts +17 -0
  18. package/dist/codex-skills.js +75 -0
  19. package/dist/codex-skills.js.map +1 -0
  20. package/dist/commands/change-advice.d.ts +25 -0
  21. package/dist/commands/change-advice.js +197 -0
  22. package/dist/commands/change-advice.js.map +1 -0
  23. package/dist/commands/change-evidence-command.d.ts +29 -0
  24. package/dist/commands/change-evidence-command.js +213 -0
  25. package/dist/commands/change-evidence-command.js.map +1 -0
  26. package/dist/commands/change-evidence-entry.d.ts +16 -0
  27. package/dist/commands/change-evidence-entry.js +35 -0
  28. package/dist/commands/change-evidence-entry.js.map +1 -0
  29. package/dist/commands/change-evidence.d.ts +108 -0
  30. package/dist/commands/change-evidence.js +341 -0
  31. package/dist/commands/change-evidence.js.map +1 -0
  32. package/dist/commands/change-finish.d.ts +71 -0
  33. package/dist/commands/change-finish.js +387 -0
  34. package/dist/commands/change-finish.js.map +1 -0
  35. package/dist/commands/change-git-status.d.ts +22 -0
  36. package/dist/commands/change-git-status.js +50 -0
  37. package/dist/commands/change-git-status.js.map +1 -0
  38. package/dist/commands/change-lifecycle-entry.d.ts +29 -0
  39. package/{src → dist}/commands/change-lifecycle-entry.js +21 -28
  40. package/dist/commands/change-lifecycle-entry.js.map +1 -0
  41. package/dist/commands/change-lifecycle.d.ts +56 -0
  42. package/dist/commands/change-lifecycle.js +211 -0
  43. package/dist/commands/change-lifecycle.js.map +1 -0
  44. package/dist/commands/change-metrics-command.d.ts +12 -0
  45. package/dist/commands/change-metrics-command.js +110 -0
  46. package/dist/commands/change-metrics-command.js.map +1 -0
  47. package/dist/commands/change-next-command.d.ts +18 -0
  48. package/dist/commands/change-next-command.js +138 -0
  49. package/dist/commands/change-next-command.js.map +1 -0
  50. package/dist/commands/change-review-gates.d.ts +107 -0
  51. package/dist/commands/change-review-gates.js +329 -0
  52. package/dist/commands/change-review-gates.js.map +1 -0
  53. package/dist/commands/change-scope-gate.d.ts +21 -0
  54. package/dist/commands/change-scope-gate.js +32 -0
  55. package/dist/commands/change-scope-gate.js.map +1 -0
  56. package/dist/commands/change-start.d.ts +30 -0
  57. package/dist/commands/change-start.js +91 -0
  58. package/dist/commands/change-start.js.map +1 -0
  59. package/dist/commands/change-state-command.d.ts +3 -0
  60. package/dist/commands/change-state-command.js +32 -0
  61. package/dist/commands/change-state-command.js.map +1 -0
  62. package/dist/commands/change-status-command.d.ts +13 -0
  63. package/dist/commands/change-status-command.js +126 -0
  64. package/dist/commands/change-status-command.js.map +1 -0
  65. package/dist/commands/change-status-context.d.ts +58 -0
  66. package/dist/commands/change-status-context.js +166 -0
  67. package/dist/commands/change-status-context.js.map +1 -0
  68. package/dist/commands/change-task-stats.d.ts +24 -0
  69. package/dist/commands/change-task-stats.js +66 -0
  70. package/dist/commands/change-task-stats.js.map +1 -0
  71. package/dist/commands/change-validate-entry.d.ts +17 -0
  72. package/dist/commands/change-validate-entry.js +44 -0
  73. package/dist/commands/change-validate-entry.js.map +1 -0
  74. package/dist/commands/change-validate.d.ts +32 -0
  75. package/dist/commands/change-validate.js +128 -0
  76. package/dist/commands/change-validate.js.map +1 -0
  77. package/dist/commands/change.d.ts +322 -0
  78. package/dist/commands/change.js +1731 -0
  79. package/dist/commands/change.js.map +1 -0
  80. package/dist/commands/codex-install-prompts.d.ts +4 -0
  81. package/dist/commands/codex-install-prompts.js +68 -0
  82. package/dist/commands/codex-install-prompts.js.map +1 -0
  83. package/dist/commands/codex-install-skills.d.ts +4 -0
  84. package/dist/commands/codex-install-skills.js +74 -0
  85. package/dist/commands/codex-install-skills.js.map +1 -0
  86. package/dist/commands/codex-status-prompts.d.ts +4 -0
  87. package/dist/commands/codex-status-prompts.js +44 -0
  88. package/dist/commands/codex-status-prompts.js.map +1 -0
  89. package/dist/commands/codex-status-skills.d.ts +4 -0
  90. package/dist/commands/codex-status-skills.js +54 -0
  91. package/dist/commands/codex-status-skills.js.map +1 -0
  92. package/dist/commands/codex-uninstall-prompts.d.ts +4 -0
  93. package/dist/commands/codex-uninstall-prompts.js +51 -0
  94. package/dist/commands/codex-uninstall-prompts.js.map +1 -0
  95. package/dist/commands/codex-uninstall-skills.d.ts +4 -0
  96. package/dist/commands/codex-uninstall-skills.js +59 -0
  97. package/dist/commands/codex-uninstall-skills.js.map +1 -0
  98. package/dist/commands/dashboard.d.ts +222 -0
  99. package/dist/commands/dashboard.js +193 -0
  100. package/dist/commands/dashboard.js.map +1 -0
  101. package/dist/commands/hooks-install.d.ts +4 -0
  102. package/dist/commands/hooks-install.js +90 -0
  103. package/dist/commands/hooks-install.js.map +1 -0
  104. package/dist/commands/hooks-status.d.ts +4 -0
  105. package/dist/commands/hooks-status.js +89 -0
  106. package/dist/commands/hooks-status.js.map +1 -0
  107. package/dist/commands/init.d.ts +4 -0
  108. package/dist/commands/init.js +100 -0
  109. package/dist/commands/init.js.map +1 -0
  110. package/dist/commands/opencode-auto.d.ts +11 -0
  111. package/dist/commands/opencode-auto.js +158 -0
  112. package/dist/commands/opencode-auto.js.map +1 -0
  113. package/dist/commands/opencode-status.d.ts +4 -0
  114. package/dist/commands/opencode-status.js +75 -0
  115. package/dist/commands/opencode-status.js.map +1 -0
  116. package/dist/commands/opencode-supervise.d.ts +24 -0
  117. package/dist/commands/opencode-supervise.js +188 -0
  118. package/dist/commands/opencode-supervise.js.map +1 -0
  119. package/dist/commands/rollback.d.ts +4 -0
  120. package/dist/commands/rollback.js +12 -0
  121. package/dist/commands/rollback.js.map +1 -0
  122. package/dist/commands/update.d.ts +4 -0
  123. package/dist/commands/update.js +212 -0
  124. package/dist/commands/update.js.map +1 -0
  125. package/dist/commands/validate.d.ts +4 -0
  126. package/dist/commands/validate.js +222 -0
  127. package/dist/commands/validate.js.map +1 -0
  128. package/dist/commands/ws-commit.d.ts +5 -0
  129. package/dist/commands/ws-commit.js +39 -0
  130. package/dist/commands/ws-commit.js.map +1 -0
  131. package/dist/commands/ws-deliver.d.ts +5 -0
  132. package/dist/commands/ws-deliver.js +59 -0
  133. package/dist/commands/ws-deliver.js.map +1 -0
  134. package/dist/commands/ws-finish.d.ts +5 -0
  135. package/dist/commands/ws-finish.js +142 -0
  136. package/dist/commands/ws-finish.js.map +1 -0
  137. package/dist/commands/ws-handoff.d.ts +5 -0
  138. package/dist/commands/ws-handoff.js +35 -0
  139. package/dist/commands/ws-handoff.js.map +1 -0
  140. package/dist/commands/ws-migrate.d.ts +5 -0
  141. package/dist/commands/ws-migrate.js +41 -0
  142. package/dist/commands/ws-migrate.js.map +1 -0
  143. package/dist/commands/ws-plan-verify.d.ts +5 -0
  144. package/dist/commands/ws-plan-verify.js +38 -0
  145. package/dist/commands/ws-plan-verify.js.map +1 -0
  146. package/dist/commands/ws-pull.d.ts +5 -0
  147. package/dist/commands/ws-pull.js +26 -0
  148. package/dist/commands/ws-pull.js.map +1 -0
  149. package/dist/commands/ws-push.d.ts +5 -0
  150. package/dist/commands/ws-push.js +68 -0
  151. package/dist/commands/ws-push.js.map +1 -0
  152. package/dist/commands/ws-submodule-setup.d.ts +5 -0
  153. package/dist/commands/ws-submodule-setup.js +55 -0
  154. package/dist/commands/ws-submodule-setup.js.map +1 -0
  155. package/dist/commands/ws-verify-before-complete.d.ts +5 -0
  156. package/dist/commands/ws-verify-before-complete.js +35 -0
  157. package/dist/commands/ws-verify-before-complete.js.map +1 -0
  158. package/dist/dashboard/app.d.ts +1 -0
  159. package/dist/dashboard/app.js +370 -0
  160. package/dist/dashboard/app.js.map +1 -0
  161. package/dist/delegation/cli.d.ts +6 -0
  162. package/dist/delegation/cli.js +14 -0
  163. package/dist/delegation/cli.js.map +1 -0
  164. package/dist/delegation/index.d.ts +35 -0
  165. package/dist/delegation/index.js +118 -0
  166. package/dist/delegation/index.js.map +1 -0
  167. package/dist/errors.d.ts +8 -0
  168. package/dist/errors.js +11 -0
  169. package/dist/errors.js.map +1 -0
  170. package/dist/exec.d.ts +9 -0
  171. package/dist/exec.js +22 -0
  172. package/dist/exec.js.map +1 -0
  173. package/dist/fs.d.ts +9 -0
  174. package/dist/fs.js +62 -0
  175. package/dist/fs.js.map +1 -0
  176. package/dist/governance.d.ts +10 -0
  177. package/dist/governance.js +135 -0
  178. package/dist/governance.js.map +1 -0
  179. package/dist/hash.d.ts +3 -0
  180. package/dist/hash.js +13 -0
  181. package/dist/hash.js.map +1 -0
  182. package/dist/hooks/deploy-claude.d.ts +13 -0
  183. package/dist/hooks/deploy-claude.js +67 -0
  184. package/dist/hooks/deploy-claude.js.map +1 -0
  185. package/dist/journal.d.ts +22 -0
  186. package/dist/journal.js +112 -0
  187. package/dist/journal.js.map +1 -0
  188. package/dist/json-schema-lite.d.ts +22 -0
  189. package/dist/json-schema-lite.js +148 -0
  190. package/dist/json-schema-lite.js.map +1 -0
  191. package/dist/managed-blocks.d.ts +24 -0
  192. package/dist/managed-blocks.js +84 -0
  193. package/dist/managed-blocks.js.map +1 -0
  194. package/dist/manifest.d.ts +24 -0
  195. package/dist/manifest.js +145 -0
  196. package/dist/manifest.js.map +1 -0
  197. package/dist/opencode-env.d.ts +62 -0
  198. package/dist/opencode-env.js +178 -0
  199. package/dist/opencode-env.js.map +1 -0
  200. package/dist/path-utils.d.ts +2 -0
  201. package/dist/path-utils.js +8 -0
  202. package/dist/path-utils.js.map +1 -0
  203. package/dist/spec.d.ts +17 -0
  204. package/dist/spec.js +174 -0
  205. package/dist/spec.js.map +1 -0
  206. package/dist/template.d.ts +20 -0
  207. package/dist/template.js +123 -0
  208. package/dist/template.js.map +1 -0
  209. package/dist/workspace.d.ts +4 -0
  210. package/dist/workspace.js +19 -0
  211. package/dist/workspace.js.map +1 -0
  212. package/package.json +11 -3
  213. package/src/aiws-package.js +0 -15
  214. package/src/backup.js +0 -149
  215. package/src/cli.js +0 -760
  216. package/src/codex-prompts.js +0 -74
  217. package/src/codex-skills.js +0 -111
  218. package/src/commands/change-advice.js +0 -181
  219. package/src/commands/change-evidence-command.js +0 -242
  220. package/src/commands/change-evidence-entry.js +0 -40
  221. package/src/commands/change-evidence.js +0 -340
  222. package/src/commands/change-finish.js +0 -413
  223. package/src/commands/change-git-status.js +0 -53
  224. package/src/commands/change-lifecycle.js +0 -236
  225. package/src/commands/change-metrics-command.js +0 -110
  226. package/src/commands/change-next-command.js +0 -133
  227. package/src/commands/change-review-gates.js +0 -331
  228. package/src/commands/change-scope-gate.js +0 -34
  229. package/src/commands/change-start.js +0 -85
  230. package/src/commands/change-state-command.js +0 -40
  231. package/src/commands/change-status-command.js +0 -125
  232. package/src/commands/change-status-context.js +0 -173
  233. package/src/commands/change-task-stats.js +0 -64
  234. package/src/commands/change-validate-entry.js +0 -45
  235. package/src/commands/change-validate.js +0 -127
  236. package/src/commands/change.js +0 -1829
  237. package/src/commands/codex-install-prompts.js +0 -68
  238. package/src/commands/codex-install-skills.js +0 -74
  239. package/src/commands/codex-status-prompts.js +0 -55
  240. package/src/commands/codex-status-skills.js +0 -63
  241. package/src/commands/codex-uninstall-prompts.js +0 -55
  242. package/src/commands/codex-uninstall-skills.js +0 -62
  243. package/src/commands/dashboard.js +0 -205
  244. package/src/commands/hooks-install.js +0 -92
  245. package/src/commands/hooks-status.js +0 -95
  246. package/src/commands/init.js +0 -101
  247. package/src/commands/opencode-auto.js +0 -167
  248. package/src/commands/opencode-status.js +0 -103
  249. package/src/commands/opencode-supervise.js +0 -200
  250. package/src/commands/rollback.js +0 -13
  251. package/src/commands/update.js +0 -145
  252. package/src/commands/validate.js +0 -228
  253. package/src/commands/ws-commit.js +0 -44
  254. package/src/commands/ws-deliver.js +0 -67
  255. package/src/commands/ws-finish.js +0 -83
  256. package/src/commands/ws-handoff.js +0 -40
  257. package/src/commands/ws-migrate.js +0 -41
  258. package/src/commands/ws-plan-verify.js +0 -44
  259. package/src/commands/ws-pull.js +0 -30
  260. package/src/commands/ws-push.js +0 -71
  261. package/src/commands/ws-submodule-setup.js +0 -65
  262. package/src/commands/ws-verify-before-complete.js +0 -39
  263. package/src/dashboard/app.js +0 -371
  264. package/src/errors.js +0 -15
  265. package/src/exec.js +0 -34
  266. package/src/fs.js +0 -91
  267. package/src/governance.js +0 -159
  268. package/src/hash.js +0 -25
  269. package/src/json-schema-lite.js +0 -164
  270. package/src/managed-blocks.js +0 -131
  271. package/src/manifest.js +0 -177
  272. package/src/opencode-env.js +0 -208
  273. package/src/path-utils.js +0 -20
  274. package/src/spec.js +0 -195
  275. package/src/template.js +0 -187
  276. package/src/workspace.js +0 -23
  277. /package/{src → dist}/dashboard/index.html +0 -0
  278. /package/{src → dist}/dashboard/style.css +0 -0
@@ -0,0 +1,387 @@
1
+ import path from "node:path";
2
+ /**
3
+ * @param {string} gitRoot
4
+ * @param {string} branch
5
+ * @param {string | undefined} preferredRemote
6
+ * @param {{ runCommand: typeof import("../exec.js").runCommand }} deps
7
+ */
8
+ export async function resolvePushTarget(gitRoot, branch, preferredRemote, deps) {
9
+ const remoteRaw = String(preferredRemote || "").trim();
10
+ const branchRemoteRes = await deps.runCommand("git", ["config", "--get", `branch.${branch}.remote`], { cwd: gitRoot });
11
+ const trackedRemote = String(branchRemoteRes.stdout || "").trim();
12
+ const branchMergeRes = await deps.runCommand("git", ["config", "--get", `branch.${branch}.merge`], { cwd: gitRoot });
13
+ const trackedMergeRef = String(branchMergeRes.stdout || "").trim();
14
+ const trackedBranch = trackedMergeRef.startsWith("refs/heads/") ? trackedMergeRef.slice("refs/heads/".length) : "";
15
+ const remote = remoteRaw || trackedRemote || "origin";
16
+ const remoteBranch = trackedBranch || branch;
17
+ const refspec = remoteBranch === branch ? branch : `${branch}:${remoteBranch}`;
18
+ return { remote, remoteBranch, refspec, trackedRemote, trackedMergeRef };
19
+ }
20
+ /**
21
+ * @param {string} gitRoot
22
+ * @param {{ pathExists: (path: string) => Promise<boolean>, runCommand: typeof import("../exec.js").runCommand }} deps
23
+ * @returns {Promise<Array<{ name: string, path: string }>>}
24
+ */
25
+ export async function listSubmodulesFromGitmodules(gitRoot, deps) {
26
+ const gitmodules = path.join(gitRoot, ".gitmodules");
27
+ if (!(await deps.pathExists(gitmodules)))
28
+ return [];
29
+ const list = await deps.runCommand("git", ["config", "--file", ".gitmodules", "--get-regexp", "^submodule\\..*\\.path$"], { cwd: gitRoot });
30
+ if (list.code !== 0)
31
+ return [];
32
+ /** @type {Array<{ name: string, path: string }>} */
33
+ const subs = [];
34
+ for (const raw of String(list.stdout || "").split("\n")) {
35
+ const line = raw.trim();
36
+ if (!line)
37
+ continue;
38
+ const idx = line.indexOf(" ");
39
+ if (idx <= 0)
40
+ continue;
41
+ const key = line.slice(0, idx).trim();
42
+ const subPath = line.slice(idx + 1).trim();
43
+ const match = key.match(/^submodule\.(.+)\.path$/);
44
+ if (!match)
45
+ continue;
46
+ const name = String(match[1] || "").trim();
47
+ if (!name || !subPath)
48
+ continue;
49
+ subs.push({ name, path: subPath });
50
+ }
51
+ return subs;
52
+ }
53
+ /**
54
+ * @param {string} targetsPath
55
+ * @param {{ pathExists: (path: string) => Promise<boolean>, readText: (path: string) => Promise<string> }} deps
56
+ */
57
+ export async function parseSubmoduleTargetsFile(targetsPath, deps) {
58
+ /** @type {Map<string, { branch: string, remote: string }>} */
59
+ const parsed = new Map();
60
+ /** @type {string[]} */
61
+ const errors = [];
62
+ if (!(await deps.pathExists(targetsPath))) {
63
+ return { parsed, errors };
64
+ }
65
+ const text = await deps.readText(targetsPath);
66
+ const lines = String(text || "").split(/\r?\n/);
67
+ for (let i = 0; i < lines.length; i += 1) {
68
+ const raw = lines[i] || "";
69
+ const line = raw.trim();
70
+ if (!line || line.startsWith("#"))
71
+ continue;
72
+ const parts = line.split(/\s+/).filter(Boolean);
73
+ if (parts.length < 2) {
74
+ errors.push(`${path.basename(targetsPath)}:${i + 1} invalid line (expected: <path> <target_branch> [remote])`);
75
+ continue;
76
+ }
77
+ const subPath = String(parts[0] || "").trim();
78
+ const targetBranch = String(parts[1] || "").trim();
79
+ const remote = String(parts[2] || "origin").trim() || "origin";
80
+ if (!subPath) {
81
+ errors.push(`${path.basename(targetsPath)}:${i + 1} missing submodule path`);
82
+ continue;
83
+ }
84
+ if (parsed.has(subPath)) {
85
+ errors.push(`${path.basename(targetsPath)}:${i + 1} duplicate submodule path: ${subPath}`);
86
+ continue;
87
+ }
88
+ if (!targetBranch || ["<fill-me>", "<fill_me>", "tbd", "TBD"].includes(targetBranch)) {
89
+ errors.push(`${path.basename(targetsPath)}:${i + 1} missing/placeholder target_branch for ${subPath}`);
90
+ continue;
91
+ }
92
+ parsed.set(subPath, { branch: targetBranch, remote });
93
+ }
94
+ return { parsed, errors };
95
+ }
96
+ /**
97
+ * @param {string} repoPath
98
+ * @param {string} rev
99
+ * @param {{ pathExists: (path: string) => Promise<boolean>, runCommand: typeof import("../exec.js").runCommand }} deps
100
+ */
101
+ async function gitHasRevision(repoPath, rev, deps) {
102
+ if (!(await deps.pathExists(repoPath)))
103
+ return false;
104
+ const res = await deps.runCommand("git", ["-C", repoPath, "cat-file", "-e", `${rev}^{commit}`], { cwd: repoPath });
105
+ return res.code === 0;
106
+ }
107
+ /**
108
+ * @param {string} repoPath
109
+ * @param {{ pathExists: (path: string) => Promise<boolean>, runCommand: typeof import("../exec.js").runCommand }} deps
110
+ * @returns {Promise<boolean>}
111
+ */
112
+ export async function isGitRepository(repoPath, deps) {
113
+ if (!(await deps.pathExists(repoPath)))
114
+ return false;
115
+ const res = await deps.runCommand("git", ["-C", repoPath, "rev-parse", "--git-dir"], { cwd: repoPath });
116
+ return res.code === 0;
117
+ }
118
+ /**
119
+ * @param {string} targetRepoPath
120
+ * @param {string} sha
121
+ * @param {string | undefined} fallbackRepoPath
122
+ * @param {{
123
+ * pathExists: (path: string) => Promise<boolean>,
124
+ * runCommand: typeof import("../exec.js").runCommand,
125
+ * UserError: typeof import("../errors.js").UserError
126
+ * }} deps
127
+ */
128
+ async function ensureRevisionAvailable(targetRepoPath, sha, fallbackRepoPath, deps) {
129
+ if (await gitHasRevision(targetRepoPath, sha, deps))
130
+ return;
131
+ const fallback = String(fallbackRepoPath || "").trim();
132
+ if (!fallback) {
133
+ throw new deps.UserError("Required submodule commit is not available locally.", {
134
+ details: `repo: ${targetRepoPath}\ncommit: ${sha}`,
135
+ });
136
+ }
137
+ if (!(await gitHasRevision(fallback, sha, deps))) {
138
+ throw new deps.UserError("Required submodule commit is missing in both target and fallback repos.", {
139
+ details: `target_repo: ${targetRepoPath}\nfallback_repo: ${fallback}\ncommit: ${sha}`,
140
+ });
141
+ }
142
+ const fetch = await deps.runCommand("git", ["-C", targetRepoPath, "fetch", fallback, sha], { cwd: targetRepoPath });
143
+ if (fetch.code !== 0 || !(await gitHasRevision(targetRepoPath, sha, deps))) {
144
+ throw new deps.UserError("Failed to import submodule commit from fallback repo.", {
145
+ details: `target_repo: ${targetRepoPath}\nfallback_repo: ${fallback}\ncommit: ${sha}\n\n${fetch.stderr || fetch.stdout}`,
146
+ });
147
+ }
148
+ }
149
+ /**
150
+ * @param {string} repoPath
151
+ * @param {string} remote
152
+ * @param {string} branch
153
+ * @param {string} sha
154
+ * @param {{ runCommand: typeof import("../exec.js").runCommand, UserError: typeof import("../errors.js").UserError }} deps
155
+ */
156
+ async function pushSubmoduleBranch(repoPath, remote, branch, sha, deps) {
157
+ const fetch = await deps.runCommand("git", ["-C", repoPath, "fetch", remote, "--prune"], { cwd: repoPath });
158
+ if (fetch.code !== 0) {
159
+ throw new deps.UserError("Failed to fetch submodule remote before push.", {
160
+ details: `repo: ${repoPath}\nremote: ${remote}\n\n${fetch.stderr || fetch.stdout}`,
161
+ });
162
+ }
163
+ const remoteRef = `refs/remotes/${remote}/${branch}`;
164
+ const hasRemoteBranch = await deps
165
+ .runCommand("git", ["-C", repoPath, "show-ref", "--verify", "--quiet", remoteRef], { cwd: repoPath })
166
+ .then((result) => result.code === 0);
167
+ if (!hasRemoteBranch) {
168
+ throw new deps.UserError("Submodule target branch does not exist on remote.", {
169
+ details: `repo: ${repoPath}\nremote: ${remote}\nbranch: ${branch}`,
170
+ });
171
+ }
172
+ const remoteAncestor = await deps
173
+ .runCommand("git", ["-C", repoPath, "merge-base", "--is-ancestor", remoteRef, sha], { cwd: repoPath })
174
+ .then((result) => result.code === 0);
175
+ if (remoteAncestor) {
176
+ const push = await deps.runCommand("git", ["-C", repoPath, "push", remote, `${sha}:refs/heads/${branch}`], { cwd: repoPath });
177
+ if (push.code !== 0) {
178
+ throw new deps.UserError("Failed to fast-forward push submodule target branch.", {
179
+ details: `repo: ${repoPath}\nremote: ${remote}\nbranch: ${branch}\ncommit: ${sha}\n\n${push.stderr || push.stdout}`,
180
+ });
181
+ }
182
+ return { status: "pushed", remoteRef };
183
+ }
184
+ const shaContained = await deps
185
+ .runCommand("git", ["-C", repoPath, "merge-base", "--is-ancestor", sha, remoteRef], { cwd: repoPath })
186
+ .then((result) => result.code === 0);
187
+ if (shaContained) {
188
+ return { status: "already-contained", remoteRef };
189
+ }
190
+ throw new deps.UserError("Submodule target branch diverged from gitlink commit.", {
191
+ details: `repo: ${repoPath}\nremote: ${remote}\nbranch: ${branch}\ncommit: ${sha}\n\nHint: reconcile the submodule branch manually, then retry.`,
192
+ });
193
+ }
194
+ /**
195
+ * @param {string} gitRoot
196
+ * @param {string} changeId
197
+ * @param {string} baseBranch
198
+ * @param {{
199
+ * pathExists: (path: string) => Promise<boolean>,
200
+ * readText: (path: string) => Promise<string>,
201
+ * runCommand: typeof import("../exec.js").runCommand,
202
+ * UserError: typeof import("../errors.js").UserError
203
+ * }} deps
204
+ */
205
+ export async function pushSubmodulesForFinish(gitRoot, changeId, baseBranch, deps) {
206
+ const subs = await listSubmodulesFromGitmodules(gitRoot, deps);
207
+ if (subs.length === 0)
208
+ return { processed: 0 };
209
+ const targetsPath = path.join(gitRoot, ".aiws", "changes", changeId, "submodules.targets");
210
+ if (!(await deps.pathExists(targetsPath))) {
211
+ throw new deps.UserError("Missing submodules.targets for submodule-aware finish.", {
212
+ details: `required: ${path.relative(gitRoot, targetsPath)}\n\nHint: add one entry per submodule path before running \`aiws change finish --push\`.`,
213
+ });
214
+ }
215
+ const parsedTargets = await parseSubmoduleTargetsFile(targetsPath, deps);
216
+ if (parsedTargets.errors.length > 0) {
217
+ throw new deps.UserError("Invalid submodules.targets.", { details: parsedTargets.errors.join("\n") });
218
+ }
219
+ const missingPaths = subs.filter((submodule) => !parsedTargets.parsed.has(submodule.path)).map((submodule) => submodule.path);
220
+ if (missingPaths.length > 0) {
221
+ throw new deps.UserError("submodules.targets missing declared submodule paths.", {
222
+ details: `file: ${path.relative(gitRoot, targetsPath)}\nmissing: ${missingPaths.join(", ")}`,
223
+ });
224
+ }
225
+ /** @type {Array<{ name: string, path: string, sha: string, branch: string, remote: string, pinBranch: string }>} */
226
+ const specs = [];
227
+ for (const sub of subs) {
228
+ const target = parsedTargets.parsed.get(sub.path);
229
+ if (!target)
230
+ continue;
231
+ const targetBranch = target.branch === "." ? baseBranch : target.branch;
232
+ const gitlink = await deps.runCommand("git", ["rev-parse", `HEAD:${sub.path}`], { cwd: gitRoot });
233
+ if (gitlink.code !== 0) {
234
+ throw new deps.UserError("Failed to resolve submodule gitlink commit from merged superproject.", {
235
+ details: `path: ${sub.path}\n\n${gitlink.stderr || gitlink.stdout}`,
236
+ });
237
+ }
238
+ const sha = String(gitlink.stdout || "").trim();
239
+ specs.push({
240
+ name: sub.name,
241
+ path: sub.path,
242
+ sha,
243
+ branch: targetBranch,
244
+ remote: target.remote,
245
+ pinBranch: `aiws/pin/${targetBranch}`,
246
+ });
247
+ }
248
+ for (const spec of specs) {
249
+ const targetRepoPath = path.join(gitRoot, spec.path);
250
+ if (!(await isGitRepository(targetRepoPath, deps))) {
251
+ throw new deps.UserError("Submodule repository is not initialized.", {
252
+ details: `path: ${spec.path}\nHint: initialize submodules before finish.`,
253
+ });
254
+ }
255
+ if (!(await gitHasRevision(targetRepoPath, spec.sha, deps))) {
256
+ throw new deps.UserError("Merged submodule gitlink commit is not available locally.", {
257
+ details: `path: ${spec.path}\ncommit: ${spec.sha}`,
258
+ });
259
+ }
260
+ const pushResult = await pushSubmoduleBranch(targetRepoPath, spec.remote, spec.branch, spec.sha, deps);
261
+ console.log(`submodule push: ${spec.path} (${spec.remote} ${spec.branch}${pushResult.status === "pushed" ? ` <= ${spec.sha}` : ", already contained"})`);
262
+ }
263
+ const sync = await deps.runCommand("git", ["submodule", "update", "--init", "--recursive"], { cwd: gitRoot });
264
+ if (sync.code !== 0) {
265
+ throw new deps.UserError("Submodule push succeeded, but failed to sync submodules in target repo.", {
266
+ details: sync.stderr || sync.stdout,
267
+ });
268
+ }
269
+ for (const spec of specs) {
270
+ const targetRepoPath = path.join(gitRoot, spec.path);
271
+ if (!(await isGitRepository(targetRepoPath, deps))) {
272
+ throw new deps.UserError("Submodule repo missing after sync.", { details: `path: ${spec.path}` });
273
+ }
274
+ await ensureRevisionAvailable(targetRepoPath, spec.sha, "", deps);
275
+ const fetch = await deps.runCommand("git", ["-C", targetRepoPath, "fetch", spec.remote, "--prune"], { cwd: targetRepoPath });
276
+ if (fetch.code !== 0) {
277
+ throw new deps.UserError("Failed to refresh target submodule remote.", {
278
+ details: `path: ${spec.path}\nremote: ${spec.remote}\n\n${fetch.stderr || fetch.stdout}`,
279
+ });
280
+ }
281
+ const checkout = await deps.runCommand("git", ["-C", targetRepoPath, "checkout", "-B", spec.pinBranch, spec.sha], { cwd: targetRepoPath });
282
+ if (checkout.code !== 0) {
283
+ throw new deps.UserError("Failed to attach target submodule to pin branch.", {
284
+ details: `path: ${spec.path}\npin_branch: ${spec.pinBranch}\ncommit: ${spec.sha}\n\n${checkout.stderr || checkout.stdout}`,
285
+ });
286
+ }
287
+ await deps.runCommand("git", ["-C", targetRepoPath, "branch", "--set-upstream-to", `${spec.remote}/${spec.branch}`, spec.pinBranch], {
288
+ cwd: targetRepoPath,
289
+ });
290
+ }
291
+ return { processed: specs.length };
292
+ }
293
+ /**
294
+ * @param {string} gitRoot
295
+ * @param {{ changeId?: string, into?: string, base?: string }} options
296
+ * @param {{
297
+ * assertValidChangeId: (changeId: string) => void,
298
+ * checkGitClean: (gitRoot: string) => Promise<{ clean: true } | { clean: false, details: string }>,
299
+ * currentBranch: (gitRoot: string) => Promise<string>,
300
+ * pathExists: (path: string) => Promise<boolean>,
301
+ * readText: (path: string) => Promise<string>,
302
+ * resolveChangeId: (gitRoot: string, changeId: string | undefined, options: { command: string }) => Promise<string>,
303
+ * runCommand: typeof import("../exec.js").runCommand,
304
+ * UserError: typeof import("../errors.js").UserError
305
+ * }} deps
306
+ */
307
+ export async function resolveFinishContext(gitRoot, options, deps) {
308
+ const changeId = await deps.resolveChangeId(gitRoot, options.changeId, { command: "finish" });
309
+ deps.assertValidChangeId(changeId);
310
+ const changeBranch = `change/${changeId}`;
311
+ const changeBranchRef = `refs/heads/${changeBranch}`;
312
+ const hasChangeBranch = await deps
313
+ .runCommand("git", ["show-ref", "--verify", "--quiet", changeBranchRef], { cwd: gitRoot })
314
+ .then((result) => result.code === 0);
315
+ if (!hasChangeBranch) {
316
+ throw new deps.UserError(`Missing change branch: ${changeBranch}`, {
317
+ details: "Hint: create it with `aiws change start <change-id>` (or `git switch -c change/<id>`).",
318
+ });
319
+ }
320
+ const clean = await deps.checkGitClean(gitRoot);
321
+ if (!clean.clean) {
322
+ throw new deps.UserError("Refusing to finish with a dirty working tree.", {
323
+ details: `${clean.details}\n\nHint: commit or stash your changes, then retry.`,
324
+ });
325
+ }
326
+ const cur = await deps.currentBranch(gitRoot);
327
+ const intoRaw = String(options.into || "").trim();
328
+ const baseRaw = String(options.base || "").trim();
329
+ if (intoRaw && baseRaw && intoRaw !== baseRaw) {
330
+ throw new deps.UserError("change finish: cannot combine --into with --base (values differ).", {
331
+ details: `--into=${intoRaw}\n--base=${baseRaw}`,
332
+ });
333
+ }
334
+ /** @type {string} */
335
+ let into = intoRaw || baseRaw;
336
+ if (!into) {
337
+ if (!cur) {
338
+ throw new deps.UserError("Detached HEAD: cannot infer target branch for finish.", {
339
+ details: "Hint: switch to the target branch (e.g. main) and retry, or pass `aiws change finish <id> --into <branch>`.",
340
+ });
341
+ }
342
+ if (cur !== changeBranch) {
343
+ into = cur;
344
+ }
345
+ else {
346
+ const metaPath = path.join(gitRoot, ".aiws", "changes", changeId, ".ws-change.json");
347
+ /** @type {any} */
348
+ let meta = null;
349
+ if (await deps.pathExists(metaPath)) {
350
+ try {
351
+ meta = JSON.parse(await deps.readText(metaPath));
352
+ }
353
+ catch {
354
+ meta = null;
355
+ }
356
+ }
357
+ if (!meta) {
358
+ const show = await deps.runCommand("git", ["show", `${changeBranch}:.aiws/changes/${changeId}/.ws-change.json`], { cwd: gitRoot });
359
+ if (show.code === 0) {
360
+ try {
361
+ meta = JSON.parse(String(show.stdout || ""));
362
+ }
363
+ catch {
364
+ meta = null;
365
+ }
366
+ }
367
+ }
368
+ const inferred = meta && typeof meta === "object" ? String(meta.base_branch || "").trim() : "";
369
+ if (!inferred) {
370
+ throw new deps.UserError("Cannot infer base branch for finish.", {
371
+ details: "Hint: run from the target branch (e.g. main), or pass: `aiws change finish <id> --into <branch>`.",
372
+ });
373
+ }
374
+ into = inferred;
375
+ }
376
+ }
377
+ if (into === changeBranch) {
378
+ throw new deps.UserError("change finish: target branch cannot be the change branch.", { details: `target=${into}` });
379
+ }
380
+ const intoRef = `refs/heads/${into}`;
381
+ const hasIntoBranch = await deps.runCommand("git", ["show-ref", "--verify", "--quiet", intoRef], { cwd: gitRoot }).then((result) => result.code === 0);
382
+ if (!hasIntoBranch) {
383
+ throw new deps.UserError("Target branch does not exist.", { details: `branch: ${into}` });
384
+ }
385
+ return { changeId, changeBranch, changeBranchRef, into, cur };
386
+ }
387
+ //# sourceMappingURL=change-finish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-finish.js","sourceRoot":"","sources":["../../src/commands/change-finish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @param {string} output
3
+ */
4
+ export declare function parseGitStatusPorcelain(output: string): {
5
+ clean: boolean;
6
+ total: number;
7
+ staged: number;
8
+ unstaged: number;
9
+ untracked: number;
10
+ conflicted: number;
11
+ };
12
+ /**
13
+ * @param {string} gitRoot
14
+ */
15
+ export declare function collectGitStatus(gitRoot: string): Promise<{
16
+ clean: boolean;
17
+ total: number;
18
+ staged: number;
19
+ unstaged: number;
20
+ untracked: number;
21
+ conflicted: number;
22
+ }>;
@@ -0,0 +1,50 @@
1
+ import { runCommand } from "../exec.js";
2
+ import { UserError } from "../errors.js";
3
+ const CONFLICT_STATUS_RE = /^(DD|AU|UD|UA|DU|AA|UU)$/;
4
+ /**
5
+ * @param {string} output
6
+ */
7
+ export function parseGitStatusPorcelain(output) {
8
+ const lines = String(output || "")
9
+ .split(/\r?\n/)
10
+ .map((line) => line.trimEnd())
11
+ .filter(Boolean);
12
+ let staged = 0;
13
+ let unstaged = 0;
14
+ let untracked = 0;
15
+ let conflicted = 0;
16
+ for (const line of lines) {
17
+ const xy = line.slice(0, 2);
18
+ if (xy === "??") {
19
+ untracked += 1;
20
+ continue;
21
+ }
22
+ if (CONFLICT_STATUS_RE.test(xy)) {
23
+ conflicted += 1;
24
+ continue;
25
+ }
26
+ if (xy[0] && xy[0] !== " " && xy[0] !== "?")
27
+ staged += 1;
28
+ if (xy[1] && xy[1] !== " ")
29
+ unstaged += 1;
30
+ }
31
+ return {
32
+ clean: lines.length === 0,
33
+ total: lines.length,
34
+ staged,
35
+ unstaged,
36
+ untracked,
37
+ conflicted,
38
+ };
39
+ }
40
+ /**
41
+ * @param {string} gitRoot
42
+ */
43
+ export async function collectGitStatus(gitRoot) {
44
+ const res = await runCommand("git", ["status", "--porcelain", "--untracked-files=all"], { cwd: gitRoot });
45
+ if (res.code !== 0) {
46
+ throw new UserError("Failed to inspect git status for change governance.", { details: res.stderr || res.stdout });
47
+ }
48
+ return parseGitStatusPorcelain(res.stdout || "");
49
+ }
50
+ //# sourceMappingURL=change-git-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-git-status.js","sourceRoot":"","sources":["../../src/commands/change-git-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SAC/B,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;SAC7B,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,SAAS,IAAI,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAChC,UAAU,IAAI,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,MAAM,IAAI,CAAC,CAAC;QACzD,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,QAAQ,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC;QACzB,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,MAAM;QACN,QAAQ;QACR,SAAS;QACT,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACpD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1G,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,SAAS,CAAC,qDAAqD,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACpH,CAAC;IACD,OAAO,uBAAuB,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @param {{
3
+ * gitRoot: string,
4
+ * changeId: string
5
+ * }} input
6
+ * @param {{
7
+ * changeDirAbs: (gitRoot: string, changeId: string) => string,
8
+ * pathExists: (path: string) => Promise<boolean>,
9
+ * runChangeSyncWorkflow: (input: any, deps: any) => Promise<{ output: string }>,
10
+ * workflowDeps: Record<string, any>,
11
+ * UserError: typeof import("../errors.js").UserError
12
+ * }} deps
13
+ */
14
+ export declare function runChangeSyncCommand(input: any, deps: any): Promise<any>;
15
+ /**
16
+ * @param {{
17
+ * gitRoot: string,
18
+ * changeId: string,
19
+ * options: { datePrefix?: string, force: boolean }
20
+ * }} input
21
+ * @param {{
22
+ * changeDirAbs: (gitRoot: string, changeId: string) => string,
23
+ * pathExists: (path: string) => Promise<boolean>,
24
+ * runChangeArchiveWorkflow: (input: any, deps: any) => Promise<{ output: string }>,
25
+ * workflowDeps: Record<string, any>,
26
+ * UserError: typeof import("../errors.js").UserError
27
+ * }} deps
28
+ */
29
+ export declare function runChangeArchiveCommand(input: any, deps: any): Promise<any>;
@@ -1,5 +1,4 @@
1
1
  import path from "node:path";
2
-
3
2
  /**
4
3
  * @param {{
5
4
  * gitRoot: string,
@@ -14,20 +13,16 @@ import path from "node:path";
14
13
  * }} deps
15
14
  */
16
15
  export async function runChangeSyncCommand(input, deps) {
17
- const changeDir = deps.changeDirAbs(input.gitRoot, input.changeId);
18
- if (!(await deps.pathExists(changeDir))) {
19
- throw new deps.UserError(`Missing change dir: ${path.relative(input.gitRoot, changeDir)}`);
20
- }
21
- return deps.runChangeSyncWorkflow(
22
- {
23
- gitRoot: input.gitRoot,
24
- changeId: input.changeId,
25
- changeDir,
26
- },
27
- deps.workflowDeps,
28
- );
16
+ const changeDir = deps.changeDirAbs(input.gitRoot, input.changeId);
17
+ if (!(await deps.pathExists(changeDir))) {
18
+ throw new deps.UserError(`Missing change dir: ${path.relative(input.gitRoot, changeDir)}`);
19
+ }
20
+ return deps.runChangeSyncWorkflow({
21
+ gitRoot: input.gitRoot,
22
+ changeId: input.changeId,
23
+ changeDir,
24
+ }, deps.workflowDeps);
29
25
  }
30
-
31
26
  /**
32
27
  * @param {{
33
28
  * gitRoot: string,
@@ -43,18 +38,16 @@ export async function runChangeSyncCommand(input, deps) {
43
38
  * }} deps
44
39
  */
45
40
  export async function runChangeArchiveCommand(input, deps) {
46
- const changeDir = deps.changeDirAbs(input.gitRoot, input.changeId);
47
- if (!(await deps.pathExists(changeDir))) {
48
- throw new deps.UserError(`Missing change dir: ${path.relative(input.gitRoot, changeDir)}`);
49
- }
50
- return deps.runChangeArchiveWorkflow(
51
- {
52
- gitRoot: input.gitRoot,
53
- changeId: input.changeId,
54
- changeDir,
55
- datePrefix: input.options.datePrefix,
56
- force: input.options.force,
57
- },
58
- deps.workflowDeps,
59
- );
41
+ const changeDir = deps.changeDirAbs(input.gitRoot, input.changeId);
42
+ if (!(await deps.pathExists(changeDir))) {
43
+ throw new deps.UserError(`Missing change dir: ${path.relative(input.gitRoot, changeDir)}`);
44
+ }
45
+ return deps.runChangeArchiveWorkflow({
46
+ gitRoot: input.gitRoot,
47
+ changeId: input.changeId,
48
+ changeDir,
49
+ datePrefix: input.options.datePrefix,
50
+ force: input.options.force,
51
+ }, deps.workflowDeps);
60
52
  }
53
+ //# sourceMappingURL=change-lifecycle-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-lifecycle-entry.js","sourceRoot":"","sources":["../../src/commands/change-lifecycle-entry.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAU,EAAE,IAAS;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,IAAI,CAAC,qBAAqB,CAC/B;QACE,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS;KACV,EACD,IAAI,CAAC,YAAY,CAClB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAU,EAAE,IAAS;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,IAAI,CAAC,wBAAwB,CAClC;QACE,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS;QACT,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU;QACpC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;KAC3B,EACD,IAAI,CAAC,YAAY,CAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @param {{
3
+ * gitRoot: string,
4
+ * changeId: string,
5
+ * changeDir: string
6
+ * }} input
7
+ * @param {{
8
+ * appendMetricsEvent: (gitRoot: string, changeId: string, type: string, payload: any) => Promise<void>,
9
+ * ensureDir: (path: string) => Promise<void>,
10
+ * nowIsoUtc: () => string,
11
+ * nowStampUtc: () => string,
12
+ * nowUnixSeconds: () => number,
13
+ * pathExists: (path: string) => Promise<boolean>,
14
+ * readText: (path: string) => Promise<string>,
15
+ * snapshotTruthFiles: (gitRoot: string) => Promise<any>,
16
+ * writeText: (path: string, content: string) => Promise<void>
17
+ * }} deps
18
+ */
19
+ export declare function runChangeSyncWorkflow(input: any, deps: any): Promise<{
20
+ output: string;
21
+ }>;
22
+ /**
23
+ * @param {{
24
+ * gitRoot: string,
25
+ * changeId: string,
26
+ * changeDir: string,
27
+ * datePrefix?: string,
28
+ * force: boolean
29
+ * }} input
30
+ * @param {{
31
+ * appendMetricsEvent: (gitRoot: string, changeId: string, type: string, payload: any) => Promise<void>,
32
+ * changeValidateCommand: (options: { changeId: string, strict: boolean, allowTruthDrift: boolean }) => Promise<void>,
33
+ * ensureDir: (path: string) => Promise<void>,
34
+ * generateHandoffContent: (gitRoot: string, changeDir: string, changeId: string) => Promise<string>,
35
+ * nowIsoUtc: () => string,
36
+ * nowStampUtc: () => string,
37
+ * nowUnixSeconds: () => number,
38
+ * pathExists: (path: string) => Promise<boolean>,
39
+ * readText: (path: string) => Promise<string>,
40
+ * snapshotTruthFiles: (gitRoot: string) => Promise<any>,
41
+ * todayLocal: () => string,
42
+ * writeText: (path: string, content: string) => Promise<void>,
43
+ * UserError: typeof import("../errors.js").UserError
44
+ * }} deps
45
+ */
46
+ export declare function runChangeArchiveWorkflow(input: any, deps: any): Promise<{
47
+ output: string;
48
+ archivedTo: string;
49
+ archivedToRel: string;
50
+ handoffPath: string;
51
+ handoffRel: string;
52
+ metaPath: string;
53
+ metaRel: string;
54
+ stampPath: string;
55
+ stampRel: string;
56
+ }>;