agentplane 0.2.19 → 0.2.22

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 (122) hide show
  1. package/assets/AGENTS.md +6 -4
  2. package/bin/agentplane.js +24 -0
  3. package/dist/backends/task-backend/load.d.ts +2 -0
  4. package/dist/backends/task-backend/load.d.ts.map +1 -1
  5. package/dist/backends/task-backend/load.js +38 -18
  6. package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
  7. package/dist/backends/task-backend/local-backend.js +27 -7
  8. package/dist/cli/command-guide.d.ts.map +1 -1
  9. package/dist/cli/command-guide.js +12 -11
  10. package/dist/cli/run-cli/command-catalog.d.ts +1 -1
  11. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  12. package/dist/cli/run-cli/command-catalog.js +72 -13
  13. package/dist/cli/run-cli/commands/core.d.ts +11 -1
  14. package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
  15. package/dist/cli/run-cli/commands/core.js +295 -8
  16. package/dist/cli/run-cli/commands/init/write-agents.d.ts.map +1 -1
  17. package/dist/cli/run-cli/commands/init/write-agents.js +33 -1
  18. package/dist/cli/run-cli/commands/init/write-config.d.ts.map +1 -1
  19. package/dist/cli/run-cli/commands/init/write-config.js +4 -0
  20. package/dist/cli/run-cli/commands/init/write-gitignore.d.ts.map +1 -1
  21. package/dist/cli/run-cli/commands/init/write-gitignore.js +3 -18
  22. package/dist/cli/run-cli/commands/init.d.ts +1 -0
  23. package/dist/cli/run-cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/run-cli/commands/init.js +96 -31
  25. package/dist/cli/run-cli.d.ts.map +1 -1
  26. package/dist/cli/run-cli.js +86 -17
  27. package/dist/cli/spec/docs-render.d.ts.map +1 -1
  28. package/dist/cli/spec/docs-render.js +13 -6
  29. package/dist/commands/backend/sync.command.d.ts +3 -2
  30. package/dist/commands/backend/sync.command.d.ts.map +1 -1
  31. package/dist/commands/backend/sync.command.js +13 -15
  32. package/dist/commands/commit.command.d.ts.map +1 -1
  33. package/dist/commands/commit.command.js +2 -0
  34. package/dist/commands/commit.spec.d.ts +2 -0
  35. package/dist/commands/commit.spec.d.ts.map +1 -1
  36. package/dist/commands/commit.spec.js +26 -0
  37. package/dist/commands/doctor.run.d.ts.map +1 -1
  38. package/dist/commands/doctor.run.js +15 -6
  39. package/dist/commands/finish.run.d.ts.map +1 -1
  40. package/dist/commands/finish.run.js +2 -0
  41. package/dist/commands/finish.spec.d.ts +2 -0
  42. package/dist/commands/finish.spec.d.ts.map +1 -1
  43. package/dist/commands/finish.spec.js +36 -0
  44. package/dist/commands/guard/impl/allow.d.ts.map +1 -1
  45. package/dist/commands/guard/impl/allow.js +33 -7
  46. package/dist/commands/guard/impl/commands.d.ts +2 -0
  47. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  48. package/dist/commands/guard/impl/commands.js +24 -4
  49. package/dist/commands/guard/impl/comment-commit.d.ts +1 -0
  50. package/dist/commands/guard/impl/comment-commit.d.ts.map +1 -1
  51. package/dist/commands/guard/impl/comment-commit.js +16 -24
  52. package/dist/commands/pr/pr.command.d.ts +1 -1
  53. package/dist/commands/pr/pr.command.d.ts.map +1 -1
  54. package/dist/commands/pr/pr.command.js +15 -15
  55. package/dist/commands/release/apply.command.d.ts.map +1 -1
  56. package/dist/commands/release/apply.command.js +51 -3
  57. package/dist/commands/release/plan.command.d.ts.map +1 -1
  58. package/dist/commands/release/plan.command.js +25 -1
  59. package/dist/commands/shared/task-backend.d.ts +3 -0
  60. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  61. package/dist/commands/shared/task-backend.js +4 -1
  62. package/dist/commands/task/block.d.ts.map +1 -1
  63. package/dist/commands/task/block.js +16 -16
  64. package/dist/commands/task/close-duplicate.command.d.ts +14 -0
  65. package/dist/commands/task/close-duplicate.command.d.ts.map +1 -0
  66. package/dist/commands/task/close-duplicate.command.js +102 -0
  67. package/dist/commands/task/close-duplicate.d.ts +14 -0
  68. package/dist/commands/task/close-duplicate.d.ts.map +1 -0
  69. package/dist/commands/task/close-duplicate.js +90 -0
  70. package/dist/commands/task/close-noop.command.d.ts +14 -0
  71. package/dist/commands/task/close-noop.command.d.ts.map +1 -0
  72. package/dist/commands/task/close-noop.command.js +77 -0
  73. package/dist/commands/task/close-noop.d.ts +13 -0
  74. package/dist/commands/task/close-noop.d.ts.map +1 -0
  75. package/dist/commands/task/close-noop.js +77 -0
  76. package/dist/commands/task/finish.d.ts +2 -0
  77. package/dist/commands/task/finish.d.ts.map +1 -1
  78. package/dist/commands/task/finish.js +63 -14
  79. package/dist/commands/task/index.d.ts +3 -0
  80. package/dist/commands/task/index.d.ts.map +1 -1
  81. package/dist/commands/task/index.js +3 -0
  82. package/dist/commands/task/new.d.ts.map +1 -1
  83. package/dist/commands/task/new.js +34 -6
  84. package/dist/commands/task/new.spec.js +1 -1
  85. package/dist/commands/task/plan.d.ts.map +1 -1
  86. package/dist/commands/task/plan.js +16 -5
  87. package/dist/commands/task/ready.d.ts.map +1 -1
  88. package/dist/commands/task/ready.js +6 -8
  89. package/dist/commands/task/set-status.d.ts.map +1 -1
  90. package/dist/commands/task/set-status.js +19 -21
  91. package/dist/commands/task/shared.d.ts +35 -1
  92. package/dist/commands/task/shared.d.ts.map +1 -1
  93. package/dist/commands/task/shared.js +188 -0
  94. package/dist/commands/task/start-ready.command.d.ts +14 -0
  95. package/dist/commands/task/start-ready.command.d.ts.map +1 -0
  96. package/dist/commands/task/start-ready.command.js +77 -0
  97. package/dist/commands/task/start-ready.d.ts +13 -0
  98. package/dist/commands/task/start-ready.d.ts.map +1 -0
  99. package/dist/commands/task/start-ready.js +37 -0
  100. package/dist/commands/task/start.d.ts.map +1 -1
  101. package/dist/commands/task/start.js +20 -23
  102. package/dist/commands/task/update.command.d.ts +1 -0
  103. package/dist/commands/task/update.command.d.ts.map +1 -1
  104. package/dist/commands/task/update.command.js +8 -0
  105. package/dist/commands/task/update.d.ts +1 -0
  106. package/dist/commands/task/update.d.ts.map +1 -1
  107. package/dist/commands/task/update.js +19 -3
  108. package/dist/commands/upgrade.d.ts.map +1 -1
  109. package/dist/commands/upgrade.js +67 -19
  110. package/dist/shared/errors.d.ts +9 -1
  111. package/dist/shared/errors.d.ts.map +1 -1
  112. package/dist/shared/errors.js +3 -1
  113. package/dist/shared/runtime-artifacts.d.ts +3 -0
  114. package/dist/shared/runtime-artifacts.d.ts.map +1 -0
  115. package/dist/shared/runtime-artifacts.js +18 -0
  116. package/dist/usecases/context/resolve-context.d.ts +3 -0
  117. package/dist/usecases/context/resolve-context.d.ts.map +1 -1
  118. package/dist/usecases/context/resolve-context.js +6 -1
  119. package/package.json +2 -2
  120. package/dist/cli/parse/lifecycle.d.ts +0 -64
  121. package/dist/cli/parse/lifecycle.d.ts.map +0 -1
  122. package/dist/cli/parse/lifecycle.js +0 -285
package/assets/AGENTS.md CHANGED
@@ -137,7 +137,7 @@ Precedence:
137
137
 
138
138
  ## Framework Upgrade / Prompt Merge
139
139
 
140
- `agentplane upgrade` is responsible for mechanical upgrades and safe merges. When an upgrade run indicates a potential semantic conflict (for example, both local and incoming changes exist relative to a baseline, or a baseline is missing but files differ), treat the result as requiring a meaning-level review.
140
+ `agentplane upgrade` is responsible for mechanical upgrades and safe merges. Treat prompt-merge as required only for unresolved semantic conflicts (for example, both local and incoming changes exist relative to a baseline and cannot be safely reconciled automatically, or merge parsing fails). If local files did not change relative to baseline, the upgrade may apply incoming framework updates without semantic review.
141
141
 
142
142
  Trigger:
143
143
 
@@ -145,6 +145,7 @@ Trigger:
145
145
  - Agent mode: `.agentplane/.upgrade/agent/<runId>/review.json`
146
146
  - Auto mode: `.agentplane/.upgrade/last-review.json`
147
147
  - If any record has `needsSemanticReview: true`, prompt merge is required.
148
+ - `needsSemanticReview: false` means the change was mechanically safe (including cases where local files were unchanged vs baseline and incoming updates were applied directly).
148
149
 
149
150
  Protocol:
150
151
 
@@ -425,7 +426,7 @@ If config sets `agents.approvals.require_plan=true`:
425
426
  - `## Verify Steps` is the **ex-ante verification contract**: instructions and pass criteria addressed to the verifier.
426
427
  - `## Verification` is the **ex-post verification log**: append-only entries written by `agentplane verify ...`.
427
428
  - Do not hand-edit `## Verification` entries. Treat them as audit records.
428
- - For tasks with verify-required tags (default: `code`, `backend`, `frontend`) and for `spike`, `agentplane task plan approve`
429
+ - For tasks with verify-required primary tags (default: `code`, `data`, `ops`) and for `spike`, `agentplane task plan approve`
429
430
  will block until `## Verify Steps` is filled (the placeholder `<!-- TODO: FILL VERIFY STEPS -->` is treated as empty).
430
431
  - Use `agentplane task verify-show <task-id>` to print the current `## Verify Steps` to stdout.
431
432
 
@@ -471,8 +472,9 @@ Use comment-driven flags (where supported by agentplane), e.g.:
471
472
 
472
473
  In this mode:
473
474
 
474
- - agentplane builds the commit subject as `<emoji> <suffix> <scope>: <summary>` from the status/finish body.
475
- - agentplane adds a short structured commit body (Task/Agent/Status/Comment) automatically for comment-driven commits.
475
+ - agentplane builds the commit subject as `<emoji> <suffix> <primary>: <status>` for major transitions only.
476
+ - major transitions for status/comment-driven commits: `TODO->DOING`, `DOING->BLOCKED`, `BLOCKED->DOING`, `DOING->DONE`.
477
+ - agentplane adds a short structured commit body (`Task` / `Primary` / `Status` / `Comment`) automatically for comment-driven commits.
476
478
 
477
479
  ## Commit subject format (enforced)
478
480
 
package/bin/agentplane.js CHANGED
@@ -12,6 +12,29 @@ async function exists(p) {
12
12
  }
13
13
  }
14
14
 
15
+ async function maybeWarnGlobalBinaryInRepoCheckout() {
16
+ const cwd = process.cwd();
17
+ const repoCli = path.join(cwd, "packages", "agentplane", "src", "cli.ts");
18
+ const repoBin = path.join(cwd, "packages", "agentplane", "bin", "agentplane.js");
19
+ if (!(await exists(repoCli)) || !(await exists(repoBin))) return;
20
+
21
+ const thisBin = fileURLToPath(import.meta.url);
22
+ const normalizedThis = path.resolve(thisBin);
23
+ const normalizedRepo = path.resolve(repoBin);
24
+ if (normalizedThis === normalizedRepo) return;
25
+
26
+ process.stderr.write(
27
+ "warning: running global agentplane binary inside repository checkout.\n" +
28
+ "using global binary: " +
29
+ normalizedThis +
30
+ "\n" +
31
+ "expected local binary: " +
32
+ normalizedRepo +
33
+ "\n" +
34
+ "tip: run `node packages/agentplane/bin/agentplane.js ...` for repo-local changes.\n",
35
+ );
36
+ }
37
+
15
38
  function isTestLikePath(absPath) {
16
39
  // The repo build does not emit test files to dist. If we treat test mtimes as
17
40
  // "src is newer than dist", we can block normal commits that only change tests.
@@ -106,5 +129,6 @@ async function assertDistUpToDate() {
106
129
  return true;
107
130
  }
108
131
 
132
+ await maybeWarnGlobalBinaryInRepoCheckout();
109
133
  const ok = await assertDistUpToDate();
110
134
  if (ok) await import("../dist/cli.js");
@@ -3,6 +3,8 @@ import { type TaskBackend } from "./shared.js";
3
3
  export declare function loadTaskBackend(opts: {
4
4
  cwd: string;
5
5
  rootOverride?: string | null;
6
+ resolvedProject?: ResolvedProject;
7
+ config?: AgentplaneConfig;
6
8
  }): Promise<{
7
9
  backend: TaskBackend;
8
10
  backendId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/load.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AA0C7D,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC,CAuBD"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/load.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAuF7D,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC,CAUD"}
@@ -18,6 +18,37 @@ async function loadBackendConfig(configPath) {
18
18
  throw err;
19
19
  }
20
20
  }
21
+ async function instantiateTaskBackend(opts) {
22
+ const backendConfigPath = path.join(opts.resolved.gitRoot, opts.config.tasks_backend.config_path);
23
+ const backendConfig = await loadBackendConfig(backendConfigPath);
24
+ const normalized = normalizeBackendConfig(backendConfig);
25
+ const backendId = normalized.id;
26
+ const settings = normalized.settings;
27
+ if (backendId === "redmine") {
28
+ await loadDotEnv(opts.resolved.gitRoot);
29
+ const cacheDirRaw = resolveMaybeRelative(opts.resolved.gitRoot, settings.cache_dir);
30
+ const cacheDir = cacheDirRaw ?? path.join(opts.resolved.gitRoot, opts.config.paths.workflow_dir);
31
+ const cache = cacheDir ? new LocalBackend({ dir: cacheDir }) : null;
32
+ const redmine = new RedmineBackend(settings, { cache });
33
+ return {
34
+ backend: redmine,
35
+ backendId,
36
+ resolved: opts.resolved,
37
+ config: opts.config,
38
+ backendConfigPath,
39
+ };
40
+ }
41
+ const localDir = resolveMaybeRelative(opts.resolved.gitRoot, settings.dir) ??
42
+ path.join(opts.resolved.gitRoot, opts.config.paths.workflow_dir);
43
+ const local = new LocalBackend({ dir: localDir });
44
+ return {
45
+ backend: local,
46
+ backendId: "local",
47
+ resolved: opts.resolved,
48
+ config: opts.config,
49
+ backendConfigPath,
50
+ };
51
+ }
21
52
  function resolveMaybeRelative(root, input) {
22
53
  if (!input)
23
54
  return null;
@@ -36,23 +67,12 @@ function normalizeBackendConfig(raw) {
36
67
  return { id, version, settings };
37
68
  }
38
69
  export async function loadTaskBackend(opts) {
39
- const resolved = await resolveProject({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null });
40
- const loaded = await loadConfig(resolved.agentplaneDir);
41
- const backendConfigPath = path.join(resolved.gitRoot, loaded.config.tasks_backend.config_path);
42
- const backendConfig = await loadBackendConfig(backendConfigPath);
43
- const normalized = normalizeBackendConfig(backendConfig);
44
- const backendId = normalized.id;
45
- const settings = normalized.settings;
46
- if (backendId === "redmine") {
47
- await loadDotEnv(resolved.gitRoot);
48
- const cacheDirRaw = resolveMaybeRelative(resolved.gitRoot, settings.cache_dir);
49
- const cacheDir = cacheDirRaw ?? path.join(resolved.gitRoot, loaded.config.paths.workflow_dir);
50
- const cache = cacheDir ? new LocalBackend({ dir: cacheDir }) : null;
51
- const redmine = new RedmineBackend(settings, { cache });
52
- return { backend: redmine, backendId, resolved, config: loaded.config, backendConfigPath };
70
+ const resolved = opts.resolvedProject ??
71
+ (await resolveProject({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
72
+ if (opts.config) {
73
+ return await instantiateTaskBackend({ resolved, config: opts.config });
53
74
  }
54
- const localDir = resolveMaybeRelative(resolved.gitRoot, settings.dir) ??
55
- path.join(resolved.gitRoot, loaded.config.paths.workflow_dir);
56
- const local = new LocalBackend({ dir: localDir });
57
- return { backend: local, backendId: "local", resolved, config: loaded.config, backendConfigPath };
75
+ const loadedConfig = await loadConfig(resolved.agentplaneDir);
76
+ const config = loadedConfig.config;
77
+ return await instantiateTaskBackend({ resolved, config });
58
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-backend.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/local-backend.ts"],"names":[],"mappings":"AAqBA,OAAO,EAiBL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,YAAW,WAAW;IAC9C,EAAE,SAAW;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;gBAEN,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAKrD,cAAc,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB3E,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA2FhC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAoBjD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;IAKzD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO3C,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyExC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB1E,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvE,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoF/D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzD"}
1
+ {"version":3,"file":"local-backend.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/local-backend.ts"],"names":[],"mappings":"AAqBA,OAAO,EAiBL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,YAAW,WAAW;IAC9C,EAAE,SAAW;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;gBAEN,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAKrD,cAAc,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB3E,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAgHhC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAoBjD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;IAKzD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO3C,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyExC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB1E,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvE,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoF/D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzD"}
@@ -41,14 +41,15 @@ export class LocalBackend {
41
41
  const entries = await readdir(this.root, { withFileTypes: true }).catch(() => []);
42
42
  const indexPath = resolveTaskIndexPath(this.root);
43
43
  const cachedIndex = await loadTaskIndex(indexPath);
44
- const cachedByPath = new Map();
44
+ const cachedEntryByPath = new Map();
45
45
  if (cachedIndex) {
46
46
  for (const [readmePath, taskId] of Object.entries(cachedIndex.byPath)) {
47
47
  const entry = cachedIndex.byId[taskId];
48
48
  if (entry)
49
- cachedByPath.set(readmePath, entry);
49
+ cachedEntryByPath.set(readmePath, entry);
50
50
  }
51
51
  }
52
+ let indexDirty = cachedIndex === null;
52
53
  const nextById = {};
53
54
  const nextByPath = {};
54
55
  const seen = new Set();
@@ -68,10 +69,11 @@ export class LocalBackend {
68
69
  }
69
70
  if (!stats.isFile())
70
71
  return null;
71
- const cached = cachedByPath.get(readme);
72
+ const cached = cachedEntryByPath.get(readme);
72
73
  if (cached?.mtimeMs === stats.mtimeMs) {
73
74
  return { task: cached.task, index: cached, mtimeMs: stats.mtimeMs, readme };
74
75
  }
76
+ indexDirty = true;
75
77
  let text = "";
76
78
  try {
77
79
  text = await readFile(readme, "utf8");
@@ -115,11 +117,29 @@ export class LocalBackend {
115
117
  nextByPath[entry.readmePath] = taskId;
116
118
  }
117
119
  }
118
- try {
119
- await saveTaskIndex(indexPath, { schema_version: 2, byId: nextById, byPath: nextByPath });
120
+ if (cachedIndex && indexDirty === false) {
121
+ const cachedPaths = Object.keys(cachedIndex.byPath);
122
+ const nextPaths = Object.keys(nextByPath);
123
+ if (cachedPaths.length === nextPaths.length) {
124
+ for (const readmePath of nextPaths) {
125
+ if (cachedIndex.byPath[readmePath] === nextByPath[readmePath]) {
126
+ continue;
127
+ }
128
+ indexDirty = true;
129
+ break;
130
+ }
131
+ }
132
+ else {
133
+ indexDirty = true;
134
+ }
120
135
  }
121
- catch {
122
- // Best-effort cache; ignore failures.
136
+ if (indexDirty) {
137
+ try {
138
+ await saveTaskIndex(indexPath, { schema_version: 2, byId: nextById, byPath: nextByPath });
139
+ }
140
+ catch {
141
+ // Best-effort cache; ignore failures.
142
+ }
123
143
  }
124
144
  return tasks;
125
145
  }
@@ -1 +1 @@
1
- {"version":3,"file":"command-guide.d.ts","sourceRoot":"","sources":["../../src/cli/command-guide.ts"],"names":[],"mappings":"AA+LA,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAEpC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CA6EzC"}
1
+ {"version":3,"file":"command-guide.d.ts","sourceRoot":"","sources":["../../src/cli/command-guide.ts"],"names":[],"mappings":"AAgMA,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAEpC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CA8EzC"}
@@ -57,11 +57,11 @@ const CHEAT_SHEET_ROWS = [
57
57
  },
58
58
  {
59
59
  operation: "INTEGRATOR: finish task(s)",
60
- command: '`agentplane finish <task-id> [<task-id> ...] --commit <git-rev> --author INTEGRATOR --body "Verified: ..." [--result "<one line>"]`',
60
+ command: '`agentplane finish <task-id> [<task-id> ...] --commit <git-rev> --author INTEGRATOR --body "Verified: ..." [--result "<one line>"] [--close-commit] [--close-unstage-others]`',
61
61
  },
62
62
  {
63
63
  operation: "INTEGRATOR: commit closure",
64
- command: "`agentplane commit <task-id> --close`",
64
+ command: "Preferred: `agentplane finish <task-id> --close-commit` (single command). Legacy/manual: `agentplane commit <task-id> --close [--check-only] [--unstage-others]` / duplicate no-op close: `agentplane task close-duplicate <task-id> --of <canonical-task-id> --author <ROLE>`",
65
65
  },
66
66
  ];
67
67
  const ROLE_GUIDES = [
@@ -82,7 +82,7 @@ const ROLE_GUIDES = [
82
82
  '- Update tasks: `agentplane task update <task-id> --title "..." --description "..." --priority med --owner <ROLE> --depends-on <task-id>`',
83
83
  "- Scaffold artifacts: `agentplane task scaffold <task-id>`",
84
84
  '- Plan lifecycle: `agentplane task plan set <task-id> --text "..." --updated-by <ROLE>` -> `agentplane task plan approve <task-id> --by <id>`',
85
- "- Verify Steps discipline: if a task has verify-required tags (default: code/backend/frontend), fill `## Verify Steps` before plan approval.",
85
+ "- Verify Steps discipline: if a task primary tag is verify-required (default: code/data/ops), fill `## Verify Steps` before plan approval.",
86
86
  '- Task docs (when planning needs it): `agentplane task doc set <task-id> --section Summary --text "..."`',
87
87
  ],
88
88
  },
@@ -95,7 +95,7 @@ const ROLE_GUIDES = [
95
95
  "- Verify Steps: `agentplane task verify-show <task-id>` (use as the verification contract before recording results).",
96
96
  '- Verify: `agentplane verify <task-id> --ok|--rework --by <ROLE> --note "..."`',
97
97
  '- PR artifacts (branch_pr): `agentplane pr open <task-id> --branch task/<task-id>/<slug> --author <ROLE>` / `agentplane pr update <task-id>` / `agentplane pr note <task-id> --author <ROLE> --body "..."`',
98
- '- Commit: `agentplane guard commit <task-id> -m "<emoji> <suffix> <scope>: <summary>"` / `agentplane commit <task-id> -m "<emoji> <suffix> <scope>: <summary>" --allow <path-prefix>` / close: `agentplane commit <task-id> --close`',
98
+ '- Commit: `agentplane guard commit <task-id> -m "<emoji> <suffix> <scope>: <summary>"` / `agentplane commit <task-id> -m "<emoji> <suffix> <scope>: <summary>" --allow <path-prefix>` / preferred close path: `agentplane finish <task-id> --close-commit [--close-unstage-others]`',
99
99
  ],
100
100
  },
101
101
  {
@@ -107,7 +107,7 @@ const ROLE_GUIDES = [
107
107
  "- Verify Steps: `agentplane task verify-show <task-id>` (treat as the verification contract).",
108
108
  '- Verify: `agentplane verify <task-id> --ok|--rework --by <ROLE> --note "..."`',
109
109
  '- PR artifacts (branch_pr): `agentplane pr open <task-id> --branch task/<task-id>/<slug> --author <ROLE>` / `agentplane pr update <task-id>` / `agentplane pr note <task-id> --author <ROLE> --body "..."`',
110
- '- Commit: `agentplane guard commit <task-id> -m "<emoji> <suffix> <scope>: <summary>"` / `agentplane commit <task-id> -m "<emoji> <suffix> <scope>: <summary>" --allow <path-prefix>` / close: `agentplane commit <task-id> --close`',
110
+ '- Commit: `agentplane guard commit <task-id> -m "<emoji> <suffix> <scope>: <summary>"` / `agentplane commit <task-id> -m "<emoji> <suffix> <scope>: <summary>" --allow <path-prefix>` / preferred close path: `agentplane finish <task-id> --close-commit [--close-unstage-others]`',
111
111
  ],
112
112
  },
113
113
  {
@@ -115,7 +115,7 @@ const ROLE_GUIDES = [
115
115
  lines: [
116
116
  '- Task docs: `agentplane task doc set <task-id> --section Summary --text "..."` (repeat per section or use `--file`)',
117
117
  '- PR notes: `agentplane pr note <task-id> --author DOCS --body "..."`',
118
- '- Commit: `agentplane guard commit <task-id> -m "<emoji> <suffix> <scope>: <summary>"` / `agentplane commit <task-id> -m "<emoji> <suffix> <scope>: <summary>" --allow <path-prefix>` / close: `agentplane commit <task-id> --close`',
118
+ '- Commit: `agentplane guard commit <task-id> -m "<emoji> <suffix> <scope>: <summary>"` / `agentplane commit <task-id> -m "<emoji> <suffix> <scope>: <summary>" --allow <path-prefix>` / preferred close path: `agentplane finish <task-id> --close-commit [--close-unstage-others]`',
119
119
  ],
120
120
  },
121
121
  {
@@ -128,8 +128,8 @@ const ROLE_GUIDES = [
128
128
  {
129
129
  role: "INTEGRATOR",
130
130
  lines: [
131
- '- branch_pr: `agentplane pr check <task-id>` -> `agentplane integrate <task-id> --branch task/<task-id>/<slug> --merge-strategy squash --run-verify` -> `agentplane finish <task-id> --commit <git-rev> --author INTEGRATOR --body "Verified: ..."`',
132
- '- direct: task owner uses `agentplane finish <task-id> --commit <git-rev> --author <OWNER> --body "Verified: ..."` after the implementation commit',
131
+ '- branch_pr: `agentplane pr check <task-id>` -> `agentplane integrate <task-id> --branch task/<task-id>/<slug> --merge-strategy squash --run-verify` -> `agentplane finish <task-id> --commit <git-rev> --author INTEGRATOR --body "Verified: ..." --close-commit`',
132
+ '- direct: task owner uses `agentplane finish <task-id> --commit <git-rev> --author <OWNER> --body "Verified: ..." --close-commit` after the implementation commit',
133
133
  "- Optional cleanup: `agentplane cleanup merged --yes`",
134
134
  ],
135
135
  },
@@ -205,7 +205,7 @@ export function renderQuickstart() {
205
205
  '- `agentplane task new --title "..." --description "..." --priority med --owner CODER --tag <tag>`',
206
206
  '- `agentplane start <task-id> --author <ROLE> --body "Start: ..."`',
207
207
  '- `agentplane verify <task-id> --ok|--rework --by <ROLE> --note "..."`',
208
- '- `agentplane finish <task-id> --author <ROLE> --body "Verified: ..."`',
208
+ '- `agentplane finish <task-id> --author <ROLE> --body "Verified: ..." --commit <git-rev> --close-commit`',
209
209
  "",
210
210
  "## Branch workflow (branch_pr)",
211
211
  "",
@@ -233,7 +233,7 @@ export function renderQuickstart() {
233
233
  "",
234
234
  "- Show the current config: `agentplane config show`",
235
235
  "- Set a value by dotted key: `agentplane config set workflow_mode branch_pr`",
236
- '- Set JSON values (lists/objects): `agentplane config set tasks.verify.required_tags \'["code","backend"]\'`',
236
+ '- Set JSON values (lists/objects): `agentplane config set tasks.verify.require_steps_for_primary \'["code","data","ops"]\'`',
237
237
  "",
238
238
  "## Role/phase command guide (when to use what)",
239
239
  "",
@@ -258,6 +258,7 @@ export function renderQuickstart() {
258
258
  "",
259
259
  "Notes:",
260
260
  "- `suffix` is the task ID segment after the last dash.",
261
- "- When using comment-driven flags, the subject is auto-built as `<emoji> <suffix> <scope>: <summary>`, and the body is auto-built from your status/finish comment.",
261
+ "- When using comment-driven flags, the subject is auto-built as `<emoji> <suffix> <primary>: <status>` and only for major transitions (TODO->DOING, DOING->BLOCKED, BLOCKED->DOING, DOING->DONE).",
262
+ "- Comment-driven commit bodies are structured: `Task`, `Primary`, `Status`, `Comment`.",
262
263
  ].join("\n");
263
264
  }
@@ -15,5 +15,5 @@ export type CommandEntry = {
15
15
  needsConfig: boolean;
16
16
  needsTaskContext: boolean;
17
17
  };
18
- export declare const COMMANDS: readonly [CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry];
18
+ export declare const COMMANDS: readonly [CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry, CommandEntry];
19
19
  //# sourceMappingURL=command-catalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-catalog.d.ts","sourceRoot":"","sources":["../../../src/cli/run-cli/command-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAiGvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,EAAE,CAAC,sBAAsB,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,kBAAkB,EAAE,CAAC,sBAAsB,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACjF,eAAe,EAAE,CAAC,sBAAsB,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3E,kBAAkB,EAAE,MAAM,SAAS,QAAQ,EAAE,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAgBF,eAAO,MAAM,QAAQ,yuCAuYuB,CAAC"}
1
+ {"version":3,"file":"command-catalog.d.ts","sourceRoot":"","sources":["../../../src/cli/run-cli/command-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAoGvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,EAAE,CAAC,sBAAsB,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,kBAAkB,EAAE,CAAC,sBAAsB,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACjF,eAAe,EAAE,CAAC,sBAAsB,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3E,kBAAkB,EAAE,MAAM,SAAS,QAAQ,EAAE,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAgBF,eAAO,MAAM,QAAQ,iyCAgeuB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { initSpec } from "./commands/init.js";
2
- import { agentsSpec, quickstartSpec, roleSpec } from "./commands/core.js";
2
+ import { agentsSpec, preflightSpec, quickstartSpec, roleSpec } from "./commands/core.js";
3
3
  import { configSetSpec, configShowSpec, modeGetSpec, modeSetSpec } from "./commands/config.js";
4
4
  import { ideSyncSpec } from "./commands/ide.js";
5
5
  import { taskNewSpec } from "../../commands/task/new.spec.js";
@@ -22,6 +22,9 @@ import { taskLintSpec } from "../../commands/task/lint.command.js";
22
22
  import { taskMigrateSpec } from "../../commands/task/migrate.command.js";
23
23
  import { taskMigrateDocSpec } from "../../commands/task/migrate-doc.command.js";
24
24
  import { taskDeriveSpec } from "../../commands/task/derive.command.js";
25
+ import { taskCloseDuplicateSpec } from "../../commands/task/close-duplicate.command.js";
26
+ import { taskCloseNoopSpec } from "../../commands/task/close-noop.command.js";
27
+ import { taskStartReadySpec } from "../../commands/task/start-ready.command.js";
25
28
  import { taskPlanSetSpec } from "../../commands/task/plan-set.command.js";
26
29
  import { taskPlanApproveSpec } from "../../commands/task/plan-approve.command.js";
27
30
  import { taskPlanRejectSpec } from "../../commands/task/plan-reject.command.js";
@@ -112,6 +115,11 @@ export const COMMANDS = [
112
115
  needsConfig: false,
113
116
  needsTaskContext: false,
114
117
  }),
118
+ entry(preflightSpec, () => import("./commands/core.js").then((m) => m.runPreflight), {
119
+ needsProject: false,
120
+ needsConfig: false,
121
+ needsTaskContext: false,
122
+ }),
115
123
  entry(roleSpec, () => import("./commands/core.js").then((m) => m.runRole), {
116
124
  needsProject: false,
117
125
  needsConfig: false,
@@ -158,11 +166,18 @@ export const COMMANDS = [
158
166
  entry(taskShowSpec, (deps) => import("../../commands/task/show.run.js").then((m) => m.makeRunTaskShowHandler(deps.getCtx))),
159
167
  entry(taskNewSpec, (deps) => import("../../commands/task/new.command.js").then((m) => m.makeRunTaskNewHandler(deps.getCtx))),
160
168
  entry(taskDeriveSpec, (deps) => import("../../commands/task/derive.command.js").then((m) => m.makeRunTaskDeriveHandler(deps.getCtx))),
169
+ entry(taskCloseDuplicateSpec, (deps) => import("../../commands/task/close-duplicate.command.js").then((m) => m.makeRunTaskCloseDuplicateHandler(deps.getCtx))),
170
+ entry(taskStartReadySpec, (deps) => import("../../commands/task/start-ready.command.js").then((m) => m.makeRunTaskStartReadyHandler(deps.getCtx))),
171
+ entry(taskCloseNoopSpec, (deps) => import("../../commands/task/close-noop.command.js").then((m) => m.makeRunTaskCloseNoopHandler(deps.getCtx))),
161
172
  entry(taskAddSpec, (deps) => import("../../commands/task/add.command.js").then((m) => m.makeRunTaskAddHandler(deps.getCtx))),
162
173
  entry(taskUpdateSpec, (deps) => import("../../commands/task/update.command.js").then((m) => m.makeRunTaskUpdateHandler(deps.getCtx))),
163
174
  entry(taskCommentSpec, (deps) => import("../../commands/task/comment.command.js").then((m) => m.makeRunTaskCommentHandler(deps.getCtx))),
164
175
  entry(taskSetStatusSpec, (deps) => import("../../commands/task/set-status.command.js").then((m) => m.makeRunTaskSetStatusHandler(deps.getCtx))),
165
- entry(taskDocSpec, () => import("../../commands/task/doc.command.js").then((m) => m.runTaskDoc)),
176
+ entry(taskDocSpec, () => import("../../commands/task/doc.command.js").then((m) => m.runTaskDoc), {
177
+ needsProject: false,
178
+ needsConfig: false,
179
+ needsTaskContext: false,
180
+ }),
166
181
  entry(taskDocShowSpec, (deps) => import("../../commands/task/doc-show.command.js").then((m) => m.makeRunTaskDocShowHandler(deps.getCtx))),
167
182
  entry(taskDocSetSpec, (deps) => import("../../commands/task/doc-set.command.js").then((m) => m.makeRunTaskDocSetHandler(deps.getCtx))),
168
183
  entry(taskScrubSpec, (deps) => import("../../commands/task/scrub.command.js").then((m) => m.makeRunTaskScrubHandler(deps.getCtx))),
@@ -175,14 +190,26 @@ export const COMMANDS = [
175
190
  entry(taskPlanSetSpec, (deps) => import("../../commands/task/plan-set.command.js").then((m) => m.makeRunTaskPlanSetHandler(deps.getCtx))),
176
191
  entry(taskPlanApproveSpec, (deps) => import("../../commands/task/plan-approve.command.js").then((m) => m.makeRunTaskPlanApproveHandler(deps.getCtx))),
177
192
  entry(taskPlanRejectSpec, (deps) => import("../../commands/task/plan-reject.command.js").then((m) => m.makeRunTaskPlanRejectHandler(deps.getCtx))),
178
- entry(taskVerifySpec, () => import("../../commands/task/verify.command.js").then((m) => m.runTaskVerify)),
193
+ entry(taskVerifySpec, () => import("../../commands/task/verify.command.js").then((m) => m.runTaskVerify), {
194
+ needsProject: false,
195
+ needsConfig: false,
196
+ needsTaskContext: false,
197
+ }),
179
198
  entry(taskVerifyOkSpec, (deps) => import("../../commands/task/verify-ok.command.js").then((m) => m.makeRunTaskVerifyOkHandler(deps.getCtx))),
180
199
  entry(taskVerifyReworkSpec, (deps) => import("../../commands/task/verify-rework.command.js").then((m) => m.makeRunTaskVerifyReworkHandler(deps.getCtx))),
181
200
  entry(taskVerifyShowSpec, (deps) => import("../../commands/task/verify-show.command.js").then((m) => m.makeRunTaskVerifyShowHandler(deps.getCtx))),
182
201
  entry(taskRebuildIndexSpec, (deps) => import("../../commands/task/rebuild-index.command.js").then((m) => m.makeRunTaskRebuildIndexHandler(deps.getCtx))),
183
202
  entry(workStartSpec, (deps) => import("../../commands/branch/work-start.command.js").then((m) => m.makeRunWorkStartHandler(deps.getCtx))),
184
- entry(recipesSpec, () => import("../../commands/recipes/recipes.command.js").then((m) => m.runRecipes)),
185
- entry(recipesCacheSpec, () => import("../../commands/recipes/cache.command.js").then((m) => m.runRecipesCache)),
203
+ entry(recipesSpec, () => import("../../commands/recipes/recipes.command.js").then((m) => m.runRecipes), {
204
+ needsProject: false,
205
+ needsConfig: false,
206
+ needsTaskContext: false,
207
+ }),
208
+ entry(recipesCacheSpec, () => import("../../commands/recipes/cache.command.js").then((m) => m.runRecipesCache), {
209
+ needsProject: false,
210
+ needsConfig: false,
211
+ needsTaskContext: false,
212
+ }),
186
213
  entry(recipesListSpec, () => import("../../commands/recipes/list.command.js").then((m) => m.runRecipesList)),
187
214
  entry(recipesListRemoteSpec, () => import("../../commands/recipes/list-remote.command.js").then((m) => m.runRecipesListRemote)),
188
215
  entry(recipesInfoSpec, () => import("../../commands/recipes/info.command.js").then((m) => m.runRecipesInfo)),
@@ -190,21 +217,37 @@ export const COMMANDS = [
190
217
  entry(recipesRemoveSpec, () => import("../../commands/recipes/remove.command.js").then((m) => m.runRecipesRemove)),
191
218
  entry(recipesCachePruneSpec, () => import("../../commands/recipes/cache-prune.command.js").then((m) => m.runRecipesCachePrune)),
192
219
  entry(recipesInstallSpec, () => import("../../commands/recipes/install.run.js").then((m) => m.runRecipesInstall)),
193
- entry(scenarioSpec, () => import("../../commands/scenario/scenario.command.js").then((m) => m.runScenario)),
220
+ entry(scenarioSpec, () => import("../../commands/scenario/scenario.command.js").then((m) => m.runScenario), {
221
+ needsProject: false,
222
+ needsConfig: false,
223
+ needsTaskContext: false,
224
+ }),
194
225
  entry(scenarioListSpec, () => import("../../commands/scenario/list.command.js").then((m) => m.runScenarioList)),
195
226
  entry(scenarioInfoSpec, () => import("../../commands/scenario/info.command.js").then((m) => m.runScenarioInfo)),
196
227
  entry(scenarioRunSpec, () => import("../../commands/scenario/run.command.js").then((m) => m.runScenarioRun)),
197
- entry(branchBaseSpec, () => import("../../commands/branch/base.command.js").then((m) => m.runBranchBase)),
228
+ entry(branchBaseSpec, () => import("../../commands/branch/base.command.js").then((m) => m.runBranchBase), {
229
+ needsProject: false,
230
+ needsConfig: false,
231
+ needsTaskContext: false,
232
+ }),
198
233
  entry(branchBaseGetSpec, () => import("../../commands/branch/base.command.js").then((m) => m.runBranchBaseGet)),
199
234
  entry(branchBaseSetSpec, () => import("../../commands/branch/base.command.js").then((m) => m.runBranchBaseSet)),
200
235
  entry(branchBaseClearSpec, () => import("../../commands/branch/base.command.js").then((m) => m.runBranchBaseClear)),
201
236
  entry(branchBaseExplainSpec, () => import("../../commands/branch/base.command.js").then((m) => m.runBranchBaseExplain)),
202
237
  entry(branchStatusSpec, () => import("../../commands/branch/status.command.js").then((m) => m.runBranchStatus)),
203
238
  entry(branchRemoveSpec, () => import("../../commands/branch/remove.command.js").then((m) => m.runBranchRemove)),
204
- entry(backendSpec, (deps) => import("../../commands/backend/sync.command.js").then((m) => m.makeRunBackendHandler(deps.getCtx))),
239
+ entry(backendSpec, (deps) => import("../../commands/backend/sync.command.js").then((m) => m.makeRunBackendHandler(deps.getCtx)), {
240
+ needsProject: false,
241
+ needsConfig: false,
242
+ needsTaskContext: false,
243
+ }),
205
244
  entry(backendSyncSpec, (deps) => import("../../commands/backend/sync.command.js").then((m) => m.makeRunBackendSyncHandler(deps.getCtx))),
206
245
  entry(syncSpec, (deps) => import("../../commands/sync.command.js").then((m) => m.makeRunSyncHandler(deps.getCtx))),
207
- entry(prSpec, (deps) => import("../../commands/pr/pr.command.js").then((m) => m.makeRunPrHandler(deps.getCtx))),
246
+ entry(prSpec, (deps) => import("../../commands/pr/pr.command.js").then((m) => m.makeRunPrHandler(deps.getCtx)), {
247
+ needsProject: false,
248
+ needsConfig: false,
249
+ needsTaskContext: false,
250
+ }),
208
251
  entry(prOpenSpec, (deps) => import("../../commands/pr/pr.command.js").then((m) => m.makeRunPrOpenHandler(deps.getCtx))),
209
252
  entry(prUpdateSpec, (deps) => import("../../commands/pr/pr.command.js").then((m) => m.makeRunPrUpdateHandler(deps.getCtx))),
210
253
  entry(prCheckSpec, (deps) => import("../../commands/pr/pr.command.js").then((m) => m.makeRunPrCheckHandler(deps.getCtx))),
@@ -216,14 +259,30 @@ export const COMMANDS = [
216
259
  entry(verifySpec, (deps) => import("../../commands/verify.run.js").then((m) => m.makeRunVerifyHandler(deps.getCtx))),
217
260
  entry(finishSpec, (deps) => import("../../commands/finish.run.js").then((m) => m.makeRunFinishHandler(deps.getCtx))),
218
261
  entry(readySpec, (deps) => import("../../commands/ready.command.js").then((m) => m.makeRunReadyHandler(deps.getCtx))),
219
- entry(docsCliSpec, (deps) => import("../../commands/docs/cli.command.js").then((m) => m.makeRunDocsCliHandler(deps.getHelpJsonForDocs))),
220
- entry(hooksSpec, () => import("../../commands/hooks/hooks.command.js").then((m) => m.runHooks)),
262
+ entry(docsCliSpec, (deps) => import("../../commands/docs/cli.command.js").then((m) => m.makeRunDocsCliHandler(deps.getHelpJsonForDocs)), {
263
+ needsProject: false,
264
+ needsConfig: false,
265
+ needsTaskContext: false,
266
+ }),
267
+ entry(hooksSpec, () => import("../../commands/hooks/hooks.command.js").then((m) => m.runHooks), {
268
+ needsProject: false,
269
+ needsConfig: false,
270
+ needsTaskContext: false,
271
+ }),
221
272
  entry(hooksInstallSpec, () => import("../../commands/hooks/install.command.js").then((m) => m.runHooksInstall)),
222
273
  entry(hooksUninstallSpec, () => import("../../commands/hooks/uninstall.command.js").then((m) => m.runHooksUninstall)),
223
274
  entry(hooksRunSpec, () => import("../../commands/hooks/run.command.js").then((m) => m.runHooksRun)),
224
- entry(cleanupSpec, () => import("../../commands/cleanup/merged.command.js").then((m) => m.runCleanup)),
275
+ entry(cleanupSpec, () => import("../../commands/cleanup/merged.command.js").then((m) => m.runCleanup), {
276
+ needsProject: false,
277
+ needsConfig: false,
278
+ needsTaskContext: false,
279
+ }),
225
280
  entry(cleanupMergedSpec, (deps) => import("../../commands/cleanup/merged.command.js").then((m) => m.makeRunCleanupMergedHandler(deps.getCtx))),
226
- entry(guardSpec, () => import("../../commands/guard/guard.command.js").then((m) => m.runGuard)),
281
+ entry(guardSpec, () => import("../../commands/guard/guard.command.js").then((m) => m.runGuard), {
282
+ needsProject: false,
283
+ needsConfig: false,
284
+ needsTaskContext: false,
285
+ }),
227
286
  entry(guardCleanSpec, () => import("../../commands/guard/clean.command.js").then((m) => m.runGuardClean)),
228
287
  entry(guardSuggestAllowSpec, () => import("../../commands/guard/suggest-allow.command.js").then((m) => m.runGuardSuggestAllow)),
229
288
  entry(guardCommitSpec, (deps) => import("../../commands/guard/commit.command.js").then((m) => m.makeRunGuardCommitHandler(deps.getCtx))),
@@ -1,10 +1,20 @@
1
1
  import type { CommandHandler, CommandSpec } from "../../spec/spec.js";
2
2
  import type { RunDeps } from "../command-catalog.js";
3
- type QuickstartParsed = Record<string, never>;
3
+ type QuickstartParsed = {
4
+ json: boolean;
5
+ };
4
6
  export declare const quickstartSpec: CommandSpec<QuickstartParsed>;
5
7
  export declare const runQuickstart: CommandHandler<QuickstartParsed>;
8
+ type PreflightMode = "quick" | "full";
9
+ type PreflightParsed = {
10
+ json: boolean;
11
+ mode: PreflightMode;
12
+ };
13
+ export declare const preflightSpec: CommandSpec<PreflightParsed>;
14
+ export declare const runPreflight: CommandHandler<PreflightParsed>;
6
15
  type RoleParsed = {
7
16
  role: string;
17
+ json: boolean;
8
18
  };
9
19
  export declare const roleSpec: CommandSpec<RoleParsed>;
10
20
  export declare const runRole: CommandHandler<RoleParsed>;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../src/cli/run-cli/commands/core.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE9C,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAOxD,CAAC;AASF,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,gBAAgB,CAE1D,CAAC;AAEF,KAAK,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,eAAO,MAAM,QAAQ,EAAE,WAAW,CAAC,UAAU,CAO5C,CAAC;AAkMF,eAAO,MAAM,OAAO,EAAE,cAAc,CAAC,UAAU,CAE9C,CAAC;AAEF,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE1C,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CAMhD,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,CA0FhF"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../src/cli/run-cli/commands/core.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,KAAK,gBAAgB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1C,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAcxD,CAAC;AA6BF,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,gBAAgB,CAE1D,CAAC;AAEF,KAAK,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AACtC,KAAK,eAAe,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AA6L9D,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,eAAe,CAuCtD,CAAC;AA4CF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,eAAe,CAExD,CAAC;AAEF,KAAK,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAElD,eAAO,MAAM,QAAQ,EAAE,WAAW,CAAC,UAAU,CAe5C,CAAC;AAoOF,eAAO,MAAM,OAAO,EAAE,cAAc,CAAC,UAAU,CAE9C,CAAC;AAEF,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE1C,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CAMhD,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,CA0FhF"}