@enterpriseai/cli 3.19.0 → 3.19.1

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 (362) hide show
  1. package/package.json +1 -1
  2. package/resources/gofer/.gofer-version +4 -357
  3. package/resources/gofer/agents-skills/eai/SKILL.md +365 -0
  4. package/resources/gofer/agents-skills/eai-update/SKILL.md +56 -0
  5. package/resources/gofer/agents-skills/gofer-documentation/SKILL.md +93 -0
  6. package/resources/gofer/bash-scripts/create-new-feature.sh +3 -1
  7. package/resources/gofer/bash-scripts/sync-implementation-status.sh +4 -3
  8. package/resources/gofer/bash-scripts/update-agent-context.sh +7 -8
  9. package/resources/gofer/bash-scripts/validate-artifact.sh +10 -6
  10. package/resources/gofer/bash-scripts/verify-object-type-routing-workspace.sh +184 -0
  11. package/resources/gofer/claude-commands/eai-update.md +46 -0
  12. package/resources/gofer/claude-commands/eai.md +355 -0
  13. package/resources/gofer/claude-skills/eai/SKILL.md +365 -0
  14. package/resources/gofer/claude-skills/eai-update/SKILL.md +56 -0
  15. package/resources/gofer/claude-skills/gofer-documentation/SKILL.md +93 -0
  16. package/resources/gofer/commands/0_gofer_start.md +440 -99
  17. package/resources/gofer/commands/0a_problem_validation.md +187 -27
  18. package/resources/gofer/commands/10_gofer_cloud.md +183 -23
  19. package/resources/gofer/commands/1_gofer_research.md +239 -30
  20. package/resources/gofer/commands/2_gofer_specify.md +239 -35
  21. package/resources/gofer/commands/3_gofer_plan.md +259 -43
  22. package/resources/gofer/commands/4_gofer_tasks.md +401 -81
  23. package/resources/gofer/commands/5_gofer_implement.md +375 -84
  24. package/resources/gofer/commands/6_gofer_validate.md +284 -53
  25. package/resources/gofer/commands/7_gofer_save.md +187 -26
  26. package/resources/gofer/commands/7a_stakeholder_comms.md +183 -23
  27. package/resources/gofer/commands/8_gofer_branding.md +183 -23
  28. package/resources/gofer/commands/9_gofer_tests.md +212 -23
  29. package/resources/gofer/commands/gofer_bootstrap_workspace.md +121 -8
  30. package/resources/gofer/commands/gofer_check_workspace.md +123 -8
  31. package/resources/gofer/commands/gofer_constitution.md +183 -23
  32. package/resources/gofer/commands/gofer_diagnose.md +183 -23
  33. package/resources/gofer/commands/gofer_eai_first_run.md +254 -25
  34. package/resources/gofer/commands/gofer_hydrate.md +183 -23
  35. package/resources/gofer/commands/gofer_personality.md +117 -6
  36. package/resources/gofer/commands/gofer_plan.md +117 -6
  37. package/resources/gofer/commands/gofer_side.md +117 -6
  38. package/resources/gofer/commands/gofer_spec_summary.md +183 -23
  39. package/resources/gofer/commands/gofer_tdd.md +183 -23
  40. package/resources/gofer/commands/gofer_vocabulary.md +185 -25
  41. package/resources/gofer/commands/gofer_zoom_out.md +183 -23
  42. package/resources/gofer/config/typesafe-learning-review.json +16 -0
  43. package/resources/gofer/config/typesafe-semantic-review.json +9 -0
  44. package/resources/gofer/copilot-instructions/gofer-cost.instructions.md +15 -6
  45. package/resources/gofer/copilot-instructions/typescript.instructions.md +1 -1
  46. package/resources/gofer/copilot-prompts/eai-update.prompt.md +58 -0
  47. package/resources/gofer/copilot-prompts/eai.prompt.md +367 -0
  48. package/resources/gofer/gemini/commands/gofer/eai-update.md +22 -0
  49. package/resources/gofer/gemini/commands/gofer/eai-update.toml +2 -0
  50. package/resources/gofer/gemini/commands/gofer/eai.md +357 -0
  51. package/resources/gofer/gemini/commands/gofer/eai.toml +2 -0
  52. package/resources/gofer/gemini/commands/gofer/manifest.json +3 -27
  53. package/resources/gofer/gemini/extension.json +4 -4
  54. package/resources/gofer/github-agents/eai.agent.md +83 -0
  55. package/resources/gofer/github-agents/gofer-business.agent.md +73 -4
  56. package/resources/gofer/github-agents/gofer-implement.agent.md +71 -2
  57. package/resources/gofer/github-agents/gofer-plan.agent.md +72 -2
  58. package/resources/gofer/github-agents/gofer-research.agent.md +72 -2
  59. package/resources/gofer/github-agents/gofer-validate.agent.md +72 -2
  60. package/resources/gofer/github-skills/eai/SKILL.md +365 -0
  61. package/resources/gofer/github-skills/eai-update/SKILL.md +56 -0
  62. package/resources/gofer/github-skills/gofer-documentation/SKILL.md +93 -0
  63. package/resources/gofer/grok-skills/eai/SKILL.md +267 -14
  64. package/resources/gofer/grok-skills/eai-update/SKILL.md +56 -0
  65. package/resources/gofer/hook-scripts/user-prompt-submit.mjs +58 -13
  66. package/resources/gofer/instruction-templates/base/agents-base.md +8 -4
  67. package/resources/gofer/instruction-templates/gofer/gofer-claude.md +7 -5
  68. package/resources/gofer/instruction-templates/gofer/gofer-copilot.md +10 -8
  69. package/resources/gofer/memory/constitution.md +9 -7
  70. package/resources/gofer/memory/gofer-model-policy.yaml +23 -1
  71. package/resources/gofer/memory/lessons.md +0 -31
  72. package/resources/gofer/node-scripts/canonical-descriptions.mjs +1 -1
  73. package/resources/gofer/node-scripts/check-version-alignment.mjs +4 -7
  74. package/resources/gofer/node-scripts/delivery-lineage-corpus.mjs +156 -0
  75. package/resources/gofer/node-scripts/generate-commands.mjs +1073 -265
  76. package/resources/gofer/node-scripts/gofer-acceptance-check.mjs +143 -0
  77. package/resources/gofer/node-scripts/gofer-agent-catalog.mjs +271 -0
  78. package/resources/gofer/node-scripts/gofer-benchmark-executor.mjs +123 -0
  79. package/resources/gofer/node-scripts/gofer-benchmark-sign.mjs +62 -0
  80. package/resources/gofer/node-scripts/gofer-benchmark-signer.mjs +89 -0
  81. package/resources/gofer/node-scripts/gofer-benchmark.mjs +76 -0
  82. package/resources/gofer/node-scripts/gofer-blocker-control.mjs +274 -0
  83. package/resources/gofer/node-scripts/gofer-claude-adapter.mjs +154 -0
  84. package/resources/gofer/node-scripts/gofer-closed-loop-audit.mjs +19 -2
  85. package/resources/gofer/node-scripts/gofer-delivery-check.mjs +121 -0
  86. package/resources/gofer/node-scripts/gofer-encrypted-key.mjs +58 -0
  87. package/resources/gofer/node-scripts/gofer-execution-metrics.mjs +477 -0
  88. package/resources/gofer/node-scripts/gofer-execution-recovery.mjs +334 -0
  89. package/resources/gofer/node-scripts/gofer-grok-adapter.mjs +184 -0
  90. package/resources/gofer/node-scripts/gofer-heldout-corpus.mjs +73 -0
  91. package/resources/gofer/node-scripts/gofer-heldout-snapshot.mjs +286 -0
  92. package/resources/gofer/node-scripts/gofer-heldout-verifier.mjs +211 -0
  93. package/resources/gofer/node-scripts/gofer-host-capability.mjs +335 -0
  94. package/resources/gofer/node-scripts/gofer-independent-reviewer.mjs +130 -0
  95. package/resources/gofer/node-scripts/gofer-live-routing.mjs +109 -0
  96. package/resources/gofer/node-scripts/gofer-local-capability-issuer.mjs +71 -0
  97. package/resources/gofer/node-scripts/gofer-local-isolation.mjs +175 -0
  98. package/resources/gofer/node-scripts/gofer-local-settings-cleanup.mjs +388 -0
  99. package/resources/gofer/node-scripts/gofer-loop-audit.mjs +54 -3
  100. package/resources/gofer/node-scripts/gofer-native-adapter.mjs +567 -0
  101. package/resources/gofer/node-scripts/gofer-native-benchmark-dispatch.mjs +145 -0
  102. package/resources/gofer/node-scripts/gofer-native-runtime.mjs +169 -0
  103. package/resources/gofer/node-scripts/gofer-pre-edit-check.mjs +204 -0
  104. package/resources/gofer/node-scripts/gofer-priority-check.mjs +214 -0
  105. package/resources/gofer/node-scripts/gofer-response-check.mjs +56 -0
  106. package/resources/gofer/node-scripts/gofer-reviewed-learning.mjs +1232 -0
  107. package/resources/gofer/node-scripts/gofer-run-verified-task.mjs +330 -0
  108. package/resources/gofer/node-scripts/gofer-runtime-ledger.mjs +289 -0
  109. package/resources/gofer/node-scripts/gofer-semantic-drift.mjs +584 -0
  110. package/resources/gofer/node-scripts/gofer-surface-update.mjs +1178 -0
  111. package/resources/gofer/node-scripts/gofer-trust-bootstrap.mjs +77 -0
  112. package/resources/gofer/node-scripts/gofer-trusted-benchmark.mjs +102 -0
  113. package/resources/gofer/node-scripts/gofer-trusted-evaluator.mjs +274 -0
  114. package/resources/gofer/node-scripts/gofer-tty-prompt.mjs +34 -0
  115. package/resources/gofer/node-scripts/gofer-typesafe-credentials.mjs +435 -0
  116. package/resources/gofer/node-scripts/gofer-ui-preview.mjs +1212 -0
  117. package/resources/gofer/node-scripts/gofer-verified-execution.mjs +484 -0
  118. package/resources/gofer/node-scripts/gofer-verifier-key-ceremony.mjs +101 -0
  119. package/resources/gofer/node-scripts/gofer-worktree-layout.mjs +32 -0
  120. package/resources/gofer/node-scripts/object-type-routing-phase-bundle.mjs +360 -0
  121. package/resources/gofer/node-scripts/package-agent-plugin.mjs +574 -82
  122. package/resources/gofer/node-scripts/parse-stage-command.mjs +1 -1
  123. package/resources/gofer/node-scripts/render-delivery-lineage.mjs +178 -0
  124. package/resources/gofer/node-scripts/sync-extension-resources.mjs +78 -2
  125. package/resources/gofer/node-scripts/validate-object-type-identifiers.mjs +767 -0
  126. package/resources/gofer/node-scripts/validate-object-type-routing-workspace.mjs +1325 -0
  127. package/resources/gofer/node-scripts/validate-v4-resource-contract.d.mts +44 -0
  128. package/resources/gofer/node-scripts/validate-v4-resource-contract.mjs +957 -0
  129. package/resources/gofer/node-scripts/workspace-bootstrap-lib.mjs +685 -116
  130. package/resources/gofer/references/agent-catalog.json +126 -0
  131. package/resources/gofer/references/blocker-mediation.md +156 -0
  132. package/resources/gofer/references/business-updates-and-goal-checks.md +109 -0
  133. package/resources/gofer/references/delivery-lineage.md +48 -0
  134. package/resources/gofer/references/mvp-capability-validation.md +102 -0
  135. package/resources/gofer/references/platform/README.md +1 -1
  136. package/resources/gofer/references/platform/eai-app-template.md +15 -13
  137. package/resources/gofer/references/platform/eai-auth-access.md +104 -0
  138. package/resources/gofer/references/platform/eai-config-driven-ui.md +5 -5
  139. package/resources/gofer/references/platform/eai-error-catalog.yaml +77 -19
  140. package/resources/gofer/references/platform/eai-repo-contract.md +61 -23
  141. package/resources/gofer/references/platform/eai-service-patterns.md +102 -105
  142. package/resources/gofer/references/platform/eai.md +44 -8
  143. package/resources/gofer/references/platform/vertical-template.md +10 -9
  144. package/resources/gofer/references/priority-outcome-protection.md +152 -0
  145. package/resources/gofer/references/verified-agent-execution.md +179 -0
  146. package/resources/gofer/schemas/gofer-learning-trace-v1.json +70 -0
  147. package/resources/gofer/specify-commands/0_gofer_start.md +440 -99
  148. package/resources/gofer/specify-commands/0a_problem_validation.md +187 -27
  149. package/resources/gofer/specify-commands/10_gofer_cloud.md +183 -23
  150. package/resources/gofer/specify-commands/1_gofer_research.md +239 -30
  151. package/resources/gofer/specify-commands/2_gofer_specify.md +239 -35
  152. package/resources/gofer/specify-commands/3_gofer_plan.md +259 -43
  153. package/resources/gofer/specify-commands/4_gofer_tasks.md +401 -81
  154. package/resources/gofer/specify-commands/5_gofer_implement.md +375 -84
  155. package/resources/gofer/specify-commands/6_gofer_validate.md +284 -53
  156. package/resources/gofer/specify-commands/7_gofer_save.md +187 -26
  157. package/resources/gofer/specify-commands/7a_stakeholder_comms.md +183 -23
  158. package/resources/gofer/specify-commands/8_gofer_branding.md +183 -23
  159. package/resources/gofer/specify-commands/9_gofer_tests.md +212 -23
  160. package/resources/gofer/specify-commands/gofer_bootstrap_workspace.md +121 -8
  161. package/resources/gofer/specify-commands/gofer_check_workspace.md +123 -8
  162. package/resources/gofer/specify-commands/gofer_constitution.md +183 -23
  163. package/resources/gofer/specify-commands/gofer_diagnose.md +183 -23
  164. package/resources/gofer/specify-commands/gofer_eai_first_run.md +254 -25
  165. package/resources/gofer/specify-commands/gofer_hydrate.md +183 -23
  166. package/resources/gofer/specify-commands/gofer_personality.md +117 -6
  167. package/resources/gofer/specify-commands/gofer_plan.md +117 -6
  168. package/resources/gofer/specify-commands/gofer_side.md +117 -6
  169. package/resources/gofer/specify-commands/gofer_spec_summary.md +183 -23
  170. package/resources/gofer/specify-commands/gofer_tdd.md +183 -23
  171. package/resources/gofer/specify-commands/gofer_vocabulary.md +185 -25
  172. package/resources/gofer/specify-commands/gofer_zoom_out.md +183 -23
  173. package/resources/gofer/specify-config/object-type-routing.json +24 -0
  174. package/resources/gofer/specify-config/typesafe-learning-review.json +16 -0
  175. package/resources/gofer/specify-config/typesafe-semantic-review.json +9 -0
  176. package/resources/gofer/system-skills/eai/SKILL.md +365 -0
  177. package/resources/gofer/system-skills/eai-update/SKILL.md +56 -0
  178. package/resources/gofer/system-skills/gofer-documentation/SKILL.md +93 -0
  179. package/resources/gofer/templates/build-map-template.md +64 -0
  180. package/resources/gofer/templates/business-scenarios-template.json +14 -0
  181. package/resources/gofer/templates/ciso-security-summary-template.md +3 -3
  182. package/resources/gofer/templates/context-bundle-template.md +4 -3
  183. package/resources/gofer/templates/contract-pack-template.md +8 -8
  184. package/resources/gofer/templates/cto-architecture-summary-template.md +3 -3
  185. package/resources/gofer/templates/delivery-lineage-template.json +8 -0
  186. package/resources/gofer/templates/eai-preflight-template.md +109 -68
  187. package/resources/gofer/templates/goal-ledger-template.json +1 -1
  188. package/resources/gofer/templates/gofer-model-policy.yaml +28 -6
  189. package/resources/gofer/templates/loop-contract-template.json +3 -1
  190. package/resources/gofer/templates/plan-template.md +8 -7
  191. package/resources/gofer/templates/priority-plan-template.json +29 -0
  192. package/resources/gofer/templates/proposal-review-template.md +6 -3
  193. package/resources/gofer/templates/release-capability-ledger-template.md +24 -0
  194. package/resources/gofer/templates/research-template.md +7 -6
  195. package/resources/gofer/templates/spec-summary-template.md +1 -1
  196. package/resources/gofer/templates/spec-template.md +45 -6
  197. package/resources/gofer/templates/tasks-template.md +12 -3
  198. package/resources/gofer/templates/ui-preview-brief-template.md +55 -5
  199. package/resources/gofer/templates/ui-review-log-template.md +21 -3
  200. package/resources/gofer/templates/ui-show-and-tell-template.md +46 -0
  201. package/resources/gofer/templates/visuals/capability-heatmap-template.md +2 -2
  202. package/resources/gofer/templates/working-backwards-prfaq-template.md +9 -8
  203. package/resources/linked-sources.json +2 -2
  204. package/resources/gofer/agents-skills/0_gofer_start/SKILL.md +0 -1287
  205. package/resources/gofer/agents-skills/0a_problem_validation/SKILL.md +0 -429
  206. package/resources/gofer/agents-skills/10_gofer_cloud/SKILL.md +0 -635
  207. package/resources/gofer/agents-skills/1_gofer_research/SKILL.md +0 -1159
  208. package/resources/gofer/agents-skills/2_gofer_specify/SKILL.md +0 -860
  209. package/resources/gofer/agents-skills/3_gofer_plan/SKILL.md +0 -899
  210. package/resources/gofer/agents-skills/4_gofer_tasks/SKILL.md +0 -760
  211. package/resources/gofer/agents-skills/5_gofer_implement/SKILL.md +0 -944
  212. package/resources/gofer/agents-skills/6_gofer_validate/SKILL.md +0 -2302
  213. package/resources/gofer/agents-skills/7_gofer_save/SKILL.md +0 -423
  214. package/resources/gofer/agents-skills/7a_stakeholder_comms/SKILL.md +0 -508
  215. package/resources/gofer/agents-skills/8_gofer_branding/SKILL.md +0 -315
  216. package/resources/gofer/agents-skills/9_gofer_tests/SKILL.md +0 -558
  217. package/resources/gofer/agents-skills/gofer_bootstrap_workspace/SKILL.md +0 -148
  218. package/resources/gofer/agents-skills/gofer_check_workspace/SKILL.md +0 -119
  219. package/resources/gofer/agents-skills/gofer_constitution/SKILL.md +0 -612
  220. package/resources/gofer/agents-skills/gofer_diagnose/SKILL.md +0 -114
  221. package/resources/gofer/agents-skills/gofer_eai_first_run/SKILL.md +0 -397
  222. package/resources/gofer/agents-skills/gofer_hydrate/SKILL.md +0 -561
  223. package/resources/gofer/agents-skills/gofer_personality/SKILL.md +0 -44
  224. package/resources/gofer/agents-skills/gofer_plan/SKILL.md +0 -40
  225. package/resources/gofer/agents-skills/gofer_side/SKILL.md +0 -45
  226. package/resources/gofer/agents-skills/gofer_spec_summary/SKILL.md +0 -112
  227. package/resources/gofer/agents-skills/gofer_tdd/SKILL.md +0 -112
  228. package/resources/gofer/agents-skills/gofer_vocabulary/SKILL.md +0 -112
  229. package/resources/gofer/agents-skills/gofer_zoom_out/SKILL.md +0 -112
  230. package/resources/gofer/claude-commands/0_gofer_start.md +0 -1282
  231. package/resources/gofer/claude-commands/0a_problem_validation.md +0 -424
  232. package/resources/gofer/claude-commands/10_gofer_cloud.md +0 -630
  233. package/resources/gofer/claude-commands/1_gofer_research.md +0 -1154
  234. package/resources/gofer/claude-commands/2_gofer_specify.md +0 -855
  235. package/resources/gofer/claude-commands/3_gofer_plan.md +0 -894
  236. package/resources/gofer/claude-commands/4_gofer_tasks.md +0 -755
  237. package/resources/gofer/claude-commands/5_gofer_implement.md +0 -939
  238. package/resources/gofer/claude-commands/6_gofer_validate.md +0 -2297
  239. package/resources/gofer/claude-commands/7_gofer_save.md +0 -418
  240. package/resources/gofer/claude-commands/7a_stakeholder_comms.md +0 -503
  241. package/resources/gofer/claude-commands/8_gofer_branding.md +0 -310
  242. package/resources/gofer/claude-commands/9_gofer_tests.md +0 -553
  243. package/resources/gofer/claude-commands/gofer_bootstrap_workspace.md +0 -143
  244. package/resources/gofer/claude-commands/gofer_check_workspace.md +0 -114
  245. package/resources/gofer/claude-commands/gofer_constitution.md +0 -607
  246. package/resources/gofer/claude-commands/gofer_diagnose.md +0 -109
  247. package/resources/gofer/claude-commands/gofer_eai_first_run.md +0 -392
  248. package/resources/gofer/claude-commands/gofer_hydrate.md +0 -556
  249. package/resources/gofer/claude-commands/gofer_personality.md +0 -39
  250. package/resources/gofer/claude-commands/gofer_plan.md +0 -35
  251. package/resources/gofer/claude-commands/gofer_side.md +0 -40
  252. package/resources/gofer/claude-commands/gofer_spec_summary.md +0 -107
  253. package/resources/gofer/claude-commands/gofer_tdd.md +0 -107
  254. package/resources/gofer/claude-commands/gofer_vocabulary.md +0 -107
  255. package/resources/gofer/claude-commands/gofer_zoom_out.md +0 -107
  256. package/resources/gofer/claude-skills/eai-gofer/SKILL.md +0 -56
  257. package/resources/gofer/copilot-prompts/0_gofer_start.prompt.md +0 -1308
  258. package/resources/gofer/copilot-prompts/0a_problem_validation.prompt.md +0 -429
  259. package/resources/gofer/copilot-prompts/10_gofer_cloud.prompt.md +0 -644
  260. package/resources/gofer/copilot-prompts/1_gofer_research.prompt.md +0 -1177
  261. package/resources/gofer/copilot-prompts/2_gofer_specify.prompt.md +0 -878
  262. package/resources/gofer/copilot-prompts/3_gofer_plan.prompt.md +0 -917
  263. package/resources/gofer/copilot-prompts/4_gofer_tasks.prompt.md +0 -778
  264. package/resources/gofer/copilot-prompts/5_gofer_implement.prompt.md +0 -962
  265. package/resources/gofer/copilot-prompts/6_gofer_validate.prompt.md +0 -2310
  266. package/resources/gofer/copilot-prompts/7_gofer_save.prompt.md +0 -433
  267. package/resources/gofer/copilot-prompts/7a_stakeholder_comms.prompt.md +0 -516
  268. package/resources/gofer/copilot-prompts/8_gofer_branding.prompt.md +0 -323
  269. package/resources/gofer/copilot-prompts/9_gofer_tests.prompt.md +0 -566
  270. package/resources/gofer/copilot-prompts/gofer_bootstrap_workspace.prompt.md +0 -161
  271. package/resources/gofer/copilot-prompts/gofer_check_workspace.prompt.md +0 -132
  272. package/resources/gofer/copilot-prompts/gofer_constitution.prompt.md +0 -621
  273. package/resources/gofer/copilot-prompts/gofer_diagnose.prompt.md +0 -127
  274. package/resources/gofer/copilot-prompts/gofer_eai_first_run.prompt.md +0 -410
  275. package/resources/gofer/copilot-prompts/gofer_hydrate.prompt.md +0 -571
  276. package/resources/gofer/copilot-prompts/gofer_personality.prompt.md +0 -57
  277. package/resources/gofer/copilot-prompts/gofer_plan.prompt.md +0 -53
  278. package/resources/gofer/copilot-prompts/gofer_side.prompt.md +0 -58
  279. package/resources/gofer/copilot-prompts/gofer_spec_summary.prompt.md +0 -125
  280. package/resources/gofer/copilot-prompts/gofer_tdd.prompt.md +0 -125
  281. package/resources/gofer/copilot-prompts/gofer_vocabulary.prompt.md +0 -125
  282. package/resources/gofer/copilot-prompts/gofer_zoom_out.prompt.md +0 -125
  283. package/resources/gofer/gemini/commands/gofer/0_gofer_start.md +0 -1282
  284. package/resources/gofer/gemini/commands/gofer/0_gofer_start.toml +0 -2
  285. package/resources/gofer/gemini/commands/gofer/0a_problem_validation.md +0 -424
  286. package/resources/gofer/gemini/commands/gofer/0a_problem_validation.toml +0 -2
  287. package/resources/gofer/gemini/commands/gofer/10_gofer_cloud.md +0 -630
  288. package/resources/gofer/gemini/commands/gofer/10_gofer_cloud.toml +0 -2
  289. package/resources/gofer/gemini/commands/gofer/1_gofer_research.md +0 -1154
  290. package/resources/gofer/gemini/commands/gofer/1_gofer_research.toml +0 -2
  291. package/resources/gofer/gemini/commands/gofer/2_gofer_specify.md +0 -855
  292. package/resources/gofer/gemini/commands/gofer/2_gofer_specify.toml +0 -2
  293. package/resources/gofer/gemini/commands/gofer/3_gofer_plan.md +0 -894
  294. package/resources/gofer/gemini/commands/gofer/3_gofer_plan.toml +0 -2
  295. package/resources/gofer/gemini/commands/gofer/4_gofer_tasks.md +0 -755
  296. package/resources/gofer/gemini/commands/gofer/4_gofer_tasks.toml +0 -2
  297. package/resources/gofer/gemini/commands/gofer/5_gofer_implement.md +0 -939
  298. package/resources/gofer/gemini/commands/gofer/5_gofer_implement.toml +0 -2
  299. package/resources/gofer/gemini/commands/gofer/6_gofer_validate.md +0 -2297
  300. package/resources/gofer/gemini/commands/gofer/6_gofer_validate.toml +0 -2
  301. package/resources/gofer/gemini/commands/gofer/7_gofer_save.md +0 -418
  302. package/resources/gofer/gemini/commands/gofer/7_gofer_save.toml +0 -2
  303. package/resources/gofer/gemini/commands/gofer/7a_stakeholder_comms.md +0 -503
  304. package/resources/gofer/gemini/commands/gofer/7a_stakeholder_comms.toml +0 -2
  305. package/resources/gofer/gemini/commands/gofer/8_gofer_branding.md +0 -310
  306. package/resources/gofer/gemini/commands/gofer/8_gofer_branding.toml +0 -2
  307. package/resources/gofer/gemini/commands/gofer/9_gofer_tests.md +0 -553
  308. package/resources/gofer/gemini/commands/gofer/9_gofer_tests.toml +0 -2
  309. package/resources/gofer/gemini/commands/gofer/gofer_bootstrap_workspace.md +0 -143
  310. package/resources/gofer/gemini/commands/gofer/gofer_bootstrap_workspace.toml +0 -2
  311. package/resources/gofer/gemini/commands/gofer/gofer_check_workspace.md +0 -114
  312. package/resources/gofer/gemini/commands/gofer/gofer_check_workspace.toml +0 -2
  313. package/resources/gofer/gemini/commands/gofer/gofer_constitution.md +0 -607
  314. package/resources/gofer/gemini/commands/gofer/gofer_constitution.toml +0 -2
  315. package/resources/gofer/gemini/commands/gofer/gofer_diagnose.md +0 -109
  316. package/resources/gofer/gemini/commands/gofer/gofer_diagnose.toml +0 -2
  317. package/resources/gofer/gemini/commands/gofer/gofer_eai_first_run.md +0 -392
  318. package/resources/gofer/gemini/commands/gofer/gofer_eai_first_run.toml +0 -2
  319. package/resources/gofer/gemini/commands/gofer/gofer_hydrate.md +0 -556
  320. package/resources/gofer/gemini/commands/gofer/gofer_hydrate.toml +0 -2
  321. package/resources/gofer/gemini/commands/gofer/gofer_personality.md +0 -39
  322. package/resources/gofer/gemini/commands/gofer/gofer_personality.toml +0 -2
  323. package/resources/gofer/gemini/commands/gofer/gofer_plan.md +0 -35
  324. package/resources/gofer/gemini/commands/gofer/gofer_plan.toml +0 -2
  325. package/resources/gofer/gemini/commands/gofer/gofer_side.md +0 -40
  326. package/resources/gofer/gemini/commands/gofer/gofer_side.toml +0 -2
  327. package/resources/gofer/gemini/commands/gofer/gofer_spec_summary.md +0 -107
  328. package/resources/gofer/gemini/commands/gofer/gofer_spec_summary.toml +0 -2
  329. package/resources/gofer/gemini/commands/gofer/gofer_tdd.md +0 -107
  330. package/resources/gofer/gemini/commands/gofer/gofer_tdd.toml +0 -2
  331. package/resources/gofer/gemini/commands/gofer/gofer_vocabulary.md +0 -107
  332. package/resources/gofer/gemini/commands/gofer/gofer_vocabulary.toml +0 -2
  333. package/resources/gofer/gemini/commands/gofer/gofer_zoom_out.md +0 -107
  334. package/resources/gofer/gemini/commands/gofer/gofer_zoom_out.toml +0 -2
  335. package/resources/gofer/github-skills/eai-gofer/SKILL.md +0 -56
  336. package/resources/gofer/system-skills/0_gofer_start/SKILL.md +0 -1287
  337. package/resources/gofer/system-skills/0a_problem_validation/SKILL.md +0 -429
  338. package/resources/gofer/system-skills/10_gofer_cloud/SKILL.md +0 -635
  339. package/resources/gofer/system-skills/1_gofer_research/SKILL.md +0 -1159
  340. package/resources/gofer/system-skills/2_gofer_specify/SKILL.md +0 -860
  341. package/resources/gofer/system-skills/3_gofer_plan/SKILL.md +0 -899
  342. package/resources/gofer/system-skills/4_gofer_tasks/SKILL.md +0 -760
  343. package/resources/gofer/system-skills/5_gofer_implement/SKILL.md +0 -944
  344. package/resources/gofer/system-skills/6_gofer_validate/SKILL.md +0 -2302
  345. package/resources/gofer/system-skills/7_gofer_save/SKILL.md +0 -423
  346. package/resources/gofer/system-skills/7a_stakeholder_comms/SKILL.md +0 -508
  347. package/resources/gofer/system-skills/8_gofer_branding/SKILL.md +0 -315
  348. package/resources/gofer/system-skills/9_gofer_tests/SKILL.md +0 -558
  349. package/resources/gofer/system-skills/gofer_bootstrap_workspace/SKILL.md +0 -148
  350. package/resources/gofer/system-skills/gofer_check_workspace/SKILL.md +0 -119
  351. package/resources/gofer/system-skills/gofer_constitution/SKILL.md +0 -612
  352. package/resources/gofer/system-skills/gofer_diagnose/SKILL.md +0 -114
  353. package/resources/gofer/system-skills/gofer_eai_first_run/SKILL.md +0 -397
  354. package/resources/gofer/system-skills/gofer_hydrate/SKILL.md +0 -561
  355. package/resources/gofer/system-skills/gofer_personality/SKILL.md +0 -44
  356. package/resources/gofer/system-skills/gofer_plan/SKILL.md +0 -40
  357. package/resources/gofer/system-skills/gofer_side/SKILL.md +0 -45
  358. package/resources/gofer/system-skills/gofer_spec_summary/SKILL.md +0 -112
  359. package/resources/gofer/system-skills/gofer_tdd/SKILL.md +0 -112
  360. package/resources/gofer/system-skills/gofer_vocabulary/SKILL.md +0 -112
  361. package/resources/gofer/system-skills/gofer_zoom_out/SKILL.md +0 -112
  362. 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
+ }