agentplane 0.2.25 → 0.2.26

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 (166) hide show
  1. package/bin/agentplane.js +91 -54
  2. package/dist/.build-manifest.json +11 -0
  3. package/dist/backends/task-backend/local-backend.d.ts +2 -0
  4. package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
  5. package/dist/backends/task-backend/local-backend.js +12 -1
  6. package/dist/backends/task-backend/redmine/mapping.d.ts.map +1 -1
  7. package/dist/backends/task-backend/redmine/mapping.js +26 -1
  8. package/dist/backends/task-backend/redmine-backend.d.ts +4 -0
  9. package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
  10. package/dist/backends/task-backend/redmine-backend.js +92 -9
  11. package/dist/backends/task-backend/shared/types.d.ts +1 -0
  12. package/dist/backends/task-backend/shared/types.d.ts.map +1 -1
  13. package/dist/backends/task-index.d.ts.map +1 -1
  14. package/dist/backends/task-index.js +8 -1
  15. package/dist/cli/command-guide.d.ts.map +1 -1
  16. package/dist/cli/command-guide.js +21 -8
  17. package/dist/cli/command-snippets.d.ts +24 -0
  18. package/dist/cli/command-snippets.d.ts.map +1 -0
  19. package/dist/cli/command-snippets.js +23 -0
  20. package/dist/cli/reason-codes.d.ts +9 -0
  21. package/dist/cli/reason-codes.d.ts.map +1 -0
  22. package/dist/cli/reason-codes.js +79 -0
  23. package/dist/cli/recipes-bundled.d.ts +1 -0
  24. package/dist/cli/recipes-bundled.d.ts.map +1 -1
  25. package/dist/cli/recipes-bundled.js +4 -1
  26. package/dist/cli/run-cli/command-catalog.d.ts +1 -1
  27. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  28. package/dist/cli/run-cli/command-catalog.js +40 -1
  29. package/dist/cli/run-cli/commands/config.d.ts +5 -0
  30. package/dist/cli/run-cli/commands/config.d.ts.map +1 -1
  31. package/dist/cli/run-cli/commands/config.js +86 -1
  32. package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
  33. package/dist/cli/run-cli/commands/core.js +55 -0
  34. package/dist/cli/run-cli/commands/init/recipes.d.ts +5 -1
  35. package/dist/cli/run-cli/commands/init/recipes.d.ts.map +1 -1
  36. package/dist/cli/run-cli/commands/init/recipes.js +24 -4
  37. package/dist/cli/run-cli/commands/init/write-workflow.d.ts +7 -0
  38. package/dist/cli/run-cli/commands/init/write-workflow.d.ts.map +1 -0
  39. package/dist/cli/run-cli/commands/init/write-workflow.js +52 -0
  40. package/dist/cli/run-cli/commands/init.d.ts +2 -1
  41. package/dist/cli/run-cli/commands/init.d.ts.map +1 -1
  42. package/dist/cli/run-cli/commands/init.js +104 -54
  43. package/dist/cli/run-cli.d.ts.map +1 -1
  44. package/dist/cli/run-cli.js +70 -1
  45. package/dist/commands/backend/sync.command.d.ts.map +1 -1
  46. package/dist/commands/backend/sync.command.js +7 -6
  47. package/dist/commands/backend.d.ts.map +1 -1
  48. package/dist/commands/backend.js +2 -0
  49. package/dist/commands/doctor.run.d.ts.map +1 -1
  50. package/dist/commands/doctor.run.js +96 -10
  51. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  52. package/dist/commands/guard/impl/commands.js +12 -6
  53. package/dist/commands/recipes/impl/commands/install.d.ts.map +1 -1
  54. package/dist/commands/recipes/impl/commands/install.js +36 -13
  55. package/dist/commands/recipes/impl/scenario.d.ts.map +1 -1
  56. package/dist/commands/recipes/impl/scenario.js +25 -0
  57. package/dist/commands/recipes/impl/types.d.ts +4 -0
  58. package/dist/commands/recipes/impl/types.d.ts.map +1 -1
  59. package/dist/commands/scenario/impl/commands.d.ts.map +1 -1
  60. package/dist/commands/scenario/impl/commands.js +74 -3
  61. package/dist/commands/scenario/impl/report.d.ts +8 -0
  62. package/dist/commands/scenario/impl/report.d.ts.map +1 -1
  63. package/dist/commands/scenario/impl/report.js +1 -0
  64. package/dist/commands/shared/reconcile-check.d.ts +7 -0
  65. package/dist/commands/shared/reconcile-check.d.ts.map +1 -0
  66. package/dist/commands/shared/reconcile-check.js +60 -0
  67. package/dist/commands/sync.command.d.ts.map +1 -1
  68. package/dist/commands/sync.command.js +9 -2
  69. package/dist/commands/task/finish.d.ts.map +1 -1
  70. package/dist/commands/task/finish.js +2 -0
  71. package/dist/commands/task/list.d.ts.map +1 -1
  72. package/dist/commands/task/list.js +2 -1
  73. package/dist/commands/task/list.spec.d.ts.map +1 -1
  74. package/dist/commands/task/list.spec.js +7 -0
  75. package/dist/commands/task/next.d.ts.map +1 -1
  76. package/dist/commands/task/next.js +2 -1
  77. package/dist/commands/task/next.spec.d.ts.map +1 -1
  78. package/dist/commands/task/next.spec.js +7 -0
  79. package/dist/commands/task/search.d.ts.map +1 -1
  80. package/dist/commands/task/search.js +2 -1
  81. package/dist/commands/task/search.spec.d.ts.map +1 -1
  82. package/dist/commands/task/search.spec.js +7 -0
  83. package/dist/commands/task/shared.d.ts +7 -0
  84. package/dist/commands/task/shared.d.ts.map +1 -1
  85. package/dist/commands/task/shared.js +21 -1
  86. package/dist/commands/task/verify-record.d.ts.map +1 -1
  87. package/dist/commands/task/verify-record.js +2 -0
  88. package/dist/commands/workflow-build.command.d.ts +8 -0
  89. package/dist/commands/workflow-build.command.d.ts.map +1 -0
  90. package/dist/commands/workflow-build.command.js +96 -0
  91. package/dist/commands/workflow-playbook.command.d.ts +10 -0
  92. package/dist/commands/workflow-playbook.command.d.ts.map +1 -0
  93. package/dist/commands/workflow-playbook.command.js +174 -0
  94. package/dist/commands/workflow-restore.command.d.ts +5 -0
  95. package/dist/commands/workflow-restore.command.d.ts.map +1 -0
  96. package/dist/commands/workflow-restore.command.js +30 -0
  97. package/dist/commands/workflow.command.d.ts +6 -0
  98. package/dist/commands/workflow.command.d.ts.map +1 -0
  99. package/dist/commands/workflow.command.js +36 -0
  100. package/dist/harness/dynamic-tool-contract.d.ts +29 -0
  101. package/dist/harness/dynamic-tool-contract.d.ts.map +1 -0
  102. package/dist/harness/dynamic-tool-contract.js +86 -0
  103. package/dist/harness/hooks-lifecycle.d.ts +27 -0
  104. package/dist/harness/hooks-lifecycle.d.ts.map +1 -0
  105. package/dist/harness/hooks-lifecycle.js +67 -0
  106. package/dist/harness/index.d.ts +9 -0
  107. package/dist/harness/index.d.ts.map +1 -0
  108. package/dist/harness/index.js +8 -0
  109. package/dist/harness/reconcile.d.ts +37 -0
  110. package/dist/harness/reconcile.d.ts.map +1 -0
  111. package/dist/harness/reconcile.js +42 -0
  112. package/dist/harness/retry-policy.d.ts +31 -0
  113. package/dist/harness/retry-policy.d.ts.map +1 -0
  114. package/dist/harness/retry-policy.js +33 -0
  115. package/dist/harness/scheduler.d.ts +18 -0
  116. package/dist/harness/scheduler.d.ts.map +1 -0
  117. package/dist/harness/scheduler.js +55 -0
  118. package/dist/harness/state-machine.d.ts +17 -0
  119. package/dist/harness/state-machine.d.ts.map +1 -0
  120. package/dist/harness/state-machine.js +70 -0
  121. package/dist/harness/token-accounting.d.ts +19 -0
  122. package/dist/harness/token-accounting.d.ts.map +1 -0
  123. package/dist/harness/token-accounting.js +77 -0
  124. package/dist/harness/workspace-safety.d.ts +14 -0
  125. package/dist/harness/workspace-safety.d.ts.map +1 -0
  126. package/dist/harness/workspace-safety.js +62 -0
  127. package/dist/recipes/bundled-recipes.d.ts +4 -0
  128. package/dist/recipes/bundled-recipes.d.ts.map +1 -1
  129. package/dist/recipes/bundled-recipes.js +11 -0
  130. package/dist/shared/errors.d.ts +6 -0
  131. package/dist/shared/errors.d.ts.map +1 -1
  132. package/dist/shared/errors.js +1 -0
  133. package/dist/workflow-runtime/build.d.ts +4 -0
  134. package/dist/workflow-runtime/build.d.ts.map +1 -0
  135. package/dist/workflow-runtime/build.js +114 -0
  136. package/dist/workflow-runtime/enforcement.d.ts +3 -0
  137. package/dist/workflow-runtime/enforcement.d.ts.map +1 -0
  138. package/dist/workflow-runtime/enforcement.js +10 -0
  139. package/dist/workflow-runtime/file-ops.d.ts +11 -0
  140. package/dist/workflow-runtime/file-ops.d.ts.map +1 -0
  141. package/dist/workflow-runtime/file-ops.js +248 -0
  142. package/dist/workflow-runtime/fix.d.ts +9 -0
  143. package/dist/workflow-runtime/fix.d.ts.map +1 -0
  144. package/dist/workflow-runtime/fix.js +107 -0
  145. package/dist/workflow-runtime/index.d.ts +11 -0
  146. package/dist/workflow-runtime/index.d.ts.map +1 -0
  147. package/dist/workflow-runtime/index.js +10 -0
  148. package/dist/workflow-runtime/markdown.d.ts +10 -0
  149. package/dist/workflow-runtime/markdown.d.ts.map +1 -0
  150. package/dist/workflow-runtime/markdown.js +147 -0
  151. package/dist/workflow-runtime/observability.d.ts +12 -0
  152. package/dist/workflow-runtime/observability.d.ts.map +1 -0
  153. package/dist/workflow-runtime/observability.js +14 -0
  154. package/dist/workflow-runtime/paths.d.ts +3 -0
  155. package/dist/workflow-runtime/paths.d.ts.map +1 -0
  156. package/dist/workflow-runtime/paths.js +11 -0
  157. package/dist/workflow-runtime/template.d.ts +7 -0
  158. package/dist/workflow-runtime/template.d.ts.map +1 -0
  159. package/dist/workflow-runtime/template.js +94 -0
  160. package/dist/workflow-runtime/types.d.ts +68 -0
  161. package/dist/workflow-runtime/types.d.ts.map +1 -0
  162. package/dist/workflow-runtime/types.js +1 -0
  163. package/dist/workflow-runtime/validate.d.ts +8 -0
  164. package/dist/workflow-runtime/validate.d.ts.map +1 -0
  165. package/dist/workflow-runtime/validate.js +331 -0
  166. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"sync.command.d.ts","sourceRoot":"","sources":["../../src/commands/sync.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9D,eAAO,MAAM,QAAQ,EAAE,WAAW,CAAC,UAAU,CA6C5C,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACnE,KAAK,UAAU,EAAE,GAAG,UAAU,KAAG,OAAO,CAAC,MAAM,CAAC,CAS/D"}
1
+ {"version":3,"file":"sync.command.d.ts","sourceRoot":"","sources":["../../src/commands/sync.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9D,eAAO,MAAM,QAAQ,EAAE,WAAW,CAAC,UAAU,CAmD5C,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACnE,KAAK,UAAU,EAAE,GAAG,UAAU,KAAG,OAAO,CAAC,MAAM,CAAC,CAS/D"}
@@ -1,3 +1,4 @@
1
+ import { COMMAND_SNIPPETS } from "../cli/command-snippets.js";
1
2
  import { cmdSyncParsed } from "./backend.js";
2
3
  export const syncSpec = {
3
4
  id: ["sync"],
@@ -33,8 +34,14 @@ export const syncSpec = {
33
34
  { kind: "boolean", name: "quiet", default: false, description: "Reduce output noise." },
34
35
  ],
35
36
  examples: [
36
- { cmd: "agentplane sync --direction pull", why: "Pull from backend (configured backend id)." },
37
- { cmd: "agentplane sync redmine --direction push --yes", why: "Push to redmine backend." },
37
+ {
38
+ cmd: COMMAND_SNIPPETS.sync.pullConfigured,
39
+ why: "Pull from backend (configured backend id).",
40
+ },
41
+ {
42
+ cmd: COMMAND_SNIPPETS.sync.pushRedmineExplicitWithYes,
43
+ why: "Push to redmine backend.",
44
+ },
38
45
  ],
39
46
  parse: (raw) => ({
40
47
  backendId: raw.args.id ? String(raw.args.id) : null,
@@ -1 +1 @@
1
- {"version":3,"file":"finish.d.ts","sourceRoot":"","sources":["../../../src/commands/task/finish.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAmCnC,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wBAAwB,EAAE,OAAO,CAAC;IAClC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2VlB"}
1
+ {"version":3,"file":"finish.d.ts","sourceRoot":"","sources":["../../../src/commands/task/finish.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAmCnC,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wBAAwB,EAAE,OAAO,CAAC;IAClC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4VlB"}
@@ -6,6 +6,7 @@ import { readFile, rm } from "node:fs/promises";
6
6
  import path from "node:path";
7
7
  import { buildGitCommitEnv, cmdCommit, commitFromComment } from "../guard/index.js";
8
8
  import { ensureActionApproved } from "../shared/approval-requirements.js";
9
+ import { ensureReconciledBeforeMutation } from "../shared/reconcile-check.js";
9
10
  import { loadCommandContext, loadTaskFromContext, } from "../shared/task-backend.js";
10
11
  import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
11
12
  import { readDirectWorkLock } from "../../shared/direct-work-lock.js";
@@ -30,6 +31,7 @@ export async function cmdFinish(opts) {
30
31
  try {
31
32
  const ctx = opts.ctx ??
32
33
  (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
34
+ await ensureReconciledBeforeMutation({ ctx, command: "finish" });
33
35
  if (opts.force) {
34
36
  await ensureActionApproved({
35
37
  action: "force_action",
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/task/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEnG,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAElB"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/task/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEnG,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CA6ClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAElB"}
@@ -1,11 +1,12 @@
1
1
  import { mapBackendError } from "../../cli/error-map.js";
2
2
  import { listTasksMemo, loadCommandContext } from "../shared/task-backend.js";
3
- import { buildDependencyState, dedupeStrings, formatTaskLine, toStringArray, } from "./shared.js";
3
+ import { buildDependencyState, dedupeStrings, formatTaskLine, handleTaskListWarnings, toStringArray, } from "./shared.js";
4
4
  export async function cmdTaskListWithFilters(opts) {
5
5
  try {
6
6
  const ctx = opts.ctx ??
7
7
  (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
8
8
  const tasks = await listTasksMemo(ctx);
9
+ handleTaskListWarnings({ backend: ctx.taskBackend, strictRead: opts.filters.strictRead });
9
10
  const depState = buildDependencyState(tasks);
10
11
  let filtered = tasks;
11
12
  if (opts.filters.status.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"list.spec.d.ts","sourceRoot":"","sources":["../../../src/commands/task/list.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAE1D,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,cAAc,CAgDpD,CAAC"}
1
+ {"version":3,"file":"list.spec.d.ts","sourceRoot":"","sources":["../../../src/commands/task/list.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAE1D,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,cAAc,CAuDpD,CAAC"}
@@ -26,6 +26,12 @@ export const taskListSpec = {
26
26
  repeatable: true,
27
27
  description: "Repeatable. Filter by tag.",
28
28
  },
29
+ {
30
+ kind: "boolean",
31
+ name: "strict-read",
32
+ default: false,
33
+ description: "Fail if task scan skips malformed/unreadable task files.",
34
+ },
29
35
  { kind: "boolean", name: "quiet", default: false, description: "Suppress summary output." },
30
36
  ],
31
37
  examples: [
@@ -46,6 +52,7 @@ export const taskListSpec = {
46
52
  owner: toStringList(raw.opts.owner),
47
53
  tag: toStringList(raw.opts.tag),
48
54
  quiet: raw.opts.quiet === true,
55
+ strictRead: raw.opts["strict-read"] === true,
49
56
  },
50
57
  }),
51
58
  };
@@ -1 +1 @@
1
- {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../../src/commands/task/next.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEpF,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB"}
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../../src/commands/task/next.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEpF,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CA6ClB"}
@@ -1,11 +1,12 @@
1
1
  import { mapBackendError } from "../../cli/error-map.js";
2
2
  import { loadCommandContext } from "../shared/task-backend.js";
3
- import { buildDependencyState, dedupeStrings, formatTaskLine, toStringArray, } from "./shared.js";
3
+ import { buildDependencyState, dedupeStrings, formatTaskLine, handleTaskListWarnings, toStringArray, } from "./shared.js";
4
4
  export async function cmdTaskNext(opts) {
5
5
  try {
6
6
  const ctx = opts.ctx ??
7
7
  (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
8
8
  const tasks = await ctx.taskBackend.listTasks();
9
+ handleTaskListWarnings({ backend: ctx.taskBackend, strictRead: opts.filters.strictRead });
9
10
  const depState = buildDependencyState(tasks);
10
11
  const statuses = opts.filters.status.length > 0
11
12
  ? new Set(opts.filters.status.map((s) => s.trim().toUpperCase()))
@@ -1 +1 @@
1
- {"version":3,"file":"next.spec.d.ts","sourceRoot":"","sources":["../../../src/commands/task/next.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAE1D,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,cAAc,CAkEpD,CAAC"}
1
+ {"version":3,"file":"next.spec.d.ts","sourceRoot":"","sources":["../../../src/commands/task/next.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAE1D,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,cAAc,CAyEpD,CAAC"}
@@ -26,6 +26,12 @@ export const taskNextSpec = {
26
26
  repeatable: true,
27
27
  description: "Repeatable. Filter by tag.",
28
28
  },
29
+ {
30
+ kind: "boolean",
31
+ name: "strict-read",
32
+ default: false,
33
+ description: "Fail if task scan skips malformed/unreadable task files.",
34
+ },
29
35
  { kind: "string", name: "limit", valueHint: "<n>", description: "Max rows to print." },
30
36
  { kind: "boolean", name: "quiet", default: false, description: "Suppress summary output." },
31
37
  ],
@@ -64,6 +70,7 @@ export const taskNextSpec = {
64
70
  tag: toStringList(raw.opts.tag),
65
71
  limit: typeof raw.opts.limit === "string" ? Number.parseInt(raw.opts.limit, 10) : undefined,
66
72
  quiet: raw.opts.quiet === true,
73
+ strictRead: raw.opts["strict-read"] === true,
67
74
  },
68
75
  }),
69
76
  };
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/task/search.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEpF,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,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,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DlB"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/task/search.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEpF,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,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,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CA8DlB"}
@@ -2,7 +2,7 @@ import { mapBackendError } from "../../cli/error-map.js";
2
2
  import { invalidValueMessage } from "../../cli/output.js";
3
3
  import { CliError } from "../../shared/errors.js";
4
4
  import { loadCommandContext } from "../shared/task-backend.js";
5
- import { buildDependencyState, dedupeStrings, formatTaskLine, taskTextBlob, toStringArray, } from "./shared.js";
5
+ import { buildDependencyState, dedupeStrings, formatTaskLine, handleTaskListWarnings, taskTextBlob, toStringArray, } from "./shared.js";
6
6
  export async function cmdTaskSearch(opts) {
7
7
  const query = opts.query.trim();
8
8
  if (!query) {
@@ -16,6 +16,7 @@ export async function cmdTaskSearch(opts) {
16
16
  const ctx = opts.ctx ??
17
17
  (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
18
18
  const tasks = await ctx.taskBackend.listTasks();
19
+ handleTaskListWarnings({ backend: ctx.taskBackend, strictRead: opts.filters.strictRead });
19
20
  const depState = buildDependencyState(tasks);
20
21
  let filtered = tasks;
21
22
  if (opts.filters.status.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"search.spec.d.ts","sourceRoot":"","sources":["../../../src/commands/task/search.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,gBAAgB,CA4ExD,CAAC"}
1
+ {"version":3,"file":"search.spec.d.ts","sourceRoot":"","sources":["../../../src/commands/task/search.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAmFxD,CAAC"}
@@ -28,6 +28,12 @@ export const taskSearchSpec = {
28
28
  repeatable: true,
29
29
  description: "Repeatable. Filter by tag.",
30
30
  },
31
+ {
32
+ kind: "boolean",
33
+ name: "strict-read",
34
+ default: false,
35
+ description: "Fail if task scan skips malformed/unreadable task files.",
36
+ },
31
37
  { kind: "string", name: "limit", valueHint: "<n>", description: "Max rows to print." },
32
38
  ],
33
39
  examples: [
@@ -74,6 +80,7 @@ export const taskSearchSpec = {
74
80
  tag: toStringList(raw.opts.tag),
75
81
  limit: typeof raw.opts.limit === "string" ? Number.parseInt(raw.opts.limit, 10) : undefined,
76
82
  quiet: true,
83
+ strictRead: raw.opts["strict-read"] === true,
77
84
  },
78
85
  }),
79
86
  };
@@ -86,9 +86,16 @@ export type TaskListFilters = {
86
86
  tag: string[];
87
87
  limit?: number;
88
88
  quiet: boolean;
89
+ strictRead?: boolean;
89
90
  };
90
91
  export declare function parseTaskListFilters(args: string[], opts?: {
91
92
  allowLimit?: boolean;
92
93
  }): TaskListFilters;
94
+ export declare function handleTaskListWarnings(opts: {
95
+ backend: {
96
+ getLastListWarnings?: () => string[];
97
+ };
98
+ strictRead?: boolean;
99
+ }): void;
93
100
  export declare function taskTextBlob(task: TaskData): string;
94
101
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/task/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAK9C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAW5D,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAKjG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,eAAO,MAAM,aAAa,+BAAsB,CAAC;AAiBjD,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,eAAO,MAAM,wBAAwB,qCAAqC,CAAC;AAE3E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjF;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAKvE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/D;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAczD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAKtD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAI9E;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAsCF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,GAAG,aAAa,CAkBzF;AAoCD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,gBAAgB,GACvB,oBAAoB,CAgDtB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAG9F;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAG/F;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,cAAc,GAAG,oBAAoB,CAE3F;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB1F;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,CAW7E;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAc3F;AAED,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAkBN;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAkCF,wBAAsB,iCAAiC,CAAC,IAAI,EAAE;IAC5D,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,UAAU,CAAC,GACjD,OAAO,CAAC,eAAe,CAAC,CAuB1B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAqBpF;AAgBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,CAgBjF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO1E;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,IAAI,CAUP;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAmBP;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAgB7F;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAI5F;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,MAAM,EAAE,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CA8BP;AAUD,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK3F;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAI5C;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlE;AAED,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,eAAe,CA8EjB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAiBnD"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/task/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAK9C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAW5D,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAKjG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,eAAO,MAAM,aAAa,+BAAsB,CAAC;AAiBjD,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,eAAO,MAAM,wBAAwB,qCAAqC,CAAC;AAE3E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjF;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAKvE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/D;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAczD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAKtD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAI9E;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAsCF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,GAAG,aAAa,CAkBzF;AAoCD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,gBAAgB,GACvB,oBAAoB,CAgDtB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAG9F;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAG/F;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,cAAc,GAAG,oBAAoB,CAE3F;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB1F;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,CAW7E;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAc3F;AAED,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAkBN;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAkCF,wBAAsB,iCAAiC,CAAC,IAAI,EAAE;IAC5D,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,UAAU,CAAC,GACjD,OAAO,CAAC,eAAe,CAAC,CAuB1B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAqBpF;AAgBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,CAgBjF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO1E;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,IAAI,CAUP;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAmBP;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAgB7F;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAI5F;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,MAAM,EAAE,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CA8BP;AAUD,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK3F;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAI5C;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlE;AAED,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,eAAe,CAkFjB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE;QAAE,mBAAmB,CAAC,EAAE,MAAM,MAAM,EAAE,CAAA;KAAE,CAAC;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,IAAI,CAcP;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAiBnD"}
@@ -521,7 +521,7 @@ export async function defaultCommitEmojiForAgentId(ctx, agentId) {
521
521
  return await resolveCommitEmojiForAgent({ agentsDirAbs: agentsDir, agentId });
522
522
  }
523
523
  export function parseTaskListFilters(args, opts) {
524
- const out = { status: [], owner: [], tag: [], quiet: false };
524
+ const out = { status: [], owner: [], tag: [], quiet: false, strictRead: false };
525
525
  for (let i = 0; i < args.length; i++) {
526
526
  const arg = args[i];
527
527
  if (!arg)
@@ -530,6 +530,10 @@ export function parseTaskListFilters(args, opts) {
530
530
  out.quiet = true;
531
531
  continue;
532
532
  }
533
+ if (arg === "--strict-read") {
534
+ out.strictRead = true;
535
+ continue;
536
+ }
533
537
  if (arg === "--status") {
534
538
  const next = args[i + 1];
535
539
  if (!next) {
@@ -600,6 +604,22 @@ export function parseTaskListFilters(args, opts) {
600
604
  }
601
605
  return out;
602
606
  }
607
+ export function handleTaskListWarnings(opts) {
608
+ const warnings = opts.backend.getLastListWarnings?.() ?? [];
609
+ if (warnings.length === 0)
610
+ return;
611
+ const preview = warnings.slice(0, 3).join("; ");
612
+ const suffix = warnings.length > 3 ? `; +${warnings.length - 3} more` : "";
613
+ const message = `skipped ${warnings.length} task files during scan (${preview}${suffix})`;
614
+ if (opts.strictRead) {
615
+ throw new CliError({
616
+ exitCode: exitCodeForError("E_VALIDATION"),
617
+ code: "E_VALIDATION",
618
+ message: `task scan strict mode failed: ${message}`,
619
+ });
620
+ }
621
+ process.stderr.write(`${warnMessage(message)}\n`);
622
+ }
603
623
  export function taskTextBlob(task) {
604
624
  const parts = [];
605
625
  for (const key of ["id", "title", "description", "status", "priority", "owner"]) {
@@ -1 +1 @@
1
- {"version":3,"file":"verify-record.d.ts","sourceRoot":"","sources":["../../../src/commands/task/verify-record.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAKnC,KAAK,WAAW,GAAG,IAAI,GAAG,cAAc,CAAC;AAiKzC,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB"}
1
+ {"version":3,"file":"verify-record.d.ts","sourceRoot":"","sources":["../../../src/commands/task/verify-record.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAKnC,KAAK,WAAW,GAAG,IAAI,GAAG,cAAc,CAAC;AAkKzC,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB"}
@@ -5,6 +5,7 @@ import { ensureDocSections, setMarkdownSection } from "@agentplaneorg/core";
5
5
  import { mapBackendError, mapCoreError } from "../../cli/error-map.js";
6
6
  import { backendNotSupportedMessage } from "../../cli/output.js";
7
7
  import { CliError } from "../../shared/errors.js";
8
+ import { ensureReconciledBeforeMutation } from "../shared/reconcile-check.js";
8
9
  import { loadCommandContext, loadTaskFromContext, } from "../shared/task-backend.js";
9
10
  import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
10
11
  import { appendTaskEvent, extractDocSection, nowIso } from "./shared.js";
@@ -68,6 +69,7 @@ function sha256Hex(text) {
68
69
  async function recordVerificationResult(opts) {
69
70
  const ctx = opts.ctx ??
70
71
  (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
72
+ await ensureReconciledBeforeMutation({ ctx, command: "verify" });
71
73
  const backend = ctx.taskBackend;
72
74
  const config = ctx.config;
73
75
  const resolved = ctx.resolvedProject;
@@ -0,0 +1,8 @@
1
+ import type { CommandHandler, CommandSpec } from "../cli/spec/spec.js";
2
+ export type WorkflowBuildParsed = {
3
+ validate: boolean;
4
+ dryRun: boolean;
5
+ };
6
+ export declare const workflowBuildSpec: CommandSpec<WorkflowBuildParsed>;
7
+ export declare const runWorkflowBuild: CommandHandler<WorkflowBuildParsed>;
8
+ //# sourceMappingURL=workflow-build.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-build.command.d.ts","sourceRoot":"","sources":["../../src/commands/workflow-build.command.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAWvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,mBAAmB,CAgC9D,CAAC;AAWF,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,mBAAmB,CAoEhE,CAAC"}
@@ -0,0 +1,96 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { loadConfig, resolveProject } from "@agentplaneorg/core";
4
+ import { successMessage, warnMessage } from "../cli/output.js";
5
+ import { DEFAULT_WORKFLOW_TEMPLATE, buildWorkflowFromTemplates, diagnosticsSummary, publishWorkflowCandidate, resolveWorkflowPaths, validateWorkflowText, } from "../workflow-runtime/index.js";
6
+ export const workflowBuildSpec = {
7
+ id: ["workflow", "build"],
8
+ group: "Workflow",
9
+ summary: "Build WORKFLOW.md from template layers with strict rendering checks.",
10
+ options: [
11
+ {
12
+ kind: "boolean",
13
+ name: "validate",
14
+ default: false,
15
+ description: "Validate built workflow and fail on errors.",
16
+ },
17
+ {
18
+ kind: "boolean",
19
+ name: "dry-run",
20
+ default: false,
21
+ description: "Do not publish; print candidate and diagnostics only.",
22
+ },
23
+ ],
24
+ examples: [
25
+ {
26
+ cmd: "agentplane workflow build --validate --dry-run",
27
+ why: "Build and validate candidate workflow without publishing.",
28
+ },
29
+ {
30
+ cmd: "agentplane workflow build --validate",
31
+ why: "Build, validate, and atomically publish workflow.",
32
+ },
33
+ ],
34
+ parse: (raw) => ({
35
+ validate: raw.opts.validate === true,
36
+ dryRun: raw.opts["dry-run"] === true,
37
+ }),
38
+ };
39
+ async function maybeReadOverride(paths) {
40
+ const overridePath = path.join(paths.workflowDir, "template.override.md");
41
+ try {
42
+ return await fs.readFile(overridePath, "utf8");
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ }
48
+ export const runWorkflowBuild = async (ctx, flags) => {
49
+ const resolved = await resolveProject({ cwd: ctx.cwd, rootOverride: ctx.rootOverride ?? null });
50
+ const configLoaded = await loadConfig(resolved.agentplaneDir);
51
+ const workflowPaths = resolveWorkflowPaths(resolved.gitRoot);
52
+ const runtimeContext = {
53
+ workflow: {
54
+ mode: configLoaded.config.workflow_mode,
55
+ version: 1,
56
+ },
57
+ runtime: {
58
+ repo_root: resolved.gitRoot,
59
+ timestamp: new Date().toISOString(),
60
+ },
61
+ };
62
+ const overrideTemplate = await maybeReadOverride(workflowPaths);
63
+ const built = buildWorkflowFromTemplates({
64
+ baseTemplate: DEFAULT_WORKFLOW_TEMPLATE,
65
+ projectOverrideTemplate: overrideTemplate,
66
+ runtimeContext,
67
+ });
68
+ if (flags.dryRun) {
69
+ process.stdout.write(`${built.text}\n`);
70
+ }
71
+ let diagnostics = [...built.diagnostics];
72
+ if (flags.validate || flags.dryRun) {
73
+ const validation = await validateWorkflowText(resolved.gitRoot, built.text);
74
+ diagnostics = [...diagnostics, ...validation.diagnostics];
75
+ }
76
+ const hasError = diagnostics.some((d) => d.severity === "ERROR");
77
+ if (diagnostics.length > 0) {
78
+ process.stderr.write(`${warnMessage(`workflow diagnostics: ${diagnosticsSummary(diagnostics)}`)}\n`);
79
+ for (const diagnostic of diagnostics) {
80
+ process.stderr.write(`- [${diagnostic.severity}] ${diagnostic.code} ${diagnostic.path}: ${diagnostic.message}\n`);
81
+ }
82
+ }
83
+ if (flags.dryRun) {
84
+ return hasError ? 1 : 0;
85
+ }
86
+ const publish = await publishWorkflowCandidate(resolved.gitRoot, built.text);
87
+ if (!publish.ok) {
88
+ process.stderr.write(warnMessage("workflow publish failed") + "\n");
89
+ for (const diagnostic of publish.diagnostics) {
90
+ process.stderr.write(`- [${diagnostic.severity}] ${diagnostic.code} ${diagnostic.path}: ${diagnostic.message}\n`);
91
+ }
92
+ return 1;
93
+ }
94
+ process.stdout.write(successMessage("workflow build", undefined, `Published ${path.relative(resolved.gitRoot, workflowPaths.workflowPath)}`) + "\n");
95
+ return hasError && flags.validate ? 1 : 0;
96
+ };
@@ -0,0 +1,10 @@
1
+ import { type CommandHandler, type CommandSpec } from "../cli/spec/spec.js";
2
+ type WorkflowPlaybookParsed = Record<string, never>;
3
+ export declare const workflowDebugSpec: CommandSpec<WorkflowPlaybookParsed>;
4
+ export declare const workflowSyncSpec: CommandSpec<WorkflowPlaybookParsed>;
5
+ export declare const workflowLandSpec: CommandSpec<WorkflowPlaybookParsed>;
6
+ export declare const runWorkflowDebug: CommandHandler<WorkflowPlaybookParsed>;
7
+ export declare const runWorkflowSync: CommandHandler<WorkflowPlaybookParsed>;
8
+ export declare const runWorkflowLand: CommandHandler<WorkflowPlaybookParsed>;
9
+ export {};
10
+ //# sourceMappingURL=workflow-playbook.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-playbook.command.d.ts","sourceRoot":"","sources":["../../src/commands/workflow-playbook.command.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAoC5E,KAAK,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AA2JpD,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,sBAAsB,CAMjE,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,sBAAsB,CAMhE,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,sBAAsB,CAMhE,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,sBAAsB,CAEnE,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,sBAAsB,CAElE,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,sBAAsB,CAElE,CAAC"}
@@ -0,0 +1,174 @@
1
+ import { execFile } from "node:child_process";
2
+ import { mkdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { promisify } from "node:util";
6
+ import { atomicWriteFile, resolveProject } from "@agentplaneorg/core";
7
+ import { mapCoreError } from "../cli/error-map.js";
8
+ const execFileAsync = promisify(execFile);
9
+ const AGENTPLANE_BIN = fileURLToPath(new URL("../../bin/agentplane.js", import.meta.url));
10
+ const MAX_LOG_CHARS = 8000;
11
+ function truncate(text) {
12
+ if (text.length <= MAX_LOG_CHARS)
13
+ return text;
14
+ const rest = text.length - MAX_LOG_CHARS;
15
+ return `${text.slice(0, MAX_LOG_CHARS)}\n...[truncated ${rest} chars]`;
16
+ }
17
+ function toSafeToken(value) {
18
+ return value.replaceAll(/[^a-zA-Z0-9._-]/g, "_");
19
+ }
20
+ function buildEvidencePath(repoRoot, mode, startedAt) {
21
+ const token = toSafeToken(startedAt);
22
+ return path.join(repoRoot, ".agentplane", "workflows", "evidence", `${mode}-${token}.json`);
23
+ }
24
+ function buildPlaybookCommands(opts) {
25
+ const ap = (...args) => ({
26
+ kind: "agentplane",
27
+ args: [...args, "--root", opts.repoRoot],
28
+ });
29
+ if (opts.mode === "debug") {
30
+ return [
31
+ ap("preflight", "--json", "--mode", "quick"),
32
+ ap("doctor"),
33
+ { kind: "git", args: ["status", "--short", "--untracked-files=no"] },
34
+ ];
35
+ }
36
+ if (opts.mode === "sync") {
37
+ return [
38
+ ap("task", "list"),
39
+ ap("task", "export"),
40
+ { kind: "git", args: ["status", "--short", "--untracked-files=no"] },
41
+ ];
42
+ }
43
+ return [
44
+ ap("preflight", "--json", "--mode", "full"),
45
+ ap("doctor"),
46
+ { kind: "git", args: ["status", "--short", "--untracked-files=no"] },
47
+ ];
48
+ }
49
+ async function runWorkflowPlaybookCommand(opts) {
50
+ const startedMs = Date.now();
51
+ const startedAt = new Date(startedMs).toISOString();
52
+ let command = "";
53
+ let args = [];
54
+ if (opts.command.kind === "agentplane") {
55
+ command = process.execPath;
56
+ args = [AGENTPLANE_BIN, ...opts.command.args];
57
+ }
58
+ else {
59
+ command = "git";
60
+ args = [...opts.command.args];
61
+ }
62
+ let exitCode = 0;
63
+ let stdout = "";
64
+ let stderr = "";
65
+ try {
66
+ const result = await execFileAsync(command, args, {
67
+ cwd: opts.repoRoot,
68
+ env: {
69
+ ...process.env,
70
+ AGENTPLANE_NO_UPDATE_CHECK: process.env.AGENTPLANE_NO_UPDATE_CHECK ?? "1",
71
+ AGENTPLANE_DEV_ALLOW_STALE_DIST: process.env.AGENTPLANE_DEV_ALLOW_STALE_DIST ?? "1",
72
+ },
73
+ encoding: "utf8",
74
+ maxBuffer: 10 * 1024 * 1024,
75
+ });
76
+ stdout = String(result.stdout ?? "");
77
+ stderr = String(result.stderr ?? "");
78
+ }
79
+ catch (err) {
80
+ const failed = err;
81
+ exitCode = typeof failed.code === "number" ? failed.code : 1;
82
+ stdout = typeof failed.stdout === "string" ? failed.stdout : "";
83
+ stderr = typeof failed.stderr === "string" ? failed.stderr : "";
84
+ if (!stderr && typeof failed.code === "string") {
85
+ stderr = failed.code;
86
+ }
87
+ }
88
+ const endedMs = Date.now();
89
+ return {
90
+ display: `${command} ${args.join(" ")}`.trim(),
91
+ started_at: startedAt,
92
+ ended_at: new Date(endedMs).toISOString(),
93
+ duration_ms: Math.max(0, endedMs - startedMs),
94
+ exit_code: exitCode,
95
+ stdout_tail: truncate(stdout),
96
+ stderr_tail: truncate(stderr),
97
+ };
98
+ }
99
+ async function runWorkflowPlaybook(opts) {
100
+ try {
101
+ const resolved = await resolveProject({
102
+ cwd: opts.cwd,
103
+ rootOverride: opts.rootOverride ?? null,
104
+ });
105
+ const startedAt = new Date().toISOString();
106
+ const evidencePath = buildEvidencePath(resolved.gitRoot, opts.mode, startedAt);
107
+ const commands = buildPlaybookCommands({ mode: opts.mode, repoRoot: resolved.gitRoot });
108
+ const results = [];
109
+ let failed = false;
110
+ for (const command of commands) {
111
+ const result = await runWorkflowPlaybookCommand({
112
+ command,
113
+ repoRoot: resolved.gitRoot,
114
+ });
115
+ results.push(result);
116
+ if (result.stdout_tail)
117
+ process.stdout.write(`${result.stdout_tail}\n`);
118
+ if (result.stderr_tail)
119
+ process.stderr.write(`${result.stderr_tail}\n`);
120
+ if (result.exit_code !== 0)
121
+ failed = true;
122
+ }
123
+ await mkdir(path.dirname(evidencePath), { recursive: true });
124
+ const evidence = {
125
+ schema_version: 1,
126
+ mode: opts.mode,
127
+ status: failed ? "failed" : "success",
128
+ started_at: startedAt,
129
+ ended_at: new Date().toISOString(),
130
+ repo_root: resolved.gitRoot,
131
+ evidence_path: evidencePath,
132
+ commands: results,
133
+ };
134
+ await atomicWriteFile(evidencePath, `${JSON.stringify(evidence, null, 2)}\n`);
135
+ process.stdout.write(`Evidence: ${path.relative(resolved.gitRoot, evidencePath)}\n`);
136
+ return failed ? 1 : 0;
137
+ }
138
+ catch (err) {
139
+ throw mapCoreError(err, {
140
+ command: `workflow ${opts.mode}`,
141
+ root: opts.rootOverride ?? null,
142
+ });
143
+ }
144
+ }
145
+ export const workflowDebugSpec = {
146
+ id: ["workflow", "debug"],
147
+ group: "Workflow",
148
+ summary: "Run built-in debug checks and capture workflow evidence.",
149
+ parse: () => ({}),
150
+ examples: [{ cmd: "agentplane workflow debug", why: "Collect debug readiness evidence." }],
151
+ };
152
+ export const workflowSyncSpec = {
153
+ id: ["workflow", "sync"],
154
+ group: "Workflow",
155
+ summary: "Run built-in sync checks and capture workflow evidence.",
156
+ parse: () => ({}),
157
+ examples: [{ cmd: "agentplane workflow sync", why: "Collect sync-state evidence." }],
158
+ };
159
+ export const workflowLandSpec = {
160
+ id: ["workflow", "land"],
161
+ group: "Workflow",
162
+ summary: "Run built-in pre-land checks and capture workflow evidence.",
163
+ parse: () => ({}),
164
+ examples: [{ cmd: "agentplane workflow land", why: "Collect land-readiness evidence." }],
165
+ };
166
+ export const runWorkflowDebug = async (ctx) => {
167
+ return await runWorkflowPlaybook({ cwd: ctx.cwd, rootOverride: ctx.rootOverride, mode: "debug" });
168
+ };
169
+ export const runWorkflowSync = async (ctx) => {
170
+ return await runWorkflowPlaybook({ cwd: ctx.cwd, rootOverride: ctx.rootOverride, mode: "sync" });
171
+ };
172
+ export const runWorkflowLand = async (ctx) => {
173
+ return await runWorkflowPlaybook({ cwd: ctx.cwd, rootOverride: ctx.rootOverride, mode: "land" });
174
+ };
@@ -0,0 +1,5 @@
1
+ import type { CommandHandler, CommandSpec } from "../cli/spec/spec.js";
2
+ export type WorkflowRestoreParsed = Record<string, never>;
3
+ export declare const workflowRestoreSpec: CommandSpec<WorkflowRestoreParsed>;
4
+ export declare const runWorkflowRestore: CommandHandler<WorkflowRestoreParsed>;
5
+ //# sourceMappingURL=workflow-restore.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-restore.command.d.ts","sourceRoot":"","sources":["../../src/commands/workflow-restore.command.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOvE,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE1D,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,qBAAqB,CAWlE,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,cAAc,CAAC,qBAAqB,CAuBpE,CAAC"}