@aifabrix/builder 2.52.1 → 2.53.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/lib/app/deploy-config.js +3 -2
  2. package/lib/channels/add-channel.js +11 -41
  3. package/lib/channels/approval-guides/index.js +3 -0
  4. package/lib/channels/approval-guides/microsoft-copilot.js +26 -17
  5. package/lib/channels/channel-add-existing.js +72 -0
  6. package/lib/channels/channel-runtime-resolver.js +5 -1
  7. package/lib/channels/channel-status-display.js +30 -3
  8. package/lib/channels/microsoft-copilot-entra-sso-form.js +73 -2
  9. package/lib/channels/microsoft-copilot-entra-sso.js +26 -5
  10. package/lib/channels/microsoft-copilot-limits.js +22 -3
  11. package/lib/channels/microsoft-copilot-package.js +59 -14
  12. package/lib/channels/microsoft-copilot-validate.js +40 -10
  13. package/lib/cli/attach-default-help-examples.js +102 -0
  14. package/lib/cli/index.js +2 -0
  15. package/lib/cli/setup-credential-deployment.js +7 -5
  16. package/lib/cli/setup-utility-validate.js +1 -0
  17. package/lib/commands/credential-push.js +37 -5
  18. package/lib/commands/package-score.js +72 -0
  19. package/lib/commands/role-assistant.js +46 -8
  20. package/lib/deployment/deployer-poll-run.js +2 -2
  21. package/lib/deployment/deployer.js +1 -1
  22. package/lib/deployment/environment.js +2 -2
  23. package/lib/external-system/deploy.js +11 -21
  24. package/lib/integration-definition/apply.js +12 -14
  25. package/lib/integration-definition/enrich-openapi-operations.js +9 -10
  26. package/lib/lab/package-parity-score.js +417 -0
  27. package/lib/programmatic/capability-registry.js +1 -0
  28. package/lib/programmatic/help-content/channel-onboarding.md +35 -0
  29. package/lib/programmatic/help-content/cip-overview.md +27 -0
  30. package/lib/programmatic/help-content/connected-system-ui.md +70 -0
  31. package/lib/programmatic/help-content/dimensions-guide.md +23 -0
  32. package/lib/programmatic/help-content/enterprise-sync-fabrix.md +123 -0
  33. package/lib/programmatic/help-content/overview.md +25 -0
  34. package/lib/programmatic/help-content/subscription-guide.md +27 -0
  35. package/lib/programmatic/help-content/workflow.md +50 -0
  36. package/lib/programmatic/openapi-component-schemas.js +1 -0
  37. package/lib/programmatic/openapi-descriptions.js +6 -0
  38. package/lib/programmatic/openapi-envelope-examples.js +11 -0
  39. package/lib/programmatic/openapi-operation-bindings.js +5 -0
  40. package/lib/programmatic/openapi-request-schemas.js +39 -13
  41. package/lib/programmatic/openapi-result-schemas.js +30 -0
  42. package/lib/programmatic/openapi-schema-descriptions-core.js +18 -0
  43. package/lib/programmatic/openapi-schema-descriptions-operations.js +19 -0
  44. package/lib/programmatic/persist-supplied-openapi.js +180 -0
  45. package/lib/programmatic/route-handler-map.js +6 -0
  46. package/lib/programmatic/run-integration-definition.js +13 -5
  47. package/lib/role-assistant/evidence-sync.js +55 -7
  48. package/lib/role-assistant/test-runner-attachments.js +118 -0
  49. package/lib/role-assistant/test-runner-bid-apply.js +100 -21
  50. package/lib/role-assistant/test-runner-bid-document.js +1 -1
  51. package/lib/role-assistant/test-runner-start-payload.js +96 -0
  52. package/lib/role-assistant/test-runner-workhub-answers.js +11 -7
  53. package/lib/role-assistant/test-runner-workhub-helpers.js +100 -0
  54. package/lib/role-assistant/test-runner-workhub-soft.js +86 -0
  55. package/lib/role-assistant/test-runner-workhub.js +68 -105
  56. package/lib/role-assistant/test-runner.js +5 -63
  57. package/lib/role-assistant/test-suite.js +33 -40
  58. package/lib/schema/external-datasource.schema.json +13 -4
  59. package/lib/utils/compose-generator.js +10 -1
  60. package/lib/utils/compose-traefik-extra-routes.js +107 -0
  61. package/lib/utils/docker-build.js +2 -2
  62. package/lib/utils/help-builder.js +2 -1
  63. package/lib/utils/promote-dev-docker-image.js +15 -10
  64. package/package.json +14 -16
  65. package/templates/README.md +12 -1
  66. package/templates/applications/dataplane/application.yaml +8 -1
  67. package/templates/applications/dataplane/env.template +1 -1
  68. package/templates/applications/miso-controller/application.yaml +2 -1
  69. package/templates/applications/miso-controller/rbac.yaml +1 -0
  70. package/templates/channels/microsoft-copilot/ai-plugin.template.json.hbs +6 -2
  71. package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +8 -5
  72. package/templates/channels/microsoft-copilot/fi-fi.template.json.hbs +7 -0
  73. package/templates/channels/microsoft-copilot/install.template.md.hbs +74 -22
  74. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +29 -14
  75. package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +6 -2
  76. package/templates/python/docker-compose.hbs +36 -0
  77. package/templates/typescript/docker-compose.hbs +36 -0
  78. package/.cursor/plans/Archive/157.1-security-quality-violations-by-type.csv +0 -374
  79. package/.cursor/process/README.md +0 -9
  80. package/.cursor/rules/anchor-docs.mdc +0 -15
  81. package/.cursor/rules/assistant-driven-integration-build.mdc +0 -40
  82. package/.cursor/rules/cli-layout.mdc +0 -81
  83. package/.cursor/rules/cli-product-neutral.mdc +0 -43
  84. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +0 -49
  85. package/.cursor/rules/docs-rules.mdc +0 -32
  86. package/.cursor/rules/plan-rules/application-lifecycle.mdc +0 -30
  87. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +0 -35
  88. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +0 -31
  89. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +0 -34
  90. package/.cursor/rules/project-rules.mdc +0 -913
  91. package/.cursor/skills/README.md +0 -15
  92. package/.dockerignore +0 -52
  93. package/.eslintignore +0 -22
  94. package/.markdownlint.json +0 -14
  95. package/anchor-docs/README.md +0 -10
  96. package/anchor-docs/_TEMPLATE +0 -24
  97. package/babel.config.js +0 -6
  98. package/bin/builder-api-cleanup.js +0 -26
  99. package/bin/builder-api-nest.js +0 -10
  100. package/bin/builder-api-spike.js +0 -19
  101. package/enterprise-knowledge/README.md +0 -50
  102. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +0 -22
  103. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +0 -15
  104. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +0 -69
  105. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +0 -52
  106. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +0 -29
  107. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +0 -2
  108. package/integration/README.md +0 -81
  109. package/integration/github/README.md +0 -53
  110. package/integration/github/application.json +0 -21
  111. package/integration/github/deploy.js +0 -72
  112. package/integration/github/env.template +0 -11
  113. package/integration/github/github-datasource-issue-comments.json +0 -239
  114. package/integration/github/github-datasource-issues.json +0 -399
  115. package/integration/github/github-datasource-repository.json +0 -354
  116. package/integration/github/github-deploy.json +0 -1202
  117. package/integration/github/github-system.json +0 -82
  118. package/integration/hubspot-test/README.md +0 -159
  119. package/integration/hubspot-test/application.json +0 -54
  120. package/integration/hubspot-test/companies.json +0 -2048
  121. package/integration/hubspot-test/create-hubspot.js +0 -523
  122. package/integration/hubspot-test/env.template +0 -4
  123. package/integration/hubspot-test/hubspot-test-datasource-company.json +0 -138
  124. package/integration/hubspot-test/hubspot-test-datasource-contact.json +0 -146
  125. package/integration/hubspot-test/hubspot-test-datasource-deal.json +0 -146
  126. package/integration/hubspot-test/hubspot-test-datasource-users.json +0 -76
  127. package/integration/hubspot-test/hubspot-test-deploy.json +0 -2160
  128. package/integration/hubspot-test/hubspot-test-system.json +0 -74
  129. package/integration/hubspot-test/rbac.json +0 -166
  130. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +0 -20
  131. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +0 -9
  132. package/integration/hubspot-test/test-artifacts/wizard-invalid-add-datasource.yaml +0 -5
  133. package/integration/hubspot-test/test-artifacts/wizard-invalid-app-name.yaml +0 -5
  134. package/integration/hubspot-test/test-artifacts/wizard-invalid-credential-create.yaml +0 -7
  135. package/integration/hubspot-test/test-artifacts/wizard-invalid-credential-select.yaml +0 -7
  136. package/integration/hubspot-test/test-artifacts/wizard-invalid-known-platform.yaml +0 -4
  137. package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-app.yaml +0 -4
  138. package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-source.yaml +0 -2
  139. package/integration/hubspot-test/test-artifacts/wizard-invalid-mode.yaml +0 -5
  140. package/integration/hubspot-test/test-artifacts/wizard-invalid-openapi-file.yaml +0 -5
  141. package/integration/hubspot-test/test-artifacts/wizard-invalid-openapi-url.yaml +0 -4
  142. package/integration/hubspot-test/test-artifacts/wizard-invalid-source.yaml +0 -4
  143. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-array-test.yaml +0 -5
  144. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-key-test.yaml +0 -5
  145. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-path-test.yaml +0 -5
  146. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-test.yaml +0 -5
  147. package/integration/hubspot-test/test-artifacts/wizard-valid-for-rbac-test.yaml +0 -5
  148. package/integration/hubspot-test/test-artifacts/wizard-valid-for-rbac-yaml-test.yaml +0 -5
  149. package/integration/hubspot-test/test-dataplane-down-helpers.js +0 -249
  150. package/integration/hubspot-test/test-dataplane-down-tests.js +0 -386
  151. package/integration/hubspot-test/test-dataplane-down.js +0 -209
  152. package/integration/hubspot-test/test.js +0 -1588
  153. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +0 -16
  154. package/integration/hubspot-test/wizard-hubspot-platform.yaml +0 -8
  155. package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +0 -23
  156. package/integration/roundtrip-test-local/README.md +0 -143
  157. package/integration/roundtrip-test-local/application.yaml +0 -13
  158. package/integration/roundtrip-test-local/env.template +0 -15
  159. package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +0 -14
  160. package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +0 -61
  161. package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +0 -25
  162. package/integration/roundtrip-test-local2/README.md +0 -143
  163. package/integration/roundtrip-test-local2/application.yaml +0 -13
  164. package/integration/roundtrip-test-local2/env.template +0 -15
  165. package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +0 -31
  166. package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +0 -86
  167. package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +0 -25
  168. package/integration/test/wizard.yaml +0 -8
  169. package/jest.config.coverage.js +0 -37
  170. package/jest.config.default.js +0 -11
  171. package/jest.config.integration.fixtures.js +0 -22
  172. package/jest.config.integration.js +0 -33
  173. package/jest.config.isolated.js +0 -11
  174. package/jest.config.manual.js +0 -30
  175. package/jest.global-live-fabrix-hooks.js +0 -36
  176. package/jest.isolated-projects.js +0 -283
  177. package/jest.projects.js +0 -79
  178. package/lib/integration-definition/openapi-enrichment/hubspot-crm-companies.json +0 -205
  179. package/packages/builder-api/README.md +0 -120
  180. package/packages/builder-api/package.json +0 -30
  181. package/packages/builder-api/src/app.module.ts +0 -7
  182. package/packages/builder-api/src/auth/auth.module.ts +0 -5
  183. package/packages/builder-api/src/external-system/external-system.module.ts +0 -5
  184. package/packages/builder-api/src/main.ts +0 -16
  185. package/packages/builder-api/tsconfig.json +0 -15
  186. package/scripts/check-builder-api-architecture-grep.js +0 -79
  187. package/scripts/check-datasource-test-run-schema-sync.js +0 -34
  188. package/scripts/ci-fix.sh +0 -19
  189. package/scripts/ci-simulate.sh +0 -19
  190. package/scripts/diagnose-cli.js +0 -150
  191. package/scripts/docker_image_content_gate.js +0 -47
  192. package/scripts/docker_image_content_gate.sh +0 -5
  193. package/scripts/export-builder-api-evidence.js +0 -262
  194. package/scripts/install-local.js +0 -490
  195. package/scripts/lib/builder-api-docker-staging-copy.js +0 -60
  196. package/scripts/lib/builder-api-docker-staging-core.js +0 -183
  197. package/scripts/lib/docker-image-content-gate-core.js +0 -166
  198. package/scripts/lib/plan-actor.js +0 -109
  199. package/scripts/lib/plan-config.js +0 -20
  200. package/scripts/lib/plan-gates.js +0 -154
  201. package/scripts/lib/plan-meta.js +0 -104
  202. package/scripts/lib/plan-parse.js +0 -162
  203. package/scripts/lib/plan-prevalidate-gates.js +0 -337
  204. package/scripts/lib/plan-run-core.js +0 -125
  205. package/scripts/lib/plan-run-report.js +0 -119
  206. package/scripts/plan-approve.js +0 -24
  207. package/scripts/plan-archive.js +0 -49
  208. package/scripts/plan-run.js +0 -13
  209. package/scripts/plan-set-actor.js +0 -21
  210. package/scripts/plan-validate.js +0 -80
  211. package/scripts/pnpm/af.mjs +0 -125
  212. package/scripts/pnpm/check-quiet.mjs +0 -32
  213. package/scripts/pnpm/dev-install.mjs +0 -29
  214. package/scripts/pnpm/dev-reload.mjs +0 -18
  215. package/scripts/pnpm/help.mjs +0 -55
  216. package/scripts/pnpm/lib/dev-reload-core.mjs +0 -189
  217. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +0 -67
  218. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +0 -32
  219. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +0 -124
  220. package/scripts/pnpm/lib/resolve-app-url.mjs +0 -183
  221. package/scripts/pnpm/lib/spinner.mjs +0 -42
  222. package/scripts/pnpm-global-remove.js +0 -48
  223. package/scripts/stage_builder_api_for_docker.js +0 -65
  224. package/scripts/sync-builder-api-template.js +0 -44
  225. package/scripts/test-dataplane-bootstrap.js +0 -331
@@ -1,490 +0,0 @@
1
- #!/usr/bin/env node
2
- /* eslint-disable no-console */
3
-
4
- /**
5
- * Install local package globally using npm link or pnpm link
6
- * Automatically detects which package manager is being used
7
- *
8
- * @fileoverview Local installation script for @aifabrix/builder
9
- * @author AI Fabrix Team
10
- * @version 2.0.0
11
- */
12
-
13
- const { execSync, execFileSync } = require('child_process');
14
- const fs = require('fs');
15
- const os = require('os');
16
- const path = require('path');
17
-
18
- const { runPnpmGlobalRemove } = require('./pnpm-global-remove');
19
-
20
- const PACKAGE_NAME = '@aifabrix/builder';
21
- /** Primary CLI name used for ā€œcurrent versionā€ before link */
22
- const PRIMARY_BIN = 'aifabrix';
23
-
24
- /**
25
- * Default PNPM_HOME when not set in the environment (matches `pnpm setup` on Linux/macOS; Windows uses LOCALAPPDATA).
26
- * @returns {string} Resolved PNPM global bin home directory
27
- */
28
- function defaultPnpmHome() {
29
- if (process.env.PNPM_HOME) {
30
- return process.env.PNPM_HOME;
31
- }
32
- if (process.platform === 'win32' && process.env.LOCALAPPDATA) {
33
- return path.join(process.env.LOCALAPPDATA, 'pnpm');
34
- }
35
- return path.join(os.homedir(), '.local', 'share', 'pnpm');
36
- }
37
-
38
- /**
39
- * Environment with PNPM_HOME and PATH set so `pnpm link --global` can find the global bin dir
40
- * (same idea as aifabrix-setup/scripts/install-local.js).
41
- * @returns {NodeJS.ProcessEnv} Copy of process.env with pnpm paths prepended
42
- */
43
- function pnpmEnv() {
44
- const env = { ...process.env };
45
- const pnpmHome = defaultPnpmHome();
46
- env.PNPM_HOME = pnpmHome;
47
- env.PATH = [pnpmHome, env.PATH].filter(Boolean).join(path.delimiter);
48
- return env;
49
- }
50
-
51
- /**
52
- * Detect which package manager is being used (pnpm or npm)
53
- * @returns {string} 'pnpm' or 'npm'
54
- */
55
- function detectPackageManager() {
56
- try {
57
- execSync('which pnpm', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
58
- return 'pnpm';
59
- } catch {
60
- return 'npm';
61
- }
62
- }
63
-
64
- /**
65
- * Reads package.json `bin` keys (or default primary bin).
66
- * @returns {string[]} CLI executable names published by this package
67
- */
68
- function listCliBinNames() {
69
- try {
70
- const packageJsonPath = path.join(__dirname, '..', 'package.json');
71
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
72
- const bin = packageJson.bin;
73
- if (!bin) return [PRIMARY_BIN];
74
- if (typeof bin === 'string') return [PRIMARY_BIN];
75
- return Object.keys(bin);
76
- } catch {
77
- return [PRIMARY_BIN];
78
- }
79
- }
80
-
81
- /**
82
- * @param {string} binName - CLI name on PATH
83
- * @param {NodeJS.ProcessEnv} [env] - Optional env (e.g. pnpm-adjusted PATH)
84
- * @returns {string|null} Trimmed `--version` output or null if command fails
85
- */
86
- function getBinVersion(binName, env) {
87
- try {
88
- return execSync(`${binName} --version`, {
89
- encoding: 'utf8',
90
- stdio: ['ignore', 'pipe', 'ignore'],
91
- env: env || process.env
92
- }).trim();
93
- } catch {
94
- return null;
95
- }
96
- }
97
-
98
- /**
99
- * @param {string} binName - CLI name on PATH
100
- * @param {NodeJS.ProcessEnv} [env] - Optional env for `which`
101
- * @returns {string|null} First resolved path or null
102
- */
103
- function getBinPath(binName, env) {
104
- try {
105
- const which = execSync(`which ${binName}`, {
106
- encoding: 'utf8',
107
- stdio: ['ignore', 'pipe', 'ignore'],
108
- env: env || process.env
109
- }).trim();
110
- return which || null;
111
- } catch {
112
- return null;
113
- }
114
- }
115
-
116
- /**
117
- * First executable `binName` on PATH (same resolution order as a POSIX shell).
118
- * @param {string} binName - CLI name
119
- * @param {string} pathString - PATH value (e.g. process.env.PATH)
120
- * @returns {{ candidate: string, real: string }|null} First hit or null
121
- */
122
- function firstExecutableOnPath(binName, pathString) {
123
- if (process.platform === 'win32') {
124
- return null;
125
- }
126
- const dirs = (pathString || '').split(path.delimiter).filter(Boolean);
127
- for (const dir of dirs) {
128
- const candidate = path.join(dir, binName);
129
- try {
130
- const st = fs.lstatSync(candidate);
131
- if (!st.isFile() && !st.isSymbolicLink()) continue;
132
- fs.accessSync(candidate, fs.constants.X_OK);
133
- const real = fs.realpathSync(candidate);
134
- return { candidate, real };
135
- } catch {
136
- // continue
137
- }
138
- }
139
- return null;
140
- }
141
-
142
- /**
143
- * @param {string} executablePath - Absolute path to CLI
144
- * @returns {string|null} Trimmed --version or null
145
- */
146
- function versionAtExecutablePath(executablePath) {
147
- try {
148
- return execFileSync(executablePath, ['--version'], {
149
- encoding: 'utf8',
150
- stdio: ['ignore', 'pipe', 'ignore']
151
- }).trim();
152
- } catch {
153
- return null;
154
- }
155
- }
156
-
157
- /**
158
- * Get currently installed version of primary CLI (aifabrix)
159
- * @param {NodeJS.ProcessEnv} [env] - Optional env for the version probe
160
- * @returns {string|null} Trimmed version or null if not on PATH
161
- */
162
- function getCurrentVersion(env) {
163
- return getBinVersion(PRIMARY_BIN, env);
164
- }
165
-
166
- /**
167
- * Get version from local package.json
168
- * @returns {string|null} Version string or null if not found
169
- */
170
- function getPackageVersion() {
171
- try {
172
- const packageJsonPath = path.join(__dirname, '..', 'package.json');
173
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
174
- return packageJson.version;
175
- } catch {
176
- return null;
177
- }
178
- }
179
-
180
- /**
181
- * Display version comparison information
182
- * @param {string|null} currentVersion - Currently installed version
183
- * @param {string|null} packageVersion - Version being linked
184
- * @returns {void}
185
- */
186
- function displayVersionInfo(currentVersion, packageVersion) {
187
- if (currentVersion) {
188
- console.log(`šŸ“¦ Current installed version: ${currentVersion}`);
189
- } else {
190
- console.log('šŸ“¦ No previous version detected (first install)');
191
- }
192
-
193
- if (packageVersion) {
194
- if (currentVersion && currentVersion !== packageVersion) {
195
- console.log(`šŸ”„ Linking new version: ${packageVersion}`);
196
- console.log(` Version change: ${currentVersion} → ${packageVersion}\n`);
197
- } else if (currentVersion && currentVersion === packageVersion) {
198
- console.log(`šŸ”„ Linking version: ${packageVersion} (same version)\n`);
199
- } else {
200
- console.log(`šŸ”„ Linking version: ${packageVersion}\n`);
201
- }
202
- }
203
- }
204
-
205
- /**
206
- * @typedef {{ name: string, path: string|null, real: string|null, version: string|null }} PathBinRow
207
- */
208
-
209
- /**
210
- * @param {string[]} binNames - CLI names from package.json
211
- * @returns {PathBinRow[]} Resolution rows for current PATH
212
- */
213
- function collectPathResolutionRows(binNames) {
214
- const rows = [];
215
- if (process.platform === 'win32') {
216
- for (const name of binNames) {
217
- const p = getBinPath(name, process.env);
218
- const version = p
219
- ? versionAtExecutablePath(p) || getBinVersion(name, process.env)
220
- : getBinVersion(name, process.env);
221
- rows.push({ name, path: p, real: p, version });
222
- }
223
- return rows;
224
- }
225
- for (const name of binNames) {
226
- const hit = firstExecutableOnPath(name, process.env.PATH);
227
- if (!hit) {
228
- rows.push({ name, path: null, real: null, version: null });
229
- continue;
230
- }
231
- const version =
232
- versionAtExecutablePath(hit.candidate) || getBinVersion(name, process.env);
233
- rows.push({ name, path: hit.candidate, real: hit.real, version });
234
- }
235
- return rows;
236
- }
237
-
238
- /**
239
- * @param {PathBinRow[]} rows - Rows from collectPathResolutionRows
240
- * @param {boolean} multipleBins - Whether package exposes more than one CLI name
241
- * @returns {void}
242
- */
243
- function printPathResolutionTable(rows, multipleBins) {
244
- const label = multipleBins
245
- ? 'First match on your PATH for each command (what new programs see):'
246
- : 'First match on your PATH (what new programs see):';
247
- console.log(`\n${label}`);
248
- for (const r of rows) {
249
- if (!r.path) {
250
- console.log(` ${r.name}: (not found on PATH)`);
251
- continue;
252
- }
253
- const ver = r.version !== null && r.version !== undefined ? r.version : '(could not run --version)';
254
- const arrow = r.real !== r.path ? ` → ${r.real}` : '';
255
- console.log(` ${r.name}: ${r.path}${arrow} → ${ver}`);
256
- }
257
- }
258
-
259
- /**
260
- * @param {PathBinRow[]} rows - Rows from collectPathResolutionRows
261
- * @param {string|null} expectedVersion - Linked package version
262
- * @param {string[]} binNames - Bin names (length for multi-alias tip)
263
- * @returns {void}
264
- */
265
- function printPathResolutionWarnings(rows, expectedVersion, binNames) {
266
- const versions = rows
267
- .map((r) => r.version)
268
- .filter((v) => v !== null && v !== undefined && v !== '(could not run --version)');
269
- const uniq = [...new Set(versions)];
270
- const mismatchAliases = uniq.length > 1;
271
- const hasStaleVers =
272
- Boolean(expectedVersion) &&
273
- rows.some(
274
- (r) => r.version !== null && r.version !== undefined && r.version !== expectedVersion
275
- );
276
-
277
- if (hasStaleVers) {
278
- console.log(`\nāš ļø At least one command above is not ${expectedVersion} (linked package version).`);
279
- console.log(' Another install is winning on PATH for that name — often an old npm global copy.');
280
- console.log(' Try: pnpm run diagnose:cli');
281
- console.log(` Then: npm uninstall -g ${PACKAGE_NAME}`);
282
- console.log(' Put PNPM_HOME (or ~/.local/share/pnpm) before other global bin dirs in PATH if needed.');
283
- }
284
-
285
- if (mismatchAliases) {
286
- console.log('\nāš ļø `af` and `aifabrix` resolve to different installs on PATH.');
287
- console.log(' Fix PATH as above, or if PATH looks correct, your shell may be using a stale location for one of them.');
288
- console.log(' Bash: hash -r Zsh: rehash Then run both with --version again.');
289
- } else if (binNames.length > 1 && expectedVersion && uniq.length === 1 && uniq[0] === expectedVersion) {
290
- console.log('\nTip: Bash caches `af` and `aifabrix` separately. If your terminal shows a wrong version for only one, run: hash -r');
291
- }
292
- }
293
-
294
- /**
295
- * Report first PATH hit per bin (matches new subprocesses). Warn on mismatch vs link or between aliases.
296
- * Bash/zsh cache each command name separately — `af` can stay stale while `aifabrix` updates; suggest hash -r.
297
- * @param {string|null} expectedVersion - Version from the linked package (pnpm env probe)
298
- * @param {string[]} binNames - All bin entries from package.json
299
- * @returns {void}
300
- */
301
- function reportCliAliasesOnPath(expectedVersion, binNames) {
302
- if (!binNames.length) return;
303
- const rows = collectPathResolutionRows(binNames);
304
- printPathResolutionTable(rows, binNames.length > 1);
305
- printPathResolutionWarnings(rows, expectedVersion, binNames);
306
- }
307
-
308
- /**
309
- * Prints pnpm-specific hints when shell PATH still resolves an old binary.
310
- * @param {boolean} usedPnpm - Whether link used pnpm
311
- * @param {string|null} newVersion - Version after link
312
- * @param {Object} [pathInfo] - Shell vs linked path probe
313
- * @param {string|null} [pathInfo.versionInShell] - Version from default shell env
314
- * @param {string|null} [pathInfo.linkedPath] - Path under pnpm env
315
- * @returns {void}
316
- */
317
- function printPnpmPathHints(usedPnpm, newVersion, pathInfo) {
318
- if (!usedPnpm) return;
319
- const shellVersion = pathInfo && pathInfo.versionInShell;
320
- const linkedPath = pathInfo && pathInfo.linkedPath;
321
- if (newVersion && shellVersion !== newVersion) {
322
- console.log(`\nāš ļø Your shell is still running an older ${PRIMARY_BIN} (${shellVersion || 'unknown'}).`);
323
- console.log(` The linked binary is at: ${linkedPath || 'unknown'}`);
324
- console.log(' Fix: run source ~/.bashrc (or open a new terminal).');
325
- console.log(' If it still shows the old version, put pnpm\'s global bin first in PATH, or run:');
326
- console.log(` npm uninstall -g ${PACKAGE_NAME}`);
327
- } else {
328
- console.log('If you still see an old version, run: source ~/.bashrc (or open a new terminal)');
329
- }
330
- }
331
-
332
- /**
333
- * Display success message with version information
334
- * @param {string|null} currentVersion - Version before linking
335
- * @param {string|null} newVersion - Version after linking
336
- * @param {boolean} [usedPnpm] - Link used pnpm
337
- * @param {Object} [pathInfo] - Optional shell vs linked path info
338
- * @param {string|null} [pathInfo.versionInShell] - Version from default shell env
339
- * @param {string|null} [pathInfo.linkedPath] - Path under pnpm env
340
- * @param {string[]} [binNames] - Bin names from package.json
341
- * @returns {void}
342
- */
343
- function displaySuccessMessage(currentVersion, newVersion, usedPnpm, pathInfo, binNames) {
344
- const bins = binNames && binNames.length ? binNames : [PRIMARY_BIN];
345
- console.log('\nāœ” Successfully linked!');
346
- if (currentVersion && newVersion && currentVersion !== newVersion) {
347
- console.log(`šŸ“Š Version updated: ${currentVersion} → ${newVersion}`);
348
- } else if (newVersion) {
349
- console.log(`šŸ“Š Installed version: ${newVersion}`);
350
- }
351
- const verifyHint =
352
- bins.length > 1
353
- ? bins.map((b) => `${b} --version`).join('" or "')
354
- : `${bins[0]} --version`;
355
- console.log(`Run "${verifyHint}" to verify.`);
356
- if (bins.length > 1) {
357
- console.log(
358
- 'If only one alias shows the wrong version in your terminal, clear the shell command cache (bash: hash -r, zsh: rehash).'
359
- );
360
- }
361
-
362
- printPnpmPathHints(usedPnpm, newVersion, pathInfo);
363
- reportCliAliasesOnPath(newVersion, bins);
364
- }
365
-
366
- /**
367
- * Runs global link and reports success (throws on failure).
368
- * @param {string} pm - 'pnpm' or 'npm'
369
- * @param {string|null} currentVersion - Version before link
370
- * @param {string[]} binNames - CLI bin names
371
- * @returns {void}
372
- */
373
- function runGlobalLink(pm, currentVersion, binNames) {
374
- const projectRoot = path.join(__dirname, '..');
375
- const env = pm === 'pnpm' ? pnpmEnv() : undefined;
376
- if (pm === 'pnpm') {
377
- execSync('pnpm link --global', { stdio: 'inherit', cwd: projectRoot, env });
378
- } else {
379
- execSync('npm link', { stdio: 'inherit', cwd: projectRoot });
380
- }
381
-
382
- const newVersion = getCurrentVersion(env);
383
- let pathInfo;
384
- if (pm === 'pnpm') {
385
- pathInfo = {
386
- versionInShell: getCurrentVersion(),
387
- linkedPath: getBinPath(PRIMARY_BIN, env)
388
- };
389
- }
390
- displaySuccessMessage(currentVersion, newVersion, pm === 'pnpm', pathInfo, binNames);
391
- }
392
-
393
- /**
394
- * Install local package globally
395
- * @returns {void}
396
- */
397
- function installLocal() {
398
- const pm = detectPackageManager();
399
- const packageVersion = getPackageVersion();
400
- const binNames = listCliBinNames();
401
- const currentVersion = getCurrentVersion();
402
-
403
- console.log(`Detected package manager: ${pm}\n`);
404
- displayVersionInfo(currentVersion, packageVersion);
405
- console.log(`Linking ${PACKAGE_NAME} globally...\n`);
406
-
407
- try {
408
- runGlobalLink(pm, currentVersion, binNames);
409
- } catch (error) {
410
- console.error('\nāœ– Failed to link package:', error.message);
411
- process.exit(1);
412
- }
413
- }
414
-
415
- /**
416
- * Display version information before unlinking
417
- * @param {string|null} currentVersion - Currently installed version
418
- * @param {string|null} packageVersion - Local package version
419
- * @returns {void}
420
- */
421
- function displayUninstallVersionInfo(currentVersion, packageVersion) {
422
- if (currentVersion) {
423
- console.log(`šŸ“¦ Current installed version: ${currentVersion}`);
424
- } else {
425
- console.log('šŸ“¦ No installed version detected');
426
- }
427
-
428
- if (packageVersion) {
429
- console.log(`šŸ“‹ Local package version: ${packageVersion}`);
430
- if (currentVersion && currentVersion === packageVersion) {
431
- console.log(' (matches installed version)\n');
432
- } else if (currentVersion && currentVersion !== packageVersion) {
433
- console.log(` (installed: ${currentVersion}, local: ${packageVersion})\n`);
434
- } else {
435
- console.log('\n');
436
- }
437
- } else {
438
- console.log('\n');
439
- }
440
- }
441
-
442
- /**
443
- * Display success message after unlinking
444
- * @param {string} pm - Package manager ('pnpm' or 'npm')
445
- * @param {string|null} currentVersion - Version that was uninstalled
446
- * @returns {void}
447
- */
448
- function displayUninstallSuccess(pm, currentVersion) {
449
- console.log(`\nāœ” Successfully unlinked with ${pm}!`);
450
- if (currentVersion) {
451
- console.log(`šŸ“Š Uninstalled version: ${currentVersion}`);
452
- }
453
- }
454
-
455
- /**
456
- * Uninstall local package from global installation
457
- * @returns {void}
458
- */
459
- function uninstallLocal() {
460
- const pm = detectPackageManager();
461
- const currentVersion = getCurrentVersion();
462
- const packageVersion = getPackageVersion();
463
-
464
- console.log(`Detected package manager: ${pm}\n`);
465
- displayUninstallVersionInfo(currentVersion, packageVersion);
466
- console.log(`Unlinking ${PACKAGE_NAME} globally...\n`);
467
-
468
- try {
469
- if (pm === 'pnpm') {
470
- const env = { ...pnpmEnv(), CI: 'true' };
471
- runPnpmGlobalRemove(env, PACKAGE_NAME);
472
- displayUninstallSuccess(pm, currentVersion);
473
- } else {
474
- execSync(`npm unlink -g ${PACKAGE_NAME}`, { stdio: 'inherit' });
475
- displayUninstallSuccess(pm, currentVersion);
476
- }
477
- } catch (error) {
478
- console.error('\nāœ– Failed to unlink package:', error.message);
479
- process.exit(1);
480
- }
481
- }
482
-
483
- // Main execution
484
- const command = process.argv[2];
485
-
486
- if (command === 'uninstall' || command === 'unlink') {
487
- uninstallLocal();
488
- } else {
489
- installLocal();
490
- }
@@ -1,60 +0,0 @@
1
- /**
2
- * Copy staged builder-api runtime tree to disk.
3
- *
4
- * @fileoverview Filesystem staging for Docker COPY layers
5
- * @author AI Fabrix Team
6
- * @version 1.0.0
7
- */
8
-
9
- 'use strict';
10
-
11
- const fs = require('fs');
12
- const path = require('path');
13
-
14
- /**
15
- * @param {string} target
16
- * @returns {void}
17
- */
18
- function removeDirIfExists(target) {
19
- if (fs.existsSync(target)) {
20
- fs.rmSync(target, { recursive: true, force: true });
21
- }
22
- }
23
-
24
- /**
25
- * @param {string} src
26
- * @param {string} dest
27
- * @returns {void}
28
- */
29
- function copyFileEnsureDir(src, dest) {
30
- fs.mkdirSync(path.dirname(dest), { recursive: true });
31
- fs.copyFileSync(src, dest);
32
- }
33
-
34
- /**
35
- * @param {string} repoRoot
36
- * @param {string} destination
37
- * @param {string[]} manifest
38
- * @returns {string[]}
39
- */
40
- function stageFiles(repoRoot, destination, manifest) {
41
- removeDirIfExists(destination);
42
- fs.mkdirSync(destination, { recursive: true });
43
-
44
- const staged = [];
45
- for (const rel of manifest) {
46
- const src = path.join(repoRoot, rel);
47
- const dest = path.join(destination, rel);
48
- if (!fs.existsSync(src)) {
49
- continue;
50
- }
51
- copyFileEnsureDir(src, dest);
52
- staged.push(rel);
53
- }
54
- return staged.sort();
55
- }
56
-
57
- module.exports = {
58
- stageFiles,
59
- removeDirIfExists
60
- };