agentplane 0.3.5 → 0.3.7

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 (256) hide show
  1. package/README.md +103 -75
  2. package/assets/AGENTS.md +4 -2
  3. package/bin/dist-guard.js +13 -3
  4. package/bin/runtime-watch.d.ts +1 -0
  5. package/bin/runtime-watch.js +22 -5
  6. package/bin/stale-dist-policy.js +9 -2
  7. package/dist/.build-manifest.json +251 -821
  8. package/dist/adapters/task-backend/task-backend-adapter.d.ts +2 -2
  9. package/dist/adapters/task-backend/task-backend-adapter.d.ts.map +1 -1
  10. package/dist/adapters/task-backend/task-backend-adapter.js +2 -2
  11. package/dist/backends/task-backend/local-backend.d.ts +7 -5
  12. package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
  13. package/dist/backends/task-backend/local-backend.js +79 -7
  14. package/dist/backends/task-backend/redmine/env.d.ts +1 -1
  15. package/dist/backends/task-backend/redmine/env.d.ts.map +1 -1
  16. package/dist/backends/task-backend/redmine/env.js +3 -0
  17. package/dist/backends/task-backend/redmine/inspect.d.ts +11 -0
  18. package/dist/backends/task-backend/redmine/inspect.d.ts.map +1 -0
  19. package/dist/backends/task-backend/redmine/inspect.js +75 -0
  20. package/dist/backends/task-backend/redmine/mapping.d.ts.map +1 -1
  21. package/dist/backends/task-backend/redmine/mapping.js +21 -2
  22. package/dist/backends/task-backend/redmine/state.d.ts +17 -0
  23. package/dist/backends/task-backend/redmine/state.d.ts.map +1 -0
  24. package/dist/backends/task-backend/redmine/state.js +95 -0
  25. package/dist/backends/task-backend/redmine-backend.d.ts +10 -16
  26. package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
  27. package/dist/backends/task-backend/redmine-backend.js +205 -15
  28. package/dist/backends/task-backend/shared/constants.d.ts +1 -1
  29. package/dist/backends/task-backend/shared/constants.js +1 -1
  30. package/dist/backends/task-backend/shared/record.d.ts.map +1 -1
  31. package/dist/backends/task-backend/shared/record.js +20 -1
  32. package/dist/backends/task-backend/shared/types.d.ts +42 -4
  33. package/dist/backends/task-backend/shared/types.d.ts.map +1 -1
  34. package/dist/backends/task-backend/shared.d.ts +1 -1
  35. package/dist/backends/task-backend/shared.d.ts.map +1 -1
  36. package/dist/backends/task-backend.d.ts +1 -1
  37. package/dist/backends/task-backend.d.ts.map +1 -1
  38. package/dist/backends/task-backend.test-helpers.d.ts +4 -0
  39. package/dist/backends/task-backend.test-helpers.d.ts.map +1 -0
  40. package/dist/backends/task-backend.test-helpers.js +33 -0
  41. package/dist/backends/task-index.d.ts.map +1 -1
  42. package/dist/backends/task-index.js +1 -0
  43. package/dist/cli/bootstrap-guide.d.ts.map +1 -1
  44. package/dist/cli/bootstrap-guide.js +1 -0
  45. package/dist/cli/command-guide.d.ts.map +1 -1
  46. package/dist/cli/command-guide.js +3 -2
  47. package/dist/cli/reason-codes.d.ts.map +1 -1
  48. package/dist/cli/reason-codes.js +30 -0
  49. package/dist/cli/run-cli/command-catalog/core.d.ts +3 -0
  50. package/dist/cli/run-cli/command-catalog/core.d.ts.map +1 -0
  51. package/dist/cli/run-cli/command-catalog/core.js +137 -0
  52. package/dist/cli/run-cli/command-catalog/lifecycle.d.ts +3 -0
  53. package/dist/cli/run-cli/command-catalog/lifecycle.d.ts.map +1 -0
  54. package/dist/cli/run-cli/command-catalog/lifecycle.js +52 -0
  55. package/dist/cli/run-cli/command-catalog/project.d.ts +3 -0
  56. package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -0
  57. package/dist/cli/run-cli/command-catalog/project.js +80 -0
  58. package/dist/cli/run-cli/command-catalog/shared.d.ts +19 -0
  59. package/dist/cli/run-cli/command-catalog/shared.d.ts.map +1 -0
  60. package/dist/cli/run-cli/command-catalog/shared.js +9 -0
  61. package/dist/cli/run-cli/command-catalog/task.d.ts +3 -0
  62. package/dist/cli/run-cli/command-catalog/task.d.ts.map +1 -0
  63. package/dist/cli/run-cli/command-catalog/task.js +85 -0
  64. package/dist/cli/run-cli/command-catalog.d.ts +3 -18
  65. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  66. package/dist/cli/run-cli/command-catalog.js +8 -337
  67. package/dist/cli/run-cli/commands/ide.d.ts.map +1 -1
  68. package/dist/cli/run-cli/commands/ide.js +64 -2
  69. package/dist/cli/run-cli/commands/init/ui.d.ts.map +1 -1
  70. package/dist/cli/run-cli/commands/init/ui.js +33 -13
  71. package/dist/cli/run-cli/commands/init/write-env.d.ts.map +1 -1
  72. package/dist/cli/run-cli/commands/init/write-env.js +12 -0
  73. package/dist/cli/run-cli.core.pr-flow.test-helpers.d.ts +3 -0
  74. package/dist/cli/run-cli.core.pr-flow.test-helpers.d.ts.map +1 -0
  75. package/dist/cli/run-cli.core.pr-flow.test-helpers.js +41 -0
  76. package/dist/cli/run-cli.core.tasks.test-helpers.d.ts +2 -0
  77. package/dist/cli/run-cli.core.tasks.test-helpers.d.ts.map +1 -0
  78. package/dist/cli/run-cli.core.tasks.test-helpers.js +6 -0
  79. package/dist/cli/run-cli.test-helpers.d.ts +3 -0
  80. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
  81. package/dist/cli/run-cli.test-helpers.js +140 -6
  82. package/dist/commands/backend/sync.command.d.ts +5 -1
  83. package/dist/commands/backend/sync.command.d.ts.map +1 -1
  84. package/dist/commands/backend/sync.command.js +67 -3
  85. package/dist/commands/backend.d.ts +22 -0
  86. package/dist/commands/backend.d.ts.map +1 -1
  87. package/dist/commands/backend.js +110 -1
  88. package/dist/commands/commit.spec.d.ts.map +1 -1
  89. package/dist/commands/commit.spec.js +31 -7
  90. package/dist/commands/doctor/runtime.d.ts.map +1 -1
  91. package/dist/commands/doctor/runtime.js +3 -6
  92. package/dist/commands/doctor/workspace.d.ts +8 -0
  93. package/dist/commands/doctor/workspace.d.ts.map +1 -1
  94. package/dist/commands/doctor/workspace.js +127 -3
  95. package/dist/commands/guard/commit.command.d.ts.map +1 -1
  96. package/dist/commands/guard/commit.command.js +30 -6
  97. package/dist/commands/guard/impl/allow.d.ts +9 -0
  98. package/dist/commands/guard/impl/allow.d.ts.map +1 -1
  99. package/dist/commands/guard/impl/allow.js +26 -10
  100. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  101. package/dist/commands/guard/impl/commands.js +146 -18
  102. package/dist/commands/guard/impl/comment-commit.d.ts.map +1 -1
  103. package/dist/commands/guard/impl/comment-commit.js +2 -0
  104. package/dist/commands/hooks/index.d.ts.map +1 -1
  105. package/dist/commands/hooks/index.js +8 -35
  106. package/dist/commands/recipes/impl/apply.d.ts +4 -0
  107. package/dist/commands/recipes/impl/apply.d.ts.map +1 -1
  108. package/dist/commands/recipes/impl/apply.js +34 -0
  109. package/dist/commands/recipes/impl/commands/explain.d.ts.map +1 -1
  110. package/dist/commands/recipes/impl/commands/explain.js +70 -11
  111. package/dist/commands/recipes/impl/commands/info.d.ts.map +1 -1
  112. package/dist/commands/recipes/impl/commands/info.js +24 -12
  113. package/dist/commands/recipes/impl/commands/install.d.ts.map +1 -1
  114. package/dist/commands/recipes/impl/commands/install.js +32 -36
  115. package/dist/commands/recipes/impl/commands/list.d.ts.map +1 -1
  116. package/dist/commands/recipes/impl/commands/list.js +7 -4
  117. package/dist/commands/recipes/impl/commands/remove.d.ts.map +1 -1
  118. package/dist/commands/recipes/impl/commands/remove.js +9 -11
  119. package/dist/commands/recipes/impl/constants.d.ts +2 -0
  120. package/dist/commands/recipes/impl/constants.d.ts.map +1 -1
  121. package/dist/commands/recipes/impl/constants.js +2 -0
  122. package/dist/commands/recipes/impl/manifest.d.ts.map +1 -1
  123. package/dist/commands/recipes/impl/manifest.js +219 -23
  124. package/dist/commands/recipes/impl/normalize.d.ts +3 -0
  125. package/dist/commands/recipes/impl/normalize.d.ts.map +1 -1
  126. package/dist/commands/recipes/impl/normalize.js +28 -24
  127. package/dist/commands/recipes/impl/paths.d.ts +9 -0
  128. package/dist/commands/recipes/impl/paths.d.ts.map +1 -1
  129. package/dist/commands/recipes/impl/paths.js +10 -1
  130. package/dist/commands/recipes/impl/project-installed-recipes.d.ts +7 -0
  131. package/dist/commands/recipes/impl/project-installed-recipes.d.ts.map +1 -0
  132. package/dist/commands/recipes/impl/project-installed-recipes.js +102 -0
  133. package/dist/commands/recipes/impl/resolver.d.ts +20 -0
  134. package/dist/commands/recipes/impl/resolver.d.ts.map +1 -0
  135. package/dist/commands/recipes/impl/resolver.js +220 -0
  136. package/dist/commands/recipes/impl/scenario.d.ts.map +1 -1
  137. package/dist/commands/recipes/impl/scenario.js +40 -11
  138. package/dist/commands/recipes/impl/types.d.ts +145 -16
  139. package/dist/commands/recipes/impl/types.d.ts.map +1 -1
  140. package/dist/commands/recipes/install.spec.d.ts.map +1 -1
  141. package/dist/commands/recipes/install.spec.js +3 -2
  142. package/dist/commands/recipes.d.ts +6 -4
  143. package/dist/commands/recipes.d.ts.map +1 -1
  144. package/dist/commands/recipes.js +5 -3
  145. package/dist/commands/recipes.test-helpers.d.ts +185 -0
  146. package/dist/commands/recipes.test-helpers.d.ts.map +1 -0
  147. package/dist/commands/recipes.test-helpers.js +339 -0
  148. package/dist/commands/scenario/impl/commands.d.ts.map +1 -1
  149. package/dist/commands/scenario/impl/commands.js +192 -336
  150. package/dist/commands/scenario/info.command.d.ts.map +1 -1
  151. package/dist/commands/scenario/info.command.js +7 -2
  152. package/dist/commands/scenario/list.command.js +2 -2
  153. package/dist/commands/scenario/run.command.d.ts.map +1 -1
  154. package/dist/commands/scenario/run.command.js +7 -2
  155. package/dist/commands/shared/reconcile-check.d.ts.map +1 -1
  156. package/dist/commands/shared/reconcile-check.js +77 -2
  157. package/dist/commands/shared/task-backend.d.ts +1 -1
  158. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  159. package/dist/commands/shared/task-backend.js +9 -0
  160. package/dist/commands/shared/task-store.d.ts +92 -2
  161. package/dist/commands/shared/task-store.d.ts.map +1 -1
  162. package/dist/commands/shared/task-store.js +405 -43
  163. package/dist/commands/task/block.d.ts.map +1 -1
  164. package/dist/commands/task/block.js +84 -46
  165. package/dist/commands/task/close-duplicate.d.ts.map +1 -1
  166. package/dist/commands/task/close-duplicate.js +12 -37
  167. package/dist/commands/task/close-noop.d.ts.map +1 -1
  168. package/dist/commands/task/close-noop.js +12 -30
  169. package/dist/commands/task/close-shared.d.ts +14 -0
  170. package/dist/commands/task/close-shared.d.ts.map +1 -0
  171. package/dist/commands/task/close-shared.js +73 -0
  172. package/dist/commands/task/comment.d.ts.map +1 -1
  173. package/dist/commands/task/comment.js +34 -21
  174. package/dist/commands/task/derive.command.d.ts +1 -0
  175. package/dist/commands/task/derive.command.d.ts.map +1 -1
  176. package/dist/commands/task/derive.command.js +15 -2
  177. package/dist/commands/task/derive.d.ts +1 -0
  178. package/dist/commands/task/derive.d.ts.map +1 -1
  179. package/dist/commands/task/derive.js +27 -4
  180. package/dist/commands/task/doc-set.command.d.ts +2 -1
  181. package/dist/commands/task/doc-set.command.d.ts.map +1 -1
  182. package/dist/commands/task/doc-set.command.js +36 -4
  183. package/dist/commands/task/doc-template.d.ts.map +1 -1
  184. package/dist/commands/task/doc-template.js +2 -7
  185. package/dist/commands/task/doc.command.js +1 -1
  186. package/dist/commands/task/doc.d.ts +2 -1
  187. package/dist/commands/task/doc.d.ts.map +1 -1
  188. package/dist/commands/task/doc.js +139 -76
  189. package/dist/commands/task/finish.d.ts.map +1 -1
  190. package/dist/commands/task/finish.js +142 -80
  191. package/dist/commands/task/migrate-doc.d.ts +15 -0
  192. package/dist/commands/task/migrate-doc.d.ts.map +1 -1
  193. package/dist/commands/task/migrate-doc.js +128 -43
  194. package/dist/commands/task/new.d.ts.map +1 -1
  195. package/dist/commands/task/new.js +3 -1
  196. package/dist/commands/task/plan-set.command.js +1 -1
  197. package/dist/commands/task/plan.command.d.ts +8 -0
  198. package/dist/commands/task/plan.command.d.ts.map +1 -0
  199. package/dist/commands/task/plan.command.js +37 -0
  200. package/dist/commands/task/plan.d.ts.map +1 -1
  201. package/dist/commands/task/plan.js +198 -101
  202. package/dist/commands/task/set-status.command.d.ts.map +1 -1
  203. package/dist/commands/task/set-status.command.js +1 -1
  204. package/dist/commands/task/set-status.d.ts.map +1 -1
  205. package/dist/commands/task/set-status.js +115 -35
  206. package/dist/commands/task/shared/dependencies.d.ts +1 -0
  207. package/dist/commands/task/shared/dependencies.d.ts.map +1 -1
  208. package/dist/commands/task/shared/dependencies.js +10 -0
  209. package/dist/commands/task/shared/docs.d.ts +1 -0
  210. package/dist/commands/task/shared/docs.d.ts.map +1 -1
  211. package/dist/commands/task/shared/docs.js +8 -1
  212. package/dist/commands/task/shared/transitions.d.ts +17 -2
  213. package/dist/commands/task/shared/transitions.d.ts.map +1 -1
  214. package/dist/commands/task/shared/transitions.js +20 -13
  215. package/dist/commands/task/shared.d.ts +3 -3
  216. package/dist/commands/task/shared.d.ts.map +1 -1
  217. package/dist/commands/task/shared.js +3 -3
  218. package/dist/commands/task/start.d.ts.map +1 -1
  219. package/dist/commands/task/start.js +101 -71
  220. package/dist/commands/task/task.command.d.ts +8 -0
  221. package/dist/commands/task/task.command.d.ts.map +1 -0
  222. package/dist/commands/task/task.command.js +71 -0
  223. package/dist/commands/task/verify-command-shared.d.ts +16 -0
  224. package/dist/commands/task/verify-command-shared.d.ts.map +1 -0
  225. package/dist/commands/task/verify-command-shared.js +53 -0
  226. package/dist/commands/task/verify-ok.command.d.ts +2 -6
  227. package/dist/commands/task/verify-ok.command.d.ts.map +1 -1
  228. package/dist/commands/task/verify-ok.command.js +8 -50
  229. package/dist/commands/task/verify-record.d.ts.map +1 -1
  230. package/dist/commands/task/verify-record.js +124 -145
  231. package/dist/commands/task/verify-rework.command.d.ts +2 -6
  232. package/dist/commands/task/verify-rework.command.d.ts.map +1 -1
  233. package/dist/commands/task/verify-rework.command.js +8 -50
  234. package/dist/commands/upgrade/apply.d.ts +2 -0
  235. package/dist/commands/upgrade/apply.d.ts.map +1 -1
  236. package/dist/commands/upgrade/apply.js +33 -1
  237. package/dist/commands/upgrade.command.d.ts.map +1 -1
  238. package/dist/commands/upgrade.command.js +25 -0
  239. package/dist/commands/upgrade.d.ts +1 -0
  240. package/dist/commands/upgrade.d.ts.map +1 -1
  241. package/dist/commands/upgrade.js +34 -0
  242. package/dist/commands/verify.spec.d.ts.map +1 -1
  243. package/dist/commands/verify.spec.js +3 -12
  244. package/dist/policy/rules/allowlist.d.ts.map +1 -1
  245. package/dist/policy/rules/allowlist.js +16 -4
  246. package/dist/policy/rules/protected-paths.d.ts.map +1 -1
  247. package/dist/policy/rules/protected-paths.js +6 -1
  248. package/dist/ports/task-backend-port.d.ts +2 -2
  249. package/dist/ports/task-backend-port.d.ts.map +1 -1
  250. package/dist/shared/agent-emoji.d.ts.map +1 -1
  251. package/dist/shared/protected-paths.d.ts +17 -0
  252. package/dist/shared/protected-paths.d.ts.map +1 -1
  253. package/dist/shared/protected-paths.js +59 -10
  254. package/dist/shared/repo-cli-version.d.ts.map +1 -1
  255. package/dist/shared/repo-cli-version.js +9 -3
  256. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"run-cli.test-helpers.d.ts","sourceRoot":"","sources":["../../src/cli/run-cli.test-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-cli.test-helpers.d.ts","sourceRoot":"","sources":["../../src/cli/run-cli.test-helpers.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { promisify } from "node:util";
8
8
  import { gzipSync } from "node:zlib";
9
- import { afterAll, afterEach, beforeAll } from "vitest";
9
+ import { afterAll, afterEach, beforeAll, beforeEach, vi } from "vitest";
10
10
  import { defaultConfig } from "@agentplaneorg/core";
11
11
  import { runCli } from "./run-cli.js";
12
12
  const execFileAsync = promisify(execFile);
@@ -98,6 +98,17 @@ export function registerAgentplaneHome() {
98
98
  }));
99
99
  });
100
100
  }
101
+ export function installRunCliIntegrationHarness() {
102
+ registerAgentplaneHome();
103
+ let restoreStdIO = null;
104
+ beforeEach(() => {
105
+ restoreStdIO = silenceStdIO();
106
+ });
107
+ afterEach(() => {
108
+ restoreStdIO?.();
109
+ restoreStdIO = null;
110
+ });
111
+ }
101
112
  export function getAgentplaneHome() {
102
113
  return agentplaneHome;
103
114
  }
@@ -150,6 +161,28 @@ export function silenceStdIO() {
150
161
  }
151
162
  };
152
163
  }
164
+ export function stubTaskBackend(overrides = {}) {
165
+ return {
166
+ id: "local",
167
+ capabilities: {
168
+ canonical_source: "local",
169
+ projection: "canonical",
170
+ reads_from_projection_by_default: false,
171
+ writes_task_readmes: true,
172
+ supports_task_revisions: true,
173
+ supports_revision_guarded_writes: true,
174
+ may_access_network_on_read: false,
175
+ may_access_network_on_write: false,
176
+ supports_projection_refresh: false,
177
+ supports_push_sync: false,
178
+ supports_snapshot_export: false,
179
+ },
180
+ listTasks: vi.fn().mockResolvedValue([]),
181
+ getTask: vi.fn().mockResolvedValue(null),
182
+ writeTask: vi.fn().mockImplementation(() => Promise.resolve()),
183
+ ...overrides,
184
+ };
185
+ }
153
186
  export async function runCliSilent(args) {
154
187
  const io = captureStdIO();
155
188
  try {
@@ -215,11 +248,60 @@ export async function createRecipeArchive(opts) {
215
248
  name: opts?.name ?? "Viewer",
216
249
  summary: opts?.summary ?? "Preview task artifacts",
217
250
  description: opts?.description ?? "Provides a local viewer for task artifacts.",
218
- agents: [{ id: "RECIPE_AGENT", summary: "Recipe agent", file: "agents/recipe.json" }],
251
+ compatibility: {
252
+ min_agentplane_version: "0.3.5",
253
+ manifest_api_version: "1",
254
+ scenario_api_version: "1",
255
+ runtime_api_version: "1",
256
+ platforms: ["darwin", "linux"],
257
+ repo_types: ["generic"],
258
+ },
259
+ skills: [
260
+ {
261
+ id: "RECIPE_SKILL",
262
+ summary: "Recipe analysis skill",
263
+ kind: "agent-skill",
264
+ file: "skills/analysis.json",
265
+ },
266
+ ],
267
+ agents: [
268
+ {
269
+ id: "RECIPE_AGENT",
270
+ display_name: "Recipe Agent",
271
+ role: "executor",
272
+ summary: "Recipe agent",
273
+ skills: ["RECIPE_SKILL"],
274
+ tools: ["RECIPE_TOOL"],
275
+ file: "agents/recipe.json",
276
+ },
277
+ ],
219
278
  tools: [
220
279
  { id: "RECIPE_TOOL", summary: "Recipe tool", runtime: "node", entrypoint: "tools/run.js" },
221
280
  ],
222
- scenarios: [{ id: "RECIPE_SCENARIO", summary: "Recipe scenario" }],
281
+ scenarios: [
282
+ {
283
+ id: "RECIPE_SCENARIO",
284
+ name: "Recipe Scenario",
285
+ summary: "Recipe scenario",
286
+ use_when: ["Task artifacts need local preview"],
287
+ required_inputs: ["task_id"],
288
+ outputs: ["report"],
289
+ permissions: ["filesystem-write"],
290
+ artifacts: ["artifact.txt"],
291
+ agents_involved: ["RECIPE_AGENT"],
292
+ skills_used: ["RECIPE_SKILL"],
293
+ tools_used: ["RECIPE_TOOL"],
294
+ run_profile: {
295
+ mode: "analysis",
296
+ sandbox: "workspace-write",
297
+ network: false,
298
+ requires_human_approval: false,
299
+ writes_artifacts_to: ["logs/", "reports/"],
300
+ expected_exit_contract: "report",
301
+ },
302
+ file: "scenarios/recipe-scenario.json",
303
+ },
304
+ ],
223
305
  };
224
306
  if (normalizedTags) {
225
307
  manifest.tags = normalizedTags;
@@ -232,6 +314,13 @@ export async function createRecipeArchive(opts) {
232
314
  role: "Recipe agent",
233
315
  description: "Example agent installed from a recipe.",
234
316
  }, null, 2), "utf8");
317
+ const skillsDir = path.join(recipeDir, "skills");
318
+ await mkdir(skillsDir, { recursive: true });
319
+ await writeFile(path.join(skillsDir, "analysis.json"), JSON.stringify({
320
+ id: "RECIPE_SKILL",
321
+ summary: "Recipe analysis skill",
322
+ kind: "agent-skill",
323
+ }, null, 2), "utf8");
235
324
  const toolsDir = path.join(recipeDir, "tools");
236
325
  await mkdir(toolsDir, { recursive: true });
237
326
  await writeFile(path.join(toolsDir, "run.js"), [
@@ -302,22 +391,67 @@ export async function createUnsafeRecipeArchive(opts) {
302
391
  name: "Unsafe",
303
392
  summary: "Unsafe recipe",
304
393
  description: "Used for archive validation tests.",
305
- agents: [{ id: "RECIPE_AGENT", summary: "Recipe agent", file: "agents/recipe.json" }],
394
+ skills: [
395
+ {
396
+ id: "RECIPE_SKILL",
397
+ summary: "Recipe skill",
398
+ kind: "agent-skill",
399
+ file: "skills/recipe.json",
400
+ },
401
+ ],
402
+ agents: [
403
+ {
404
+ id: "RECIPE_AGENT",
405
+ display_name: "Recipe Agent",
406
+ role: "executor",
407
+ summary: "Recipe agent",
408
+ skills: ["RECIPE_SKILL"],
409
+ tools: ["RECIPE_TOOL"],
410
+ file: "agents/recipe.json",
411
+ },
412
+ ],
306
413
  tools: [
307
414
  { id: "RECIPE_TOOL", summary: "Recipe tool", runtime: "bash", entrypoint: "tools/run.sh" },
308
415
  ],
309
- scenarios: [{ id: "RECIPE_SCENARIO", summary: "Recipe scenario" }],
416
+ scenarios: [
417
+ {
418
+ id: "RECIPE_SCENARIO",
419
+ name: "Recipe Scenario",
420
+ summary: "Recipe scenario",
421
+ use_when: ["Unsafe validation fixture"],
422
+ required_inputs: [],
423
+ outputs: [],
424
+ permissions: [],
425
+ artifacts: [],
426
+ agents_involved: ["RECIPE_AGENT"],
427
+ skills_used: ["RECIPE_SKILL"],
428
+ tools_used: ["RECIPE_TOOL"],
429
+ run_profile: { mode: "analysis" },
430
+ file: "scenarios/recipe-scenario.json",
431
+ },
432
+ ],
310
433
  };
311
434
  await writeFile(path.join(recipeDir, "manifest.json"), JSON.stringify(manifest, null, 2), "utf8");
312
435
  const agentsDir = path.join(recipeDir, "agents");
313
436
  await mkdir(agentsDir, { recursive: true });
314
437
  await writeFile(path.join(agentsDir, "recipe.json"), JSON.stringify({ id: "RECIPE_AGENT", role: "Recipe agent" }, null, 2), "utf8");
438
+ const skillsDir = path.join(recipeDir, "skills");
439
+ await mkdir(skillsDir, { recursive: true });
440
+ await writeFile(path.join(skillsDir, "recipe.json"), JSON.stringify({ id: "RECIPE_SKILL" }), "utf8");
315
441
  const toolsDir = path.join(recipeDir, "tools");
316
442
  await mkdir(toolsDir, { recursive: true });
317
443
  await writeFile(path.join(toolsDir, "run.sh"), "#!/usr/bin/env bash\n", "utf8");
318
444
  const scenariosDir = path.join(recipeDir, "scenarios");
319
445
  await mkdir(scenariosDir, { recursive: true });
320
- await writeFile(path.join(scenariosDir, "recipe-scenario.json"), JSON.stringify({ schema_version: "1", id: "RECIPE_SCENARIO", summary: "Recipe scenario" }, null, 2), "utf8");
446
+ await writeFile(path.join(scenariosDir, "recipe-scenario.json"), JSON.stringify({
447
+ schema_version: "1",
448
+ id: "RECIPE_SCENARIO",
449
+ summary: "Recipe scenario",
450
+ goal: "Exercise unsafe archive validation.",
451
+ inputs: [],
452
+ outputs: [],
453
+ steps: [{ tool: "RECIPE_TOOL" }],
454
+ }, null, 2), "utf8");
321
455
  const entryPath = opts.entryPath ?? "../evil.txt";
322
456
  await writeFile(path.join(baseDir, "evil.txt"), "evil", "utf8");
323
457
  const archivePath = opts.format === "zip" ? path.join(baseDir, "unsafe.zip") : path.join(baseDir, "unsafe.tar.gz");
@@ -1,13 +1,17 @@
1
1
  import type { CommandCtx, CommandSpec } from "../../cli/spec/spec.js";
2
2
  import type { CommandContext } from "../shared/task-backend.js";
3
- import { type BackendSyncParsed } from "../backend.js";
3
+ import { type BackendInspectParsed, type BackendMigrateCanonicalStateParsed, type BackendSyncParsed } from "../backend.js";
4
4
  type BackendRootParsed = {
5
5
  cmd: string[];
6
6
  };
7
7
  export declare const backendSpec: CommandSpec<BackendRootParsed>;
8
8
  export declare const backendSyncSpec: CommandSpec<BackendSyncParsed>;
9
+ export declare const backendMigrateCanonicalStateSpec: CommandSpec<BackendMigrateCanonicalStateParsed>;
10
+ export declare const backendInspectSpec: CommandSpec<BackendInspectParsed>;
9
11
  declare function runBackendRootGroup(_ctx: CommandCtx, p: BackendRootParsed): Promise<number>;
10
12
  export declare function makeRunBackendHandler(_getCtx: (cmd: string) => Promise<CommandContext>): typeof runBackendRootGroup;
11
13
  export declare function makeRunBackendSyncHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: BackendSyncParsed) => Promise<number>;
14
+ export declare function makeRunBackendInspectHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: BackendInspectParsed) => Promise<number>;
15
+ export declare function makeRunBackendMigrateCanonicalStateHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: BackendMigrateCanonicalStateParsed) => Promise<number>;
12
16
  export {};
13
17
  //# sourceMappingURL=sync.command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.command.d.ts","sourceRoot":"","sources":["../../../src/commands/backend/sync.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAItE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE7E,KAAK,iBAAiB,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3C,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAQtD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,iBAAiB,CAuC1D,CAAC;AAEF,iBAAS,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,8BAEtF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC1E,KAAK,UAAU,EAAE,GAAG,iBAAiB,KAAG,OAAO,CAAC,MAAM,CAAC,CAStE"}
1
+ {"version":3,"file":"sync.command.d.ts","sourceRoot":"","sources":["../../../src/commands/backend/sync.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAItE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,kCAAkC,EACvC,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,KAAK,iBAAiB,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3C,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAStD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,iBAAiB,CAuC1D,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,WAAW,CAAC,kCAAkC,CAoB5F,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,oBAAoB,CAoBhE,CAAC;AAEF,iBAAS,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,8BAEtF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC1E,KAAK,UAAU,EAAE,GAAG,iBAAiB,KAAG,OAAO,CAAC,MAAM,CAAC,CAStE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC7E,KAAK,UAAU,EAAE,GAAG,oBAAoB,KAAG,OAAO,CAAC,MAAM,CAAC,CASzE;AAED,wBAAgB,0CAA0C,CACxD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAElC,KAAK,UAAU,EAAE,GAAG,kCAAkC,KAAG,OAAO,CAAC,MAAM,CAAC,CASvF"}
@@ -1,12 +1,12 @@
1
1
  import { COMMAND_SNIPPETS } from "../../cli/command-snippets.js";
2
2
  import { usageError } from "../../cli/spec/errors.js";
3
3
  import { suggestOne } from "../../cli/spec/suggest.js";
4
- import { cmdBackendSyncParsed } from "../backend.js";
4
+ import { cmdBackendInspectParsed, cmdBackendMigrateCanonicalStateParsed, cmdBackendSyncParsed, } from "../backend.js";
5
5
  export const backendSpec = {
6
6
  id: ["backend"],
7
7
  group: "Backend",
8
8
  summary: "Backend-related operations.",
9
- description: "This is a command group. Use a subcommand such as `agentplane backend sync ...`.",
9
+ description: "This is a command group. Use a subcommand such as `agentplane backend sync ...`, `agentplane backend inspect ...`, or `agentplane backend migrate-canonical-state ...`.",
10
10
  args: [{ name: "cmd", required: false, variadic: true, valueHint: "<cmd>" }],
11
11
  examples: [{ cmd: COMMAND_SNIPPETS.backendSync.pullLocal, why: "Sync the backend." }],
12
12
  parse: (raw) => ({ cmd: (raw.args.cmd ?? []) }),
@@ -51,9 +51,51 @@ export const backendSyncSpec = {
51
51
  quiet: raw.opts.quiet === true,
52
52
  }),
53
53
  };
54
+ export const backendMigrateCanonicalStateSpec = {
55
+ id: ["backend", "migrate-canonical-state"],
56
+ group: "Backend",
57
+ summary: "Backfill canonical_state for issues in the configured backend.",
58
+ args: [{ name: "id", required: true, valueHint: "<id>", description: "Configured backend id." }],
59
+ options: [
60
+ { kind: "boolean", name: "yes", default: false, description: "Auto-approve network access." },
61
+ { kind: "boolean", name: "quiet", default: false, description: "Reduce output noise." },
62
+ ],
63
+ examples: [
64
+ {
65
+ cmd: "agentplane backend migrate-canonical-state redmine --yes",
66
+ why: "Backfill structured canonical_state into legacy Redmine issues.",
67
+ },
68
+ ],
69
+ parse: (raw) => ({
70
+ backendId: String(raw.args.id),
71
+ yes: raw.opts.yes === true,
72
+ quiet: raw.opts.quiet === true,
73
+ }),
74
+ };
75
+ export const backendInspectSpec = {
76
+ id: ["backend", "inspect"],
77
+ group: "Backend",
78
+ summary: "Inspect visible backend readiness facts without mutating remote state.",
79
+ args: [{ name: "id", required: true, valueHint: "<id>", description: "Configured backend id." }],
80
+ options: [
81
+ { kind: "boolean", name: "yes", default: false, description: "Auto-approve network access." },
82
+ { kind: "boolean", name: "quiet", default: false, description: "Reduce output noise." },
83
+ ],
84
+ examples: [
85
+ {
86
+ cmd: "agentplane backend inspect redmine --yes",
87
+ why: "Inspect visible Redmine custom fields and canonical_state readiness without remote writes.",
88
+ },
89
+ ],
90
+ parse: (raw) => ({
91
+ backendId: String(raw.args.id),
92
+ yes: raw.opts.yes === true,
93
+ quiet: raw.opts.quiet === true,
94
+ }),
95
+ };
54
96
  function runBackendRootGroup(_ctx, p) {
55
97
  const input = p.cmd.join(" ");
56
- const suggestion = suggestOne(input, ["sync"]);
98
+ const suggestion = suggestOne(input, ["sync", "inspect", "migrate-canonical-state"]);
57
99
  const suffix = suggestion ? ` Did you mean: ${suggestion}?` : "";
58
100
  const msg = p.cmd.length === 0 ? "Missing subcommand." : `Unknown subcommand: ${p.cmd[0]}.`;
59
101
  throw usageError({
@@ -76,3 +118,25 @@ export function makeRunBackendSyncHandler(getCtx) {
76
118
  });
77
119
  };
78
120
  }
121
+ export function makeRunBackendInspectHandler(getCtx) {
122
+ return async (ctx, p) => {
123
+ const commandCtx = await getCtx("backend inspect");
124
+ return await cmdBackendInspectParsed({
125
+ ctx: commandCtx,
126
+ cwd: ctx.cwd,
127
+ rootOverride: ctx.rootOverride,
128
+ flags: p,
129
+ });
130
+ };
131
+ }
132
+ export function makeRunBackendMigrateCanonicalStateHandler(getCtx) {
133
+ return async (ctx, p) => {
134
+ const commandCtx = await getCtx("backend migrate-canonical-state");
135
+ return await cmdBackendMigrateCanonicalStateParsed({
136
+ ctx: commandCtx,
137
+ cwd: ctx.cwd,
138
+ rootOverride: ctx.rootOverride,
139
+ flags: p,
140
+ });
141
+ };
142
+ }
@@ -13,6 +13,16 @@ export type SyncParsed = {
13
13
  yes: boolean;
14
14
  quiet: boolean;
15
15
  };
16
+ export type BackendMigrateCanonicalStateParsed = {
17
+ backendId: string;
18
+ yes: boolean;
19
+ quiet: boolean;
20
+ };
21
+ export type BackendInspectParsed = {
22
+ backendId: string;
23
+ yes: boolean;
24
+ quiet: boolean;
25
+ };
16
26
  export declare function cmdBackendSyncParsed(opts: {
17
27
  ctx?: CommandContext;
18
28
  cwd: string;
@@ -25,4 +35,16 @@ export declare function cmdSyncParsed(opts: {
25
35
  rootOverride?: string;
26
36
  flags: SyncParsed;
27
37
  }): Promise<number>;
38
+ export declare function cmdBackendMigrateCanonicalStateParsed(opts: {
39
+ ctx?: CommandContext;
40
+ cwd: string;
41
+ rootOverride?: string;
42
+ flags: BackendMigrateCanonicalStateParsed;
43
+ }): Promise<number>;
44
+ export declare function cmdBackendInspectParsed(opts: {
45
+ ctx?: CommandContext;
46
+ cwd: string;
47
+ rootOverride?: string;
48
+ flags: BackendInspectParsed;
49
+ }): Promise<number>;
28
50
  //# sourceMappingURL=backend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/commands/backend.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGnF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;IAC7D,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;IAC7D,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClB"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/commands/backend.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGnF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;IAC7D,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;IAC7D,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClB;AAED,wBAAsB,qCAAqC,CAAC,IAAI,EAAE;IAChE,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,kCAAkC,CAAC;CAC3C,GAAG,OAAO,CAAC,MAAM,CAAC,CA2DlB;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,oBAAoB,CAAC;CAC7B,GAAG,OAAO,CAAC,MAAM,CAAC,CAkElB"}
@@ -1,4 +1,4 @@
1
- import { backendNotSupportedMessage } from "../cli/output.js";
1
+ import { backendNotSupportedMessage, successMessage, warnMessage } from "../cli/output.js";
2
2
  import { mapBackendError } from "../cli/error-map.js";
3
3
  import { CliError } from "../shared/errors.js";
4
4
  import { loadCommandContext } from "./shared/task-backend.js";
@@ -89,3 +89,112 @@ export async function cmdSyncParsed(opts) {
89
89
  throw mapBackendError(err, { command: "sync", root: opts.rootOverride ?? null });
90
90
  }
91
91
  }
92
+ export async function cmdBackendMigrateCanonicalStateParsed(opts) {
93
+ try {
94
+ const ctx = opts.ctx ??
95
+ (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
96
+ const backend = ctx.taskBackend;
97
+ const backendId = ctx.backendId;
98
+ const config = ctx.config;
99
+ if (opts.flags.backendId && backendId && opts.flags.backendId !== backendId) {
100
+ throw new CliError({
101
+ exitCode: 2,
102
+ code: "E_USAGE",
103
+ message: `Configured backend is "${backendId}", not "${opts.flags.backendId}"`,
104
+ context: {
105
+ command: "backend migrate-canonical-state",
106
+ reason_code: "sync_backend_mismatch",
107
+ },
108
+ });
109
+ }
110
+ if (!backend.migrateCanonicalState) {
111
+ throw new CliError({
112
+ exitCode: 2,
113
+ code: "E_USAGE",
114
+ message: backendNotSupportedMessage("migrateCanonicalState()"),
115
+ });
116
+ }
117
+ if (backendId !== "local") {
118
+ await ensureNetworkApproved({
119
+ config,
120
+ yes: opts.flags.yes,
121
+ reason: `backend migrate-canonical-state may access the network (backend: ${backendId})`,
122
+ });
123
+ }
124
+ const result = await backend.migrateCanonicalState();
125
+ if (!opts.flags.quiet) {
126
+ process.stdout.write(`${successMessage("backend migrate-canonical-state", undefined, `scanned=${result.scanned} migrated=${result.migrated.length} skipped-structured=${result.skippedStructured.length} skipped-no-doc=${result.skippedNoDoc.length} failed=${result.failed.length}`)}\n`);
127
+ }
128
+ if (result.failed.length > 0) {
129
+ for (const failure of result.failed.slice(0, 20)) {
130
+ process.stderr.write(`${warnMessage(`backend migrate-canonical-state failed for ${failure.taskId}: ${failure.reason}`)}\n`);
131
+ }
132
+ return 1;
133
+ }
134
+ return 0;
135
+ }
136
+ catch (err) {
137
+ if (err instanceof CliError)
138
+ throw err;
139
+ throw mapBackendError(err, {
140
+ command: "backend migrate-canonical-state",
141
+ root: opts.rootOverride ?? null,
142
+ });
143
+ }
144
+ }
145
+ export async function cmdBackendInspectParsed(opts) {
146
+ try {
147
+ const ctx = opts.ctx ??
148
+ (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
149
+ const backend = ctx.taskBackend;
150
+ const backendId = ctx.backendId;
151
+ const config = ctx.config;
152
+ if (opts.flags.backendId && backendId && opts.flags.backendId !== backendId) {
153
+ throw new CliError({
154
+ exitCode: 2,
155
+ code: "E_USAGE",
156
+ message: `Configured backend is "${backendId}", not "${opts.flags.backendId}"`,
157
+ context: {
158
+ command: "backend inspect",
159
+ reason_code: "inspect_backend_mismatch",
160
+ },
161
+ });
162
+ }
163
+ if (!backend.inspectConfiguration) {
164
+ throw new CliError({
165
+ exitCode: 2,
166
+ code: "E_USAGE",
167
+ message: backendNotSupportedMessage("inspectConfiguration()"),
168
+ });
169
+ }
170
+ if (backendId !== "local") {
171
+ await ensureNetworkApproved({
172
+ config,
173
+ yes: opts.flags.yes,
174
+ reason: `backend inspect may access the network (backend: ${backendId})`,
175
+ });
176
+ }
177
+ const result = await backend.inspectConfiguration();
178
+ if (opts.flags.quiet)
179
+ return 0;
180
+ const canonicalStateSummary = result.canonicalState.configuredFieldId === null
181
+ ? result.canonicalState.visibleFieldId === null
182
+ ? "missing"
183
+ : `visible-unconfigured:${result.canonicalState.visibleFieldId}`
184
+ : `configured:${result.canonicalState.configuredFieldId}`;
185
+ process.stdout.write(`${successMessage("backend inspect", undefined, `visible-fields=${result.visibleCustomFields.length} canonical-state=${canonicalStateSummary} drift=${result.configuredFieldNameDrift.length}`)}\n`);
186
+ process.stdout.write(`canonical_state configured=${result.canonicalState.configuredFieldId ?? "unset"} visible=${result.canonicalState.visibleFieldId ?? "absent"}\n`);
187
+ for (const drift of result.configuredFieldNameDrift) {
188
+ process.stdout.write(`drift key=${drift.key} configured-id=${drift.configuredId} visible-name=${JSON.stringify(drift.visibleName)}\n`);
189
+ }
190
+ for (const field of result.visibleCustomFields) {
191
+ process.stdout.write(`field id=${field.id} name=${JSON.stringify(field.name)} non-empty=${field.nonEmptyCount}\n`);
192
+ }
193
+ return 0;
194
+ }
195
+ catch (err) {
196
+ if (err instanceof CliError)
197
+ throw err;
198
+ throw mapBackendError(err, { command: "backend inspect", root: opts.rootOverride ?? null });
199
+ }
200
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"commit.spec.d.ts","sourceRoot":"","sources":["../../src/commands/commit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOvD,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CA8JhD,CAAC"}
1
+ {"version":3,"file":"commit.spec.d.ts","sourceRoot":"","sources":["../../src/commands/commit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOvD,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CAwLhD,CAAC"}
@@ -3,7 +3,7 @@ import { findRepoWideAllowPrefixes, repoWideAllowPrefixMessage, } from "../share
3
3
  export const commitSpec = {
4
4
  id: ["commit"],
5
5
  group: "Guard",
6
- summary: "Create a git commit after validating policy and allowlist against staged changes.",
6
+ summary: "Create a git commit after validating policy and allowlist; if the index is empty, stage matching allowlist paths first.",
7
7
  args: [{ name: "task-id", required: true, valueHint: "<task-id>" }],
8
8
  options: [
9
9
  {
@@ -49,23 +49,38 @@ export const commitSpec = {
49
49
  kind: "boolean",
50
50
  name: "allow-tasks",
51
51
  default: false,
52
- description: "Allow task workflow artifacts (tasks/ and .agentplane/tasks/).",
52
+ description: "Allow the tasks export snapshot plus artifacts under the active task subtree; standalone path scope.",
53
53
  },
54
54
  {
55
55
  kind: "boolean",
56
56
  name: "allow-base",
57
57
  default: false,
58
- description: "Allow base branch edits.",
58
+ description: "Allow base branch edits; branch override only, not a path allowlist.",
59
59
  },
60
60
  {
61
61
  kind: "boolean",
62
62
  name: "allow-policy",
63
63
  default: false,
64
- description: "Allow policy edits (e.g. AGENTS.md).",
64
+ description: "Allow policy edits (e.g. AGENTS.md); standalone path scope.",
65
+ },
66
+ {
67
+ kind: "boolean",
68
+ name: "allow-config",
69
+ default: false,
70
+ description: "Allow config edits; standalone path scope.",
71
+ },
72
+ {
73
+ kind: "boolean",
74
+ name: "allow-hooks",
75
+ default: false,
76
+ description: "Allow hooks edits; standalone path scope.",
77
+ },
78
+ {
79
+ kind: "boolean",
80
+ name: "allow-ci",
81
+ default: false,
82
+ description: "Allow CI workflow edits; standalone path scope.",
65
83
  },
66
- { kind: "boolean", name: "allow-config", default: false, description: "Allow config edits." },
67
- { kind: "boolean", name: "allow-hooks", default: false, description: "Allow hooks edits." },
68
- { kind: "boolean", name: "allow-ci", default: false, description: "Allow CI workflow edits." },
69
84
  {
70
85
  kind: "boolean",
71
86
  name: "require-clean",
@@ -79,11 +94,20 @@ export const commitSpec = {
79
94
  cmd: 'agentplane commit 202602030608-F1Q8AB -m "✨ F1Q8AB task: implement allowlist guard" --allow packages/agentplane',
80
95
  why: "Create a commit after validating allowlist and subject policy.",
81
96
  },
97
+ {
98
+ cmd: 'agentplane commit 202602030608-F1Q8AB -m "✨ F1Q8AB task: update publish workflow" --allow-ci',
99
+ why: "Commit CI-only changes without a redundant explicit workflow path prefix.",
100
+ },
82
101
  {
83
102
  cmd: "agentplane commit 202602030608-F1Q8AB --close",
84
103
  why: "Create a close commit for the task README using a deterministic message builder.",
85
104
  },
86
105
  ],
106
+ notes: [
107
+ "Protected path-scoped overrides can stand alone without a duplicate explicit prefix: `--allow-tasks`, `--allow-policy`, `--allow-config`, `--allow-hooks`, and `--allow-ci` each admit their own path family.",
108
+ "Top-level `agentplane commit` can auto-stage those protected path scopes when the git index starts empty.",
109
+ "`--allow-base` is different: it only overrides base-branch protection and never selects file paths by itself.",
110
+ ],
87
111
  validateRaw: (raw) => {
88
112
  const close = raw.opts.close === true;
89
113
  const msg = typeof raw.opts.message === "string" ? raw.opts.message.trim() : "";
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAyB5D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,CA+BxF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAM1E"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAsB5D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,CA+BxF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAM1E"}
@@ -10,10 +10,7 @@ function renderCliVersionFacts(expectation) {
10
10
  ...(expectation.recovery ? [`[WARN] Recovery: ${expectation.recovery}`] : []),
11
11
  ];
12
12
  }
13
- return [
14
- `[INFO] Repository expected agentplane CLI: ${expectation.expectedVersion}`,
15
- ...(expectation.summary ? [`[INFO] ${expectation.summary}`] : []),
16
- ];
13
+ return [];
17
14
  }
18
15
  export function checkRuntimeSourceFacts(cwd, config) {
19
16
  const report = resolveRuntimeSourceInfo({ cwd, entryModuleUrl: import.meta.url });
@@ -25,9 +22,9 @@ export function checkRuntimeSourceFacts(cwd, config) {
25
22
  }
26
23
  const warning = report.mode === "global-in-framework"
27
24
  ? "[WARN] Framework checkout detected but the active runtime is still a global installed binary. " +
28
- "Update or reinstall agentplane to pick up repo-local handoff, or run the repo-local binary directly."
25
+ "Run scripts/reinstall-global-agentplane.sh to refresh the wrapper, or run the repo-local binary directly."
29
26
  : report.mode === "global-forced-in-framework"
30
- ? "[WARN] Framework checkout is forcing the global installed binary via AGENTPLANE_USE_GLOBAL_IN_FRAMEWORK=1."
27
+ ? "[WARN] Framework checkout is forcing the global installed binary via AGENTPLANE_USE_GLOBAL_IN_FRAMEWORK=1. Unset it unless that override is intentional."
31
28
  : null;
32
29
  return [
33
30
  ...(warning ? [warning] : []),
@@ -1,5 +1,13 @@
1
1
  import { type CommandContext } from "../shared/task-backend.js";
2
+ type TaskDocSnapshot = {
3
+ id?: unknown;
4
+ status?: unknown;
5
+ doc_version?: unknown;
6
+ };
7
+ export declare function buildTaskReadmeMigrationFindings(tasks: TaskDocSnapshot[]): string[];
8
+ export declare function checkTaskReadmeMigrationState(repoRoot: string, ctx?: CommandContext): Promise<string[]>;
2
9
  export declare function checkWorkspace(repoRoot: string, opts?: {
3
10
  ctx?: CommandContext;
4
11
  }): Promise<string[]>;
12
+ export {};
5
13
  //# sourceMappingURL=workspace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/workspace.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AA6NpF,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,cAAc,CAAA;CAAE,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CAyDnB"}
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/workspace.ts"],"names":[],"mappings":"AAUA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEpF,KAAK,eAAe,GAAG;IACrB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAuFF,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAyDnF;AAED,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,cAAc,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CAOnB;AAuMD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,cAAc,CAAA;CAAE,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CA2DnB"}