eai-cli 0.0.0-bootstrap.0

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 (690) hide show
  1. package/LICENSE +183 -0
  2. package/NOTICE +4 -0
  3. package/README.md +14 -0
  4. package/dist/commands/agent.d.ts +3 -0
  5. package/dist/commands/agent.d.ts.map +1 -0
  6. package/dist/commands/agent.js +69 -0
  7. package/dist/commands/agent.js.map +1 -0
  8. package/dist/commands/blocks.d.ts +3 -0
  9. package/dist/commands/blocks.d.ts.map +1 -0
  10. package/dist/commands/blocks.js +249 -0
  11. package/dist/commands/blocks.js.map +1 -0
  12. package/dist/commands/chat.d.ts +6 -0
  13. package/dist/commands/chat.d.ts.map +1 -0
  14. package/dist/commands/chat.js +105 -0
  15. package/dist/commands/chat.js.map +1 -0
  16. package/dist/commands/deploy.d.ts +36 -0
  17. package/dist/commands/deploy.d.ts.map +1 -0
  18. package/dist/commands/deploy.js +712 -0
  19. package/dist/commands/deploy.js.map +1 -0
  20. package/dist/commands/dev.d.ts +15 -0
  21. package/dist/commands/dev.d.ts.map +1 -0
  22. package/dist/commands/dev.js +133 -0
  23. package/dist/commands/dev.js.map +1 -0
  24. package/dist/commands/docs.d.ts +6 -0
  25. package/dist/commands/docs.d.ts.map +1 -0
  26. package/dist/commands/docs.js +118 -0
  27. package/dist/commands/docs.js.map +1 -0
  28. package/dist/commands/env.d.ts +10 -0
  29. package/dist/commands/env.d.ts.map +1 -0
  30. package/dist/commands/env.js +200 -0
  31. package/dist/commands/env.js.map +1 -0
  32. package/dist/commands/errors.d.ts +3 -0
  33. package/dist/commands/errors.d.ts.map +1 -0
  34. package/dist/commands/errors.js +72 -0
  35. package/dist/commands/errors.js.map +1 -0
  36. package/dist/commands/gofer.d.ts +3 -0
  37. package/dist/commands/gofer.d.ts.map +1 -0
  38. package/dist/commands/gofer.js +134 -0
  39. package/dist/commands/gofer.js.map +1 -0
  40. package/dist/commands/init.d.ts +14 -0
  41. package/dist/commands/init.d.ts.map +1 -0
  42. package/dist/commands/init.js +1437 -0
  43. package/dist/commands/init.js.map +1 -0
  44. package/dist/commands/login.d.ts +7 -0
  45. package/dist/commands/login.d.ts.map +1 -0
  46. package/dist/commands/login.js +117 -0
  47. package/dist/commands/login.js.map +1 -0
  48. package/dist/commands/provision.d.ts +6 -0
  49. package/dist/commands/provision.d.ts.map +1 -0
  50. package/dist/commands/provision.js +855 -0
  51. package/dist/commands/provision.js.map +1 -0
  52. package/dist/commands/publicapi.d.ts +6 -0
  53. package/dist/commands/publicapi.d.ts.map +1 -0
  54. package/dist/commands/publicapi.js +184 -0
  55. package/dist/commands/publicapi.js.map +1 -0
  56. package/dist/commands/resources.d.ts +38 -0
  57. package/dist/commands/resources.d.ts.map +1 -0
  58. package/dist/commands/resources.js +1010 -0
  59. package/dist/commands/resources.js.map +1 -0
  60. package/dist/commands/runtime.d.ts +3 -0
  61. package/dist/commands/runtime.d.ts.map +1 -0
  62. package/dist/commands/runtime.js +78 -0
  63. package/dist/commands/runtime.js.map +1 -0
  64. package/dist/commands/template.d.ts +3 -0
  65. package/dist/commands/template.d.ts.map +1 -0
  66. package/dist/commands/template.js +365 -0
  67. package/dist/commands/template.js.map +1 -0
  68. package/dist/commands/tenant.d.ts +45 -0
  69. package/dist/commands/tenant.d.ts.map +1 -0
  70. package/dist/commands/tenant.js +1036 -0
  71. package/dist/commands/tenant.js.map +1 -0
  72. package/dist/commands/types.d.ts +130 -0
  73. package/dist/commands/types.d.ts.map +1 -0
  74. package/dist/commands/types.js +1636 -0
  75. package/dist/commands/types.js.map +1 -0
  76. package/dist/commands/update.d.ts +13 -0
  77. package/dist/commands/update.d.ts.map +1 -0
  78. package/dist/commands/update.js +163 -0
  79. package/dist/commands/update.js.map +1 -0
  80. package/dist/commands/user.d.ts +6 -0
  81. package/dist/commands/user.d.ts.map +1 -0
  82. package/dist/commands/user.js +359 -0
  83. package/dist/commands/user.js.map +1 -0
  84. package/dist/commands/verify.d.ts +40 -0
  85. package/dist/commands/verify.d.ts.map +1 -0
  86. package/dist/commands/verify.js +1442 -0
  87. package/dist/commands/verify.js.map +1 -0
  88. package/dist/commands/vertical.d.ts +24 -0
  89. package/dist/commands/vertical.d.ts.map +1 -0
  90. package/dist/commands/vertical.js +301 -0
  91. package/dist/commands/vertical.js.map +1 -0
  92. package/dist/commands/whoami.d.ts +6 -0
  93. package/dist/commands/whoami.d.ts.map +1 -0
  94. package/dist/commands/whoami.js +73 -0
  95. package/dist/commands/whoami.js.map +1 -0
  96. package/dist/commands/workflow.d.ts +6 -0
  97. package/dist/commands/workflow.d.ts.map +1 -0
  98. package/dist/commands/workflow.js +400 -0
  99. package/dist/commands/workflow.js.map +1 -0
  100. package/dist/index.d.ts +10 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +272 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/lib/agent-guide.d.ts +24 -0
  105. package/dist/lib/agent-guide.d.ts.map +1 -0
  106. package/dist/lib/agent-guide.js +155 -0
  107. package/dist/lib/agent-guide.js.map +1 -0
  108. package/dist/lib/api.d.ts +338 -0
  109. package/dist/lib/api.d.ts.map +1 -0
  110. package/dist/lib/api.js +991 -0
  111. package/dist/lib/api.js.map +1 -0
  112. package/dist/lib/auth.d.ts +65 -0
  113. package/dist/lib/auth.d.ts.map +1 -0
  114. package/dist/lib/auth.js +592 -0
  115. package/dist/lib/auth.js.map +1 -0
  116. package/dist/lib/azure-cli.d.ts +6 -0
  117. package/dist/lib/azure-cli.d.ts.map +1 -0
  118. package/dist/lib/azure-cli.js +13 -0
  119. package/dist/lib/azure-cli.js.map +1 -0
  120. package/dist/lib/block-catalog-normalize.d.ts +47 -0
  121. package/dist/lib/block-catalog-normalize.d.ts.map +1 -0
  122. package/dist/lib/block-catalog-normalize.js +355 -0
  123. package/dist/lib/block-catalog-normalize.js.map +1 -0
  124. package/dist/lib/block-catalog-types.d.ts +111 -0
  125. package/dist/lib/block-catalog-types.d.ts.map +1 -0
  126. package/dist/lib/block-catalog-types.js +41 -0
  127. package/dist/lib/block-catalog-types.js.map +1 -0
  128. package/dist/lib/block-catalog-utils.d.ts +7 -0
  129. package/dist/lib/block-catalog-utils.d.ts.map +1 -0
  130. package/dist/lib/block-catalog-utils.js +47 -0
  131. package/dist/lib/block-catalog-utils.js.map +1 -0
  132. package/dist/lib/block-catalog-validation.d.ts +5 -0
  133. package/dist/lib/block-catalog-validation.d.ts.map +1 -0
  134. package/dist/lib/block-catalog-validation.js +112 -0
  135. package/dist/lib/block-catalog-validation.js.map +1 -0
  136. package/dist/lib/block-catalog.d.ts +3 -0
  137. package/dist/lib/block-catalog.d.ts.map +1 -0
  138. package/dist/lib/block-catalog.js +284 -0
  139. package/dist/lib/block-catalog.js.map +1 -0
  140. package/dist/lib/cloud-env.d.ts +25 -0
  141. package/dist/lib/cloud-env.d.ts.map +1 -0
  142. package/dist/lib/cloud-env.js +79 -0
  143. package/dist/lib/cloud-env.js.map +1 -0
  144. package/dist/lib/config.d.ts +116 -0
  145. package/dist/lib/config.d.ts.map +1 -0
  146. package/dist/lib/config.js +195 -0
  147. package/dist/lib/config.js.map +1 -0
  148. package/dist/lib/context.d.ts +43 -0
  149. package/dist/lib/context.d.ts.map +1 -0
  150. package/dist/lib/context.js +68 -0
  151. package/dist/lib/context.js.map +1 -0
  152. package/dist/lib/error-codes.d.ts +56 -0
  153. package/dist/lib/error-codes.d.ts.map +1 -0
  154. package/dist/lib/error-codes.js +211 -0
  155. package/dist/lib/error-codes.js.map +1 -0
  156. package/dist/lib/error-guidance/catalog.d.ts +648 -0
  157. package/dist/lib/error-guidance/catalog.d.ts.map +1 -0
  158. package/dist/lib/error-guidance/catalog.js +940 -0
  159. package/dist/lib/error-guidance/catalog.js.map +1 -0
  160. package/dist/lib/error-guidance/match.d.ts +3 -0
  161. package/dist/lib/error-guidance/match.d.ts.map +1 -0
  162. package/dist/lib/error-guidance/match.js +46 -0
  163. package/dist/lib/error-guidance/match.js.map +1 -0
  164. package/dist/lib/error-guidance/render.d.ts +5 -0
  165. package/dist/lib/error-guidance/render.d.ts.map +1 -0
  166. package/dist/lib/error-guidance/render.js +92 -0
  167. package/dist/lib/error-guidance/render.js.map +1 -0
  168. package/dist/lib/error-guidance/types.d.ts +76 -0
  169. package/dist/lib/error-guidance/types.d.ts.map +1 -0
  170. package/dist/lib/error-guidance/types.js +2 -0
  171. package/dist/lib/error-guidance/types.js.map +1 -0
  172. package/dist/lib/error-guidance/validate.d.ts +3 -0
  173. package/dist/lib/error-guidance/validate.d.ts.map +1 -0
  174. package/dist/lib/error-guidance/validate.js +59 -0
  175. package/dist/lib/error-guidance/validate.js.map +1 -0
  176. package/dist/lib/gofer-installer.d.ts +32 -0
  177. package/dist/lib/gofer-installer.d.ts.map +1 -0
  178. package/dist/lib/gofer-installer.js +589 -0
  179. package/dist/lib/gofer-installer.js.map +1 -0
  180. package/dist/lib/gofer-refresh.d.ts +46 -0
  181. package/dist/lib/gofer-refresh.d.ts.map +1 -0
  182. package/dist/lib/gofer-refresh.js +536 -0
  183. package/dist/lib/gofer-refresh.js.map +1 -0
  184. package/dist/lib/next-route-exports.d.ts +6 -0
  185. package/dist/lib/next-route-exports.d.ts.map +1 -0
  186. package/dist/lib/next-route-exports.js +127 -0
  187. package/dist/lib/next-route-exports.js.map +1 -0
  188. package/dist/lib/npm.d.ts +2 -0
  189. package/dist/lib/npm.d.ts.map +1 -0
  190. package/dist/lib/npm.js +4 -0
  191. package/dist/lib/npm.js.map +1 -0
  192. package/dist/lib/object-type-defaults.d.ts +4 -0
  193. package/dist/lib/object-type-defaults.d.ts.map +1 -0
  194. package/dist/lib/object-type-defaults.js +72 -0
  195. package/dist/lib/object-type-defaults.js.map +1 -0
  196. package/dist/lib/output.d.ts +35 -0
  197. package/dist/lib/output.d.ts.map +1 -0
  198. package/dist/lib/output.js +166 -0
  199. package/dist/lib/output.js.map +1 -0
  200. package/dist/lib/profile.d.ts +52 -0
  201. package/dist/lib/profile.d.ts.map +1 -0
  202. package/dist/lib/profile.js +116 -0
  203. package/dist/lib/profile.js.map +1 -0
  204. package/dist/lib/project-manifest.d.ts +42 -0
  205. package/dist/lib/project-manifest.d.ts.map +1 -0
  206. package/dist/lib/project-manifest.js +191 -0
  207. package/dist/lib/project-manifest.js.map +1 -0
  208. package/dist/lib/resourceapi-bundle.d.ts +33 -0
  209. package/dist/lib/resourceapi-bundle.d.ts.map +1 -0
  210. package/dist/lib/resourceapi-bundle.js +79 -0
  211. package/dist/lib/resourceapi-bundle.js.map +1 -0
  212. package/dist/lib/runtime-contract.d.ts +84 -0
  213. package/dist/lib/runtime-contract.d.ts.map +1 -0
  214. package/dist/lib/runtime-contract.js +318 -0
  215. package/dist/lib/runtime-contract.js.map +1 -0
  216. package/dist/lib/schema-builder.d.ts +28 -0
  217. package/dist/lib/schema-builder.d.ts.map +1 -0
  218. package/dist/lib/schema-builder.js +69 -0
  219. package/dist/lib/schema-builder.js.map +1 -0
  220. package/dist/lib/tenant-context.d.ts +127 -0
  221. package/dist/lib/tenant-context.d.ts.map +1 -0
  222. package/dist/lib/tenant-context.js +573 -0
  223. package/dist/lib/tenant-context.js.map +1 -0
  224. package/dist/lib/update-check.d.ts +52 -0
  225. package/dist/lib/update-check.d.ts.map +1 -0
  226. package/dist/lib/update-check.js +271 -0
  227. package/dist/lib/update-check.js.map +1 -0
  228. package/dist/lib/update-maintenance.d.ts +15 -0
  229. package/dist/lib/update-maintenance.d.ts.map +1 -0
  230. package/dist/lib/update-maintenance.js +187 -0
  231. package/dist/lib/update-maintenance.js.map +1 -0
  232. package/dist/lib/utils.d.ts +23 -0
  233. package/dist/lib/utils.d.ts.map +1 -0
  234. package/dist/lib/utils.js +48 -0
  235. package/dist/lib/utils.js.map +1 -0
  236. package/dist/lib/workflow-provisioning.d.ts +54 -0
  237. package/dist/lib/workflow-provisioning.d.ts.map +1 -0
  238. package/dist/lib/workflow-provisioning.js +281 -0
  239. package/dist/lib/workflow-provisioning.js.map +1 -0
  240. package/package.json +51 -0
  241. package/resources/gofer/.gofer-version +7 -0
  242. package/resources/gofer/agents-skills/0_gofer_start/SKILL.md +1287 -0
  243. package/resources/gofer/agents-skills/0a_problem_validation/SKILL.md +429 -0
  244. package/resources/gofer/agents-skills/10_gofer_cloud/SKILL.md +635 -0
  245. package/resources/gofer/agents-skills/1_gofer_research/SKILL.md +1159 -0
  246. package/resources/gofer/agents-skills/2_gofer_specify/SKILL.md +860 -0
  247. package/resources/gofer/agents-skills/3_gofer_plan/SKILL.md +886 -0
  248. package/resources/gofer/agents-skills/4_gofer_tasks/SKILL.md +748 -0
  249. package/resources/gofer/agents-skills/5_gofer_implement/SKILL.md +924 -0
  250. package/resources/gofer/agents-skills/6_gofer_validate/SKILL.md +2269 -0
  251. package/resources/gofer/agents-skills/7_gofer_save/SKILL.md +423 -0
  252. package/resources/gofer/agents-skills/7a_stakeholder_comms/SKILL.md +508 -0
  253. package/resources/gofer/agents-skills/8_gofer_branding/SKILL.md +315 -0
  254. package/resources/gofer/agents-skills/9_gofer_tests/SKILL.md +558 -0
  255. package/resources/gofer/agents-skills/gofer_bootstrap_workspace/SKILL.md +148 -0
  256. package/resources/gofer/agents-skills/gofer_check_workspace/SKILL.md +119 -0
  257. package/resources/gofer/agents-skills/gofer_constitution/SKILL.md +612 -0
  258. package/resources/gofer/agents-skills/gofer_diagnose/SKILL.md +114 -0
  259. package/resources/gofer/agents-skills/gofer_eai_first_run/SKILL.md +397 -0
  260. package/resources/gofer/agents-skills/gofer_hydrate/SKILL.md +561 -0
  261. package/resources/gofer/agents-skills/gofer_personality/SKILL.md +44 -0
  262. package/resources/gofer/agents-skills/gofer_plan/SKILL.md +40 -0
  263. package/resources/gofer/agents-skills/gofer_side/SKILL.md +45 -0
  264. package/resources/gofer/agents-skills/gofer_spec_summary/SKILL.md +112 -0
  265. package/resources/gofer/agents-skills/gofer_tdd/SKILL.md +112 -0
  266. package/resources/gofer/agents-skills/gofer_vocabulary/SKILL.md +112 -0
  267. package/resources/gofer/agents-skills/gofer_zoom_out/SKILL.md +112 -0
  268. package/resources/gofer/bash-scripts/check-context-health.sh +365 -0
  269. package/resources/gofer/bash-scripts/check-persona-pack.sh +81 -0
  270. package/resources/gofer/bash-scripts/check-prerequisites.sh +168 -0
  271. package/resources/gofer/bash-scripts/common.sh +192 -0
  272. package/resources/gofer/bash-scripts/create-new-feature.sh +260 -0
  273. package/resources/gofer/bash-scripts/install-optional-tools.sh +270 -0
  274. package/resources/gofer/bash-scripts/log-stage.sh +224 -0
  275. package/resources/gofer/bash-scripts/mark-task-complete.sh +74 -0
  276. package/resources/gofer/bash-scripts/pipeline-state.sh +306 -0
  277. package/resources/gofer/bash-scripts/read-failed-approaches.sh +114 -0
  278. package/resources/gofer/bash-scripts/read-session-memories.sh +96 -0
  279. package/resources/gofer/bash-scripts/save-checkpoint.sh +407 -0
  280. package/resources/gofer/bash-scripts/setup-plan.sh +62 -0
  281. package/resources/gofer/bash-scripts/sync-implementation-status.sh +47 -0
  282. package/resources/gofer/bash-scripts/update-agent-context.sh +772 -0
  283. package/resources/gofer/bash-scripts/validate-artifact.sh +335 -0
  284. package/resources/gofer/bash-scripts/verify-task.sh +384 -0
  285. package/resources/gofer/bash-scripts/write-failed-approach.sh +110 -0
  286. package/resources/gofer/bash-scripts/write-periodic-checkpoint.sh +128 -0
  287. package/resources/gofer/bash-scripts/write-session-memory.sh +118 -0
  288. package/resources/gofer/claude-agents/assumption-tracker.md +168 -0
  289. package/resources/gofer/claude-agents/business-metrics-analyzer.md +169 -0
  290. package/resources/gofer/claude-agents/business-problem-validator.md +168 -0
  291. package/resources/gofer/claude-agents/codebase-analyzer.md +124 -0
  292. package/resources/gofer/claude-agents/codebase-locator.md +95 -0
  293. package/resources/gofer/claude-agents/codebase-pattern-finder.md +180 -0
  294. package/resources/gofer/claude-agents/comms-writer.md +158 -0
  295. package/resources/gofer/claude-agents/engineer-review.md +169 -0
  296. package/resources/gofer/claude-agents/implement-bug-triangulator.md +94 -0
  297. package/resources/gofer/claude-agents/implement-code-review-council.md +89 -0
  298. package/resources/gofer/claude-agents/implement-doc-writer.md +89 -0
  299. package/resources/gofer/claude-agents/implement-error-hardener.md +84 -0
  300. package/resources/gofer/claude-agents/implement-performance-explorer.md +95 -0
  301. package/resources/gofer/claude-agents/implement-test-diversifier.md +82 -0
  302. package/resources/gofer/claude-agents/implement-variant-generator.md +80 -0
  303. package/resources/gofer/claude-agents/multi-perspective-judge.md +114 -0
  304. package/resources/gofer/claude-agents/plan-api-comparator.md +90 -0
  305. package/resources/gofer/claude-agents/plan-architecture-diverger.md +100 -0
  306. package/resources/gofer/claude-agents/plan-data-model-stress-tester.md +95 -0
  307. package/resources/gofer/claude-agents/plan-migration-path-finder.md +95 -0
  308. package/resources/gofer/claude-agents/plan-refactor-rewrite-advisor.md +97 -0
  309. package/resources/gofer/claude-agents/research-dependency-evaluator.md +106 -0
  310. package/resources/gofer/claude-agents/research-horizon-scanner.md +100 -0
  311. package/resources/gofer/claude-agents/research-market-scanner.md +137 -0
  312. package/resources/gofer/claude-agents/research-perspective-multiplier.md +102 -0
  313. package/resources/gofer/claude-agents/scope-creep-detector.md +152 -0
  314. package/resources/gofer/claude-agents/specify-ambiguity-detector.md +95 -0
  315. package/resources/gofer/claude-agents/specify-journey-stress-tester.md +92 -0
  316. package/resources/gofer/claude-agents/tasks-cross-cutting-scanner.md +91 -0
  317. package/resources/gofer/claude-agents/tasks-rollback-planner.md +89 -0
  318. package/resources/gofer/claude-agents/validate-security-red-team.md +102 -0
  319. package/resources/gofer/claude-agents/validation-correctness.md +103 -0
  320. package/resources/gofer/claude-agents/validation-integration.md +129 -0
  321. package/resources/gofer/claude-agents/validation-performance.md +120 -0
  322. package/resources/gofer/claude-agents/validation-security.md +115 -0
  323. package/resources/gofer/claude-agents/validation-standards.md +151 -0
  324. package/resources/gofer/claude-agents/validation-test-quality.md +146 -0
  325. package/resources/gofer/claude-agents/visual-bounded-context-writer.md +40 -0
  326. package/resources/gofer/claude-agents/visual-c4-writer.md +45 -0
  327. package/resources/gofer/claude-agents/visual-erd-writer.md +34 -0
  328. package/resources/gofer/claude-agents/visual-heatmap-writer.md +63 -0
  329. package/resources/gofer/claude-agents/visual-risk-writer.md +64 -0
  330. package/resources/gofer/claude-commands/0_gofer_start.md +1282 -0
  331. package/resources/gofer/claude-commands/0a_problem_validation.md +424 -0
  332. package/resources/gofer/claude-commands/10_gofer_cloud.md +630 -0
  333. package/resources/gofer/claude-commands/1_gofer_research.md +1154 -0
  334. package/resources/gofer/claude-commands/2_gofer_specify.md +855 -0
  335. package/resources/gofer/claude-commands/3_gofer_plan.md +881 -0
  336. package/resources/gofer/claude-commands/4_gofer_tasks.md +743 -0
  337. package/resources/gofer/claude-commands/5_gofer_implement.md +919 -0
  338. package/resources/gofer/claude-commands/6_gofer_validate.md +2264 -0
  339. package/resources/gofer/claude-commands/7_gofer_save.md +418 -0
  340. package/resources/gofer/claude-commands/7a_stakeholder_comms.md +503 -0
  341. package/resources/gofer/claude-commands/8_gofer_branding.md +310 -0
  342. package/resources/gofer/claude-commands/9_gofer_tests.md +553 -0
  343. package/resources/gofer/claude-commands/gofer_bootstrap_workspace.md +143 -0
  344. package/resources/gofer/claude-commands/gofer_check_workspace.md +114 -0
  345. package/resources/gofer/claude-commands/gofer_constitution.md +607 -0
  346. package/resources/gofer/claude-commands/gofer_diagnose.md +109 -0
  347. package/resources/gofer/claude-commands/gofer_eai_first_run.md +392 -0
  348. package/resources/gofer/claude-commands/gofer_hydrate.md +556 -0
  349. package/resources/gofer/claude-commands/gofer_personality.md +39 -0
  350. package/resources/gofer/claude-commands/gofer_plan.md +35 -0
  351. package/resources/gofer/claude-commands/gofer_side.md +40 -0
  352. package/resources/gofer/claude-commands/gofer_spec_summary.md +107 -0
  353. package/resources/gofer/claude-commands/gofer_tdd.md +107 -0
  354. package/resources/gofer/claude-commands/gofer_vocabulary.md +107 -0
  355. package/resources/gofer/claude-commands/gofer_zoom_out.md +107 -0
  356. package/resources/gofer/claude-skills/eai-gofer/SKILL.md +56 -0
  357. package/resources/gofer/commands/.gitkeep +0 -0
  358. package/resources/gofer/commands/0_gofer_start.md +1299 -0
  359. package/resources/gofer/commands/0a_problem_validation.md +405 -0
  360. package/resources/gofer/commands/10_gofer_cloud.md +611 -0
  361. package/resources/gofer/commands/1_gofer_research.md +1135 -0
  362. package/resources/gofer/commands/2_gofer_specify.md +836 -0
  363. package/resources/gofer/commands/3_gofer_plan.md +862 -0
  364. package/resources/gofer/commands/4_gofer_tasks.md +724 -0
  365. package/resources/gofer/commands/5_gofer_implement.md +900 -0
  366. package/resources/gofer/commands/6_gofer_validate.md +2245 -0
  367. package/resources/gofer/commands/7_gofer_save.md +399 -0
  368. package/resources/gofer/commands/7a_stakeholder_comms.md +484 -0
  369. package/resources/gofer/commands/8_gofer_branding.md +291 -0
  370. package/resources/gofer/commands/9_gofer_tests.md +534 -0
  371. package/resources/gofer/commands/gofer_bootstrap_workspace.md +159 -0
  372. package/resources/gofer/commands/gofer_check_workspace.md +130 -0
  373. package/resources/gofer/commands/gofer_constitution.md +588 -0
  374. package/resources/gofer/commands/gofer_diagnose.md +89 -0
  375. package/resources/gofer/commands/gofer_eai_first_run.md +392 -0
  376. package/resources/gofer/commands/gofer_hydrate.md +537 -0
  377. package/resources/gofer/commands/gofer_personality.md +61 -0
  378. package/resources/gofer/commands/gofer_plan.md +51 -0
  379. package/resources/gofer/commands/gofer_side.md +56 -0
  380. package/resources/gofer/commands/gofer_spec_summary.md +87 -0
  381. package/resources/gofer/commands/gofer_tdd.md +87 -0
  382. package/resources/gofer/commands/gofer_vocabulary.md +87 -0
  383. package/resources/gofer/commands/gofer_zoom_out.md +87 -0
  384. package/resources/gofer/copilot-instructions/gofer-cost.instructions.md +13 -0
  385. package/resources/gofer/copilot-instructions/language-server.instructions.md +49 -0
  386. package/resources/gofer/copilot-instructions/typescript.instructions.md +47 -0
  387. package/resources/gofer/copilot-instructions/vscode-extension.instructions.md +46 -0
  388. package/resources/gofer/copilot-prompts/0_gofer_start.prompt.md +1308 -0
  389. package/resources/gofer/copilot-prompts/0a_problem_validation.prompt.md +429 -0
  390. package/resources/gofer/copilot-prompts/10_gofer_cloud.prompt.md +644 -0
  391. package/resources/gofer/copilot-prompts/1_gofer_research.prompt.md +1177 -0
  392. package/resources/gofer/copilot-prompts/2_gofer_specify.prompt.md +878 -0
  393. package/resources/gofer/copilot-prompts/3_gofer_plan.prompt.md +904 -0
  394. package/resources/gofer/copilot-prompts/4_gofer_tasks.prompt.md +766 -0
  395. package/resources/gofer/copilot-prompts/5_gofer_implement.prompt.md +942 -0
  396. package/resources/gofer/copilot-prompts/6_gofer_validate.prompt.md +2277 -0
  397. package/resources/gofer/copilot-prompts/7_gofer_save.prompt.md +433 -0
  398. package/resources/gofer/copilot-prompts/7a_stakeholder_comms.prompt.md +516 -0
  399. package/resources/gofer/copilot-prompts/8_gofer_branding.prompt.md +323 -0
  400. package/resources/gofer/copilot-prompts/9_gofer_tests.prompt.md +566 -0
  401. package/resources/gofer/copilot-prompts/gofer_bootstrap_workspace.prompt.md +161 -0
  402. package/resources/gofer/copilot-prompts/gofer_check_workspace.prompt.md +132 -0
  403. package/resources/gofer/copilot-prompts/gofer_constitution.prompt.md +621 -0
  404. package/resources/gofer/copilot-prompts/gofer_diagnose.prompt.md +127 -0
  405. package/resources/gofer/copilot-prompts/gofer_eai_first_run.prompt.md +410 -0
  406. package/resources/gofer/copilot-prompts/gofer_hydrate.prompt.md +571 -0
  407. package/resources/gofer/copilot-prompts/gofer_personality.prompt.md +57 -0
  408. package/resources/gofer/copilot-prompts/gofer_plan.prompt.md +53 -0
  409. package/resources/gofer/copilot-prompts/gofer_side.prompt.md +58 -0
  410. package/resources/gofer/copilot-prompts/gofer_spec_summary.prompt.md +125 -0
  411. package/resources/gofer/copilot-prompts/gofer_tdd.prompt.md +125 -0
  412. package/resources/gofer/copilot-prompts/gofer_vocabulary.prompt.md +125 -0
  413. package/resources/gofer/copilot-prompts/gofer_zoom_out.prompt.md +125 -0
  414. package/resources/gofer/gemini/agents/assumption-tracker.md +171 -0
  415. package/resources/gofer/gemini/agents/business-metrics-analyzer.md +172 -0
  416. package/resources/gofer/gemini/agents/business-problem-validator.md +171 -0
  417. package/resources/gofer/gemini/agents/codebase-analyzer.md +127 -0
  418. package/resources/gofer/gemini/agents/codebase-locator.md +98 -0
  419. package/resources/gofer/gemini/agents/codebase-pattern-finder.md +183 -0
  420. package/resources/gofer/gemini/agents/comms-writer.md +161 -0
  421. package/resources/gofer/gemini/agents/engineer-review.md +172 -0
  422. package/resources/gofer/gemini/agents/implement-bug-triangulator.md +97 -0
  423. package/resources/gofer/gemini/agents/implement-code-review-council.md +92 -0
  424. package/resources/gofer/gemini/agents/implement-doc-writer.md +92 -0
  425. package/resources/gofer/gemini/agents/implement-error-hardener.md +87 -0
  426. package/resources/gofer/gemini/agents/implement-performance-explorer.md +98 -0
  427. package/resources/gofer/gemini/agents/implement-test-diversifier.md +85 -0
  428. package/resources/gofer/gemini/agents/implement-variant-generator.md +83 -0
  429. package/resources/gofer/gemini/agents/multi-perspective-judge.md +117 -0
  430. package/resources/gofer/gemini/agents/plan-api-comparator.md +93 -0
  431. package/resources/gofer/gemini/agents/plan-architecture-diverger.md +103 -0
  432. package/resources/gofer/gemini/agents/plan-data-model-stress-tester.md +98 -0
  433. package/resources/gofer/gemini/agents/plan-migration-path-finder.md +98 -0
  434. package/resources/gofer/gemini/agents/plan-refactor-rewrite-advisor.md +100 -0
  435. package/resources/gofer/gemini/agents/research-dependency-evaluator.md +109 -0
  436. package/resources/gofer/gemini/agents/research-horizon-scanner.md +103 -0
  437. package/resources/gofer/gemini/agents/research-market-scanner.md +140 -0
  438. package/resources/gofer/gemini/agents/research-perspective-multiplier.md +105 -0
  439. package/resources/gofer/gemini/agents/scope-creep-detector.md +155 -0
  440. package/resources/gofer/gemini/agents/specify-ambiguity-detector.md +98 -0
  441. package/resources/gofer/gemini/agents/specify-journey-stress-tester.md +95 -0
  442. package/resources/gofer/gemini/agents/tasks-cross-cutting-scanner.md +94 -0
  443. package/resources/gofer/gemini/agents/tasks-rollback-planner.md +92 -0
  444. package/resources/gofer/gemini/agents/validate-security-red-team.md +105 -0
  445. package/resources/gofer/gemini/agents/validation-correctness.md +106 -0
  446. package/resources/gofer/gemini/agents/validation-integration.md +132 -0
  447. package/resources/gofer/gemini/agents/validation-performance.md +123 -0
  448. package/resources/gofer/gemini/agents/validation-security.md +118 -0
  449. package/resources/gofer/gemini/agents/validation-standards.md +154 -0
  450. package/resources/gofer/gemini/agents/validation-test-quality.md +149 -0
  451. package/resources/gofer/gemini/agents/visual-bounded-context-writer.md +40 -0
  452. package/resources/gofer/gemini/agents/visual-c4-writer.md +44 -0
  453. package/resources/gofer/gemini/agents/visual-erd-writer.md +36 -0
  454. package/resources/gofer/gemini/agents/visual-heatmap-writer.md +63 -0
  455. package/resources/gofer/gemini/agents/visual-risk-writer.md +64 -0
  456. package/resources/gofer/gemini/commands/gofer/.gitkeep +0 -0
  457. package/resources/gofer/gemini/commands/gofer/0_gofer_start.md +1282 -0
  458. package/resources/gofer/gemini/commands/gofer/0_gofer_start.toml +2 -0
  459. package/resources/gofer/gemini/commands/gofer/0a_problem_validation.md +424 -0
  460. package/resources/gofer/gemini/commands/gofer/0a_problem_validation.toml +2 -0
  461. package/resources/gofer/gemini/commands/gofer/10_gofer_cloud.md +630 -0
  462. package/resources/gofer/gemini/commands/gofer/10_gofer_cloud.toml +2 -0
  463. package/resources/gofer/gemini/commands/gofer/1_gofer_research.md +1154 -0
  464. package/resources/gofer/gemini/commands/gofer/1_gofer_research.toml +2 -0
  465. package/resources/gofer/gemini/commands/gofer/2_gofer_specify.md +855 -0
  466. package/resources/gofer/gemini/commands/gofer/2_gofer_specify.toml +2 -0
  467. package/resources/gofer/gemini/commands/gofer/3_gofer_plan.md +881 -0
  468. package/resources/gofer/gemini/commands/gofer/3_gofer_plan.toml +2 -0
  469. package/resources/gofer/gemini/commands/gofer/4_gofer_tasks.md +743 -0
  470. package/resources/gofer/gemini/commands/gofer/4_gofer_tasks.toml +2 -0
  471. package/resources/gofer/gemini/commands/gofer/5_gofer_implement.md +919 -0
  472. package/resources/gofer/gemini/commands/gofer/5_gofer_implement.toml +2 -0
  473. package/resources/gofer/gemini/commands/gofer/6_gofer_validate.md +2264 -0
  474. package/resources/gofer/gemini/commands/gofer/6_gofer_validate.toml +2 -0
  475. package/resources/gofer/gemini/commands/gofer/7_gofer_save.md +418 -0
  476. package/resources/gofer/gemini/commands/gofer/7_gofer_save.toml +2 -0
  477. package/resources/gofer/gemini/commands/gofer/7a_stakeholder_comms.md +503 -0
  478. package/resources/gofer/gemini/commands/gofer/7a_stakeholder_comms.toml +2 -0
  479. package/resources/gofer/gemini/commands/gofer/8_gofer_branding.md +310 -0
  480. package/resources/gofer/gemini/commands/gofer/8_gofer_branding.toml +2 -0
  481. package/resources/gofer/gemini/commands/gofer/9_gofer_tests.md +553 -0
  482. package/resources/gofer/gemini/commands/gofer/9_gofer_tests.toml +2 -0
  483. package/resources/gofer/gemini/commands/gofer/gofer_bootstrap_workspace.md +143 -0
  484. package/resources/gofer/gemini/commands/gofer/gofer_bootstrap_workspace.toml +2 -0
  485. package/resources/gofer/gemini/commands/gofer/gofer_check_workspace.md +114 -0
  486. package/resources/gofer/gemini/commands/gofer/gofer_check_workspace.toml +2 -0
  487. package/resources/gofer/gemini/commands/gofer/gofer_constitution.md +607 -0
  488. package/resources/gofer/gemini/commands/gofer/gofer_constitution.toml +2 -0
  489. package/resources/gofer/gemini/commands/gofer/gofer_diagnose.md +109 -0
  490. package/resources/gofer/gemini/commands/gofer/gofer_diagnose.toml +2 -0
  491. package/resources/gofer/gemini/commands/gofer/gofer_eai_first_run.md +392 -0
  492. package/resources/gofer/gemini/commands/gofer/gofer_eai_first_run.toml +2 -0
  493. package/resources/gofer/gemini/commands/gofer/gofer_hydrate.md +556 -0
  494. package/resources/gofer/gemini/commands/gofer/gofer_hydrate.toml +2 -0
  495. package/resources/gofer/gemini/commands/gofer/gofer_personality.md +39 -0
  496. package/resources/gofer/gemini/commands/gofer/gofer_personality.toml +2 -0
  497. package/resources/gofer/gemini/commands/gofer/gofer_plan.md +35 -0
  498. package/resources/gofer/gemini/commands/gofer/gofer_plan.toml +2 -0
  499. package/resources/gofer/gemini/commands/gofer/gofer_side.md +40 -0
  500. package/resources/gofer/gemini/commands/gofer/gofer_side.toml +2 -0
  501. package/resources/gofer/gemini/commands/gofer/gofer_spec_summary.md +107 -0
  502. package/resources/gofer/gemini/commands/gofer/gofer_spec_summary.toml +2 -0
  503. package/resources/gofer/gemini/commands/gofer/gofer_tdd.md +107 -0
  504. package/resources/gofer/gemini/commands/gofer/gofer_tdd.toml +2 -0
  505. package/resources/gofer/gemini/commands/gofer/gofer_vocabulary.md +107 -0
  506. package/resources/gofer/gemini/commands/gofer/gofer_vocabulary.toml +2 -0
  507. package/resources/gofer/gemini/commands/gofer/gofer_zoom_out.md +107 -0
  508. package/resources/gofer/gemini/commands/gofer/gofer_zoom_out.toml +2 -0
  509. package/resources/gofer/gemini/commands/gofer/manifest.json +32 -0
  510. package/resources/gofer/gemini/extension.json +16 -0
  511. package/resources/gofer/github-agents/gofer-business.agent.md +20 -0
  512. package/resources/gofer/github-agents/gofer-implement.agent.md +15 -0
  513. package/resources/gofer/github-agents/gofer-plan.agent.md +15 -0
  514. package/resources/gofer/github-agents/gofer-research.agent.md +15 -0
  515. package/resources/gofer/github-agents/gofer-validate.agent.md +10 -0
  516. package/resources/gofer/github-skills/eai-gofer/SKILL.md +56 -0
  517. package/resources/gofer/hook-scripts/agent-stop.mjs +655 -0
  518. package/resources/gofer/hook-scripts/log-stage-launch-time.mjs +77 -0
  519. package/resources/gofer/hook-scripts/post-tool-use.mjs +333 -0
  520. package/resources/gofer/hook-scripts/queued-input.mjs +188 -0
  521. package/resources/gofer/hook-scripts/session-lifecycle.mjs +93 -0
  522. package/resources/gofer/hook-scripts/user-prompt-submit.mjs +228 -0
  523. package/resources/gofer/instruction-templates/base/agents-base.md +37 -0
  524. package/resources/gofer/instruction-templates/base/claude-base.md +7 -0
  525. package/resources/gofer/instruction-templates/base/copilot-base.md +26 -0
  526. package/resources/gofer/instruction-templates/gofer/gofer-claude.md +5 -0
  527. package/resources/gofer/instruction-templates/gofer/gofer-copilot.md +9 -0
  528. package/resources/gofer/instruction-templates/languages/generic.md +7 -0
  529. package/resources/gofer/instruction-templates/languages/go.md +8 -0
  530. package/resources/gofer/instruction-templates/languages/java.md +8 -0
  531. package/resources/gofer/instruction-templates/languages/python.md +9 -0
  532. package/resources/gofer/instruction-templates/languages/rust.md +9 -0
  533. package/resources/gofer/instruction-templates/languages/typescript.md +19 -0
  534. package/resources/gofer/instruction-templates/workflow/principles.md +52 -0
  535. package/resources/gofer/memory/constitution.md +391 -0
  536. package/resources/gofer/memory/context-profiles.yaml +74 -0
  537. package/resources/gofer/memory/decisions/000-use-adr-for-decisions.md +67 -0
  538. package/resources/gofer/memory/decisions/001-di-framework.md +190 -0
  539. package/resources/gofer/memory/decisions/002-module-extraction.md +305 -0
  540. package/resources/gofer/memory/decisions/003-error-handling.md +368 -0
  541. package/resources/gofer/memory/decisions/004-cache-eviction.md +436 -0
  542. package/resources/gofer/memory/decisions/005-constants-management.md +520 -0
  543. package/resources/gofer/memory/decisions/README.md +129 -0
  544. package/resources/gofer/memory/diagrams/di-container.mmd +321 -0
  545. package/resources/gofer/memory/diagrams/extension-activation.mmd +184 -0
  546. package/resources/gofer/memory/diagrams/module-dependencies.mmd +264 -0
  547. package/resources/gofer/memory/gofer-model-policy.yaml +97 -0
  548. package/resources/gofer/memory/lessons.md +46 -0
  549. package/resources/gofer/node-scripts/canonical-descriptions.mjs +86 -0
  550. package/resources/gofer/node-scripts/check-version-alignment.mjs +131 -0
  551. package/resources/gofer/node-scripts/codex-doctor.mjs +425 -0
  552. package/resources/gofer/node-scripts/generate-commands.mjs +1366 -0
  553. package/resources/gofer/node-scripts/generate-issues.js +563 -0
  554. package/resources/gofer/node-scripts/gofer-closed-loop-audit.mjs +893 -0
  555. package/resources/gofer/node-scripts/gofer-loop-audit.mjs +541 -0
  556. package/resources/gofer/node-scripts/gofer-performance-report.mjs +306 -0
  557. package/resources/gofer/node-scripts/gofer-workspace-bootstrap.mjs +56 -0
  558. package/resources/gofer/node-scripts/gofer-workspace-check.mjs +56 -0
  559. package/resources/gofer/node-scripts/lib/ai-leverage-tagger.mjs +103 -0
  560. package/resources/gofer/node-scripts/lib/assemble-stakeholder-pack.mjs +114 -0
  561. package/resources/gofer/node-scripts/lib/marp-deck.mjs +87 -0
  562. package/resources/gofer/node-scripts/lib/mermaid-tabular-fallback.mjs +264 -0
  563. package/resources/gofer/node-scripts/lib/render-visual.mjs +54 -0
  564. package/resources/gofer/node-scripts/lib/validate-aliases.mjs +85 -0
  565. package/resources/gofer/node-scripts/lib/visual-counts.mjs +44 -0
  566. package/resources/gofer/node-scripts/lib/visual-pass-pipeline.mjs +134 -0
  567. package/resources/gofer/node-scripts/mermaid-export.mjs +72 -0
  568. package/resources/gofer/node-scripts/package-agent-plugin.mjs +940 -0
  569. package/resources/gofer/node-scripts/parse-stage-command.mjs +211 -0
  570. package/resources/gofer/node-scripts/schemas/.gitkeep +0 -0
  571. package/resources/gofer/node-scripts/schemas/stage-command.schema.json +72 -0
  572. package/resources/gofer/node-scripts/sync-extension-resources.mjs +110 -0
  573. package/resources/gofer/node-scripts/workspace-bootstrap-lib.mjs +1166 -0
  574. package/resources/gofer/powershell-scripts/install-optional-tools.ps1 +214 -0
  575. package/resources/gofer/references/platform/README.md +17 -0
  576. package/resources/gofer/references/platform/deployment-repo.md +9 -0
  577. package/resources/gofer/references/platform/eai-app-template.md +45 -0
  578. package/resources/gofer/references/platform/eai-config-driven-ui.md +156 -0
  579. package/resources/gofer/references/platform/eai-error-catalog.yaml +197 -0
  580. package/resources/gofer/references/platform/eai-repo-contract.md +134 -0
  581. package/resources/gofer/references/platform/eai-service-patterns.md +56 -0
  582. package/resources/gofer/references/platform/eai.md +85 -0
  583. package/resources/gofer/references/platform/vertical-template.md +49 -0
  584. package/resources/gofer/specify-commands/.gitkeep +0 -0
  585. package/resources/gofer/specify-commands/0_gofer_start.md +1299 -0
  586. package/resources/gofer/specify-commands/0a_problem_validation.md +405 -0
  587. package/resources/gofer/specify-commands/10_gofer_cloud.md +611 -0
  588. package/resources/gofer/specify-commands/1_gofer_research.md +1135 -0
  589. package/resources/gofer/specify-commands/2_gofer_specify.md +836 -0
  590. package/resources/gofer/specify-commands/3_gofer_plan.md +862 -0
  591. package/resources/gofer/specify-commands/4_gofer_tasks.md +724 -0
  592. package/resources/gofer/specify-commands/5_gofer_implement.md +900 -0
  593. package/resources/gofer/specify-commands/6_gofer_validate.md +2245 -0
  594. package/resources/gofer/specify-commands/7_gofer_save.md +399 -0
  595. package/resources/gofer/specify-commands/7a_stakeholder_comms.md +484 -0
  596. package/resources/gofer/specify-commands/8_gofer_branding.md +291 -0
  597. package/resources/gofer/specify-commands/9_gofer_tests.md +534 -0
  598. package/resources/gofer/specify-commands/gofer_bootstrap_workspace.md +159 -0
  599. package/resources/gofer/specify-commands/gofer_check_workspace.md +130 -0
  600. package/resources/gofer/specify-commands/gofer_constitution.md +588 -0
  601. package/resources/gofer/specify-commands/gofer_diagnose.md +89 -0
  602. package/resources/gofer/specify-commands/gofer_eai_first_run.md +392 -0
  603. package/resources/gofer/specify-commands/gofer_hydrate.md +537 -0
  604. package/resources/gofer/specify-commands/gofer_personality.md +61 -0
  605. package/resources/gofer/specify-commands/gofer_plan.md +51 -0
  606. package/resources/gofer/specify-commands/gofer_side.md +56 -0
  607. package/resources/gofer/specify-commands/gofer_spec_summary.md +87 -0
  608. package/resources/gofer/specify-commands/gofer_tdd.md +87 -0
  609. package/resources/gofer/specify-commands/gofer_vocabulary.md +87 -0
  610. package/resources/gofer/specify-commands/gofer_zoom_out.md +87 -0
  611. package/resources/gofer/system-skills/0_gofer_start/SKILL.md +1287 -0
  612. package/resources/gofer/system-skills/0a_problem_validation/SKILL.md +429 -0
  613. package/resources/gofer/system-skills/10_gofer_cloud/SKILL.md +635 -0
  614. package/resources/gofer/system-skills/1_gofer_research/SKILL.md +1159 -0
  615. package/resources/gofer/system-skills/2_gofer_specify/SKILL.md +860 -0
  616. package/resources/gofer/system-skills/3_gofer_plan/SKILL.md +886 -0
  617. package/resources/gofer/system-skills/4_gofer_tasks/SKILL.md +748 -0
  618. package/resources/gofer/system-skills/5_gofer_implement/SKILL.md +924 -0
  619. package/resources/gofer/system-skills/6_gofer_validate/SKILL.md +2269 -0
  620. package/resources/gofer/system-skills/7_gofer_save/SKILL.md +423 -0
  621. package/resources/gofer/system-skills/7a_stakeholder_comms/SKILL.md +508 -0
  622. package/resources/gofer/system-skills/8_gofer_branding/SKILL.md +315 -0
  623. package/resources/gofer/system-skills/9_gofer_tests/SKILL.md +558 -0
  624. package/resources/gofer/system-skills/gofer_bootstrap_workspace/SKILL.md +148 -0
  625. package/resources/gofer/system-skills/gofer_check_workspace/SKILL.md +119 -0
  626. package/resources/gofer/system-skills/gofer_constitution/SKILL.md +612 -0
  627. package/resources/gofer/system-skills/gofer_diagnose/SKILL.md +114 -0
  628. package/resources/gofer/system-skills/gofer_eai_first_run/SKILL.md +397 -0
  629. package/resources/gofer/system-skills/gofer_hydrate/SKILL.md +561 -0
  630. package/resources/gofer/system-skills/gofer_personality/SKILL.md +44 -0
  631. package/resources/gofer/system-skills/gofer_plan/SKILL.md +40 -0
  632. package/resources/gofer/system-skills/gofer_side/SKILL.md +45 -0
  633. package/resources/gofer/system-skills/gofer_spec_summary/SKILL.md +112 -0
  634. package/resources/gofer/system-skills/gofer_tdd/SKILL.md +112 -0
  635. package/resources/gofer/system-skills/gofer_vocabulary/SKILL.md +112 -0
  636. package/resources/gofer/system-skills/gofer_zoom_out/SKILL.md +112 -0
  637. package/resources/gofer/templates/agent-file-template.md +28 -0
  638. package/resources/gofer/templates/assumptions-template.md +94 -0
  639. package/resources/gofer/templates/audit-history-template.md +35 -0
  640. package/resources/gofer/templates/brand/brand-profile-template.json +45 -0
  641. package/resources/gofer/templates/brand/document-style-template.md +50 -0
  642. package/resources/gofer/templates/brand/marp-theme-template.css +58 -0
  643. package/resources/gofer/templates/brownfield-analysis.md +44 -0
  644. package/resources/gofer/templates/business-metrics-template.md +120 -0
  645. package/resources/gofer/templates/business-owner-summary-template.md +83 -0
  646. package/resources/gofer/templates/checklist-template.md +40 -0
  647. package/resources/gofer/templates/ciso-security-summary-template.md +70 -0
  648. package/resources/gofer/templates/context-bundle-template.md +76 -0
  649. package/resources/gofer/templates/contract-pack-template.md +109 -0
  650. package/resources/gofer/templates/cto-architecture-summary-template.md +83 -0
  651. package/resources/gofer/templates/discovery-template.md +92 -0
  652. package/resources/gofer/templates/eai-preflight-template.md +144 -0
  653. package/resources/gofer/templates/goal-ledger-template.json +69 -0
  654. package/resources/gofer/templates/gofer-model-policy.yaml +97 -0
  655. package/resources/gofer/templates/issues-template.md +106 -0
  656. package/resources/gofer/templates/journey/base-journey.md +95 -0
  657. package/resources/gofer/templates/journey/industry-variants.yaml +277 -0
  658. package/resources/gofer/templates/loop-contract-template.json +68 -0
  659. package/resources/gofer/templates/plan-template.md +215 -0
  660. package/resources/gofer/templates/problem-brief-template.md +85 -0
  661. package/resources/gofer/templates/proposal-review-template.md +79 -0
  662. package/resources/gofer/templates/research-template.md +222 -0
  663. package/resources/gofer/templates/reuse-scan-template.md +43 -0
  664. package/resources/gofer/templates/sequence-diagrams/option-spectrum.yaml +178 -0
  665. package/resources/gofer/templates/service-fit-matrix-template.md +29 -0
  666. package/resources/gofer/templates/session-handoff-template.md +172 -0
  667. package/resources/gofer/templates/spec-summary-template.md +118 -0
  668. package/resources/gofer/templates/spec-template.md +196 -0
  669. package/resources/gofer/templates/stakeholder-comms-template.md +330 -0
  670. package/resources/gofer/templates/stakeholder-review-index-template.md +54 -0
  671. package/resources/gofer/templates/tasks-template.md +323 -0
  672. package/resources/gofer/templates/ui-approval-template.md +32 -0
  673. package/resources/gofer/templates/ui-preview-brief-template.md +65 -0
  674. package/resources/gofer/templates/ui-review-log-template.md +11 -0
  675. package/resources/gofer/templates/visuals/.gitkeep +0 -0
  676. package/resources/gofer/templates/visuals/bounded-context-map.md +19 -0
  677. package/resources/gofer/templates/visuals/bounded-context-template.md +47 -0
  678. package/resources/gofer/templates/visuals/c4-container-template.md +38 -0
  679. package/resources/gofer/templates/visuals/c4-container.md +20 -0
  680. package/resources/gofer/templates/visuals/c4-context-template.md +46 -0
  681. package/resources/gofer/templates/visuals/capability-heatmap-template.md +54 -0
  682. package/resources/gofer/templates/visuals/data-model-erd-template.md +41 -0
  683. package/resources/gofer/templates/visuals/erd.md +19 -0
  684. package/resources/gofer/templates/visuals/impact-canvas.md +40 -0
  685. package/resources/gofer/templates/visuals/risk-heatmap-template.md +51 -0
  686. package/resources/gofer/templates/visuals/roi-projection.md +17 -0
  687. package/resources/gofer/templates/visuals/value-stream-asis.md +16 -0
  688. package/resources/gofer/templates/visuals/value-stream-tobe.md +18 -0
  689. package/resources/gofer/templates/working-backwards-prfaq-template.md +165 -0
  690. package/resources/linked-sources.json +25 -0
@@ -0,0 +1,855 @@
1
+ /**
2
+ * eai provision — provision platform resources for an app.
3
+ */
4
+ import { Command } from 'commander';
5
+ import chalk from 'chalk';
6
+ import { readFile, writeFile } from 'node:fs/promises';
7
+ import { join } from 'node:path';
8
+ import { findProjectRoot, loadEnvFile, patchEnvFile } from '../lib/config.js';
9
+ import { resolveActiveTenantContext, resolvePublicApiUrl } from '../lib/tenant-context.js';
10
+ import { PlatformAPIClient, PlatformAPIRequestError, } from '../lib/api.js';
11
+ import { getAccessToken, loadTokens } from '../lib/auth.js';
12
+ import * as out from '../lib/output.js';
13
+ import { ErrorCode, exitWithError } from '../lib/error-codes.js';
14
+ import { buildPassiveResourceApiBundle } from '../lib/resourceapi-bundle.js';
15
+ import { findGuidanceByCode } from '../lib/error-guidance/catalog.js';
16
+ import { formatGuidanceText } from '../lib/error-guidance/render.js';
17
+ function readErrorContext(err) {
18
+ if (err instanceof PlatformAPIRequestError) {
19
+ return {
20
+ status: err.status,
21
+ serverMessage: err.serverMessage,
22
+ serverCode: err.serverCode,
23
+ requestId: err.requestId,
24
+ rawBody: err.rawBody,
25
+ };
26
+ }
27
+ return {};
28
+ }
29
+ function normalizeLocalEntraSetting(value) {
30
+ const normalized = value?.trim();
31
+ if (!normalized) {
32
+ return null;
33
+ }
34
+ if (['empty', 'changeme', 'placeholder', '<empty>'].includes(normalized.toLowerCase())) {
35
+ return null;
36
+ }
37
+ return normalized;
38
+ }
39
+ function hasUsableLocalEntraSecret(env) {
40
+ return normalizeLocalEntraSetting(env.ENTRA_CLIENT_SECRET) !== null;
41
+ }
42
+ function hasUsableLocalEntraClientId(env) {
43
+ return normalizeLocalEntraSetting(env.ENTRA_CLIENT_ID) !== null;
44
+ }
45
+ async function removeEnvFileKeys(projectRoot, keys) {
46
+ const envPath = join(projectRoot, '.env.local');
47
+ let content;
48
+ try {
49
+ content = await readFile(envPath, 'utf-8');
50
+ }
51
+ catch {
52
+ return;
53
+ }
54
+ const keySet = new Set(keys);
55
+ const updatedLines = content
56
+ .split('\n')
57
+ .filter((line) => {
58
+ const trimmed = line.trimStart();
59
+ for (const key of keySet) {
60
+ if (line.startsWith(`${key}=`) || trimmed.startsWith(`export ${key}=`)) {
61
+ return false;
62
+ }
63
+ }
64
+ return true;
65
+ });
66
+ const normalized = updatedLines.join('\n').replace(/\n{3,}/g, '\n\n');
67
+ await writeFile(envPath, normalized.endsWith('\n') ? normalized : `${normalized}\n`, 'utf-8');
68
+ }
69
+ function printServerDetail(ctx, diag, options = {}) {
70
+ const includeServerMessage = options.includeServerMessage ?? true;
71
+ const includeServerCode = options.includeServerCode ?? true;
72
+ if (includeServerMessage && ctx.serverMessage) {
73
+ out.info(`Server: ${ctx.serverMessage}`);
74
+ }
75
+ if (ctx.requestId) {
76
+ out.info(`Request ID: ${ctx.requestId}`);
77
+ }
78
+ if (diag.debug && ctx.status) {
79
+ out.info(`HTTP status: ${ctx.status}`);
80
+ }
81
+ if (diag.debug && includeServerCode && ctx.serverCode) {
82
+ out.info(`Server code: ${ctx.serverCode}`);
83
+ }
84
+ }
85
+ function printProvisionFallback(reference) {
86
+ out.info(`Reference: ${reference}`);
87
+ out.info('Retry after confirming you are logged in and have selected the correct tenant.');
88
+ out.info('If this continues, contact your platform administrator.');
89
+ out.info('Manual fallback: set ENTRA_CLIENT_ID and ENTRA_CLIENT_SECRET in .env.local.');
90
+ }
91
+ function printGuidance(code, context) {
92
+ const guidance = findGuidanceByCode(code);
93
+ if (guidance) {
94
+ out.error(formatGuidanceText(guidance, context));
95
+ }
96
+ }
97
+ function tenantLabel(diag) {
98
+ if (diag.tenantSlug && diag.tenantId) {
99
+ return `${chalk.cyan(diag.tenantSlug)} (${chalk.dim(diag.tenantId)})`;
100
+ }
101
+ return chalk.cyan(diag.tenantSlug ?? diag.tenantId ?? 'unknown');
102
+ }
103
+ function isAuthConfigErrorMessage(message) {
104
+ return message.includes('Stored CLI login does not match the active auth configuration')
105
+ || message.includes('no CLI public client ID was provided');
106
+ }
107
+ function handleProvisionError(err, diag) {
108
+ const ctx = readErrorContext(err);
109
+ const status = ctx.status;
110
+ if (status === 404) {
111
+ out.error('Entra provisioning is not available for this tenant or platform instance.');
112
+ printServerDetail(ctx, diag, { includeServerMessage: false, includeServerCode: false });
113
+ printProvisionFallback('EAI-PROVISION-UNAVAILABLE');
114
+ process.exit(1);
115
+ }
116
+ if (status === 501) {
117
+ out.error('Entra provisioning is not available on this platform instance.');
118
+ printServerDetail(ctx, diag, { includeServerMessage: false, includeServerCode: false });
119
+ printProvisionFallback('EAI-PROVISION-UNAVAILABLE');
120
+ process.exit(1);
121
+ }
122
+ if (status === 403) {
123
+ out.error(`Permission denied for tenant ${tenantLabel(diag)}.`);
124
+ printServerDetail(ctx, diag);
125
+ out.info('Confirm role with: eai whoami --verbose && eai tenant list');
126
+ if (diag.userOid) {
127
+ out.info(`Platform team can verify membership at /v4/platform/users/${diag.userOid}/memberships`);
128
+ }
129
+ out.info('Reference: EAI-PROVISION-FORBIDDEN');
130
+ printGuidance(ErrorCode.E204);
131
+ process.exit(1);
132
+ }
133
+ if (status === 409) {
134
+ out.error('The maximum number of app registrations for this tenant has been reached.');
135
+ printServerDetail(ctx, diag);
136
+ out.info('Reference: EAI-PROVISION-LIMIT');
137
+ out.info('Contact your platform administrator.');
138
+ process.exit(1);
139
+ }
140
+ out.error('Entra provisioning failed.');
141
+ printServerDetail(ctx, diag);
142
+ printProvisionFallback('EAI-PROVISION-FAILED');
143
+ process.exit(1);
144
+ }
145
+ function handleSecretRotationError(err, diag) {
146
+ const ctx = readErrorContext(err);
147
+ out.error('Entra client secret rotation failed.');
148
+ printServerDetail(ctx, diag);
149
+ out.info('Reference: EAI-PROVISION-ROTATE-SECRET-FAILED');
150
+ out.info('Confirm you are a tenant admin and ENTRA_CLIENT_ID belongs to the active tenant.');
151
+ process.exit(1);
152
+ }
153
+ function handleDeprovisionError(err, diag) {
154
+ const ctx = readErrorContext(err);
155
+ out.error('Entra app deprovisioning failed.');
156
+ printServerDetail(ctx, diag);
157
+ out.info('Reference: EAI-PROVISION-DEAUTHORIZE-FAILED');
158
+ out.info('Confirm you are a tenant admin and the client id belongs to the active tenant.');
159
+ process.exit(1);
160
+ }
161
+ async function formatJsonResponseError(response, label) {
162
+ const text = await response.text();
163
+ if (!text) {
164
+ return `${label} failed: ${response.status} ${response.statusText}`;
165
+ }
166
+ try {
167
+ const payload = JSON.parse(text);
168
+ const detail = payload.detail;
169
+ const message = typeof detail === 'object'
170
+ ? detail.message || detail.error
171
+ : detail || payload.message || payload.error;
172
+ return `${label} failed: ${response.status} ${response.statusText}${message ? ` — ${message}` : ''}`;
173
+ }
174
+ catch {
175
+ return `${label} failed: ${response.status} ${response.statusText} — ${text.slice(0, 300)}`;
176
+ }
177
+ }
178
+ async function formatProvisionResponseError(response) {
179
+ const text = await response.text();
180
+ if (!text) {
181
+ return `Storage provisioning failed: ${response.status} ${response.statusText}`;
182
+ }
183
+ try {
184
+ const payload = JSON.parse(text);
185
+ const detail = payload.detail;
186
+ const message = typeof detail === 'object'
187
+ ? detail.message || detail.error
188
+ : detail || payload.message || payload.error;
189
+ return `Storage provisioning failed: ${response.status} ${response.statusText}${message ? ` — ${message}` : ''}`;
190
+ }
191
+ catch {
192
+ return `Storage provisioning failed: ${response.status} ${response.statusText} — ${text.slice(0, 300)}`;
193
+ }
194
+ }
195
+ export const provisionCommand = new Command('provision')
196
+ .description('Provision platform resources for this app');
197
+ // ─── eai provision entra ──────────────────────────────────────────────────
198
+ provisionCommand
199
+ .command('entra')
200
+ .description('Create an Entra app registration for end-user auth (Auth.js)')
201
+ .option('--force', 'Re-check the remote app registration even if ENTRA_CLIENT_ID already exists locally', false)
202
+ .option('--rotate-secret', 'Rotate the existing ENTRA_CLIENT_ID secret and write the new value to .env.local', false)
203
+ .option('--deauthorize', 'Remove tenant authorization and delete the Entra app registration for cleanup', false)
204
+ .option('--client-id <id>', 'Client ID to deauthorize; defaults to ENTRA_CLIENT_ID in .env.local')
205
+ .option('--keep-registration', 'Only remove tenant authorization; do not delete the Entra app registration', false)
206
+ .option('--redirect-uri <uri>', 'Additional OAuth redirect URI to register (e.g. a deployed callback). Repeatable. Registered alongside the local callback; the platform merges with existing URIs.', (val, prev) => prev.concat(val), [])
207
+ .option('--debug', 'Print product-safe diagnostic status and request identifiers on failure', false)
208
+ .addHelpText('after', `
209
+ Examples:
210
+ $ eai provision entra
211
+ $ eai provision entra --force
212
+ $ eai provision entra --rotate-secret
213
+ $ eai provision entra --deauthorize --force
214
+ $ eai provision entra --redirect-uri https://abc.com/api/auth/callback/microsoft-entra-id
215
+
216
+ What happens:
217
+ - Calls the platform provisioning API to create an Entra app registration
218
+ - Writes ENTRA_CLIENT_ID and ENTRA_CLIENT_SECRET to .env.local
219
+ - If the registration already exists, confirms ENTRA_CLIENT_ID without rotating the secret
220
+ - With --rotate-secret, rotates the existing app registration secret through the platform API
221
+ - With --deauthorize --force, removes tenant authorization, deletes the app registration, and removes local ENTRA_CLIENT_ID/SECRET
222
+ - With --redirect-uri, registers the given deployed callback(s) in addition to the local one (the platform merges them with any already registered)
223
+
224
+ Diagnostics:
225
+ - Uses the PublicAPI URL from the active profile, .env.local BASE_URL_PUBLIC_API, environment, or the default API
226
+ - Default/no profile uses the public API; private profiles use their locally configured API
227
+ - The platform chooses the matching CIAM from its deployment configuration; the CLI never sends a CIAM selector
228
+ - Errors are product-safe and include a support reference without exposing platform internals
229
+ `)
230
+ .action(async (options) => {
231
+ const root = await findProjectRoot();
232
+ if (!root) {
233
+ exitWithError(ErrorCode.E001);
234
+ }
235
+ const env = await loadEnvFile(root);
236
+ const appName = env.NEXT_PUBLIC_APP_NAME;
237
+ if (!appName) {
238
+ out.error('NEXT_PUBLIC_APP_NAME is not set in .env.local. Run `eai init` to scaffold an app first.');
239
+ process.exit(1);
240
+ }
241
+ // Check if ENTRA_CLIENT_ID already exists
242
+ if (hasUsableLocalEntraClientId(env) && !options.force && !options.rotateSecret && !options.deauthorize) {
243
+ out.warn(`ENTRA_CLIENT_ID is already set for ${chalk.cyan(appName)}.`);
244
+ out.info(`Use ${chalk.cyan('eai provision entra --force')} to re-check the remote registration and confirm ENTRA_CLIENT_ID.`);
245
+ out.info(`Use ${chalk.cyan('eai provision entra --rotate-secret')} to rotate and write a new ENTRA_CLIENT_SECRET.`);
246
+ out.info(`Use ${chalk.cyan('eai provision entra --deauthorize --force')} to clean up the app registration.`);
247
+ process.exit(0);
248
+ }
249
+ const publicApiUrl = await resolvePublicApiUrl(root);
250
+ let tenantId;
251
+ let tenantSlug;
252
+ let userOid;
253
+ try {
254
+ const context = await resolveActiveTenantContext({ projectRoot: root, publicApiUrl, interactive: true });
255
+ tenantId = context.activeTenant.id;
256
+ tenantSlug = context.activeTenant.slug;
257
+ userOid = context.user?.oid
258
+ ?? context.user?.id;
259
+ }
260
+ catch (error) {
261
+ const message = error instanceof Error ? error.message : String(error);
262
+ if (isAuthConfigErrorMessage(message)) {
263
+ out.error(message);
264
+ out.info('Run `eai login` again after sourcing the intended environment, then retry provisioning.');
265
+ process.exit(1);
266
+ }
267
+ out.error('Failed to resolve active tenant.');
268
+ out.info(`Run ${chalk.cyan('eai login')} and ${chalk.cyan('eai tenant select')} first.`);
269
+ process.exit(1);
270
+ }
271
+ const diag = { tenantSlug, tenantId, userOid, debug: Boolean(options.debug) };
272
+ const client = new PlatformAPIClient(publicApiUrl, tenantId);
273
+ if (options.deauthorize) {
274
+ if (options.rotateSecret) {
275
+ out.error('Choose either --deauthorize or --rotate-secret, not both.');
276
+ process.exit(1);
277
+ }
278
+ if (options.redirectUri?.length) {
279
+ out.error('Do not combine --deauthorize with --redirect-uri.');
280
+ process.exit(1);
281
+ }
282
+ if (!options.force) {
283
+ out.error('Refusing to deauthorize without explicit confirmation.');
284
+ out.info(`Re-run with ${chalk.cyan('eai provision entra --deauthorize --force')}.`);
285
+ process.exit(1);
286
+ }
287
+ const localClientId = normalizeLocalEntraSetting(env.ENTRA_CLIENT_ID);
288
+ const clientId = normalizeLocalEntraSetting(options.clientId) ?? localClientId;
289
+ if (!clientId) {
290
+ out.error('No Entra client id was provided or found in .env.local.');
291
+ out.info('Pass --client-id <id>, or run from a project with ENTRA_CLIENT_ID in .env.local.');
292
+ process.exit(1);
293
+ }
294
+ out.info(`Deauthorizing Entra app registration for ${chalk.cyan(appName)}...`);
295
+ try {
296
+ const result = await client.deprovisionEntraApp({
297
+ tenantId,
298
+ clientId,
299
+ deleteRegistration: !options.keepRegistration,
300
+ });
301
+ const localEnvCleaned = localClientId === clientId;
302
+ if (localEnvCleaned) {
303
+ await removeEnvFileKeys(root, ['ENTRA_CLIENT_ID', 'ENTRA_CLIENT_SECRET']);
304
+ }
305
+ else if (localClientId) {
306
+ out.warn('Local ENTRA_CLIENT_ID belongs to a different app; leaving .env.local unchanged.');
307
+ }
308
+ out.success(`Entra app cleanup complete for ${chalk.cyan(appName)}`);
309
+ out.table([
310
+ ['Client ID', chalk.dim(result.clientId)],
311
+ ['Tenant authorization removed', result.tenantDeauthorization.removed ? chalk.green('yes') : chalk.yellow('already absent')],
312
+ ['App registration found', result.appRegistrationFound ? 'yes' : 'no'],
313
+ ['App registration deleted', result.appRegistrationDeleted ? 'yes' : options.keepRegistration ? 'kept' : 'already absent'],
314
+ ['Local env cleaned', localEnvCleaned ? 'ENTRA_CLIENT_ID, ENTRA_CLIENT_SECRET' : 'not changed'],
315
+ ]);
316
+ return;
317
+ }
318
+ catch (err) {
319
+ handleDeprovisionError(err, diag);
320
+ }
321
+ }
322
+ if (options.rotateSecret) {
323
+ if (!hasUsableLocalEntraClientId(env)) {
324
+ out.error('ENTRA_CLIENT_ID is not set in .env.local. Run `eai provision entra` first.');
325
+ process.exit(1);
326
+ }
327
+ out.info(`Rotating Entra client secret for ${chalk.cyan(appName)}...`);
328
+ try {
329
+ const rotated = await client.rotateEntraAppSecret({
330
+ tenantId,
331
+ clientId: normalizeLocalEntraSetting(env.ENTRA_CLIENT_ID),
332
+ });
333
+ await patchEnvFile(root, {
334
+ ENTRA_CLIENT_ID: rotated.clientId,
335
+ ENTRA_CLIENT_SECRET: rotated.clientSecret,
336
+ EAI_TENANT_ID: rotated.tenantId,
337
+ });
338
+ out.success(`Entra client secret rotated for ${chalk.cyan(appName)}`);
339
+ out.table([
340
+ ['Client ID', chalk.dim(rotated.clientId)],
341
+ ['Client Secret', chalk.dim('[written to .env.local]')],
342
+ ['Expires', chalk.dim(rotated.expiresAt || 'unknown')],
343
+ ]);
344
+ out.warn('The new client secret has been written to .env.local and cannot be retrieved again.');
345
+ out.warn('Do NOT commit .env.local to source control.');
346
+ return;
347
+ }
348
+ catch (err) {
349
+ handleSecretRotationError(err, diag);
350
+ }
351
+ }
352
+ out.info(`Provisioning Entra app registration for ${chalk.cyan(appName)}...`);
353
+ let result;
354
+ const authRuntime = resolveAuthRuntime(env);
355
+ const localCallback = `${authRuntime.siteUrl}/api/auth/callback/microsoft-entra-id`;
356
+ // Local callback first, then any deployed callbacks passed via --redirect-uri,
357
+ // deduped. The platform merges these with already-registered URIs (additive),
358
+ // so this never drops a previously-registered deployed callback.
359
+ const extraRedirectUris = options.redirectUri ?? [];
360
+ const redirectUris = [localCallback, ...extraRedirectUris.filter((u) => u !== localCallback)];
361
+ try {
362
+ result = await client.provisionEntraApp({
363
+ tenantId,
364
+ appName,
365
+ redirectUris,
366
+ // The platform route is intentionally idempotent: it creates on first run and
367
+ // returns the existing app ID on later runs without attempting secret rotation.
368
+ idempotent: true,
369
+ });
370
+ }
371
+ catch (err) {
372
+ handleProvisionError(err, diag);
373
+ }
374
+ // Build env-var patches that derive from the platform response so the
375
+ // CLI persists scopes / redirect URIs / environment / tenant id without
376
+ // requiring manual portal clicks. Older PublicAPI versions return empty
377
+ // arrays; in that case we leave the keys untouched rather than writing
378
+ // empty strings.
379
+ const optionalEnv = {};
380
+ if (result.scopes.length > 0) {
381
+ optionalEnv.ENTRA_SCOPES = result.scopes.join(' ');
382
+ }
383
+ optionalEnv.ENTRA_REDIRECT_URIS = redirectUris.join(' ');
384
+ optionalEnv.AUTH_URL = authRuntime.siteUrl;
385
+ optionalEnv.NEXTAUTH_URL = authRuntime.siteUrl;
386
+ optionalEnv.AUTH_TRUST_HOST = 'true';
387
+ if (result.environment) {
388
+ optionalEnv.ENTRA_ENVIRONMENT = result.environment;
389
+ }
390
+ if (result.tenantId) {
391
+ optionalEnv.EAI_TENANT_ID = result.tenantId;
392
+ }
393
+ // Persist the Entra directory (authority) tenant id + name from the
394
+ // authenticated session so Auth.js can construct the issuer URL without a
395
+ // follow-up `eai env pull`. These come from the login token, not the
396
+ // platform provision response.
397
+ const tokens = await loadTokens();
398
+ if (tokens?.tenantId) {
399
+ optionalEnv.ENTRA_TENANT_ID = tokens.tenantId;
400
+ }
401
+ if (tokens?.tenantName) {
402
+ optionalEnv.ENTRA_TENANT_NAME = tokens.tenantName;
403
+ }
404
+ if (result.existing && !result.clientSecret) {
405
+ out.info(`App registration already exists for ${chalk.cyan(appName)}.`);
406
+ if (hasUsableLocalEntraSecret(env)) {
407
+ out.info('Your existing ENTRA_CLIENT_SECRET in .env.local remains valid.');
408
+ }
409
+ else {
410
+ out.error('No usable ENTRA_CLIENT_SECRET is available locally for the existing app registration.');
411
+ out.info('Run `eai provision entra --rotate-secret` to generate a new local secret, or set ENTRA_CLIENT_SECRET in .env.local.');
412
+ process.exit(1);
413
+ }
414
+ await patchEnvFile(root, { ENTRA_CLIENT_ID: result.clientId, ...optionalEnv });
415
+ out.success(`ENTRA_CLIENT_ID confirmed: ${chalk.dim(result.clientId)}`);
416
+ if (Object.keys(optionalEnv).length > 0) {
417
+ out.info(`Refreshed env vars from platform response: ${Object.keys(optionalEnv).join(', ')}`);
418
+ }
419
+ else {
420
+ out.warn('Platform response did not include scopes/redirect URIs — set ENTRA_SCOPES manually.');
421
+ }
422
+ reportTenantAuthorization(result.tenantAuthorization, result.clientId);
423
+ reportSigninCompleteness(result.signinCompleteness, result.clientId);
424
+ return;
425
+ }
426
+ if (!result.clientSecret) {
427
+ out.error('Platform returned a registration but no clientSecret. Contact your platform administrator.');
428
+ process.exit(1);
429
+ }
430
+ await patchEnvFile(root, {
431
+ ENTRA_CLIENT_ID: result.clientId,
432
+ ENTRA_CLIENT_SECRET: result.clientSecret,
433
+ ...optionalEnv,
434
+ });
435
+ out.success(`Entra app registration created for ${chalk.cyan(appName)}`);
436
+ const tableRows = [
437
+ ['Client ID', chalk.dim(result.clientId)],
438
+ ['Client Secret', chalk.dim('[written to .env.local]')],
439
+ ];
440
+ if (optionalEnv.ENTRA_SCOPES) {
441
+ tableRows.push(['Scopes', chalk.dim(optionalEnv.ENTRA_SCOPES)]);
442
+ }
443
+ if (optionalEnv.ENTRA_REDIRECT_URIS) {
444
+ tableRows.push(['Redirect URIs', chalk.dim(optionalEnv.ENTRA_REDIRECT_URIS)]);
445
+ }
446
+ if (optionalEnv.ENTRA_ENVIRONMENT) {
447
+ tableRows.push(['Environment', chalk.dim(optionalEnv.ENTRA_ENVIRONMENT)]);
448
+ }
449
+ if (optionalEnv.ENTRA_TENANT_ID) {
450
+ tableRows.push(['Directory Tenant ID', chalk.dim(optionalEnv.ENTRA_TENANT_ID)]);
451
+ }
452
+ if (optionalEnv.ENTRA_TENANT_NAME) {
453
+ tableRows.push(['Directory Tenant', chalk.dim(optionalEnv.ENTRA_TENANT_NAME)]);
454
+ }
455
+ out.table(tableRows);
456
+ out.warn('The client secret has been written to .env.local and cannot be retrieved again.');
457
+ out.warn('Do NOT commit .env.local to source control.');
458
+ if (!optionalEnv.ENTRA_SCOPES) {
459
+ out.warn('Platform response did not include scopes — set ENTRA_SCOPES manually.');
460
+ }
461
+ if (!optionalEnv.ENTRA_REDIRECT_URIS) {
462
+ out.warn('Platform response did not include redirect URIs — set ENTRA_REDIRECT_URIS manually.');
463
+ }
464
+ // Surface the management API's post-provision sign-in wiring rollup. When the API
465
+ // permission merge / admin consent / preAuthorizedApplications steps
466
+ // failed silently, the app reg looks "created" but cannot reach
467
+ // platform API from a user session — sign-in then fails with AADSTS650057
468
+ // the moment the app's BFF proxy makes its first call. Refusing to
469
+ // exit 0 here turns that silent failure into a loud, actionable one.
470
+ reportTenantAuthorization(result.tenantAuthorization, result.clientId);
471
+ reportSigninCompleteness(result.signinCompleteness, result.clientId);
472
+ });
473
+ // ─── eai provision resourceapi-refresh ──────────────────────────────────
474
+ provisionCommand
475
+ .command('resourceapi-refresh')
476
+ .description('Refresh a passive customer storage schema snapshot through the management service')
477
+ .requiredOption('--admin-api-url <url>', 'Management service URL for server-backed orchestration')
478
+ .option('--tenant-id <id>', 'Tenant ID the refresh is scoped to')
479
+ .option('--install-id <id>', 'Customer storage install registry ID')
480
+ .option('--apply', 'Apply the refreshed snapshot after planning', false)
481
+ .option('--dry-run', 'With --apply, ask the storage service to plan schema application without writing', false)
482
+ .option('--backend <backend>', 'postgresql|mongodb|documentdb|blob|search|all', 'all')
483
+ .option('--rebuild-search', 'Request search projection rebuild after schema sync', false)
484
+ .option('--force-overwrite', 'Allow the passive snapshot to overwrite an existing schema version', false)
485
+ .option('--no-verify', 'Skip storage schema-status verification after apply')
486
+ .option('--no-update-install-registry', 'Do not update the tenant install registry schema hash after apply')
487
+ .option('--reason <text>', 'Human-readable reason for a real schema refresh apply')
488
+ .option('--change-ticket <id>', 'Support/change ticket for audit trail')
489
+ .option('--product <key>', 'Product/app key this refresh enables')
490
+ .option('--schema-version <version>', 'Tenant schema version to stamp into metadata', '1')
491
+ .option('--format <format>', 'Output format (text|json)', 'text')
492
+ .option('--json', 'Output raw JSON (deprecated, use --format json)', false)
493
+ .addHelpText('after', `
494
+ Examples:
495
+ $ eai provision resourceapi-refresh --admin-api-url https://admin-api.example --tenant-id <tenantId> --install-id <installId>
496
+ $ eai provision resourceapi-refresh --admin-api-url https://admin-api.example --tenant-id <tenantId> --install-id <installId> --apply --dry-run --force-overwrite
497
+ $ eai provision resourceapi-refresh --admin-api-url https://admin-api.example --tenant-id <tenantId> --install-id <installId> --apply --force-overwrite --reason "Repair passive schema drift"
498
+
499
+ Notes:
500
+ - This is a super-admin repair path for passive customer storage schema metadata.
501
+ - It updates the tenant install registry only after the storage service accepts and verifies the refreshed snapshot.
502
+ `)
503
+ .action(async (options) => {
504
+ const jsonOutput = options.json || options.format === 'json';
505
+ const adminApiUrl = String(options.adminApiUrl || '').trim().replace(/\/+$/, '');
506
+ const root = await findProjectRoot();
507
+ if (!root) {
508
+ exitWithError(ErrorCode.E001);
509
+ }
510
+ const publicApiUrl = await resolvePublicApiUrl(root);
511
+ let tenantId = options.tenantId;
512
+ try {
513
+ const context = await resolveActiveTenantContext({
514
+ projectRoot: root,
515
+ publicApiUrl,
516
+ tenantId,
517
+ interactive: !tenantId,
518
+ forceRefresh: Boolean(tenantId),
519
+ });
520
+ tenantId = context.activeTenant.id;
521
+ }
522
+ catch (err) {
523
+ out.error(err instanceof Error ? err.message : String(err));
524
+ process.exit(1);
525
+ }
526
+ const token = await getAccessToken();
527
+ if (!token) {
528
+ out.error('Not logged in. Run `eai login` before calling server-backed provisioning.');
529
+ process.exit(1);
530
+ }
531
+ const response = await fetch(`${adminApiUrl}/v4/platform/tenants/${encodeURIComponent(tenantId)}/resourceapi/passive-refresh`, {
532
+ method: 'POST',
533
+ headers: {
534
+ Authorization: `Bearer ${token}`,
535
+ 'Content-Type': 'application/json',
536
+ },
537
+ body: JSON.stringify({
538
+ installId: options.installId,
539
+ productKey: options.product,
540
+ schemaVersion: options.schemaVersion,
541
+ apply: Boolean(options.apply),
542
+ dryRun: Boolean(options.dryRun),
543
+ backend: options.backend,
544
+ rebuildSearch: Boolean(options.rebuildSearch),
545
+ forceOverwrite: Boolean(options.forceOverwrite),
546
+ verify: options.verify !== false,
547
+ updateInstallRegistry: options.updateInstallRegistry !== false,
548
+ reason: options.reason,
549
+ changeTicket: options.changeTicket,
550
+ }),
551
+ });
552
+ if (!response.ok) {
553
+ out.error(await formatJsonResponseError(response, 'passive customer storage schema refresh'));
554
+ process.exit(1);
555
+ }
556
+ const payload = await response.json();
557
+ if (jsonOutput) {
558
+ out.json(payload);
559
+ return;
560
+ }
561
+ out.success(options.apply ? 'Passive customer storage schema refresh applied' : 'Passive customer storage schema refresh planned');
562
+ out.info(`Tenant: ${chalk.cyan(payload.tenantId)}`);
563
+ out.info(`Install: ${chalk.dim(payload.installId)}`);
564
+ out.info(`Object Types: ${payload.objectTypeCount}`);
565
+ out.info(`Storage Backends: ${payload.storageBackends.join(', ')}`);
566
+ out.info(`Schema Hash: ${chalk.dim(payload.schemaHash)}`);
567
+ out.info(`Verified: ${payload.verified ? 'yes' : 'no'}`);
568
+ out.info(`Install Registry Updated: ${payload.installRegistryUpdated ? 'yes' : 'no'}`);
569
+ const missing = payload.verifyDiff?.missingObjectTypes || payload.currentDiff?.missingObjectTypes || [];
570
+ if (missing.length) {
571
+ out.warn(`Missing Object Types: ${missing.join(', ')}`);
572
+ }
573
+ });
574
+ function normaliseBasePath(value) {
575
+ const trimmed = (value ?? '').trim();
576
+ if (!trimmed || trimmed === '/') {
577
+ return '';
578
+ }
579
+ return `/${trimmed.replace(/^\/+|\/+$/g, '')}`;
580
+ }
581
+ function stripAuthEndpointPath(pathname) {
582
+ if (pathname === '/api/auth') {
583
+ return '/';
584
+ }
585
+ return pathname.endsWith('/api/auth')
586
+ ? pathname.slice(0, -'/api/auth'.length) || '/'
587
+ : pathname;
588
+ }
589
+ function stripTrailingSlash(value) {
590
+ return value.replace(/\/+$/, '');
591
+ }
592
+ function resolveAuthRuntime(env) {
593
+ const basePath = normaliseBasePath(env.APP_BASE_PATH);
594
+ const rawUrl = env.NEXTAUTH_URL || env.AUTH_URL || 'http://localhost:3000';
595
+ try {
596
+ const url = new URL(rawUrl);
597
+ url.pathname = basePath || stripAuthEndpointPath(url.pathname);
598
+ url.search = '';
599
+ url.hash = '';
600
+ return { siteUrl: stripTrailingSlash(url.toString()) };
601
+ }
602
+ catch {
603
+ return { siteUrl: `http://localhost:3000${basePath}` };
604
+ }
605
+ }
606
+ function reportSigninCompleteness(summary, clientId) {
607
+ if (!summary) {
608
+ // Older PublicAPI deployments don't relay this field. We can't tell
609
+ // success from failure, so don't claim either way — silent.
610
+ return;
611
+ }
612
+ if (summary.signinReady) {
613
+ out.success('Sign-in wiring complete: app reg has Graph + PublicAPI delegated permissions, admin consent, and preAuthorizedApplications.');
614
+ return;
615
+ }
616
+ // Not ready — emit a structured error block and exit non-zero so
617
+ // onboarding scripts fail fast instead of producing a broken app.
618
+ out.error('Sign-in wiring incomplete — provisioning succeeded but the new app reg cannot reach PublicAPI from a user session.');
619
+ out.warn(' ✗ Without the steps below, browser sign-in will fail with AADSTS650057 the moment the BFF proxy calls PublicAPI.');
620
+ const stepRow = (label, ok) => [
621
+ label,
622
+ ok ? chalk.green('✓ done') : chalk.red('✗ missing'),
623
+ ];
624
+ out.table([
625
+ stepRow('Graph delegated perms', summary.graphPermsAdded),
626
+ stepRow('PublicAPI delegated perms', summary.publicapiPermsAdded),
627
+ stepRow('Admin consent', summary.consentGranted),
628
+ stepRow('preAuthorizedApplications', summary.publicapiPreauthorized),
629
+ ]);
630
+ if (summary.warnings.length > 0) {
631
+ out.warn('Reasons:');
632
+ for (const w of summary.warnings) {
633
+ out.warn(` - ${w}`);
634
+ }
635
+ }
636
+ out.warn('Remediation:');
637
+ out.warn(` 1. Azure portal → Microsoft Entra ID → App registrations → ${chalk.cyan(clientId)}`);
638
+ out.warn(' 2. API permissions → Add a permission → APIs my organization uses → select PublicAPI → Delegated permissions → access_token → Add');
639
+ out.warn(' 3. Grant admin consent for the directory tenant');
640
+ out.warn(' 4. Re-run sign-in (clear localhost cookie / use Incognito)');
641
+ out.warn('Or: ask your platform team to review the public provisioning support reference for this tenant.');
642
+ process.exit(1);
643
+ }
644
+ function reportTenantAuthorization(summary, clientId) {
645
+ if (!summary) {
646
+ out.warn('Tenant data-plane authorization status was not reported by PublicAPI.');
647
+ out.warn('Run `eai user provision-me` after provisioning to verify tenant access.');
648
+ return;
649
+ }
650
+ if (summary.warning || (!summary.added && !summary.alreadyAuthorized)) {
651
+ if (summary.warning) {
652
+ out.warn(`Reason: ${summary.warning}`);
653
+ }
654
+ out.warn(`App client ID: ${chalk.cyan(clientId)}`);
655
+ const code = summary.warning?.includes('502') || summary.warning?.includes('5xx')
656
+ ? ErrorCode.E243
657
+ : ErrorCode.E242;
658
+ printGuidance(code);
659
+ process.exit(1);
660
+ }
661
+ out.success(summary.added
662
+ ? 'Tenant data-plane authorization complete: app was added to the tenant allowlist.'
663
+ : 'Tenant data-plane authorization complete: app was already on the tenant allowlist.');
664
+ }
665
+ // ─── eai provision storage ───────────────────────────────────────────────
666
+ provisionCommand
667
+ .command('storage')
668
+ .description('Provision storage for the active tenant')
669
+ .option('--tenant-id <id>', 'Provision storage for a specific tenant')
670
+ .option('--backend <backend>', 'postgresql|mongodb|documentdb|blob|search|all', 'all')
671
+ .option('--dry-run', 'Plan actions without applying changes', false)
672
+ .option('--rebuild-search', 'Request search projection rebuild after provisioning', false)
673
+ .option('--format <format>', 'Output format (text|json)', 'text')
674
+ .option('--json', 'Output raw JSON (deprecated, use --format json)', false)
675
+ .action(async (options) => {
676
+ const root = await findProjectRoot();
677
+ if (!root) {
678
+ exitWithError(ErrorCode.E001);
679
+ }
680
+ const publicApiUrl = await resolvePublicApiUrl(root);
681
+ let tenantId = options.tenantId;
682
+ try {
683
+ const context = await resolveActiveTenantContext({
684
+ projectRoot: root,
685
+ publicApiUrl,
686
+ tenantId,
687
+ interactive: !tenantId,
688
+ forceRefresh: Boolean(tenantId),
689
+ });
690
+ tenantId = context.activeTenant.id;
691
+ }
692
+ catch (err) {
693
+ out.error(err instanceof Error ? err.message : String(err));
694
+ process.exit(1);
695
+ }
696
+ const client = new PlatformAPIClient(publicApiUrl, tenantId);
697
+ const jsonOutput = options.json || options.format === 'json';
698
+ if (!jsonOutput) {
699
+ out.info(`${options.dryRun ? 'Planning' : 'Provisioning'} storage for tenant ${tenantId}...`);
700
+ }
701
+ const response = await client.provisionStorage({
702
+ backend: options.backend,
703
+ dryRun: Boolean(options.dryRun),
704
+ rebuildSearch: Boolean(options.rebuildSearch),
705
+ });
706
+ if (!response.ok) {
707
+ out.error(await formatProvisionResponseError(response));
708
+ process.exit(1);
709
+ }
710
+ const payload = await response.json();
711
+ if (jsonOutput) {
712
+ out.json(payload);
713
+ return;
714
+ }
715
+ out.success(options.dryRun ? 'Storage plan complete' : 'Storage provisioning complete');
716
+ for (const result of payload.results) {
717
+ out.info(`${chalk.cyan(result.objectType)} ${chalk.dim(result.backend)} ${result.status}`);
718
+ for (const action of result.actions || []) {
719
+ out.dim(` ${action}`);
720
+ }
721
+ }
722
+ });
723
+ // ─── eai provision resourceapi-bundle ────────────────────────────────────
724
+ provisionCommand
725
+ .command('resourceapi-bundle')
726
+ .description('Prepare a customer-hosted storage schema bundle')
727
+ .option('--schema <file>', 'Object-types export JSON for local bundle generation')
728
+ .option('--tenant-id <id>', 'Tenant ID the bundle is scoped to')
729
+ .option('--install-id <id>', 'Customer storage install registry ID')
730
+ .option('--admin-api-url <url>', 'Management service URL for server-backed orchestration')
731
+ .option('--apply', 'Ask the management service to push the signed bundle to the customer storage install', false)
732
+ .option('--dry-run', 'Plan schema application without applying customer storage changes', false)
733
+ .option('--backend <backend>', 'postgresql|mongodb|documentdb|blob|search|all', 'all')
734
+ .option('--rebuild-search', 'Request search projection rebuild after schema sync', false)
735
+ .option('--product <key>', 'Product/app key this bundle enables')
736
+ .option('--schema-version <version>', 'Tenant schema version to stamp into metadata', '1')
737
+ .option('--out <file>', 'Write bundle JSON to this file')
738
+ .option('--format <format>', 'Output format (text|json)', 'text')
739
+ .option('--json', 'Output raw JSON (deprecated, use --format json)', false)
740
+ .addHelpText('after', `
741
+ Examples:
742
+ $ eai provision resourceapi-bundle --schema object-types.json --tenant-id <tenantId> --install-id <installId> --out resourceapi-bundle.json
743
+ $ eai provision resourceapi-bundle --admin-api-url https://admin-api.example --tenant-id <tenantId> --install-id <installId> --apply
744
+ $ eai provision resourceapi-bundle --schema object-types.json --tenant-id <tenantId> --install-id <installId> --product daisy-assist --format json
745
+
746
+ Notes:
747
+ - With --admin-api-url, the management service reads the platform schema source of truth, signs the bundle, and can push it.
748
+ - Local --schema mode is for offline inspection only and does not own provisioning policy.
749
+ `)
750
+ .action(async (options) => {
751
+ const jsonOutput = options.json || options.format === 'json';
752
+ const adminApiUrl = String(options.adminApiUrl || '').trim().replace(/\/+$/, '');
753
+ if (adminApiUrl) {
754
+ const root = await findProjectRoot();
755
+ if (!root) {
756
+ exitWithError(ErrorCode.E001);
757
+ }
758
+ const publicApiUrl = await resolvePublicApiUrl(root);
759
+ let tenantId = options.tenantId;
760
+ try {
761
+ const context = await resolveActiveTenantContext({
762
+ projectRoot: root,
763
+ publicApiUrl,
764
+ tenantId,
765
+ interactive: !tenantId,
766
+ forceRefresh: Boolean(tenantId),
767
+ });
768
+ tenantId = context.activeTenant.id;
769
+ }
770
+ catch (err) {
771
+ out.error(err instanceof Error ? err.message : String(err));
772
+ process.exit(1);
773
+ }
774
+ const token = await getAccessToken();
775
+ if (!token) {
776
+ out.error('Not logged in. Run `eai login` before calling server-backed provisioning.');
777
+ process.exit(1);
778
+ }
779
+ const response = await fetch(`${adminApiUrl}/v4/platform/tenants/${encodeURIComponent(tenantId)}/resourceapi/passive-bundle`, {
780
+ method: 'POST',
781
+ headers: {
782
+ Authorization: `Bearer ${token}`,
783
+ 'Content-Type': 'application/json',
784
+ },
785
+ body: JSON.stringify({
786
+ installId: options.installId,
787
+ productKey: options.product,
788
+ schemaVersion: options.schemaVersion,
789
+ apply: Boolean(options.apply),
790
+ dryRun: Boolean(options.dryRun),
791
+ backend: options.backend,
792
+ rebuildSearch: Boolean(options.rebuildSearch),
793
+ }),
794
+ });
795
+ if (!response.ok) {
796
+ out.error(await formatJsonResponseError(response, 'storage schema bundle provisioning'));
797
+ process.exit(1);
798
+ }
799
+ const payload = await response.json();
800
+ if (options.out) {
801
+ await writeFile(options.out, `${JSON.stringify(payload.bundle, null, 2)}\n`, 'utf-8');
802
+ }
803
+ if (jsonOutput) {
804
+ out.json(payload);
805
+ return;
806
+ }
807
+ if (options.apply) {
808
+ out.success('Storage schema bundle applied through the management service');
809
+ }
810
+ else if (options.out) {
811
+ out.success(`Storage schema bundle written to ${chalk.cyan(options.out)}`);
812
+ }
813
+ else {
814
+ out.success('Storage schema bundle prepared through the management service');
815
+ }
816
+ out.info(`Tenant: ${chalk.cyan(payload.tenantId)}`);
817
+ out.info(`Install: ${chalk.dim(payload.installId)}`);
818
+ out.info(`Object Types: ${payload.objectTypeCount}`);
819
+ out.info(`Storage Backends: ${payload.storageBackends.join(', ')}`);
820
+ return;
821
+ }
822
+ const schemaPath = String(options.schema || '').trim();
823
+ if (!schemaPath || !options.tenantId || !options.installId) {
824
+ out.error('--schema, --tenant-id, and --install-id are required for local bundle generation.');
825
+ out.info('Use --admin-api-url to let the management service build the bundle from the platform schema source of truth.');
826
+ process.exit(1);
827
+ }
828
+ const raw = await readFile(schemaPath, 'utf-8');
829
+ const schemaExport = JSON.parse(raw);
830
+ const bundle = buildPassiveResourceApiBundle(schemaExport, {
831
+ tenantId: options.tenantId,
832
+ installId: options.installId,
833
+ productKey: options.product,
834
+ schemaVersion: options.schemaVersion,
835
+ source: schemaPath,
836
+ });
837
+ if (options.out) {
838
+ await writeFile(options.out, `${JSON.stringify(bundle, null, 2)}\n`, 'utf-8');
839
+ }
840
+ if (jsonOutput) {
841
+ out.json(bundle);
842
+ return;
843
+ }
844
+ if (options.out) {
845
+ out.success(`Storage schema bundle written to ${chalk.cyan(options.out)}`);
846
+ }
847
+ else {
848
+ out.info(JSON.stringify(bundle, null, 2));
849
+ }
850
+ out.info(`Tenant: ${chalk.cyan(bundle.tenantId)}`);
851
+ out.info(`Install: ${chalk.dim(bundle.installId)}`);
852
+ out.info(`Object Types: ${bundle.objectTypes.length}`);
853
+ out.info(`Storage Backends: ${bundle.storageBackends.join(', ')}`);
854
+ });
855
+ //# sourceMappingURL=provision.js.map