coding-agent-harness 1.0.2 → 1.0.5

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 (219) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/CONTRIBUTING.md +98 -0
  3. package/LICENSE +661 -21
  4. package/LICENSE-EXCEPTION.md +37 -0
  5. package/README.md +244 -87
  6. package/README.zh-CN.md +77 -35
  7. package/SKILL.md +32 -24
  8. package/docs-release/README.md +9 -5
  9. package/docs-release/architecture/overview.md +17 -5
  10. package/docs-release/architecture/overview.zh-CN.md +9 -5
  11. package/docs-release/architecture/system-explainer/01-system-overview.md +217 -0
  12. package/docs-release/architecture/system-explainer/02-module-dependency.md +257 -0
  13. package/docs-release/architecture/system-explainer/03-task-lifecycle.md +304 -0
  14. package/docs-release/architecture/system-explainer/04-check-and-governance.md +239 -0
  15. package/docs-release/architecture/system-explainer/05-data-flow.md +276 -0
  16. package/docs-release/architecture/system-explainer/06-preset-and-migration.md +303 -0
  17. package/docs-release/architecture/system-explainer/README.md +67 -0
  18. package/docs-release/architecture/system-explainer/en-US/01-system-overview.md +226 -0
  19. package/docs-release/architecture/system-explainer/en-US/02-module-dependency.md +263 -0
  20. package/docs-release/architecture/system-explainer/en-US/03-task-lifecycle.md +319 -0
  21. package/docs-release/architecture/system-explainer/en-US/04-check-and-governance.md +250 -0
  22. package/docs-release/architecture/system-explainer/en-US/05-data-flow.md +290 -0
  23. package/docs-release/architecture/system-explainer/en-US/06-preset-and-migration.md +323 -0
  24. package/docs-release/architecture/system-explainer/en-US/README.md +70 -0
  25. package/docs-release/assets/dashboard-overview.png +0 -0
  26. package/docs-release/guides/agent-installation.en-US.md +39 -15
  27. package/docs-release/guides/agent-installation.md +43 -16
  28. package/docs-release/guides/contributing.md +100 -0
  29. package/docs-release/guides/contributing.zh-CN.md +99 -0
  30. package/docs-release/guides/document-audience-and-surfaces.en-US.md +3 -2
  31. package/docs-release/guides/document-audience-and-surfaces.md +3 -2
  32. package/docs-release/guides/full-legacy-migration-subagent-strategy.md +2 -2
  33. package/docs-release/guides/full-legacy-migration-subagent-strategy.zh-CN.md +2 -2
  34. package/docs-release/guides/legacy-migration-agent-prompt.md +0 -11
  35. package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +0 -11
  36. package/docs-release/guides/migration-playbook.en-US.md +14 -15
  37. package/docs-release/guides/migration-playbook.md +14 -15
  38. package/docs-release/guides/parent-control-repository-pattern.en-US.md +7 -5
  39. package/docs-release/guides/parent-control-repository-pattern.md +7 -5
  40. package/docs-release/guides/preset-development.md +238 -0
  41. package/docs-release/guides/repository-operating-models.en-US.md +5 -4
  42. package/docs-release/guides/repository-operating-models.md +5 -4
  43. package/docs-release/guides/task-state-machine.en-US.md +224 -0
  44. package/docs-release/guides/task-state-machine.md +231 -0
  45. package/docs-release/intl/en-US.md +1 -1
  46. package/docs-release/intl/zh-CN.md +1 -1
  47. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/INDEX.md +60 -0
  48. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/findings.md +7 -0
  49. package/package.json +10 -4
  50. package/presets/legacy-migration/checks/preset-check.mjs +3 -0
  51. package/presets/legacy-migration/preset.yaml +134 -0
  52. package/presets/legacy-migration/scripts/plan-work-queue.mjs +4 -0
  53. package/presets/legacy-migration/scripts/scaffold-task-contracts.mjs +4 -0
  54. package/presets/legacy-migration/templates/execution_strategy.append.md +18 -0
  55. package/presets/legacy-migration/templates/findings.seed.md +17 -0
  56. package/presets/legacy-migration/templates/review.seed.md +12 -0
  57. package/presets/legacy-migration/templates/task_plan.append.md +9 -0
  58. package/presets/legacy-migration/templates/visual_map.append.md +12 -0
  59. package/presets/legacy-migration/workbench/dashboard-panels.yaml +2 -0
  60. package/presets/legacy-migration/workbench/migration-queue.schema.json +23 -0
  61. package/presets/lesson-sedimentation/preset.yaml +23 -0
  62. package/presets/lesson-sedimentation/templates/prompt.md +23 -0
  63. package/presets/module/preset.yaml +25 -0
  64. package/presets/module/templates/execution_strategy.append.md +8 -0
  65. package/presets/module/templates/task_plan.append.md +17 -0
  66. package/presets/standard-task/preset.yaml +31 -0
  67. package/presets/standard-task/templates/task_plan.append.md +7 -0
  68. package/references/adversarial-review-standard.md +2 -2
  69. package/references/agents-md-pattern.md +2 -2
  70. package/references/delivery-operating-model-standard.md +3 -3
  71. package/references/docs-directory-standard.md +6 -7
  72. package/references/harness-ledger.md +53 -96
  73. package/references/lessons-governance.md +88 -93
  74. package/references/module-parallel-standard.md +14 -14
  75. package/references/planning-loop.md +12 -6
  76. package/references/pull-request-standard.md +118 -0
  77. package/references/repo-governance-standard.md +11 -2
  78. package/references/review-routing-standard.md +7 -1
  79. package/references/ssot-governance.md +67 -59
  80. package/references/taskr-gap-analysis.md +600 -0
  81. package/references/walkthrough-closeout.md +7 -7
  82. package/scripts/check-harness.mjs +40 -301
  83. package/scripts/commands/dashboard-command.mjs +67 -0
  84. package/scripts/commands/migration-command.mjs +126 -0
  85. package/scripts/commands/preset-command.mjs +73 -0
  86. package/scripts/commands/task-command.mjs +328 -0
  87. package/scripts/harness.mjs +59 -260
  88. package/scripts/lib/capability-registry.mjs +82 -28
  89. package/scripts/lib/check-module-parallel.mjs +230 -0
  90. package/scripts/lib/check-profiles.mjs +90 -228
  91. package/scripts/lib/check-task-contracts.mjs +55 -0
  92. package/scripts/lib/core-shared.mjs +65 -2
  93. package/scripts/lib/dashboard-data.mjs +155 -24
  94. package/scripts/lib/dashboard-workbench.mjs +131 -12
  95. package/scripts/lib/dashboard-writer.mjs +20 -4
  96. package/scripts/lib/git-status-summary.mjs +46 -0
  97. package/scripts/lib/governance-index-generator.mjs +174 -0
  98. package/scripts/lib/governance-sync.mjs +611 -0
  99. package/scripts/lib/governance-table-boundary.mjs +175 -0
  100. package/scripts/lib/harness-core.mjs +6 -0
  101. package/scripts/lib/lesson-maintenance.mjs +36 -29
  102. package/scripts/lib/markdown-utils.mjs +33 -0
  103. package/scripts/lib/migration-planner.mjs +4 -6
  104. package/scripts/lib/migration-support.mjs +1 -1
  105. package/scripts/lib/phase-kind.mjs +50 -0
  106. package/scripts/lib/preset-audit-contracts.mjs +37 -0
  107. package/scripts/lib/preset-engine.mjs +494 -0
  108. package/scripts/lib/preset-registry.mjs +776 -0
  109. package/scripts/lib/preset-resource-contracts.mjs +83 -0
  110. package/scripts/lib/review-confirm-git-gate.mjs +248 -0
  111. package/scripts/lib/status-builder.mjs +88 -0
  112. package/scripts/lib/status-dashboard-renderer.mjs +105 -0
  113. package/scripts/lib/subagent-authorization-audit.mjs +196 -0
  114. package/scripts/lib/task-audit-metadata.mjs +385 -0
  115. package/scripts/lib/task-audit-migration.mjs +350 -0
  116. package/scripts/lib/task-completion-consistency.mjs +26 -0
  117. package/scripts/lib/task-index.mjs +93 -0
  118. package/scripts/lib/task-lesson-candidates.mjs +242 -0
  119. package/scripts/lib/task-lesson-sedimentation.mjs +326 -0
  120. package/scripts/lib/task-lifecycle/create-task-helpers.mjs +67 -0
  121. package/scripts/lib/task-lifecycle/phase-sync.mjs +88 -0
  122. package/scripts/lib/task-lifecycle/review-confirm.mjs +112 -0
  123. package/scripts/lib/task-lifecycle/review-gates.mjs +73 -0
  124. package/scripts/lib/task-lifecycle/review-submission.mjs +63 -0
  125. package/scripts/lib/task-lifecycle/scaffold-provenance.mjs +49 -0
  126. package/scripts/lib/task-lifecycle/template-files.mjs +53 -0
  127. package/scripts/lib/task-lifecycle/text-utils.mjs +24 -0
  128. package/scripts/lib/task-lifecycle.mjs +338 -477
  129. package/scripts/lib/task-metadata.mjs +118 -0
  130. package/scripts/lib/task-review-model.mjs +455 -0
  131. package/scripts/lib/task-scanner.mjs +193 -372
  132. package/scripts/lib/task-tombstone-commands.mjs +140 -0
  133. package/scripts/postinstall.mjs +14 -0
  134. package/skills/preset-creator/SKILL.md +179 -0
  135. package/skills/preset-creator/references/complex-task-skeleton/README.md +31 -0
  136. package/skills/preset-creator/references/complex-task-skeleton/artifacts/INDEX.md +12 -0
  137. package/skills/preset-creator/references/complex-task-skeleton/brief.md +43 -0
  138. package/skills/preset-creator/references/complex-task-skeleton/execution_strategy.md +71 -0
  139. package/skills/preset-creator/references/complex-task-skeleton/findings.md +24 -0
  140. package/skills/preset-creator/references/complex-task-skeleton/lesson_candidates.md +70 -0
  141. package/skills/preset-creator/references/complex-task-skeleton/long-running-task-contract.md +76 -0
  142. package/skills/preset-creator/references/complex-task-skeleton/progress.md +33 -0
  143. package/skills/preset-creator/references/complex-task-skeleton/references/INDEX.md +13 -0
  144. package/skills/preset-creator/references/complex-task-skeleton/review.md +107 -0
  145. package/skills/preset-creator/references/complex-task-skeleton/task_plan.md +111 -0
  146. package/skills/preset-creator/references/complex-task-skeleton/visual_map.md +50 -0
  147. package/skills/preset-creator/references/preset-package-skeleton.md +296 -0
  148. package/templates/AGENTS.md.template +24 -18
  149. package/templates/dashboard/assets/app-src/00-state.js +13 -0
  150. package/templates/dashboard/assets/app-src/10-router.js +5 -1
  151. package/templates/dashboard/assets/app-src/20-overview.js +18 -8
  152. package/templates/dashboard/assets/app-src/30-tasks.js +92 -246
  153. package/templates/dashboard/assets/app-src/35-task-detail.js +286 -0
  154. package/templates/dashboard/assets/app-src/45-review.js +241 -22
  155. package/templates/dashboard/assets/app-src/50-migration.js +24 -10
  156. package/templates/dashboard/assets/app-src/55-presets.js +375 -0
  157. package/templates/dashboard/assets/app-src/60-shared.js +3 -1
  158. package/templates/dashboard/assets/app-src/90-bindings.js +302 -29
  159. package/templates/dashboard/assets/app.css +1501 -376
  160. package/templates/dashboard/assets/app.css.manifest.json +10 -0
  161. package/templates/dashboard/assets/app.js +1240 -101
  162. package/templates/dashboard/assets/app.manifest.json +2 -0
  163. package/templates/dashboard/assets/css-src/00-foundation.css +346 -0
  164. package/templates/dashboard/assets/css-src/10-panels-flow.css +236 -0
  165. package/templates/dashboard/assets/css-src/20-briefs-controls.css +398 -0
  166. package/templates/dashboard/assets/css-src/30-task-index.css +739 -0
  167. package/templates/dashboard/assets/css-src/35-review-workspace.css +507 -0
  168. package/templates/dashboard/assets/css-src/40-detail-modules-migration.css +489 -0
  169. package/templates/dashboard/assets/css-src/45-presets.css +516 -0
  170. package/templates/dashboard/assets/css-src/50-responsive-overrides.css +551 -0
  171. package/templates/dashboard/assets/i18n.js +263 -23
  172. package/templates/ledger/Harness-Ledger.md +13 -25
  173. package/templates/lessons/lesson-arch-process-change.md +1 -1
  174. package/templates/lessons/lesson-new-doc.md +1 -1
  175. package/templates/lessons/lesson-ref-change.md +1 -1
  176. package/templates/planning/INDEX.md +87 -0
  177. package/templates/planning/brief.md +1 -1
  178. package/templates/planning/execution_strategy.md +31 -0
  179. package/templates/planning/lesson_candidates.md +18 -6
  180. package/templates/planning/module_session_prompt.md +1 -0
  181. package/templates/planning/optional/artifacts/INDEX.md +3 -3
  182. package/templates/planning/optional/references/INDEX.md +3 -3
  183. package/templates/planning/review.md +41 -0
  184. package/templates/planning/task_plan.md +5 -21
  185. package/templates/planning/visual_map.md +13 -9
  186. package/templates/planning/visual_map.simple.md +52 -0
  187. package/templates/reference/execution-workflow-standard.md +31 -3
  188. package/templates/reference/pull-request-standard.md +80 -0
  189. package/templates/reference/repo-governance-standard.md +7 -6
  190. package/templates/reference/review-routing-standard.md +6 -0
  191. package/templates/reference/walkthrough-standard.md +2 -1
  192. package/templates/verifier/verifier-output.md +1 -1
  193. package/templates-zh-CN/AGENTS.md.template +25 -19
  194. package/templates-zh-CN/ledger/Harness-Ledger.md +17 -40
  195. package/templates-zh-CN/planning/INDEX.md +87 -0
  196. package/templates-zh-CN/planning/brief.md +1 -1
  197. package/templates-zh-CN/planning/execution_strategy.md +30 -0
  198. package/templates-zh-CN/planning/lesson_candidates.md +18 -6
  199. package/templates-zh-CN/planning/module_session_prompt.md +1 -0
  200. package/templates-zh-CN/planning/review.md +41 -1
  201. package/templates-zh-CN/planning/task_plan.md +4 -44
  202. package/templates-zh-CN/planning/visual_map.md +14 -7
  203. package/templates-zh-CN/planning/visual_map.simple.md +48 -0
  204. package/templates-zh-CN/reference/adversarial-review-standard.md +1 -1
  205. package/templates-zh-CN/reference/docs-library-standard.md +1 -1
  206. package/templates-zh-CN/reference/execution-workflow-standard.md +33 -7
  207. package/templates-zh-CN/reference/harness-ledger-standard.md +2 -2
  208. package/templates-zh-CN/reference/pull-request-standard.md +106 -0
  209. package/templates-zh-CN/reference/repo-governance-standard.md +4 -3
  210. package/templates-zh-CN/reference/review-routing-standard.md +8 -1
  211. package/templates-zh-CN/reference/walkthrough-standard.md +3 -2
  212. package/templates-zh-CN/walkthrough/Closeout-SSoT.md +1 -1
  213. package/docs-release/assets/dashboard-overview-en.png +0 -0
  214. package/scripts/smoke-dashboard.mjs +0 -92
  215. package/scripts/test-harness.mjs +0 -1395
  216. package/templates/ssot/Feature-SSoT.md +0 -43
  217. package/templates/ssot/Lessons-SSoT.md +0 -44
  218. package/templates-zh-CN/ssot/Feature-SSoT.md +0 -49
  219. package/templates-zh-CN/ssot/Lessons-SSoT.md +0 -49
@@ -0,0 +1,328 @@
1
+ import {
2
+ confirmTaskReview,
3
+ createTask,
4
+ readPresetPackage,
5
+ buildTaskIndex,
6
+ createLessonSedimentationTask,
7
+ archiveTask,
8
+ listLifecycleTasks,
9
+ promoteLessonCandidate,
10
+ reopenTask,
11
+ softDeleteTask,
12
+ supersedeTask,
13
+ updateModuleStep,
14
+ updateTaskPhase,
15
+ updateTaskLifecycle,
16
+ } from "../lib/harness-core.mjs";
17
+
18
+ export function runTaskCommand(command, { args, takeFlag, takeOption, targetArg }) {
19
+ if (command === "new-task") {
20
+ const dryRun = takeFlag("--dry-run");
21
+ const locale = takeOption("--locale", "");
22
+ const title = takeOption("--title", "");
23
+ const moduleKey = takeOption("--module", "");
24
+ const budget = takeOption("--budget", "standard");
25
+ const preset = takeOption("--preset", "");
26
+ const fromSession = takeOption("--from-session", "");
27
+ const longRunning = takeFlag("--long-running");
28
+ try {
29
+ const parsed = parseNewTaskArgs(args, { preset, fromSession });
30
+ console.log(JSON.stringify(createTask(parsed.target, parsed.taskId, { title, locale, dryRun, moduleKey, budget, longRunning, preset, fromSession, presetArgs: parsed.presetArgs, automaticTaskId: parsed.automaticTaskId }), null, 2));
31
+ } catch (error) {
32
+ console.error(error.message);
33
+ process.exit(1);
34
+ }
35
+ return;
36
+ }
37
+
38
+ if (command === "task-phase") {
39
+ const state = takeOption("--state", "");
40
+ const completion = takeOption("--completion", "");
41
+ const evidenceStatus = takeOption("--evidence", "");
42
+ const taskId = args.shift();
43
+ const phaseId = args.shift();
44
+ if (!taskId || !phaseId) {
45
+ console.error("Missing task id or phase id");
46
+ process.exit(2);
47
+ }
48
+ try {
49
+ console.log(JSON.stringify(updateTaskPhase(targetArg(), taskId, phaseId, { state, completion, evidenceStatus }), null, 2));
50
+ } catch (error) {
51
+ console.error(error.message);
52
+ process.exit(1);
53
+ }
54
+ return;
55
+ }
56
+
57
+ if (["task-start", "task-log", "task-block", "task-review", "task-complete"].includes(command)) {
58
+ const message = takeOption("--message", "");
59
+ const evidence = takeOption("--evidence", "");
60
+ const taskId = args.shift();
61
+ if (!taskId) {
62
+ console.error("Missing task id");
63
+ process.exit(2);
64
+ }
65
+ const lifecycle = {
66
+ "task-start": { event: "task-start", state: "in_progress" },
67
+ "task-log": { event: "task-log", state: "" },
68
+ "task-block": { event: "task-block", state: "blocked" },
69
+ "task-review": { event: "task-review", state: "review" },
70
+ "task-complete": { event: "task-complete", state: "done" },
71
+ }[command];
72
+ try {
73
+ console.log(JSON.stringify(updateTaskLifecycle(targetArg(), taskId, { ...lifecycle, message, evidence }), null, 2));
74
+ } catch (error) {
75
+ console.error(error.message);
76
+ process.exit(1);
77
+ }
78
+ return;
79
+ }
80
+
81
+ if (command === "review-confirm") {
82
+ const reviewer = takeOption("--reviewer", "Human Reviewer");
83
+ const message = takeOption("--message", "");
84
+ const evidence = takeOption("--evidence", "");
85
+ const confirmText = takeOption("--confirm", "");
86
+ const taskId = args.shift();
87
+ if (!taskId) {
88
+ console.error("Missing task id");
89
+ process.exit(2);
90
+ }
91
+ try {
92
+ console.log(JSON.stringify(confirmTaskReview(targetArg(), taskId, { reviewer, message, evidence, confirmText }), null, 2));
93
+ } catch (error) {
94
+ console.error(formatTaskCommandError(error));
95
+ process.exit(1);
96
+ }
97
+ return;
98
+ }
99
+
100
+ if (command === "lesson-promote") {
101
+ const dryRun = takeFlag("--dry-run");
102
+ const apply = takeFlag("--apply");
103
+ const taskId = args.shift();
104
+ const candidateId = args.shift();
105
+ if (!taskId || !candidateId) {
106
+ console.error("Missing task id or candidate id");
107
+ process.exit(2);
108
+ }
109
+ try {
110
+ console.log(JSON.stringify(promoteLessonCandidate(targetArg(), taskId, candidateId, { dryRun, apply }), null, 2));
111
+ } catch (error) {
112
+ console.error(error.message);
113
+ process.exit(1);
114
+ }
115
+ return;
116
+ }
117
+
118
+ if (command === "lesson-sediment") {
119
+ const dryRun = takeFlag("--dry-run");
120
+ const title = takeOption("--title", "");
121
+ const taskId = args.shift();
122
+ const candidateId = args.shift();
123
+ if (!taskId || !candidateId) {
124
+ console.error("Missing task id or candidate id");
125
+ process.exit(2);
126
+ }
127
+ try {
128
+ console.log(JSON.stringify(createLessonSedimentationTask(targetArg(), taskId, candidateId, { dryRun, title }), null, 2));
129
+ } catch (error) {
130
+ console.error(error.message);
131
+ process.exit(1);
132
+ }
133
+ return;
134
+ }
135
+
136
+ if (command === "task-list") {
137
+ const json = takeFlag("--json");
138
+ const state = takeOption("--state", "");
139
+ const moduleKey = takeOption("--module", "");
140
+ const queue = takeOption("--queue", "");
141
+ const preset = takeOption("--preset", "");
142
+ const review = takeOption("--review", "");
143
+ const lesson = takeOption("--lesson", "");
144
+ const search = takeOption("--search", "");
145
+ const missingMaterials = takeFlag("--missing-materials");
146
+ const result = listLifecycleTasks(targetArg(), { state, moduleKey, queue, preset, review, lesson, search, missingMaterials });
147
+ if (json) {
148
+ console.log(JSON.stringify(result, null, 2));
149
+ } else {
150
+ for (const task of result.tasks) {
151
+ console.log(`${task.id}\t${task.state}\t${task.completion}%\t${task.title}`);
152
+ }
153
+ }
154
+ return;
155
+ }
156
+
157
+ if (command === "task-index") {
158
+ const json = takeFlag("--json");
159
+ const result = buildTaskIndex(targetArg());
160
+ if (json) console.log(JSON.stringify(result, null, 2));
161
+ else console.log(`${result.tasks.length} tasks indexed (${result.schemaVersion})`);
162
+ return;
163
+ }
164
+
165
+ if (command === "task-supersede") {
166
+ const by = takeOption("--by", "");
167
+ const reason = takeOption("--reason", "");
168
+ const taskId = args.shift();
169
+ if (!taskId) {
170
+ console.error("Missing task id");
171
+ process.exit(2);
172
+ }
173
+ try {
174
+ console.log(JSON.stringify(supersedeTask(targetArg(), taskId, { by, reason }), null, 2));
175
+ } catch (error) {
176
+ console.error(error.message);
177
+ process.exit(1);
178
+ }
179
+ return;
180
+ }
181
+
182
+ if (["task-delete", "task-archive", "task-reopen"].includes(command)) {
183
+ const soft = takeFlag("--soft");
184
+ const reason = takeOption("--reason", "");
185
+ const taskId = args.shift();
186
+ if (!taskId) {
187
+ console.error("Missing task id");
188
+ process.exit(2);
189
+ }
190
+ try {
191
+ if (command === "task-delete" && !soft) throw new Error("task-delete only supports --soft; hard delete is intentionally disabled.");
192
+ const result =
193
+ command === "task-delete"
194
+ ? softDeleteTask(targetArg(), taskId, { reason })
195
+ : command === "task-archive"
196
+ ? archiveTask(targetArg(), taskId, { reason })
197
+ : reopenTask(targetArg(), taskId, { reason });
198
+ console.log(JSON.stringify(result, null, 2));
199
+ } catch (error) {
200
+ console.error(error.message);
201
+ process.exit(1);
202
+ }
203
+ return;
204
+ }
205
+
206
+ if (command === "module-step") {
207
+ const state = takeOption("--state", "done");
208
+ const moduleKey = args.shift();
209
+ const stepId = args.shift();
210
+ if (!moduleKey || !stepId) {
211
+ console.error("Missing module key or step id");
212
+ process.exit(2);
213
+ }
214
+ try {
215
+ console.log(JSON.stringify(updateModuleStep(targetArg(), moduleKey, stepId, { state }), null, 2));
216
+ } catch (error) {
217
+ console.error(error.message);
218
+ process.exit(1);
219
+ }
220
+ return;
221
+ }
222
+
223
+ throw new Error(`Unsupported task command: ${command}`);
224
+ }
225
+
226
+ function parseNewTaskArgs(args, { preset = "" } = {}) {
227
+ const values = [...args];
228
+ const presetPackage = preset ? readPresetPackageForNewTask(preset, values) : null;
229
+ const parsed = splitPresetArgsAndPositionals(values, presetPackage);
230
+ const resolved = resolveNewTaskPositionals(parsed.positionals);
231
+ return {
232
+ taskId: resolved.taskId,
233
+ target: resolved.target || ".",
234
+ automaticTaskId: !resolved.taskId,
235
+ presetArgs: parsed.presetArgs,
236
+ };
237
+ }
238
+
239
+ function readPresetPackageForNewTask(preset, values) {
240
+ const candidates = presetDiscoveryTargetCandidates(values);
241
+ let fallbackPackage = null;
242
+ let lastError = null;
243
+ for (const targetInput of candidates) {
244
+ try {
245
+ const presetPackage = readPresetPackage(preset, { targetInput });
246
+ if (presetPackage.source === "project") return presetPackage;
247
+ if (!fallbackPackage) fallbackPackage = presetPackage;
248
+ } catch (error) {
249
+ lastError = error;
250
+ }
251
+ }
252
+ if (fallbackPackage) return fallbackPackage;
253
+ throw lastError;
254
+ }
255
+
256
+ function presetDiscoveryTargetCandidates(values) {
257
+ const candidates = [];
258
+ for (let index = values.length - 1; index >= 0; index -= 1) {
259
+ const value = values[index];
260
+ if (!value || value.startsWith("-")) continue;
261
+ if (!candidates.includes(value)) candidates.push(value);
262
+ }
263
+ if (!candidates.includes(".")) candidates.push(".");
264
+ return candidates;
265
+ }
266
+
267
+ function splitPresetArgsAndPositionals(values, presetPackage) {
268
+ const presetArgs = [];
269
+ const positionals = [];
270
+ const declaredFlags = new Map(Object.values(presetPackage?.inputs || {}).filter((input) => input.flag).map((input) => [input.flag, input]));
271
+ for (let index = 0; index < values.length; index += 1) {
272
+ const value = values[index];
273
+ const declared = declaredFlags.get(value);
274
+ if (declared) {
275
+ presetArgs.push(value);
276
+ if (declared.type !== "flag" && index + 1 < values.length) {
277
+ presetArgs.push(values[index + 1]);
278
+ index += 1;
279
+ }
280
+ } else if (value.startsWith("-")) {
281
+ presetArgs.push(value);
282
+ if (index + 1 < values.length && !values[index + 1].startsWith("-")) {
283
+ presetArgs.push(values[index + 1]);
284
+ index += 1;
285
+ }
286
+ } else {
287
+ positionals.push(value);
288
+ }
289
+ }
290
+ return {
291
+ positionals,
292
+ presetArgs,
293
+ };
294
+ }
295
+
296
+ function isPathLikePositional(value) {
297
+ return value === "." || value === ".." || value.startsWith("/") || value.startsWith("~/") || value.includes("/") || value.includes("\\");
298
+ }
299
+
300
+ function resolveNewTaskPositionals(positionals) {
301
+ if (positionals.length === 0) return { taskId: "", target: "" };
302
+ if (positionals.length === 1) {
303
+ const [value] = positionals;
304
+ if (isPathLikePositional(value)) return { taskId: "", target: value };
305
+ return { taskId: value, target: "" };
306
+ }
307
+ if (positionals.length === 2) return { taskId: positionals[0], target: positionals[1] };
308
+ throw new Error(`Too many positional arguments for new-task: ${positionals.join(", ")}`);
309
+ }
310
+
311
+ function formatTaskCommandError(error) {
312
+ const lines = [error.message];
313
+ if (Array.isArray(error.recovery) && error.recovery.length > 0) {
314
+ lines.push("", "Recovery:");
315
+ for (const item of error.recovery) lines.push(`- ${item}`);
316
+ }
317
+ if (error.details?.entries?.length) {
318
+ lines.push("", "Blocking Git status:");
319
+ for (const entry of error.details.entries) lines.push(`- ${entry.raw || entry.path}`);
320
+ }
321
+ if (error.details?.disallowed?.length) {
322
+ lines.push("", "Disallowed paths:");
323
+ for (const item of error.details.disallowed) lines.push(`- ${item}`);
324
+ }
325
+ if (error.details?.stderr) lines.push("", error.details.stderr);
326
+ if (error.details?.stdout) lines.push("", error.details.stdout);
327
+ return lines.join("\n");
328
+ }