@aifabrix/builder 2.49.2 → 2.50.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 (409) hide show
  1. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  2. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  3. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  4. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  5. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  6. package/.cursor/skills/README.md +1 -0
  7. package/.dockerignore +52 -0
  8. package/.eslintignore +22 -0
  9. package/README.md +2 -0
  10. package/bin/builder-api-cleanup.js +26 -0
  11. package/bin/builder-api-nest.js +10 -0
  12. package/bin/builder-api-spike.js +19 -0
  13. package/enterprise-knowledge/README.md +50 -0
  14. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  20. package/integration/README.md +81 -0
  21. package/integration/github/README.md +53 -0
  22. package/integration/github/application.json +21 -0
  23. package/integration/github/deploy.js +72 -0
  24. package/integration/github/env.template +11 -0
  25. package/integration/github/github-datasource-issue-comments.json +239 -0
  26. package/integration/github/github-datasource-issues.json +399 -0
  27. package/integration/github/github-datasource-repository.json +354 -0
  28. package/integration/github/github-deploy.json +1202 -0
  29. package/integration/github/github-system.json +82 -0
  30. package/integration/hubspot-test/README.md +1 -1
  31. package/jest.isolated-projects.js +31 -1
  32. package/jest.projects.js +87 -1
  33. package/lib/api/dev-server-https.js +1 -1
  34. package/lib/api/enterprise-knowledge.api.js +63 -0
  35. package/lib/api/evidence.api.js +172 -0
  36. package/lib/api/external-systems.api.js +8 -2
  37. package/lib/api/resource-types.api.js +1 -0
  38. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  39. package/lib/api/types/evidence.types.js +67 -0
  40. package/lib/api/types/resource-types.types.js +2 -0
  41. package/lib/app/controller-application-filter.js +36 -0
  42. package/lib/app/deploy.js +1 -1
  43. package/lib/app/list-external-systems.js +130 -0
  44. package/lib/app/list.js +20 -8
  45. package/lib/app/run.js +3 -1
  46. package/lib/app/show-display.js +8 -3
  47. package/lib/app/show-online.js +178 -0
  48. package/lib/app/show.js +37 -88
  49. package/lib/build/builder-api-docker-staging.js +47 -0
  50. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  51. package/lib/build/standard-docker-build.js +2 -0
  52. package/lib/certification/post-unified-cert-sync.js +4 -31
  53. package/lib/certification/sync-after-external-command.js +0 -1
  54. package/lib/certification/sync-system-certification.js +0 -3
  55. package/lib/channels/add-channel.js +40 -34
  56. package/lib/channels/approval-guides/chatgpt.js +33 -0
  57. package/lib/channels/approval-guides/credential-portal.js +38 -0
  58. package/lib/channels/approval-guides/index.js +110 -0
  59. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  60. package/lib/channels/approval-guides/slack.js +34 -0
  61. package/lib/channels/approval-guides/teams-bot.js +35 -0
  62. package/lib/channels/approval-guides/web-embed.js +32 -0
  63. package/lib/channels/channel-approval-guide.js +11 -0
  64. package/lib/channels/channel-artifact-generator.js +16 -4
  65. package/lib/channels/channel-audit.js +3 -0
  66. package/lib/channels/channel-auth-context.js +1 -1
  67. package/lib/channels/channel-description.js +59 -0
  68. package/lib/channels/channel-integration-generator.js +13 -230
  69. package/lib/channels/channel-integration-template.js +94 -0
  70. package/lib/channels/channel-runtime-resolver.js +43 -3
  71. package/lib/channels/channel-status-display.js +66 -26
  72. package/lib/channels/channel-targets.js +3 -3
  73. package/lib/cli/index.js +27 -3
  74. package/lib/cli/infra-guided.js +5 -1
  75. package/lib/cli/setup-app-external-create.js +111 -0
  76. package/lib/cli/setup-app.help.js +1 -1
  77. package/lib/cli/setup-app.js +38 -125
  78. package/lib/cli/setup-app.test-commands.js +26 -52
  79. package/lib/cli/setup-certification-commands.js +4 -4
  80. package/lib/cli/setup-certification.help.js +9 -9
  81. package/lib/cli/setup-dev.js +7 -2
  82. package/lib/cli/setup-external-system-help.js +4 -6
  83. package/lib/cli/setup-external-system.js +58 -52
  84. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  85. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  86. package/lib/cli/setup-infra.js +15 -0
  87. package/lib/cli/setup-list.js +43 -0
  88. package/lib/cli/setup-utility-repair.js +26 -7
  89. package/lib/cli/setup-utility.js +5 -3
  90. package/lib/commands/app.js +15 -43
  91. package/lib/commands/channel-add-setup.js +110 -0
  92. package/lib/commands/channel.js +42 -8
  93. package/lib/commands/datasource-sync-display.js +96 -0
  94. package/lib/commands/datasource-sync-policy.js +210 -0
  95. package/lib/commands/datasource-test-trust-cli.js +6 -6
  96. package/lib/commands/datasource-unified-test-cli.js +2 -1
  97. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  98. package/lib/commands/deploy-gate-failure-details.js +163 -0
  99. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  100. package/lib/commands/dev-cli-handlers.js +1 -59
  101. package/lib/commands/dev-host-ops-params.js +91 -0
  102. package/lib/commands/dev-host-ops-poll.js +111 -0
  103. package/lib/commands/dev-host-ops.js +107 -94
  104. package/lib/commands/dev-init.js +3 -1
  105. package/lib/commands/enterprise-knowledge.js +284 -0
  106. package/lib/commands/evidence-cli-leaves.js +250 -0
  107. package/lib/commands/evidence.js +51 -0
  108. package/lib/commands/governance-cli-shared.js +2 -2
  109. package/lib/commands/governance-command-action.js +2 -2
  110. package/lib/commands/governance-fixture-subjects.js +85 -0
  111. package/lib/commands/governance.js +1 -1
  112. package/lib/commands/lifecycle-command-action.js +2 -2
  113. package/lib/commands/lifecycle-external.js +3 -3
  114. package/lib/commands/manifest-cli-auth.js +29 -0
  115. package/lib/commands/manifest-cli-commands.js +170 -0
  116. package/lib/commands/manifest-cli-integration-path.js +63 -0
  117. package/lib/commands/manifest.js +21 -0
  118. package/lib/commands/protection-cli-leaves.js +3 -3
  119. package/lib/commands/repair-auth-apply.js +15 -1
  120. package/lib/commands/repair-authentications-454.js +169 -0
  121. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  122. package/lib/commands/repair-datasource-apply.js +135 -0
  123. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  124. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  125. package/lib/commands/repair-datasource-operation-security.js +180 -0
  126. package/lib/commands/repair-datasource-run.js +7 -2
  127. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  128. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  129. package/lib/commands/repair-datasource.js +12 -68
  130. package/lib/commands/repair-env-template.js +11 -1
  131. package/lib/commands/repair-external-run.js +121 -31
  132. package/lib/commands/repair-internal.js +1 -1
  133. package/lib/commands/repair-openapi-export.js +156 -0
  134. package/lib/commands/repair-openapi-sync.js +19 -2
  135. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  136. package/lib/commands/repair-persist.js +22 -1
  137. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  138. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  139. package/lib/commands/repair-rbac.js +163 -86
  140. package/lib/commands/repair-steps.js +83 -18
  141. package/lib/commands/repair-system-permissions.js +1 -0
  142. package/lib/commands/repair.js +1 -1
  143. package/lib/commands/resource-type.js +65 -26
  144. package/lib/commands/run-post-publish-data-sync.js +68 -0
  145. package/lib/commands/setup-modes.js +1 -1
  146. package/lib/commands/test-e2e-external.js +21 -8
  147. package/lib/commands/test-governance-cli-options.js +2 -2
  148. package/lib/commands/test-trust-cli-options.js +2 -2
  149. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  150. package/lib/commands/up-builder-api-provision.js +241 -0
  151. package/lib/commands/up-builder-api.js +88 -0
  152. package/lib/commands/up-common.js +25 -1
  153. package/lib/commands/upload-credential-push-log.js +117 -0
  154. package/lib/commands/upload-data-sync-finalize.js +60 -0
  155. package/lib/commands/upload-probe.js +66 -0
  156. package/lib/commands/upload-publish-context.js +4 -1
  157. package/lib/commands/upload-sidecar-followups.js +55 -27
  158. package/lib/commands/upload.js +116 -157
  159. package/lib/commands/verify-governance-combined-external.js +1 -1
  160. package/lib/commands/verify-governance-db.js +2 -2
  161. package/lib/commands/verify-operations-command-action.js +2 -2
  162. package/lib/commands/verify-operations-step-plan.js +2 -2
  163. package/lib/commands/verify-operations-steps.js +2 -2
  164. package/lib/commands/verify-trust-command-action.js +1 -1
  165. package/lib/commands/wizard-core.js +1 -1
  166. package/lib/commands/wizard-headless.js +2 -1
  167. package/lib/core/admin-secrets.js +2 -6
  168. package/lib/core/secrets-env-content.js +10 -4
  169. package/lib/core/secrets-env-write.js +2 -13
  170. package/lib/datasource/agent-trust-run.js +3 -3
  171. package/lib/datasource/deploy.js +3 -1
  172. package/lib/datasource/test-e2e.js +6 -1
  173. package/lib/datasource/unified-validation-run-body.js +4 -1
  174. package/lib/datasource/unified-validation-run.js +1 -1
  175. package/lib/deployment/deploy-poll-ui.js +73 -12
  176. package/lib/deployment/deployer-poll-run.js +113 -0
  177. package/lib/deployment/deployer.js +17 -87
  178. package/lib/evidence/dataplane-context.js +21 -0
  179. package/lib/evidence/evidence-display.js +78 -0
  180. package/lib/evidence/evidence-service.js +392 -0
  181. package/lib/external-system/deploy.js +290 -112
  182. package/lib/external-system/download.js +7 -3
  183. package/lib/external-system/test-execution.js +1 -1
  184. package/lib/external-system/test-system-level.js +8 -10
  185. package/lib/external-system/test.js +12 -6
  186. package/lib/generator/deploy-script.js +73 -0
  187. package/lib/generator/external.js +2 -1
  188. package/lib/generator/index.js +17 -2
  189. package/lib/generator/wizard.js +3 -36
  190. package/lib/internal/fs-real-sync.js +22 -1
  191. package/lib/internal/node-fs.js +2 -0
  192. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  193. package/lib/lifecycle/verify-step-progress.js +1 -1
  194. package/lib/programmatic/access-log.js +26 -0
  195. package/lib/programmatic/auth-config.js +44 -0
  196. package/lib/programmatic/bearer-auth.js +176 -0
  197. package/lib/programmatic/builder-api-request.js +175 -0
  198. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  199. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  200. package/lib/programmatic/builder-api-server.js +230 -0
  201. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  202. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  203. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  204. package/lib/programmatic/builder-help-envelope.js +36 -0
  205. package/lib/programmatic/builder-help-fixtures.js +200 -0
  206. package/lib/programmatic/builder-help-governance.js +172 -0
  207. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  208. package/lib/programmatic/builder-help.js +361 -0
  209. package/lib/programmatic/capability-registry.js +77 -0
  210. package/lib/programmatic/command-options.js +32 -0
  211. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  212. package/lib/programmatic/http-problem-details.js +99 -0
  213. package/lib/programmatic/http-route-match.js +40 -0
  214. package/lib/programmatic/idempotency-cache.js +69 -0
  215. package/lib/programmatic/index.js +53 -0
  216. package/lib/programmatic/integration-path-scope.js +39 -0
  217. package/lib/programmatic/log-redaction.js +66 -0
  218. package/lib/programmatic/manifest-get-section.js +146 -0
  219. package/lib/programmatic/manifest-patch-section.js +252 -0
  220. package/lib/programmatic/manifest-repair.js +122 -0
  221. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  222. package/lib/programmatic/manifest-section-io.js +225 -0
  223. package/lib/programmatic/manifest-section-quality.js +171 -0
  224. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  225. package/lib/programmatic/manifest-section-registry.js +205 -0
  226. package/lib/programmatic/nest-http-bridge.js +34 -0
  227. package/lib/programmatic/openapi-component-schemas.js +68 -0
  228. package/lib/programmatic/openapi-description-enricher.js +117 -0
  229. package/lib/programmatic/openapi-descriptions.js +190 -0
  230. package/lib/programmatic/openapi-docs-serving.js +123 -0
  231. package/lib/programmatic/openapi-help-schemas.js +63 -0
  232. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  233. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  234. package/lib/programmatic/openapi-request-schemas.js +155 -0
  235. package/lib/programmatic/openapi-result-schemas.js +476 -0
  236. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  237. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  238. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  239. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  240. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  241. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  242. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  243. package/lib/programmatic/openapi-spec.js +203 -0
  244. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  245. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  246. package/lib/programmatic/request-timeout.js +53 -0
  247. package/lib/programmatic/route-handler-map.js +143 -0
  248. package/lib/programmatic/route-handlers-context.js +29 -0
  249. package/lib/programmatic/route-handlers.js +33 -0
  250. package/lib/programmatic/run-certify.js +57 -0
  251. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  252. package/lib/programmatic/run-lifecycle.js +29 -0
  253. package/lib/programmatic/run-repair.js +41 -0
  254. package/lib/programmatic/run-repository-emcp.js +54 -0
  255. package/lib/programmatic/run-template-workspace.js +61 -0
  256. package/lib/programmatic/run-test.js +49 -0
  257. package/lib/programmatic/run-upload.js +63 -0
  258. package/lib/programmatic/run-validate.js +53 -0
  259. package/lib/programmatic/run-wizard.js +40 -0
  260. package/lib/programmatic/system-key.js +48 -0
  261. package/lib/programmatic/wizard-config-normalize.js +118 -0
  262. package/lib/programmatic/workspace-cleanup.js +128 -0
  263. package/lib/programmatic/workspace-context.js +145 -0
  264. package/lib/programmatic/workspace-lock.js +75 -0
  265. package/lib/programmatic/workspace-meta.js +64 -0
  266. package/lib/programmatic/workspace-ops.js +149 -0
  267. package/lib/protection/run-commands-upload-sync.js +35 -0
  268. package/lib/protection/run-commands.js +2 -20
  269. package/lib/protection/upload-batch.js +11 -7
  270. package/lib/resolvers/resource-type-file.js +22 -0
  271. package/lib/schema/external-datasource.schema.json +161 -1
  272. package/lib/schema/external-system.schema.json +244 -118
  273. package/lib/schema/flag-map-validation-run.json +3 -0
  274. package/lib/schema/type/credential-field-registry.json +2 -2
  275. package/lib/schema/type/document-storage.json +9 -0
  276. package/lib/utils/agent-trust-run-display.js +1 -1
  277. package/lib/utils/app-path-resolve.js +168 -0
  278. package/lib/utils/authentication-env-template.js +222 -0
  279. package/lib/utils/cli-sync-options.js +7 -11
  280. package/lib/utils/cli-utils.js +4 -0
  281. package/lib/utils/cli-workspace-options.js +29 -0
  282. package/lib/utils/compose-generate-docker-compose.js +102 -0
  283. package/lib/utils/configuration-env-resolver.js +203 -27
  284. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  285. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  286. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  287. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  288. package/lib/utils/datasource-test-run-display.js +2 -1
  289. package/lib/utils/dev-init-ssh-merge.js +165 -23
  290. package/lib/utils/dev-pin-share-instructions.js +110 -0
  291. package/lib/utils/dev-ssh-config-helper.js +177 -33
  292. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  293. package/lib/utils/env-copy.js +2 -1
  294. package/lib/utils/env-dotenv-format.js +103 -0
  295. package/lib/utils/external-env-template.js +4 -1
  296. package/lib/utils/external-system-display.js +5 -1
  297. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  298. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  299. package/lib/utils/external-system-readiness-core.js +16 -0
  300. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  301. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  302. package/lib/utils/external-system-readiness-display.js +20 -30
  303. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  304. package/lib/utils/external-system-system-test-tty.js +5 -41
  305. package/lib/utils/help-builder.js +6 -1
  306. package/lib/utils/host-ops-job-labels.js +236 -0
  307. package/lib/utils/host-ops-job-result.js +61 -0
  308. package/lib/utils/host-ops-poll-ui.js +163 -0
  309. package/lib/utils/integration-path-resolve.js +112 -0
  310. package/lib/utils/paths-reload-source.js +148 -0
  311. package/lib/utils/paths-system-builder-keys.js +25 -0
  312. package/lib/utils/paths.js +151 -26
  313. package/lib/utils/runtime-configuration-values.js +64 -2
  314. package/lib/utils/secrets-helpers.js +5 -1
  315. package/lib/utils/ssh-known-hosts.js +130 -0
  316. package/lib/utils/test-target-cli-options.js +75 -0
  317. package/lib/utils/upload-sync-options.js +4 -0
  318. package/lib/utils/validation-run-request.js +11 -2
  319. package/lib/validation/external-manifest-validator.js +11 -1
  320. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  321. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  322. package/lib/validation/validate-external-file.js +160 -0
  323. package/lib/validation/validate.js +6 -117
  324. package/package.json +46 -29
  325. package/packages/builder-api/README.md +120 -0
  326. package/packages/builder-api/package.json +30 -0
  327. package/packages/builder-api/src/app.module.ts +7 -0
  328. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  329. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  330. package/packages/builder-api/src/main.ts +16 -0
  331. package/packages/builder-api/tsconfig.json +15 -0
  332. package/scripts/check-builder-api-architecture-grep.js +79 -0
  333. package/scripts/docker_image_content_gate.js +47 -0
  334. package/scripts/docker_image_content_gate.sh +5 -0
  335. package/scripts/export-builder-api-evidence.js +262 -0
  336. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  337. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  338. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  339. package/scripts/lib/plan-actor.js +109 -0
  340. package/scripts/lib/plan-config.js +20 -0
  341. package/scripts/lib/plan-gates.js +154 -0
  342. package/scripts/lib/plan-meta.js +104 -0
  343. package/scripts/lib/plan-parse.js +162 -0
  344. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  345. package/scripts/lib/plan-run-core.js +125 -0
  346. package/scripts/lib/plan-run-report.js +108 -0
  347. package/scripts/plan-approve.js +24 -0
  348. package/scripts/plan-archive.js +49 -0
  349. package/scripts/plan-run.js +13 -0
  350. package/scripts/plan-set-actor.js +21 -0
  351. package/scripts/plan-validate.js +80 -0
  352. package/scripts/pnpm/af.mjs +110 -0
  353. package/scripts/pnpm/check-quiet.mjs +32 -0
  354. package/scripts/pnpm/dev-install.mjs +29 -0
  355. package/scripts/pnpm/dev-reload.mjs +18 -0
  356. package/scripts/pnpm/help.mjs +55 -0
  357. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  358. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  359. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  360. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  361. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  362. package/scripts/pnpm/lib/spinner.mjs +42 -0
  363. package/scripts/stage_builder_api_for_docker.js +65 -0
  364. package/scripts/sync-builder-api-template.js +44 -0
  365. package/templates/README.md +3 -0
  366. package/templates/applications/builder-api/Dockerfile +38 -0
  367. package/templates/applications/builder-api/application.yaml +75 -0
  368. package/templates/applications/builder-api/env.template +48 -0
  369. package/templates/applications/dataplane/application.yaml +1 -1
  370. package/templates/applications/dataplane/env.template +10 -6
  371. package/templates/applications/dataplane/rbac.yaml +21 -1
  372. package/templates/applications/miso-controller/application.yaml +1 -1
  373. package/templates/applications/miso-controller/env.template +1 -3
  374. package/templates/channels/README.md +18 -0
  375. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  376. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  377. package/templates/channels/chatgpt/integration/README.md +11 -0
  378. package/templates/channels/chatgpt/integration/application.json +15 -0
  379. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  380. package/templates/channels/chatgpt/integration/env.template +4 -0
  381. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  382. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  383. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  384. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  385. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  386. package/templates/channels/slack/install.template.md.hbs +48 -18
  387. package/templates/channels/slack/integration/README.md +38 -0
  388. package/templates/channels/slack/integration/application.json +18 -0
  389. package/templates/channels/slack/integration/env.template +29 -0
  390. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  391. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  392. package/templates/channels/slack/integration/slack-system.json +86 -0
  393. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  394. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  395. package/templates/channels/teams-bot/integration/README.md +18 -0
  396. package/templates/channels/teams-bot/integration/application.json +17 -0
  397. package/templates/channels/teams-bot/integration/env.template +5 -0
  398. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  399. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  400. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  401. package/templates/channels/web-embed/integration/README.md +11 -0
  402. package/templates/channels/web-embed/integration/application.json +15 -0
  403. package/templates/channels/web-embed/integration/env.template +4 -0
  404. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  405. package/templates/openapi/redoc_page.html +86 -0
  406. package/templates/python/docker-compose.hbs +11 -0
  407. package/templates/python/requirements.txt +1 -1
  408. package/templates/typescript/docker-compose.hbs +11 -0
  409. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,250 @@
1
+ /**
2
+ * @fileoverview Evidence Fabrix v2 CLI leaf command registration.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const logger = require('../utils/logger');
10
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
11
+ const {
12
+ exitCodeForEvidenceError,
13
+ runEvidenceList,
14
+ runEvidenceGet,
15
+ runEvidenceInsert,
16
+ runEvidenceUpdate,
17
+ runEvidenceDelete,
18
+ runEvidenceLoad,
19
+ runEvidenceExport,
20
+ DEFAULT_BULK_FILE
21
+ } = require('../evidence/evidence-service');
22
+
23
+ const SHARED_OPTS = [
24
+ ['-e, --env <environment>', 'Environment key'],
25
+ ['--json', 'Machine-readable JSON output']
26
+ ];
27
+
28
+ const LIST_HELP = `
29
+
30
+ Examples:
31
+ $ aifabrix evidence list
32
+ $ aifabrix evidence list --resource-type deal --generic
33
+ $ aifabrix evidence list --role-key sales-executive --status active --json
34
+ `;
35
+
36
+ const GET_HELP = `
37
+
38
+ Examples:
39
+ $ aifabrix evidence get ev2_abc123
40
+ $ aifabrix evidence get ev2_abc123 --json
41
+ `;
42
+
43
+ const INSERT_HELP = `
44
+
45
+ Examples:
46
+ $ aifabrix evidence insert --resource-type deal --title "High-value review" --when "Amount over threshold" --expected-behavior "Procurement review first"
47
+ $ aifabrix evidence insert --file ./row.json
48
+ `;
49
+
50
+ const UPDATE_HELP = `
51
+
52
+ Examples:
53
+ $ aifabrix evidence update ev2_abc123 --title "Updated title"
54
+ $ aifabrix evidence update ev2_abc123 --file ./patch.json
55
+ `;
56
+
57
+ const DELETE_HELP = `
58
+
59
+ Examples:
60
+ $ aifabrix evidence delete ev2_abc123 --yes
61
+ $ aifabrix evidence delete ev2_abc123
62
+
63
+ Delete succeeds only when the row is not referenced by runtime execution.
64
+ `;
65
+
66
+ const LOAD_HELP = `
67
+
68
+ Examples:
69
+ $ aifabrix evidence load --file ${DEFAULT_BULK_FILE}
70
+ $ aifabrix evidence load --dry-run
71
+ `;
72
+
73
+ const EXPORT_HELP = `
74
+
75
+ Examples:
76
+ $ aifabrix evidence export --file ${DEFAULT_BULK_FILE}
77
+ $ aifabrix evidence export --resource-type deal --json
78
+ `;
79
+
80
+ /**
81
+ * @param {import('commander').Command} cmd
82
+ * @param {string} name
83
+ * @param {string} description
84
+ * @param {Function} action
85
+ * @param {Array<[string, string]>} extraOpts
86
+ * @param {string} helpAfter
87
+ */
88
+ function addEvidenceLeaf(cmd, name, description, action, extraOpts = [], helpAfter = '') {
89
+ const leaf = cmd.command(name).description(description);
90
+ for (const [flags, desc] of [...SHARED_OPTS, ...extraOpts]) {
91
+ leaf.option(flags, desc);
92
+ }
93
+ if (helpAfter) {
94
+ leaf.addHelpText('after', helpAfter);
95
+ }
96
+ leaf.action(async(...args) => {
97
+ try {
98
+ const code = await action(...args);
99
+ if (code && code !== 0) {
100
+ process.exit(code);
101
+ }
102
+ } catch (err) {
103
+ logger.error(formatBlockingError(err.message || String(err)));
104
+ process.exit(exitCodeForEvidenceError(err));
105
+ }
106
+ });
107
+ }
108
+
109
+ /**
110
+ * @param {import('commander').Command} evidence
111
+ */
112
+ function registerEvidenceList(evidence) {
113
+ addEvidenceLeaf(
114
+ evidence,
115
+ 'list',
116
+ 'List Evidence Fabrix v2 rows from the dataplane',
117
+ async(options) => runEvidenceList(options, logger),
118
+ [
119
+ ['--resource-type <resourceType>', 'Filter by resource type'],
120
+ ['--role-key <roleKey>', 'Filter by role-specific scope'],
121
+ ['--generic', 'Generic rows only (no roleKey)'],
122
+ ['--status <status>', 'Filter by active or disabled']
123
+ ],
124
+ LIST_HELP
125
+ );
126
+ }
127
+
128
+ /**
129
+ * @param {import('commander').Command} evidence
130
+ */
131
+ function registerEvidenceGet(evidence) {
132
+ addEvidenceLeaf(
133
+ evidence,
134
+ 'get <evidenceId>',
135
+ 'Get one evidence row by id',
136
+ async(evidenceId, options) => runEvidenceGet(evidenceId, options, logger),
137
+ [],
138
+ GET_HELP
139
+ );
140
+ }
141
+
142
+ /**
143
+ * @param {import('commander').Command} evidence
144
+ */
145
+ function registerEvidenceInsert(evidence) {
146
+ addEvidenceLeaf(
147
+ evidence,
148
+ 'insert',
149
+ 'Insert a new evidence row',
150
+ async(options) => runEvidenceInsert(options, logger),
151
+ [
152
+ ['--file <path>', 'Single evidence JSON object'],
153
+ ['--resource-type <resourceType>', 'Resource type key'],
154
+ ['--role-key <roleKey>', 'Optional role-specific scope'],
155
+ ['--generic', 'Create generic evidence (no roleKey)'],
156
+ ['--title <title>', 'Title'],
157
+ ['--description <description>', 'Description'],
158
+ ['--when <when>', 'Natural-language when condition'],
159
+ ['--expected-behavior <text>', 'Expected business behavior'],
160
+ ['--order <n>', 'Sort order within scope bucket', parseInt],
161
+ ['--status <status>', 'active or disabled']
162
+ ],
163
+ INSERT_HELP
164
+ );
165
+ }
166
+
167
+ /**
168
+ * @param {import('commander').Command} evidence
169
+ */
170
+ function registerEvidenceUpdate(evidence) {
171
+ addEvidenceLeaf(
172
+ evidence,
173
+ 'update <evidenceId>',
174
+ 'Update an evidence row',
175
+ async(evidenceId, options) => runEvidenceUpdate(evidenceId, options, logger),
176
+ [
177
+ ['--file <path>', 'Partial update JSON object'],
178
+ ['--role-key <roleKey>', 'Role-specific scope'],
179
+ ['--generic', 'Clear roleKey to generic scope'],
180
+ ['--title <title>', 'Title'],
181
+ ['--description <description>', 'Description'],
182
+ ['--when <when>', 'When condition'],
183
+ ['--expected-behavior <text>', 'Expected behavior'],
184
+ ['--order <n>', 'Sort order', parseInt],
185
+ ['--status <status>', 'active or disabled']
186
+ ],
187
+ UPDATE_HELP
188
+ );
189
+ }
190
+
191
+ /**
192
+ * @param {import('commander').Command} evidence
193
+ */
194
+ function registerEvidenceDelete(evidence) {
195
+ addEvidenceLeaf(
196
+ evidence,
197
+ 'delete <evidenceId>',
198
+ 'Delete evidence when it is not referenced by runtime execution',
199
+ async(evidenceId, options) => runEvidenceDelete(evidenceId, options, logger),
200
+ [['--yes', 'Skip confirmation prompt']],
201
+ DELETE_HELP
202
+ );
203
+ }
204
+
205
+ /**
206
+ * @param {import('commander').Command} evidence
207
+ */
208
+ function registerEvidenceLoad(evidence) {
209
+ addEvidenceLeaf(
210
+ evidence,
211
+ 'load',
212
+ 'Bulk insert or update evidence rows from a JSON array file',
213
+ async(options) => runEvidenceLoad(options, logger),
214
+ [
215
+ ['--file <path>', `JSON array file (default: ${DEFAULT_BULK_FILE})`],
216
+ ['--dry-run', 'Validate file without mutating dataplane']
217
+ ],
218
+ LOAD_HELP
219
+ );
220
+ }
221
+
222
+ /**
223
+ * @param {import('commander').Command} evidence
224
+ */
225
+ function registerEvidenceExport(evidence) {
226
+ addEvidenceLeaf(
227
+ evidence,
228
+ 'export',
229
+ 'Export filtered evidence rows to a JSON array file',
230
+ async(options) => runEvidenceExport(options, logger),
231
+ [
232
+ ['--file <path>', `Output file (default: ${DEFAULT_BULK_FILE})`],
233
+ ['--resource-type <resourceType>', 'Filter by resource type'],
234
+ ['--role-key <roleKey>', 'Filter by role-specific scope'],
235
+ ['--generic', 'Generic rows only'],
236
+ ['--status <status>', 'Filter by active or disabled']
237
+ ],
238
+ EXPORT_HELP
239
+ );
240
+ }
241
+
242
+ module.exports = {
243
+ registerEvidenceList,
244
+ registerEvidenceGet,
245
+ registerEvidenceInsert,
246
+ registerEvidenceUpdate,
247
+ registerEvidenceDelete,
248
+ registerEvidenceLoad,
249
+ registerEvidenceExport
250
+ };
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @fileoverview Evidence Fabrix v2 CLI commands.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const {
10
+ registerEvidenceList,
11
+ registerEvidenceGet,
12
+ registerEvidenceInsert,
13
+ registerEvidenceUpdate,
14
+ registerEvidenceDelete,
15
+ registerEvidenceLoad,
16
+ registerEvidenceExport
17
+ } = require('./evidence-cli-leaves');
18
+
19
+ const EVIDENCE_HELP_AFTER = `
20
+
21
+ Examples:
22
+ $ aifabrix evidence list --resource-type deal
23
+ $ aifabrix evidence insert --resource-type deal --title "Review threshold" --when "..." --expected-behavior "..."
24
+ $ aifabrix evidence export --file .evidence/evidence.json
25
+ $ aifabrix evidence load --file .evidence/evidence.json --dry-run
26
+ $ aifabrix evidence delete ev2_abc123 --yes
27
+
28
+ Per-command help: aifabrix evidence <command> --help
29
+ `;
30
+
31
+ /**
32
+ * @param {import('commander').Command} program
33
+ */
34
+ function setupEvidenceCommands(program) {
35
+ const evidence = program
36
+ .command('evidence')
37
+ .description('Manage Evidence Fabrix v2 rows on the dataplane')
38
+ .addHelpText('after', EVIDENCE_HELP_AFTER);
39
+
40
+ registerEvidenceList(evidence);
41
+ registerEvidenceGet(evidence);
42
+ registerEvidenceInsert(evidence);
43
+ registerEvidenceUpdate(evidence);
44
+ registerEvidenceDelete(evidence);
45
+ registerEvidenceLoad(evidence);
46
+ registerEvidenceExport(evidence);
47
+ }
48
+
49
+ module.exports = {
50
+ setupEvidenceCommands
51
+ };
@@ -9,7 +9,7 @@ const {
9
9
  syncLocalIfRequested
10
10
  } = require('./test-e2e-external');
11
11
  const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
12
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
12
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
13
13
  const { fetchDataplaneGeneralHealth } = require('../api/dataplane-health.api');
14
14
  const { formatNetworkError } = require('../utils/api-error-handler');
15
15
 
@@ -74,7 +74,7 @@ async function resolveGovernanceIntegrationContext(systemKey, options) {
74
74
  dataplaneUrl: options.dataplaneUrl
75
75
  };
76
76
  }
77
- if (!cliOptsSkipSync(options)) {
77
+ if (!cliOptsSkipPublish(options)) {
78
78
  const uploadCtx = await syncLocalIfRequested(resolvedKey, options);
79
79
  if (uploadCtx?.authConfig && uploadCtx?.dataplaneUrl) {
80
80
  options.authConfig = uploadCtx.authConfig;
@@ -35,7 +35,7 @@ function normalizeGovernanceOptions(options, cmd) {
35
35
  return {
36
36
  env: options.env || parent.env || 'dev',
37
37
  verbose: options.verbose === true || parent.verbose === true,
38
- noSync: options.noSync === true || parent.noSync === true,
38
+ noPublish: options.noPublish === true || parent.noPublish === true,
39
39
  force: options.force === true || parent.force === true,
40
40
  json: options.json === true || parent.json === true,
41
41
  pack: options.pack,
@@ -109,7 +109,7 @@ async function governanceUploadHandler(systemKey, options, cmd) {
109
109
  async function governanceDownloadHandler(systemKey, options, cmd) {
110
110
  try {
111
111
  const opts = normalizeGovernanceOptions(options, cmd);
112
- opts.noSync = true;
112
+ opts.noPublish = true;
113
113
  const result = await runGovernanceDownloadForExternalSystem(systemKey, opts);
114
114
  if (opts.json) {
115
115
  logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @fileoverview Resolve governance subject emails from integration fixture CSV.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const path = require('path');
10
+ const { nodeFs } = require('../internal/node-fs');
11
+ const { getIntegrationPath } = require('../utils/paths');
12
+
13
+ /**
14
+ * @param {string} line
15
+ * @returns {string[]}
16
+ */
17
+ function parseCsvLine(line) {
18
+ const cells = [];
19
+ let current = '';
20
+ let inQuotes = false;
21
+ for (let index = 0; index < line.length; index += 1) {
22
+ const char = line[index];
23
+ if (char === '"') {
24
+ inQuotes = !inQuotes;
25
+ continue;
26
+ }
27
+ if (char === ',' && !inQuotes) {
28
+ cells.push(current.trim());
29
+ current = '';
30
+ continue;
31
+ }
32
+ current += char;
33
+ }
34
+ cells.push(current.trim());
35
+ return cells;
36
+ }
37
+
38
+ /**
39
+ * @param {string[]} lines
40
+ * @param {number} emailIndex
41
+ * @returns {string[]}
42
+ */
43
+ function collectUniqueEmailsFromRows(lines, emailIndex) {
44
+ const emails = [];
45
+ const seen = new Set();
46
+ for (let rowIndex = 1; rowIndex < lines.length; rowIndex += 1) {
47
+ const row = parseCsvLine(lines[rowIndex]);
48
+ const email = String(row[emailIndex] || '').trim().toLowerCase();
49
+ if (!email || seen.has(email)) {
50
+ continue;
51
+ }
52
+ seen.add(email);
53
+ emails.push(email);
54
+ }
55
+ return emails;
56
+ }
57
+
58
+ /**
59
+ * @param {string} systemKey
60
+ * @returns {string[]}
61
+ */
62
+ function resolveGovernanceFixtureSubjectEmails(systemKey) {
63
+ const integrationPath = getIntegrationPath(systemKey);
64
+ const csvPath = path.join(integrationPath, 'fixtures', 'session-users.csv');
65
+ const disk = nodeFs();
66
+ if (!disk.existsSync(csvPath)) {
67
+ return [];
68
+ }
69
+ const raw = disk.readFileSync(csvPath, 'utf8');
70
+ const lines = raw.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
71
+ if (lines.length < 2) {
72
+ return [];
73
+ }
74
+ const headers = parseCsvLine(lines[0]).map((header) => header.toLowerCase());
75
+ const emailIndex = headers.indexOf('email');
76
+ if (emailIndex < 0) {
77
+ return [];
78
+ }
79
+ return collectUniqueEmailsFromRows(lines, emailIndex);
80
+ }
81
+
82
+ module.exports = {
83
+ parseCsvLine,
84
+ resolveGovernanceFixtureSubjectEmails
85
+ };
@@ -21,7 +21,7 @@ const {
21
21
 
22
22
  const SHARED_OPTS = [
23
23
  ['-e, --env <env>', 'Environment: dev, tst, or pro', 'dev'],
24
- ['--no-sync', 'Skip publishing local integration files before dataplane calls'],
24
+ ['--no-publish', 'Skip publishing local integration files before dataplane calls'],
25
25
  [
26
26
  '--force',
27
27
  'With default sync, pass force to upload (same as aifabrix upload --force)'
@@ -8,7 +8,7 @@
8
8
 
9
9
  const logger = require('../utils/logger');
10
10
  const { handleCommandError } = require('../utils/cli-utils');
11
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
11
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
12
12
  const { runLifecycleForExternalSystem } = require('./lifecycle-external');
13
13
  const { displayLifecycleReportTTY } = require('../lifecycle/report-display');
14
14
  const { VERDICT } = require('../lifecycle/product-model');
@@ -29,7 +29,7 @@ function normalizeLifecycleCliOptions(options, cmd) {
29
29
  debug: options.debug === true || has('-d') || has('--debug'),
30
30
  json: options.json === true || has('--json'),
31
31
  run: options.run === true || has('--run'),
32
- noSync: cliOptsSkipSync(options, cmd),
32
+ noPublish: cliOptsSkipPublish(options, cmd),
33
33
  force: options.force === true || has('--force'),
34
34
  subjectUserId: options.subjectUserId || [],
35
35
  subjectEmail: options.subjectEmail || [],
@@ -9,7 +9,7 @@
9
9
  const { getSystemLifecycleReport, runSystemLifecycle } = require('../api/lifecycle.api');
10
10
  const { setupIntegrationTestAuth } = require('../external-system/test-auth');
11
11
  const { getConfig } = require('../core/config');
12
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
12
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
13
13
  const { syncLocalIfRequested } = require('./test-e2e-external');
14
14
  const { runVerifyOperationsForExternalSystem } = require('./verify-operations-external');
15
15
  const { runVerifyTrustForExternalSystem } = require('./verify-trust-external');
@@ -45,7 +45,7 @@ async function resolveLifecycleDataplaneUiBaseUrl(dataplaneUrl) {
45
45
  * @returns {Promise<{ authConfig: Object, dataplaneUrl: string }>}
46
46
  */
47
47
  async function resolveLifecycleAuth(systemKey, options) {
48
- if (!cliOptsSkipSync(options) && options.run === true) {
48
+ if (!cliOptsSkipPublish(options) && options.run === true) {
49
49
  options.lifecycleProgress?.setLabel?.('Checking config on dataplane');
50
50
  const uploadCtx = await syncLocalIfRequested(systemKey, {
51
51
  ...options,
@@ -97,7 +97,7 @@ async function runLifecycleGovernanceCombinedIfNeeded(
97
97
  * @param {Object} options
98
98
  */
99
99
  async function runMissingVerifyStepsLocally(systemKey, report, options) {
100
- const runOpts = { ...options, noSync: true };
100
+ const runOpts = { ...options, noPublish: true };
101
101
  if (report.operations?.verdict !== VERDICT.VERIFIED) {
102
102
  await runVerifyOperationsForExternalSystem(systemKey, runOpts);
103
103
  }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Resolve bearer context for manifest CLI commands.
3
+ *
4
+ * @fileoverview Uses aifabrix auth token + developer workspace root
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const path = require('path');
12
+ const os = require('os');
13
+ const { getValidatedAuthContext } = require('./auth-status');
14
+
15
+ /**
16
+ * @returns {Promise<{ userId: string, bearerToken: string, workspaceRoot: string }>}
17
+ */
18
+ async function resolveActorBearerContext() {
19
+ const ctx = await getValidatedAuthContext();
20
+ const userId = ctx.authConfig?.userId || 'cli-user';
21
+ const workspaceRoot = process.env.WORKSPACE_ROOT || path.join(os.homedir(), '.aifabrix', 'builder-workspaces');
22
+ return {
23
+ userId: String(userId),
24
+ bearerToken: ctx.authConfig.token,
25
+ workspaceRoot
26
+ };
27
+ }
28
+
29
+ module.exports = { resolveActorBearerContext };
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Register manifest CLI subcommands (plan 154.4).
3
+ *
4
+ * @fileoverview Keeps setupManifestCommands under max-lines-per-function
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const chalk = require('chalk');
13
+ const { getManifestSection, listManifestSections } = require('../programmatic/manifest-get-section');
14
+ const { patchManifestSection } = require('../programmatic/manifest-patch-section');
15
+ const { runManifestRepair } = require('../programmatic/manifest-repair');
16
+ const { resolveActorBearerContext } = require('./manifest-cli-auth');
17
+ const { resolveManifestCliIntegrationPath } = require('./manifest-cli-integration-path');
18
+ const { createWorkspaceContext, runWithWorkspaceContext } = require('../programmatic/workspace-context');
19
+
20
+ /**
21
+ * @param {import('commander').Command} manifest
22
+ */
23
+ function registerManifestSubcommands(manifest) {
24
+ registerManifestReadCommands(manifest);
25
+ registerManifestWriteCommands(manifest);
26
+ }
27
+
28
+ /**
29
+ * @param {import('commander').Command} manifest
30
+ */
31
+ function registerManifestReadCommands(manifest) {
32
+ manifest
33
+ .command('get-section <systemKey> <sectionKey>')
34
+ .description('Read one governed manifest section with quality and read token')
35
+ .option('--datasource <key>', 'Datasource key for datasource sections')
36
+ .option('--json', 'Print JSON result')
37
+ .action(async(systemKey, sectionKey, options) => {
38
+ await runManifestCliAction(options, async(ctx) => {
39
+ printManifestResult(
40
+ await getManifestSection(ctx, { sectionKey, datasourceKey: options.datasource }),
41
+ options
42
+ );
43
+ }, systemKey);
44
+ });
45
+
46
+ manifest
47
+ .command('list-sections <systemKey>')
48
+ .description('List governed section keys for a workspace system')
49
+ .option('--json', 'Print JSON result')
50
+ .action(async(systemKey, options) => {
51
+ await runManifestCliAction(options, async(ctx) => {
52
+ printManifestResult(await listManifestSections(ctx), options);
53
+ }, systemKey);
54
+ });
55
+ }
56
+
57
+ /**
58
+ * @param {import('commander').Command} manifest
59
+ */
60
+ function registerManifestWriteCommands(manifest) {
61
+ manifest
62
+ .command('patch-section <systemKey> <sectionKey>')
63
+ .description('Patch one governed manifest section (requires prior get-section token)')
64
+ .requiredOption('--intent <text>', 'Why this patch is made (audit)')
65
+ .option('--datasource <key>', 'Datasource key for datasource sections')
66
+ .option('--file <path>', 'JSON file with patch payload object')
67
+ .option('--mode <mode>', 'merge or replace', 'merge')
68
+ .option('--token <token>', 'sectionReadToken from get-section')
69
+ .option('--dry-run', 'Validate without writing')
70
+ .option('--json', 'Print JSON result')
71
+ .action(async(systemKey, sectionKey, options) => {
72
+ await runManifestCliAction(options, async(ctx) => {
73
+ printManifestResult(await patchFromCli(ctx, sectionKey, options), options);
74
+ }, systemKey);
75
+ });
76
+
77
+ manifest
78
+ .command('repair <systemKey>')
79
+ .description('Run explicit manifest repair hooks after section patches')
80
+ .requiredOption('--hooks <list>', 'Comma-separated hooks (fieldMappings,expose,rbac,...)')
81
+ .option('--section-key <key>', 'Section key for graph-derived ordering metadata')
82
+ .option('--datasource <key>', 'Datasource key for post-repair quality snapshot')
83
+ .option('--dry-run', 'Preview repair')
84
+ .option('--json', 'Print JSON result')
85
+ .action(async(systemKey, options) => {
86
+ await runManifestCliAction(options, async(ctx) => {
87
+ const hooks = String(options.hooks)
88
+ .split(',')
89
+ .map((h) => h.trim())
90
+ .filter(Boolean);
91
+ printManifestResult(
92
+ await runManifestRepair(ctx, {
93
+ hooks,
94
+ sectionKey: options.sectionKey,
95
+ datasourceKey: options.datasource,
96
+ dryRun: options.dryRun === true
97
+ }),
98
+ options
99
+ );
100
+ }, systemKey);
101
+ });
102
+ }
103
+
104
+ /**
105
+ * @param {import('./workspace-context').WorkspaceContext} ctx
106
+ * @param {string} sectionKey
107
+ * @param {Object} options
108
+ */
109
+ async function patchFromCli(ctx, sectionKey, options) {
110
+ const patch = options.file ? JSON.parse(fs.readFileSync(options.file, 'utf8')) : {};
111
+ let token = options.token;
112
+ if (!token) {
113
+ const view = await getManifestSection(ctx, { sectionKey, datasourceKey: options.datasource });
114
+ token = view.sectionReadToken;
115
+ }
116
+ return patchManifestSection(ctx, {
117
+ sectionKey,
118
+ datasourceKey: options.datasource,
119
+ intent: options.intent,
120
+ patch,
121
+ mode: options.mode,
122
+ sectionReadToken: token,
123
+ dryRun: options.dryRun === true
124
+ });
125
+ }
126
+
127
+ /**
128
+ * @param {Object} result
129
+ * @param {Object} options
130
+ */
131
+ function printManifestResult(result, options) {
132
+ if (options.json) {
133
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
134
+ return;
135
+ }
136
+ process.stdout.write(`${chalk.green('✓ Manifest operation completed')}\n`);
137
+ if (result.sectionKey) {
138
+ process.stdout.write(`${chalk.cyan(` section: ${result.sectionKey}`)}\n`);
139
+ }
140
+ if (result.quality) {
141
+ process.stdout.write(`${chalk.cyan(` quality.score: ${result.quality.score}`)}\n`);
142
+ }
143
+ if (result.nextActions) {
144
+ process.stdout.write(`${chalk.cyan(` nextActions: ${result.nextActions.join(' → ')}`)}\n`);
145
+ }
146
+ }
147
+
148
+ /**
149
+ * @param {Object} options
150
+ * @param {Function} fn
151
+ * @param {string} systemKey
152
+ */
153
+ async function runManifestCliAction(options, fn, systemKey) {
154
+ const auth = await resolveActorBearerContext();
155
+ const { integrationPath } = resolveManifestCliIntegrationPath(systemKey);
156
+ const ctx = createWorkspaceContext({
157
+ userId: auth.userId,
158
+ systemKey,
159
+ bearerToken: auth.bearerToken,
160
+ workspaceRoot: auth.workspaceRoot,
161
+ integrationPath
162
+ });
163
+ await runWithWorkspaceContext(ctx, () => fn(ctx));
164
+ }
165
+
166
+ module.exports = {
167
+ registerManifestSubcommands,
168
+ printManifestResult,
169
+ runManifestCliAction
170
+ };