@enterpriseai/cli 3.19.0 → 3.19.2

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 (364) hide show
  1. package/package.json +3 -3
  2. package/resources/deploy/eai-app-template/producer-pin.json +5 -5
  3. package/resources/deploy/eai-app-template/tests/source-unknown-deployment-evidence.test.mjs +2141 -1
  4. package/resources/gofer/.gofer-version +4 -357
  5. package/resources/gofer/agents-skills/eai/SKILL.md +365 -0
  6. package/resources/gofer/agents-skills/eai-update/SKILL.md +56 -0
  7. package/resources/gofer/agents-skills/gofer-documentation/SKILL.md +93 -0
  8. package/resources/gofer/bash-scripts/create-new-feature.sh +3 -1
  9. package/resources/gofer/bash-scripts/sync-implementation-status.sh +4 -3
  10. package/resources/gofer/bash-scripts/update-agent-context.sh +7 -8
  11. package/resources/gofer/bash-scripts/validate-artifact.sh +10 -6
  12. package/resources/gofer/bash-scripts/verify-object-type-routing-workspace.sh +184 -0
  13. package/resources/gofer/claude-commands/eai-update.md +46 -0
  14. package/resources/gofer/claude-commands/eai.md +355 -0
  15. package/resources/gofer/claude-skills/eai/SKILL.md +365 -0
  16. package/resources/gofer/claude-skills/eai-update/SKILL.md +56 -0
  17. package/resources/gofer/claude-skills/gofer-documentation/SKILL.md +93 -0
  18. package/resources/gofer/commands/0_gofer_start.md +440 -99
  19. package/resources/gofer/commands/0a_problem_validation.md +187 -27
  20. package/resources/gofer/commands/10_gofer_cloud.md +183 -23
  21. package/resources/gofer/commands/1_gofer_research.md +239 -30
  22. package/resources/gofer/commands/2_gofer_specify.md +239 -35
  23. package/resources/gofer/commands/3_gofer_plan.md +259 -43
  24. package/resources/gofer/commands/4_gofer_tasks.md +401 -81
  25. package/resources/gofer/commands/5_gofer_implement.md +375 -84
  26. package/resources/gofer/commands/6_gofer_validate.md +284 -53
  27. package/resources/gofer/commands/7_gofer_save.md +187 -26
  28. package/resources/gofer/commands/7a_stakeholder_comms.md +183 -23
  29. package/resources/gofer/commands/8_gofer_branding.md +183 -23
  30. package/resources/gofer/commands/9_gofer_tests.md +212 -23
  31. package/resources/gofer/commands/gofer_bootstrap_workspace.md +121 -8
  32. package/resources/gofer/commands/gofer_check_workspace.md +123 -8
  33. package/resources/gofer/commands/gofer_constitution.md +183 -23
  34. package/resources/gofer/commands/gofer_diagnose.md +183 -23
  35. package/resources/gofer/commands/gofer_eai_first_run.md +254 -25
  36. package/resources/gofer/commands/gofer_hydrate.md +183 -23
  37. package/resources/gofer/commands/gofer_personality.md +117 -6
  38. package/resources/gofer/commands/gofer_plan.md +117 -6
  39. package/resources/gofer/commands/gofer_side.md +117 -6
  40. package/resources/gofer/commands/gofer_spec_summary.md +183 -23
  41. package/resources/gofer/commands/gofer_tdd.md +183 -23
  42. package/resources/gofer/commands/gofer_vocabulary.md +185 -25
  43. package/resources/gofer/commands/gofer_zoom_out.md +183 -23
  44. package/resources/gofer/config/typesafe-learning-review.json +16 -0
  45. package/resources/gofer/config/typesafe-semantic-review.json +9 -0
  46. package/resources/gofer/copilot-instructions/gofer-cost.instructions.md +15 -6
  47. package/resources/gofer/copilot-instructions/typescript.instructions.md +1 -1
  48. package/resources/gofer/copilot-prompts/eai-update.prompt.md +58 -0
  49. package/resources/gofer/copilot-prompts/eai.prompt.md +367 -0
  50. package/resources/gofer/gemini/commands/gofer/eai-update.md +22 -0
  51. package/resources/gofer/gemini/commands/gofer/eai-update.toml +2 -0
  52. package/resources/gofer/gemini/commands/gofer/eai.md +357 -0
  53. package/resources/gofer/gemini/commands/gofer/eai.toml +2 -0
  54. package/resources/gofer/gemini/commands/gofer/manifest.json +3 -27
  55. package/resources/gofer/gemini/extension.json +4 -4
  56. package/resources/gofer/github-agents/eai.agent.md +83 -0
  57. package/resources/gofer/github-agents/gofer-business.agent.md +73 -4
  58. package/resources/gofer/github-agents/gofer-implement.agent.md +71 -2
  59. package/resources/gofer/github-agents/gofer-plan.agent.md +72 -2
  60. package/resources/gofer/github-agents/gofer-research.agent.md +72 -2
  61. package/resources/gofer/github-agents/gofer-validate.agent.md +72 -2
  62. package/resources/gofer/github-skills/eai/SKILL.md +365 -0
  63. package/resources/gofer/github-skills/eai-update/SKILL.md +56 -0
  64. package/resources/gofer/github-skills/gofer-documentation/SKILL.md +93 -0
  65. package/resources/gofer/grok-skills/eai/SKILL.md +267 -14
  66. package/resources/gofer/grok-skills/eai-update/SKILL.md +56 -0
  67. package/resources/gofer/hook-scripts/user-prompt-submit.mjs +58 -13
  68. package/resources/gofer/instruction-templates/base/agents-base.md +8 -4
  69. package/resources/gofer/instruction-templates/gofer/gofer-claude.md +7 -5
  70. package/resources/gofer/instruction-templates/gofer/gofer-copilot.md +10 -8
  71. package/resources/gofer/memory/constitution.md +9 -7
  72. package/resources/gofer/memory/gofer-model-policy.yaml +23 -1
  73. package/resources/gofer/memory/lessons.md +0 -31
  74. package/resources/gofer/node-scripts/canonical-descriptions.mjs +1 -1
  75. package/resources/gofer/node-scripts/check-version-alignment.mjs +4 -7
  76. package/resources/gofer/node-scripts/delivery-lineage-corpus.mjs +156 -0
  77. package/resources/gofer/node-scripts/generate-commands.mjs +1073 -265
  78. package/resources/gofer/node-scripts/gofer-acceptance-check.mjs +143 -0
  79. package/resources/gofer/node-scripts/gofer-agent-catalog.mjs +271 -0
  80. package/resources/gofer/node-scripts/gofer-benchmark-executor.mjs +123 -0
  81. package/resources/gofer/node-scripts/gofer-benchmark-sign.mjs +62 -0
  82. package/resources/gofer/node-scripts/gofer-benchmark-signer.mjs +89 -0
  83. package/resources/gofer/node-scripts/gofer-benchmark.mjs +76 -0
  84. package/resources/gofer/node-scripts/gofer-blocker-control.mjs +274 -0
  85. package/resources/gofer/node-scripts/gofer-claude-adapter.mjs +154 -0
  86. package/resources/gofer/node-scripts/gofer-closed-loop-audit.mjs +19 -2
  87. package/resources/gofer/node-scripts/gofer-delivery-check.mjs +121 -0
  88. package/resources/gofer/node-scripts/gofer-encrypted-key.mjs +58 -0
  89. package/resources/gofer/node-scripts/gofer-execution-metrics.mjs +477 -0
  90. package/resources/gofer/node-scripts/gofer-execution-recovery.mjs +334 -0
  91. package/resources/gofer/node-scripts/gofer-grok-adapter.mjs +184 -0
  92. package/resources/gofer/node-scripts/gofer-heldout-corpus.mjs +73 -0
  93. package/resources/gofer/node-scripts/gofer-heldout-snapshot.mjs +286 -0
  94. package/resources/gofer/node-scripts/gofer-heldout-verifier.mjs +211 -0
  95. package/resources/gofer/node-scripts/gofer-host-capability.mjs +335 -0
  96. package/resources/gofer/node-scripts/gofer-independent-reviewer.mjs +130 -0
  97. package/resources/gofer/node-scripts/gofer-live-routing.mjs +109 -0
  98. package/resources/gofer/node-scripts/gofer-local-capability-issuer.mjs +71 -0
  99. package/resources/gofer/node-scripts/gofer-local-isolation.mjs +175 -0
  100. package/resources/gofer/node-scripts/gofer-local-settings-cleanup.mjs +388 -0
  101. package/resources/gofer/node-scripts/gofer-loop-audit.mjs +54 -3
  102. package/resources/gofer/node-scripts/gofer-native-adapter.mjs +567 -0
  103. package/resources/gofer/node-scripts/gofer-native-benchmark-dispatch.mjs +145 -0
  104. package/resources/gofer/node-scripts/gofer-native-runtime.mjs +169 -0
  105. package/resources/gofer/node-scripts/gofer-pre-edit-check.mjs +204 -0
  106. package/resources/gofer/node-scripts/gofer-priority-check.mjs +214 -0
  107. package/resources/gofer/node-scripts/gofer-response-check.mjs +56 -0
  108. package/resources/gofer/node-scripts/gofer-reviewed-learning.mjs +1232 -0
  109. package/resources/gofer/node-scripts/gofer-run-verified-task.mjs +330 -0
  110. package/resources/gofer/node-scripts/gofer-runtime-ledger.mjs +289 -0
  111. package/resources/gofer/node-scripts/gofer-semantic-drift.mjs +584 -0
  112. package/resources/gofer/node-scripts/gofer-surface-update.mjs +1178 -0
  113. package/resources/gofer/node-scripts/gofer-trust-bootstrap.mjs +77 -0
  114. package/resources/gofer/node-scripts/gofer-trusted-benchmark.mjs +102 -0
  115. package/resources/gofer/node-scripts/gofer-trusted-evaluator.mjs +274 -0
  116. package/resources/gofer/node-scripts/gofer-tty-prompt.mjs +34 -0
  117. package/resources/gofer/node-scripts/gofer-typesafe-credentials.mjs +435 -0
  118. package/resources/gofer/node-scripts/gofer-ui-preview.mjs +1212 -0
  119. package/resources/gofer/node-scripts/gofer-verified-execution.mjs +484 -0
  120. package/resources/gofer/node-scripts/gofer-verifier-key-ceremony.mjs +101 -0
  121. package/resources/gofer/node-scripts/gofer-worktree-layout.mjs +32 -0
  122. package/resources/gofer/node-scripts/object-type-routing-phase-bundle.mjs +360 -0
  123. package/resources/gofer/node-scripts/package-agent-plugin.mjs +574 -82
  124. package/resources/gofer/node-scripts/parse-stage-command.mjs +1 -1
  125. package/resources/gofer/node-scripts/render-delivery-lineage.mjs +178 -0
  126. package/resources/gofer/node-scripts/sync-extension-resources.mjs +78 -2
  127. package/resources/gofer/node-scripts/validate-object-type-identifiers.mjs +767 -0
  128. package/resources/gofer/node-scripts/validate-object-type-routing-workspace.mjs +1325 -0
  129. package/resources/gofer/node-scripts/validate-v4-resource-contract.d.mts +44 -0
  130. package/resources/gofer/node-scripts/validate-v4-resource-contract.mjs +957 -0
  131. package/resources/gofer/node-scripts/workspace-bootstrap-lib.mjs +685 -116
  132. package/resources/gofer/references/agent-catalog.json +126 -0
  133. package/resources/gofer/references/blocker-mediation.md +156 -0
  134. package/resources/gofer/references/business-updates-and-goal-checks.md +109 -0
  135. package/resources/gofer/references/delivery-lineage.md +48 -0
  136. package/resources/gofer/references/mvp-capability-validation.md +102 -0
  137. package/resources/gofer/references/platform/README.md +1 -1
  138. package/resources/gofer/references/platform/eai-app-template.md +15 -13
  139. package/resources/gofer/references/platform/eai-auth-access.md +104 -0
  140. package/resources/gofer/references/platform/eai-config-driven-ui.md +5 -5
  141. package/resources/gofer/references/platform/eai-error-catalog.yaml +77 -19
  142. package/resources/gofer/references/platform/eai-repo-contract.md +61 -23
  143. package/resources/gofer/references/platform/eai-service-patterns.md +102 -105
  144. package/resources/gofer/references/platform/eai.md +44 -8
  145. package/resources/gofer/references/platform/vertical-template.md +10 -9
  146. package/resources/gofer/references/priority-outcome-protection.md +152 -0
  147. package/resources/gofer/references/verified-agent-execution.md +179 -0
  148. package/resources/gofer/schemas/gofer-learning-trace-v1.json +70 -0
  149. package/resources/gofer/specify-commands/0_gofer_start.md +440 -99
  150. package/resources/gofer/specify-commands/0a_problem_validation.md +187 -27
  151. package/resources/gofer/specify-commands/10_gofer_cloud.md +183 -23
  152. package/resources/gofer/specify-commands/1_gofer_research.md +239 -30
  153. package/resources/gofer/specify-commands/2_gofer_specify.md +239 -35
  154. package/resources/gofer/specify-commands/3_gofer_plan.md +259 -43
  155. package/resources/gofer/specify-commands/4_gofer_tasks.md +401 -81
  156. package/resources/gofer/specify-commands/5_gofer_implement.md +375 -84
  157. package/resources/gofer/specify-commands/6_gofer_validate.md +284 -53
  158. package/resources/gofer/specify-commands/7_gofer_save.md +187 -26
  159. package/resources/gofer/specify-commands/7a_stakeholder_comms.md +183 -23
  160. package/resources/gofer/specify-commands/8_gofer_branding.md +183 -23
  161. package/resources/gofer/specify-commands/9_gofer_tests.md +212 -23
  162. package/resources/gofer/specify-commands/gofer_bootstrap_workspace.md +121 -8
  163. package/resources/gofer/specify-commands/gofer_check_workspace.md +123 -8
  164. package/resources/gofer/specify-commands/gofer_constitution.md +183 -23
  165. package/resources/gofer/specify-commands/gofer_diagnose.md +183 -23
  166. package/resources/gofer/specify-commands/gofer_eai_first_run.md +254 -25
  167. package/resources/gofer/specify-commands/gofer_hydrate.md +183 -23
  168. package/resources/gofer/specify-commands/gofer_personality.md +117 -6
  169. package/resources/gofer/specify-commands/gofer_plan.md +117 -6
  170. package/resources/gofer/specify-commands/gofer_side.md +117 -6
  171. package/resources/gofer/specify-commands/gofer_spec_summary.md +183 -23
  172. package/resources/gofer/specify-commands/gofer_tdd.md +183 -23
  173. package/resources/gofer/specify-commands/gofer_vocabulary.md +185 -25
  174. package/resources/gofer/specify-commands/gofer_zoom_out.md +183 -23
  175. package/resources/gofer/specify-config/object-type-routing.json +24 -0
  176. package/resources/gofer/specify-config/typesafe-learning-review.json +16 -0
  177. package/resources/gofer/specify-config/typesafe-semantic-review.json +9 -0
  178. package/resources/gofer/system-skills/eai/SKILL.md +365 -0
  179. package/resources/gofer/system-skills/eai-update/SKILL.md +56 -0
  180. package/resources/gofer/system-skills/gofer-documentation/SKILL.md +93 -0
  181. package/resources/gofer/templates/build-map-template.md +64 -0
  182. package/resources/gofer/templates/business-scenarios-template.json +14 -0
  183. package/resources/gofer/templates/ciso-security-summary-template.md +3 -3
  184. package/resources/gofer/templates/context-bundle-template.md +4 -3
  185. package/resources/gofer/templates/contract-pack-template.md +8 -8
  186. package/resources/gofer/templates/cto-architecture-summary-template.md +3 -3
  187. package/resources/gofer/templates/delivery-lineage-template.json +8 -0
  188. package/resources/gofer/templates/eai-preflight-template.md +109 -68
  189. package/resources/gofer/templates/goal-ledger-template.json +1 -1
  190. package/resources/gofer/templates/gofer-model-policy.yaml +28 -6
  191. package/resources/gofer/templates/loop-contract-template.json +3 -1
  192. package/resources/gofer/templates/plan-template.md +8 -7
  193. package/resources/gofer/templates/priority-plan-template.json +29 -0
  194. package/resources/gofer/templates/proposal-review-template.md +6 -3
  195. package/resources/gofer/templates/release-capability-ledger-template.md +24 -0
  196. package/resources/gofer/templates/research-template.md +7 -6
  197. package/resources/gofer/templates/spec-summary-template.md +1 -1
  198. package/resources/gofer/templates/spec-template.md +45 -6
  199. package/resources/gofer/templates/tasks-template.md +12 -3
  200. package/resources/gofer/templates/ui-preview-brief-template.md +55 -5
  201. package/resources/gofer/templates/ui-review-log-template.md +21 -3
  202. package/resources/gofer/templates/ui-show-and-tell-template.md +46 -0
  203. package/resources/gofer/templates/visuals/capability-heatmap-template.md +2 -2
  204. package/resources/gofer/templates/working-backwards-prfaq-template.md +9 -8
  205. package/resources/linked-sources.json +4 -4
  206. package/resources/gofer/agents-skills/0_gofer_start/SKILL.md +0 -1287
  207. package/resources/gofer/agents-skills/0a_problem_validation/SKILL.md +0 -429
  208. package/resources/gofer/agents-skills/10_gofer_cloud/SKILL.md +0 -635
  209. package/resources/gofer/agents-skills/1_gofer_research/SKILL.md +0 -1159
  210. package/resources/gofer/agents-skills/2_gofer_specify/SKILL.md +0 -860
  211. package/resources/gofer/agents-skills/3_gofer_plan/SKILL.md +0 -899
  212. package/resources/gofer/agents-skills/4_gofer_tasks/SKILL.md +0 -760
  213. package/resources/gofer/agents-skills/5_gofer_implement/SKILL.md +0 -944
  214. package/resources/gofer/agents-skills/6_gofer_validate/SKILL.md +0 -2302
  215. package/resources/gofer/agents-skills/7_gofer_save/SKILL.md +0 -423
  216. package/resources/gofer/agents-skills/7a_stakeholder_comms/SKILL.md +0 -508
  217. package/resources/gofer/agents-skills/8_gofer_branding/SKILL.md +0 -315
  218. package/resources/gofer/agents-skills/9_gofer_tests/SKILL.md +0 -558
  219. package/resources/gofer/agents-skills/gofer_bootstrap_workspace/SKILL.md +0 -148
  220. package/resources/gofer/agents-skills/gofer_check_workspace/SKILL.md +0 -119
  221. package/resources/gofer/agents-skills/gofer_constitution/SKILL.md +0 -612
  222. package/resources/gofer/agents-skills/gofer_diagnose/SKILL.md +0 -114
  223. package/resources/gofer/agents-skills/gofer_eai_first_run/SKILL.md +0 -397
  224. package/resources/gofer/agents-skills/gofer_hydrate/SKILL.md +0 -561
  225. package/resources/gofer/agents-skills/gofer_personality/SKILL.md +0 -44
  226. package/resources/gofer/agents-skills/gofer_plan/SKILL.md +0 -40
  227. package/resources/gofer/agents-skills/gofer_side/SKILL.md +0 -45
  228. package/resources/gofer/agents-skills/gofer_spec_summary/SKILL.md +0 -112
  229. package/resources/gofer/agents-skills/gofer_tdd/SKILL.md +0 -112
  230. package/resources/gofer/agents-skills/gofer_vocabulary/SKILL.md +0 -112
  231. package/resources/gofer/agents-skills/gofer_zoom_out/SKILL.md +0 -112
  232. package/resources/gofer/claude-commands/0_gofer_start.md +0 -1282
  233. package/resources/gofer/claude-commands/0a_problem_validation.md +0 -424
  234. package/resources/gofer/claude-commands/10_gofer_cloud.md +0 -630
  235. package/resources/gofer/claude-commands/1_gofer_research.md +0 -1154
  236. package/resources/gofer/claude-commands/2_gofer_specify.md +0 -855
  237. package/resources/gofer/claude-commands/3_gofer_plan.md +0 -894
  238. package/resources/gofer/claude-commands/4_gofer_tasks.md +0 -755
  239. package/resources/gofer/claude-commands/5_gofer_implement.md +0 -939
  240. package/resources/gofer/claude-commands/6_gofer_validate.md +0 -2297
  241. package/resources/gofer/claude-commands/7_gofer_save.md +0 -418
  242. package/resources/gofer/claude-commands/7a_stakeholder_comms.md +0 -503
  243. package/resources/gofer/claude-commands/8_gofer_branding.md +0 -310
  244. package/resources/gofer/claude-commands/9_gofer_tests.md +0 -553
  245. package/resources/gofer/claude-commands/gofer_bootstrap_workspace.md +0 -143
  246. package/resources/gofer/claude-commands/gofer_check_workspace.md +0 -114
  247. package/resources/gofer/claude-commands/gofer_constitution.md +0 -607
  248. package/resources/gofer/claude-commands/gofer_diagnose.md +0 -109
  249. package/resources/gofer/claude-commands/gofer_eai_first_run.md +0 -392
  250. package/resources/gofer/claude-commands/gofer_hydrate.md +0 -556
  251. package/resources/gofer/claude-commands/gofer_personality.md +0 -39
  252. package/resources/gofer/claude-commands/gofer_plan.md +0 -35
  253. package/resources/gofer/claude-commands/gofer_side.md +0 -40
  254. package/resources/gofer/claude-commands/gofer_spec_summary.md +0 -107
  255. package/resources/gofer/claude-commands/gofer_tdd.md +0 -107
  256. package/resources/gofer/claude-commands/gofer_vocabulary.md +0 -107
  257. package/resources/gofer/claude-commands/gofer_zoom_out.md +0 -107
  258. package/resources/gofer/claude-skills/eai-gofer/SKILL.md +0 -56
  259. package/resources/gofer/copilot-prompts/0_gofer_start.prompt.md +0 -1308
  260. package/resources/gofer/copilot-prompts/0a_problem_validation.prompt.md +0 -429
  261. package/resources/gofer/copilot-prompts/10_gofer_cloud.prompt.md +0 -644
  262. package/resources/gofer/copilot-prompts/1_gofer_research.prompt.md +0 -1177
  263. package/resources/gofer/copilot-prompts/2_gofer_specify.prompt.md +0 -878
  264. package/resources/gofer/copilot-prompts/3_gofer_plan.prompt.md +0 -917
  265. package/resources/gofer/copilot-prompts/4_gofer_tasks.prompt.md +0 -778
  266. package/resources/gofer/copilot-prompts/5_gofer_implement.prompt.md +0 -962
  267. package/resources/gofer/copilot-prompts/6_gofer_validate.prompt.md +0 -2310
  268. package/resources/gofer/copilot-prompts/7_gofer_save.prompt.md +0 -433
  269. package/resources/gofer/copilot-prompts/7a_stakeholder_comms.prompt.md +0 -516
  270. package/resources/gofer/copilot-prompts/8_gofer_branding.prompt.md +0 -323
  271. package/resources/gofer/copilot-prompts/9_gofer_tests.prompt.md +0 -566
  272. package/resources/gofer/copilot-prompts/gofer_bootstrap_workspace.prompt.md +0 -161
  273. package/resources/gofer/copilot-prompts/gofer_check_workspace.prompt.md +0 -132
  274. package/resources/gofer/copilot-prompts/gofer_constitution.prompt.md +0 -621
  275. package/resources/gofer/copilot-prompts/gofer_diagnose.prompt.md +0 -127
  276. package/resources/gofer/copilot-prompts/gofer_eai_first_run.prompt.md +0 -410
  277. package/resources/gofer/copilot-prompts/gofer_hydrate.prompt.md +0 -571
  278. package/resources/gofer/copilot-prompts/gofer_personality.prompt.md +0 -57
  279. package/resources/gofer/copilot-prompts/gofer_plan.prompt.md +0 -53
  280. package/resources/gofer/copilot-prompts/gofer_side.prompt.md +0 -58
  281. package/resources/gofer/copilot-prompts/gofer_spec_summary.prompt.md +0 -125
  282. package/resources/gofer/copilot-prompts/gofer_tdd.prompt.md +0 -125
  283. package/resources/gofer/copilot-prompts/gofer_vocabulary.prompt.md +0 -125
  284. package/resources/gofer/copilot-prompts/gofer_zoom_out.prompt.md +0 -125
  285. package/resources/gofer/gemini/commands/gofer/0_gofer_start.md +0 -1282
  286. package/resources/gofer/gemini/commands/gofer/0_gofer_start.toml +0 -2
  287. package/resources/gofer/gemini/commands/gofer/0a_problem_validation.md +0 -424
  288. package/resources/gofer/gemini/commands/gofer/0a_problem_validation.toml +0 -2
  289. package/resources/gofer/gemini/commands/gofer/10_gofer_cloud.md +0 -630
  290. package/resources/gofer/gemini/commands/gofer/10_gofer_cloud.toml +0 -2
  291. package/resources/gofer/gemini/commands/gofer/1_gofer_research.md +0 -1154
  292. package/resources/gofer/gemini/commands/gofer/1_gofer_research.toml +0 -2
  293. package/resources/gofer/gemini/commands/gofer/2_gofer_specify.md +0 -855
  294. package/resources/gofer/gemini/commands/gofer/2_gofer_specify.toml +0 -2
  295. package/resources/gofer/gemini/commands/gofer/3_gofer_plan.md +0 -894
  296. package/resources/gofer/gemini/commands/gofer/3_gofer_plan.toml +0 -2
  297. package/resources/gofer/gemini/commands/gofer/4_gofer_tasks.md +0 -755
  298. package/resources/gofer/gemini/commands/gofer/4_gofer_tasks.toml +0 -2
  299. package/resources/gofer/gemini/commands/gofer/5_gofer_implement.md +0 -939
  300. package/resources/gofer/gemini/commands/gofer/5_gofer_implement.toml +0 -2
  301. package/resources/gofer/gemini/commands/gofer/6_gofer_validate.md +0 -2297
  302. package/resources/gofer/gemini/commands/gofer/6_gofer_validate.toml +0 -2
  303. package/resources/gofer/gemini/commands/gofer/7_gofer_save.md +0 -418
  304. package/resources/gofer/gemini/commands/gofer/7_gofer_save.toml +0 -2
  305. package/resources/gofer/gemini/commands/gofer/7a_stakeholder_comms.md +0 -503
  306. package/resources/gofer/gemini/commands/gofer/7a_stakeholder_comms.toml +0 -2
  307. package/resources/gofer/gemini/commands/gofer/8_gofer_branding.md +0 -310
  308. package/resources/gofer/gemini/commands/gofer/8_gofer_branding.toml +0 -2
  309. package/resources/gofer/gemini/commands/gofer/9_gofer_tests.md +0 -553
  310. package/resources/gofer/gemini/commands/gofer/9_gofer_tests.toml +0 -2
  311. package/resources/gofer/gemini/commands/gofer/gofer_bootstrap_workspace.md +0 -143
  312. package/resources/gofer/gemini/commands/gofer/gofer_bootstrap_workspace.toml +0 -2
  313. package/resources/gofer/gemini/commands/gofer/gofer_check_workspace.md +0 -114
  314. package/resources/gofer/gemini/commands/gofer/gofer_check_workspace.toml +0 -2
  315. package/resources/gofer/gemini/commands/gofer/gofer_constitution.md +0 -607
  316. package/resources/gofer/gemini/commands/gofer/gofer_constitution.toml +0 -2
  317. package/resources/gofer/gemini/commands/gofer/gofer_diagnose.md +0 -109
  318. package/resources/gofer/gemini/commands/gofer/gofer_diagnose.toml +0 -2
  319. package/resources/gofer/gemini/commands/gofer/gofer_eai_first_run.md +0 -392
  320. package/resources/gofer/gemini/commands/gofer/gofer_eai_first_run.toml +0 -2
  321. package/resources/gofer/gemini/commands/gofer/gofer_hydrate.md +0 -556
  322. package/resources/gofer/gemini/commands/gofer/gofer_hydrate.toml +0 -2
  323. package/resources/gofer/gemini/commands/gofer/gofer_personality.md +0 -39
  324. package/resources/gofer/gemini/commands/gofer/gofer_personality.toml +0 -2
  325. package/resources/gofer/gemini/commands/gofer/gofer_plan.md +0 -35
  326. package/resources/gofer/gemini/commands/gofer/gofer_plan.toml +0 -2
  327. package/resources/gofer/gemini/commands/gofer/gofer_side.md +0 -40
  328. package/resources/gofer/gemini/commands/gofer/gofer_side.toml +0 -2
  329. package/resources/gofer/gemini/commands/gofer/gofer_spec_summary.md +0 -107
  330. package/resources/gofer/gemini/commands/gofer/gofer_spec_summary.toml +0 -2
  331. package/resources/gofer/gemini/commands/gofer/gofer_tdd.md +0 -107
  332. package/resources/gofer/gemini/commands/gofer/gofer_tdd.toml +0 -2
  333. package/resources/gofer/gemini/commands/gofer/gofer_vocabulary.md +0 -107
  334. package/resources/gofer/gemini/commands/gofer/gofer_vocabulary.toml +0 -2
  335. package/resources/gofer/gemini/commands/gofer/gofer_zoom_out.md +0 -107
  336. package/resources/gofer/gemini/commands/gofer/gofer_zoom_out.toml +0 -2
  337. package/resources/gofer/github-skills/eai-gofer/SKILL.md +0 -56
  338. package/resources/gofer/system-skills/0_gofer_start/SKILL.md +0 -1287
  339. package/resources/gofer/system-skills/0a_problem_validation/SKILL.md +0 -429
  340. package/resources/gofer/system-skills/10_gofer_cloud/SKILL.md +0 -635
  341. package/resources/gofer/system-skills/1_gofer_research/SKILL.md +0 -1159
  342. package/resources/gofer/system-skills/2_gofer_specify/SKILL.md +0 -860
  343. package/resources/gofer/system-skills/3_gofer_plan/SKILL.md +0 -899
  344. package/resources/gofer/system-skills/4_gofer_tasks/SKILL.md +0 -760
  345. package/resources/gofer/system-skills/5_gofer_implement/SKILL.md +0 -944
  346. package/resources/gofer/system-skills/6_gofer_validate/SKILL.md +0 -2302
  347. package/resources/gofer/system-skills/7_gofer_save/SKILL.md +0 -423
  348. package/resources/gofer/system-skills/7a_stakeholder_comms/SKILL.md +0 -508
  349. package/resources/gofer/system-skills/8_gofer_branding/SKILL.md +0 -315
  350. package/resources/gofer/system-skills/9_gofer_tests/SKILL.md +0 -558
  351. package/resources/gofer/system-skills/gofer_bootstrap_workspace/SKILL.md +0 -148
  352. package/resources/gofer/system-skills/gofer_check_workspace/SKILL.md +0 -119
  353. package/resources/gofer/system-skills/gofer_constitution/SKILL.md +0 -612
  354. package/resources/gofer/system-skills/gofer_diagnose/SKILL.md +0 -114
  355. package/resources/gofer/system-skills/gofer_eai_first_run/SKILL.md +0 -397
  356. package/resources/gofer/system-skills/gofer_hydrate/SKILL.md +0 -561
  357. package/resources/gofer/system-skills/gofer_personality/SKILL.md +0 -44
  358. package/resources/gofer/system-skills/gofer_plan/SKILL.md +0 -40
  359. package/resources/gofer/system-skills/gofer_side/SKILL.md +0 -45
  360. package/resources/gofer/system-skills/gofer_spec_summary/SKILL.md +0 -112
  361. package/resources/gofer/system-skills/gofer_tdd/SKILL.md +0 -112
  362. package/resources/gofer/system-skills/gofer_vocabulary/SKILL.md +0 -112
  363. package/resources/gofer/system-skills/gofer_zoom_out/SKILL.md +0 -112
  364. package/resources/gofer/templates/ui-approval-template.md +0 -32
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env node
2
+ import { lstat, open, realpath } from 'node:fs/promises';
3
+ import { constants } from 'node:fs';
4
+ import { createHash } from 'node:crypto';
5
+ import path from 'node:path';
6
+ import { pathToFileURL } from 'node:url';
7
+
8
+ const text = value => typeof value === 'string' && value.trim().length > 0;
9
+ const hash = value => createHash('sha256').update(value).digest('hex');
10
+ const taskId = value => typeof value === 'string' && /^T\d+$/.test(value);
11
+ const MAX_DOCUMENT_BYTES = 4 * 1024 * 1024;
12
+ const MAX_EVIDENCE_BYTES = 64 * 1024 * 1024;
13
+ const MAX_TOTAL_EVIDENCE_BYTES = 128 * 1024 * 1024;
14
+ const MAX_TASKS = 20000;
15
+ const MAX_EDGES = 100000;
16
+ class CheckError extends Error {}
17
+ function namesReceipt(line, receipt) {
18
+ const references = line.matchAll(/`([^`]+)`|\[[^\[\]]*\]\(\s*(?:<([^>]+)>|([^\s)]+))(?:\s+["'][^"']*["'])?\s*\)|\[[^\[\]]*\](?:\[[^\[\]]*\])?|([^\s|`()[\]<>]+)/g);
19
+ return Array.from(references).some(match => (match[1] ?? match[2] ?? match[3] ?? match[4]) === receipt);
20
+ }
21
+ function relative(value) {
22
+ if (!text(value) || value.includes('\\') || value.includes(':') || path.isAbsolute(value) ||
23
+ value.includes('\0') || value.split('/').some(part => part === '..' || part === '.') || /[*?\[\]]/.test(value)) throw new CheckError('UNSAFE_RELATIVE_PATH');
24
+ return value;
25
+ }
26
+ async function read(root, file, digest = false, cache) {
27
+ const target = await realpath(path.resolve(root, relative(file)));
28
+ if (!target.startsWith(root + path.sep)) throw new CheckError('EVIDENCE_OUTSIDE_FEATURE');
29
+ const handle = await open(target, constants.O_RDONLY | (constants.O_NONBLOCK || 0) | (constants.O_NOFOLLOW || 0));
30
+ try {
31
+ const limit = digest ? MAX_EVIDENCE_BYTES : MAX_DOCUMENT_BYTES;
32
+ const stat = await handle.stat();
33
+ if (!stat.isFile() || stat.size > limit) throw new CheckError('INVALID_FILE_TYPE_OR_SIZE');
34
+ const identity = `${stat.ino ? `${stat.dev}:${stat.ino}` : target}:${stat.size}:${stat.mtimeMs}:${stat.ctimeMs}`;
35
+ if (digest && cache?.hashes.has(identity)) return cache.hashes.get(identity);
36
+ if (digest && cache && stat.size + cache.bytes > MAX_TOTAL_EVIDENCE_BYTES) throw new CheckError('TOTAL_EVIDENCE_LIMIT');
37
+ let bytes = 0;
38
+ const chunks = [];
39
+ const sha = createHash('sha256');
40
+ for await (const chunk of handle.createReadStream({ autoClose: false })) {
41
+ bytes += chunk.length;
42
+ if (bytes > limit) throw new CheckError('FILE_SIZE_LIMIT');
43
+ if (digest && cache) {
44
+ cache.bytes += chunk.length;
45
+ if (cache.bytes > MAX_TOTAL_EVIDENCE_BYTES) throw new CheckError('TOTAL_EVIDENCE_LIMIT');
46
+ }
47
+ if (digest) sha.update(chunk); else chunks.push(chunk);
48
+ }
49
+ const result = digest ? sha.digest('hex') : Buffer.concat(chunks);
50
+ if (digest && cache) cache.hashes.set(identity, result);
51
+ return result;
52
+ } finally { await handle.close(); }
53
+ }
54
+
55
+ // Resolve existing parents too: proposed new files can sit below a symlink.
56
+ async function destination(root, file) {
57
+ let candidate = path.resolve(root, relative(file));
58
+ const suffix = [];
59
+ while (true) {
60
+ try {
61
+ const resolved = path.resolve(await realpath(candidate), ...suffix);
62
+ if (resolved !== root && !resolved.startsWith(root + path.sep)) throw new CheckError('EDIT_OUTSIDE_REPOSITORY');
63
+ return resolved;
64
+ } catch (error) {
65
+ if (error.code !== 'ENOENT' || candidate === path.dirname(candidate)) throw error;
66
+ const existing = await lstat(candidate).catch(statError => {
67
+ if (statError.code !== 'ENOENT') throw statError;
68
+ return null;
69
+ });
70
+ if (existing?.isSymbolicLink()) throw new CheckError('DANGLING_EDIT_SYMLINK');
71
+ suffix.unshift(path.basename(candidate));
72
+ candidate = path.dirname(candidate);
73
+ }
74
+ }
75
+ }
76
+
77
+ export async function reviewPriority(featureDir, { task, changedFiles = [], workspaceRoot, finish = false } = {}) {
78
+ const findings = [];
79
+ let nextTask = null;
80
+ let lastInstruction = null;
81
+ let decisionPolicy = 'legacy-recorded-direction';
82
+ try {
83
+ const root = await realpath(featureDir);
84
+ const raw = await read(root, 'priority-plan.json');
85
+ const plan = JSON.parse(raw);
86
+ const spec = await read(root, 'spec.md');
87
+ const decisions = (await read(root, 'decisions.md')).toString('utf8');
88
+ const tasksText = (await read(root, 'tasks.md')).toString('utf8');
89
+ const trace = (await read(root, 'traceability.md')).toString('utf8');
90
+ const tasks = new Map();
91
+ for (const match of tasksText.matchAll(/^\s*-\s+\[([ xX])\]\s+(?:\*\*)?#?(T\d+)\b/gm)) {
92
+ if (tasks.has(match[2])) throw new Error('Duplicate task');
93
+ tasks.set(match[2], match[1].toLowerCase() === 'x');
94
+ }
95
+ if (![1, 2].includes(plan.schemaVersion) || !text(plan.objective) || !text(plan.revision) ||
96
+ !Array.isArray(plan.criticalPath) || !plan.criticalPath.length ||
97
+ new Set(plan.criticalPath).size !== plan.criticalPath.length ||
98
+ plan.criticalPath.some(id => !taskId(id) || !tasks.has(id)) ||
99
+ !plan.tasks || typeof plan.tasks !== 'object' || Array.isArray(plan.tasks)) throw new Error('Invalid priority plan');
100
+ if (plan.schemaVersion === 2 && (!plan.decisionPolicy ||
101
+ plan.decisionPolicy.mode !== 'goal-led' ||
102
+ !Array.isArray(plan.decisionPolicy.askOnlyFor) ||
103
+ !plan.decisionPolicy.askOnlyFor.length)) throw new Error('Invalid goal-led decision policy');
104
+ decisionPolicy = plan.decisionPolicy?.mode ?? decisionPolicy;
105
+ lastInstruction = plan.lastInstruction;
106
+ if (!text(lastInstruction?.id) || !text(lastInstruction?.text) ||
107
+ !decisions.includes(lastInstruction.id) || !decisions.includes(lastInstruction.text)) throw new Error('Latest direction is not recorded in decisions.md');
108
+ if (Object.keys(plan.tasks).length !== tasks.size) throw new Error('Task scope coverage mismatch');
109
+ for (const [id, item] of Object.entries(plan.tasks)) {
110
+ if (!tasks.has(id) || !Array.isArray(item.dependsOn) ||
111
+ item.dependsOn.some(dep => !tasks.has(dep)) || !Array.isArray(item.allowedEditScope) ||
112
+ item.allowedEditScope.some(scope => !relative(scope))) throw new Error('Invalid task dependencies or edit scope');
113
+ if (item.parallelFor !== undefined && (!plan.criticalPath.includes(item.parallelFor) ||
114
+ !text(item.reason) || !text(item.decisionId) || !decisions.includes(item.decisionId) ||
115
+ (item.decisionOwner !== undefined && !['gofer', 'user'].includes(item.decisionOwner)))) throw new Error('Parallel work needs a recorded decision');
116
+ }
117
+ if (tasks.size > MAX_TASKS || Object.values(plan.tasks).reduce((n, item) => n + item.dependsOn.length, 0) > MAX_EDGES) throw new CheckError('TASK_GRAPH_LIMIT');
118
+ const visited = new Set();
119
+ for (const id of tasks.keys()) {
120
+ const stack = [{ id, index: 0 }];
121
+ const visiting = new Set();
122
+ while (stack.length) {
123
+ const current = stack[stack.length - 1];
124
+ if (visited.has(current.id)) { stack.pop(); continue; }
125
+ visiting.add(current.id);
126
+ const deps = plan.tasks[current.id].dependsOn;
127
+ if (current.index === deps.length) {
128
+ visiting.delete(current.id); visited.add(current.id); stack.pop(); continue;
129
+ }
130
+ const dep = deps[current.index++];
131
+ if (visiting.has(dep)) throw new CheckError('CYCLIC_TASK_DEPENDENCIES');
132
+ if (!visited.has(dep)) stack.push({ id: dep, index: 0 });
133
+ }
134
+ }
135
+ const critical = plan.criticalPath.find(id => !tasks.get(id));
136
+ nextTask = critical || null;
137
+ while (nextTask) {
138
+ const dependency = plan.tasks[nextTask].dependsOn.find(dep => !tasks.get(dep));
139
+ if (!dependency) break;
140
+ nextTask = dependency;
141
+ }
142
+ for (const [id, complete] of tasks) {
143
+ if (complete && plan.tasks[id].dependsOn.some(dep => !tasks.get(dep))) findings.push(`UNFINISHED_DEPENDENCY:${id}`);
144
+ }
145
+ if (task !== undefined) {
146
+ if (!taskId(task) || !tasks.has(task) || tasks.get(task)) throw new Error('Unknown or completed task');
147
+ const item = plan.tasks[task];
148
+ if (item.dependsOn.some(dep => !tasks.get(dep))) findings.push('TASK_DEPENDENCIES_OPEN');
149
+ if (critical && task !== nextTask && item.parallelFor !== critical) findings.push('TASK_NOT_ON_APPROVED_PATH');
150
+ if (changedFiles.length && !text(workspaceRoot)) throw new CheckError('WORKSPACE_ROOT_REQUIRED');
151
+ const workspace = changedFiles.length ? await realpath(workspaceRoot) : null;
152
+ for (const file of changedFiles) {
153
+ relative(file);
154
+ const actual = await destination(workspace, file);
155
+ const inScope = candidate => item.allowedEditScope.some(scope => scope.endsWith('/') ? candidate.startsWith(scope) : candidate === scope);
156
+ const resolvedRelative = path.relative(workspace, actual).split(path.sep).join('/');
157
+ const allowed = inScope(file) && inScope(resolvedRelative);
158
+ if (!allowed) findings.push(`EDIT_OUTSIDE_SCOPE:${file}`);
159
+ }
160
+ } else if (changedFiles.length) throw new Error('Changed files need a task');
161
+ const outcome = plan.outcome;
162
+ if (!text(outcome?.id) || !text(outcome?.statement) || !text(outcome?.target?.environment) ||
163
+ !text(outcome?.target?.revision) || !Array.isArray(outcome?.requirements) || !outcome.requirements.length ||
164
+ outcome.requirements.some(id => typeof id !== 'string' || !/^(FR|NFR|SC)-\d+$/.test(id) || !new RegExp(`\\b${id}\\b`).test(spec))) throw new Error('Invalid outcome definition');
165
+ relative(outcome.receipt);
166
+ if (finish) {
167
+ if (critical) findings.push('PRIORITY_TASKS_OPEN');
168
+ const receipt = JSON.parse(await read(root, outcome.receipt));
169
+ if (receipt.result !== 'pass' || receipt.outcomeId !== outcome.id || receipt.planHash !== hash(raw) ||
170
+ receipt.specHash !== hash(spec) || receipt.target?.environment !== outcome.target.environment ||
171
+ receipt.target?.revision !== outcome.target.revision || !Array.isArray(receipt.requirements) ||
172
+ outcome.requirements.some(id => !receipt.requirements.includes(id)) ||
173
+ !Array.isArray(receipt.checks) || !receipt.checks.length) throw new Error('Outcome evidence is stale or does not match the target');
174
+ if (receipt.checks.length > 1000) throw new CheckError('OUTCOME_CHECK_LIMIT');
175
+ const evidenceCache = { hashes: new Map(), bytes: 0 };
176
+ for (const check of receipt.checks) {
177
+ relative(check.evidence);
178
+ if (check.result !== 'pass' || !text(check.command) || await read(root, check.evidence, true, evidenceCache) !== check.sha256) throw new CheckError('OUTCOME_CHECK_INVALID');
179
+ }
180
+ for (const id of outcome.requirements) {
181
+ if (!trace.split('\n').some(line => new RegExp(`\\b${id}\\b`).test(line) && namesReceipt(line, outcome.receipt))) findings.push(`OUTCOME_TRACE_MISSING:${id}`);
182
+ }
183
+ }
184
+ } catch (error) { findings.push(`PRIORITY_CHECK_INVALID:${error instanceof CheckError ? error.message : 'INVALID_INPUT_OR_EVIDENCE'}`); }
185
+ return { status: findings.length ? 'fail' : 'pass', findings, nextTask, lastInstruction,
186
+ decisionPolicy,
187
+ outcomeStatus: finish ? (findings.length ? 'unverified' : 'verified_record') : 'not_checked',
188
+ coverage: 'Recorded direction, scope and evidence integrity only. Does not intercept host tools, authenticate approval or independently prove deployment.' };
189
+ }
190
+
191
+ async function main() {
192
+ const args = process.argv.slice(2);
193
+ if (args.includes('--help')) { console.log('Usage: gofer-priority-check.mjs --feature-dir <path> [--task T001] [--workspace <repo-root> --changed-file relative/path] [--finish]'); return; }
194
+ const options = { changedFiles: [] };
195
+ let dir;
196
+ for (let i = 0; i < args.length; i++) {
197
+ const flag = args[i];
198
+ if (flag === '--finish') options.finish = true;
199
+ else if (['--feature-dir', '--task', '--changed-file', '--workspace'].includes(flag) && args[i + 1] && !args[i + 1].startsWith('--')) {
200
+ const value = args[++i];
201
+ if (flag === '--feature-dir') dir = value;
202
+ else if (flag === '--task') options.task = value;
203
+ else if (flag === '--workspace') options.workspaceRoot = value;
204
+ else options.changedFiles.push(value);
205
+ } else throw new Error('Invalid arguments');
206
+ }
207
+ if (!dir) throw new Error('Feature directory is required');
208
+ const result = await reviewPriority(dir, options);
209
+ console.log(JSON.stringify(result, null, 2));
210
+ if (result.status !== 'pass') process.exitCode = 1;
211
+ }
212
+ if (process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
213
+ main().catch(() => { console.error('Priority check failed. Check the local plan and arguments.'); process.exitCode = 1; });
214
+ }
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ import { readFile } from 'node:fs/promises';
3
+ import { resolve } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+
6
+ const BUSINESS_UPDATE_FIELDS = ['Recommendation', 'Why', 'Next step', 'Owner', 'User action'];
7
+
8
+ export function checkResponse(text, { kind = 'progress', previous = '', technical = false, businessUpdate = false } = {}) {
9
+ const findings = [];
10
+ if (typeof text !== 'string' || !text.trim()) findings.push('EMPTY_REPLY');
11
+ const prose = String(text ?? '').replace(/```[\s\S]*?```/g, '');
12
+ const words = prose.trim().split(/\s+/).filter(Boolean);
13
+ if (!technical) {
14
+ if (/```/.test(text)) findings.push('TECHNICAL_BLOCK_IN_BUSINESS_REPLY');
15
+ if (words.length > (kind === 'progress' ? 90 : 250)) findings.push('TOO_LONG');
16
+ const jargon = /\b(fixture(?:s| pool)?|CRUD|tenant-boundary proof|matched serial-versus-parallel benchmark|OBO|idempotent|serializer)\b/gi;
17
+ if (jargon.test(prose)) findings.push('EXPLAIN_IN_BUSINESS_WORDS');
18
+ if (/\b(?:npm|gh|curl|node)\s+(?:run|api|install|\.specify)/.test(prose)) findings.push('MOVE_COMMAND_TO_EVIDENCE');
19
+ if (prose.split(/(?<=[.!?])\s+/).some(s => s.split(/\s+/).length > 35)) findings.push('SPLIT_LONG_SENTENCE');
20
+ }
21
+ if (businessUpdate) {
22
+ for (const field of BUSINESS_UPDATE_FIELDS) {
23
+ const heading = new RegExp(`^[ \\t]*(?:[-*][ \\t]*)?(?:\\*\\*)?${field}(?:\\*\\*)?:[ \\t]*\\S`, 'im');
24
+ if (!heading.test(prose)) findings.push(`BUSINESS_UPDATE_FIELD_MISSING:${field.toUpperCase().replace(/ /g, '_')}`);
25
+ }
26
+ }
27
+ const normalize = value => value.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();
28
+ if (kind === 'progress' && previous && normalize(previous) === normalize(prose)) findings.push('REPEATED_UPDATE');
29
+ return { status: findings.length ? 'fail' : 'pass', findings, wordCount: words.length,
30
+ scope: 'Mechanical writing checks only; meaning, accuracy, and host delivery still need review.' };
31
+ }
32
+
33
+ async function main() {
34
+ const args = process.argv.slice(2);
35
+ if (args.includes('--help')) {
36
+ console.log('Usage: gofer-response-check.mjs --input <draft-file> [--kind progress|answer] [--previous <file>] [--technical] [--business-update]');
37
+ return;
38
+ }
39
+ const values = {};
40
+ for (let i = 0; i < args.length; i++) {
41
+ if (args[i] === '--technical') values.technical = true;
42
+ else if (args[i] === '--business-update') values.businessUpdate = true;
43
+ else if (['--input', '--kind', '--previous'].includes(args[i]) && args[i + 1] && !args[i + 1].startsWith('--')) values[args[i].slice(2)] = args[++i];
44
+ else throw new Error('Unknown or missing argument');
45
+ }
46
+ if (!values.input || (values.kind && !['progress', 'answer'].includes(values.kind))) throw new Error('Input file and a valid reply kind are required');
47
+ const result = checkResponse(await readFile(values.input, 'utf8'), {
48
+ ...values, previous: values.previous ? await readFile(values.previous, 'utf8') : '',
49
+ });
50
+ console.log(JSON.stringify(result, null, 2));
51
+ if (result.status === 'fail') process.exitCode = 1;
52
+ }
53
+
54
+ if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) {
55
+ main().catch(() => { console.error('Response check failed. Check the arguments and local input files.'); process.exitCode = 1; });
56
+ }