@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.
- package/lib/app/deploy-config.js +3 -2
- package/lib/channels/add-channel.js +11 -41
- package/lib/channels/approval-guides/index.js +3 -0
- package/lib/channels/approval-guides/microsoft-copilot.js +26 -17
- package/lib/channels/channel-add-existing.js +72 -0
- package/lib/channels/channel-runtime-resolver.js +5 -1
- package/lib/channels/channel-status-display.js +30 -3
- package/lib/channels/microsoft-copilot-entra-sso-form.js +73 -2
- package/lib/channels/microsoft-copilot-entra-sso.js +26 -5
- package/lib/channels/microsoft-copilot-limits.js +22 -3
- package/lib/channels/microsoft-copilot-package.js +59 -14
- package/lib/channels/microsoft-copilot-validate.js +40 -10
- package/lib/cli/attach-default-help-examples.js +102 -0
- package/lib/cli/index.js +2 -0
- package/lib/cli/setup-credential-deployment.js +7 -5
- package/lib/cli/setup-utility-validate.js +1 -0
- package/lib/commands/credential-push.js +37 -5
- package/lib/commands/package-score.js +72 -0
- package/lib/commands/role-assistant.js +46 -8
- package/lib/deployment/deployer-poll-run.js +2 -2
- package/lib/deployment/deployer.js +1 -1
- package/lib/deployment/environment.js +2 -2
- package/lib/external-system/deploy.js +11 -21
- package/lib/integration-definition/apply.js +12 -14
- package/lib/integration-definition/enrich-openapi-operations.js +9 -10
- package/lib/lab/package-parity-score.js +417 -0
- package/lib/programmatic/capability-registry.js +1 -0
- package/lib/programmatic/help-content/channel-onboarding.md +35 -0
- package/lib/programmatic/help-content/cip-overview.md +27 -0
- package/lib/programmatic/help-content/connected-system-ui.md +70 -0
- package/lib/programmatic/help-content/dimensions-guide.md +23 -0
- package/lib/programmatic/help-content/enterprise-sync-fabrix.md +123 -0
- package/lib/programmatic/help-content/overview.md +25 -0
- package/lib/programmatic/help-content/subscription-guide.md +27 -0
- package/lib/programmatic/help-content/workflow.md +50 -0
- package/lib/programmatic/openapi-component-schemas.js +1 -0
- package/lib/programmatic/openapi-descriptions.js +6 -0
- package/lib/programmatic/openapi-envelope-examples.js +11 -0
- package/lib/programmatic/openapi-operation-bindings.js +5 -0
- package/lib/programmatic/openapi-request-schemas.js +39 -13
- package/lib/programmatic/openapi-result-schemas.js +30 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +18 -0
- package/lib/programmatic/openapi-schema-descriptions-operations.js +19 -0
- package/lib/programmatic/persist-supplied-openapi.js +180 -0
- package/lib/programmatic/route-handler-map.js +6 -0
- package/lib/programmatic/run-integration-definition.js +13 -5
- package/lib/role-assistant/evidence-sync.js +55 -7
- package/lib/role-assistant/test-runner-attachments.js +118 -0
- package/lib/role-assistant/test-runner-bid-apply.js +100 -21
- package/lib/role-assistant/test-runner-bid-document.js +1 -1
- package/lib/role-assistant/test-runner-start-payload.js +96 -0
- package/lib/role-assistant/test-runner-workhub-answers.js +11 -7
- package/lib/role-assistant/test-runner-workhub-helpers.js +100 -0
- package/lib/role-assistant/test-runner-workhub-soft.js +86 -0
- package/lib/role-assistant/test-runner-workhub.js +68 -105
- package/lib/role-assistant/test-runner.js +5 -63
- package/lib/role-assistant/test-suite.js +33 -40
- package/lib/schema/external-datasource.schema.json +13 -4
- package/lib/utils/compose-generator.js +10 -1
- package/lib/utils/compose-traefik-extra-routes.js +107 -0
- package/lib/utils/docker-build.js +2 -2
- package/lib/utils/help-builder.js +2 -1
- package/lib/utils/promote-dev-docker-image.js +15 -10
- package/package.json +14 -16
- package/templates/README.md +12 -1
- package/templates/applications/dataplane/application.yaml +8 -1
- package/templates/applications/dataplane/env.template +1 -1
- package/templates/applications/miso-controller/application.yaml +2 -1
- package/templates/applications/miso-controller/rbac.yaml +1 -0
- package/templates/channels/microsoft-copilot/ai-plugin.template.json.hbs +6 -2
- package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +8 -5
- package/templates/channels/microsoft-copilot/fi-fi.template.json.hbs +7 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +74 -22
- package/templates/channels/microsoft-copilot/manifest.template.json.hbs +29 -14
- package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +6 -2
- package/templates/python/docker-compose.hbs +36 -0
- package/templates/typescript/docker-compose.hbs +36 -0
- package/.cursor/plans/Archive/157.1-security-quality-violations-by-type.csv +0 -374
- package/.cursor/process/README.md +0 -9
- package/.cursor/rules/anchor-docs.mdc +0 -15
- package/.cursor/rules/assistant-driven-integration-build.mdc +0 -40
- package/.cursor/rules/cli-layout.mdc +0 -81
- package/.cursor/rules/cli-product-neutral.mdc +0 -43
- package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +0 -49
- package/.cursor/rules/docs-rules.mdc +0 -32
- package/.cursor/rules/plan-rules/application-lifecycle.mdc +0 -30
- package/.cursor/rules/plan-rules/plan-frontmatter.mdc +0 -35
- package/.cursor/rules/plan-rules/plan-lifecycle.mdc +0 -31
- package/.cursor/rules/plan-rules/plan-validation-gate.mdc +0 -34
- package/.cursor/rules/project-rules.mdc +0 -913
- package/.cursor/skills/README.md +0 -15
- package/.dockerignore +0 -52
- package/.eslintignore +0 -22
- package/.markdownlint.json +0 -14
- package/anchor-docs/README.md +0 -10
- package/anchor-docs/_TEMPLATE +0 -24
- package/babel.config.js +0 -6
- package/bin/builder-api-cleanup.js +0 -26
- package/bin/builder-api-nest.js +0 -10
- package/bin/builder-api-spike.js +0 -19
- package/enterprise-knowledge/README.md +0 -50
- package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +0 -22
- package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +0 -15
- package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +0 -69
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +0 -52
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +0 -29
- package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +0 -2
- package/integration/README.md +0 -81
- package/integration/github/README.md +0 -53
- package/integration/github/application.json +0 -21
- package/integration/github/deploy.js +0 -72
- package/integration/github/env.template +0 -11
- package/integration/github/github-datasource-issue-comments.json +0 -239
- package/integration/github/github-datasource-issues.json +0 -399
- package/integration/github/github-datasource-repository.json +0 -354
- package/integration/github/github-deploy.json +0 -1202
- package/integration/github/github-system.json +0 -82
- package/integration/hubspot-test/README.md +0 -159
- package/integration/hubspot-test/application.json +0 -54
- package/integration/hubspot-test/companies.json +0 -2048
- package/integration/hubspot-test/create-hubspot.js +0 -523
- package/integration/hubspot-test/env.template +0 -4
- package/integration/hubspot-test/hubspot-test-datasource-company.json +0 -138
- package/integration/hubspot-test/hubspot-test-datasource-contact.json +0 -146
- package/integration/hubspot-test/hubspot-test-datasource-deal.json +0 -146
- package/integration/hubspot-test/hubspot-test-datasource-users.json +0 -76
- package/integration/hubspot-test/hubspot-test-deploy.json +0 -2160
- package/integration/hubspot-test/hubspot-test-system.json +0 -74
- package/integration/hubspot-test/rbac.json +0 -166
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +0 -20
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +0 -9
- package/integration/hubspot-test/test-artifacts/wizard-invalid-add-datasource.yaml +0 -5
- package/integration/hubspot-test/test-artifacts/wizard-invalid-app-name.yaml +0 -5
- package/integration/hubspot-test/test-artifacts/wizard-invalid-credential-create.yaml +0 -7
- package/integration/hubspot-test/test-artifacts/wizard-invalid-credential-select.yaml +0 -7
- package/integration/hubspot-test/test-artifacts/wizard-invalid-known-platform.yaml +0 -4
- package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-app.yaml +0 -4
- package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-source.yaml +0 -2
- package/integration/hubspot-test/test-artifacts/wizard-invalid-mode.yaml +0 -5
- package/integration/hubspot-test/test-artifacts/wizard-invalid-openapi-file.yaml +0 -5
- package/integration/hubspot-test/test-artifacts/wizard-invalid-openapi-url.yaml +0 -4
- package/integration/hubspot-test/test-artifacts/wizard-invalid-source.yaml +0 -4
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-array-test.yaml +0 -5
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-key-test.yaml +0 -5
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-path-test.yaml +0 -5
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-test.yaml +0 -5
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-rbac-test.yaml +0 -5
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-rbac-yaml-test.yaml +0 -5
- package/integration/hubspot-test/test-dataplane-down-helpers.js +0 -249
- package/integration/hubspot-test/test-dataplane-down-tests.js +0 -386
- package/integration/hubspot-test/test-dataplane-down.js +0 -209
- package/integration/hubspot-test/test.js +0 -1588
- package/integration/hubspot-test/wizard-hubspot-e2e.yaml +0 -16
- package/integration/hubspot-test/wizard-hubspot-platform.yaml +0 -8
- package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +0 -23
- package/integration/roundtrip-test-local/README.md +0 -143
- package/integration/roundtrip-test-local/application.yaml +0 -13
- package/integration/roundtrip-test-local/env.template +0 -15
- package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +0 -14
- package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +0 -61
- package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +0 -25
- package/integration/roundtrip-test-local2/README.md +0 -143
- package/integration/roundtrip-test-local2/application.yaml +0 -13
- package/integration/roundtrip-test-local2/env.template +0 -15
- package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +0 -31
- package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +0 -86
- package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +0 -25
- package/integration/test/wizard.yaml +0 -8
- package/jest.config.coverage.js +0 -37
- package/jest.config.default.js +0 -11
- package/jest.config.integration.fixtures.js +0 -22
- package/jest.config.integration.js +0 -33
- package/jest.config.isolated.js +0 -11
- package/jest.config.manual.js +0 -30
- package/jest.global-live-fabrix-hooks.js +0 -36
- package/jest.isolated-projects.js +0 -283
- package/jest.projects.js +0 -79
- package/lib/integration-definition/openapi-enrichment/hubspot-crm-companies.json +0 -205
- package/packages/builder-api/README.md +0 -120
- package/packages/builder-api/package.json +0 -30
- package/packages/builder-api/src/app.module.ts +0 -7
- package/packages/builder-api/src/auth/auth.module.ts +0 -5
- package/packages/builder-api/src/external-system/external-system.module.ts +0 -5
- package/packages/builder-api/src/main.ts +0 -16
- package/packages/builder-api/tsconfig.json +0 -15
- package/scripts/check-builder-api-architecture-grep.js +0 -79
- package/scripts/check-datasource-test-run-schema-sync.js +0 -34
- package/scripts/ci-fix.sh +0 -19
- package/scripts/ci-simulate.sh +0 -19
- package/scripts/diagnose-cli.js +0 -150
- package/scripts/docker_image_content_gate.js +0 -47
- package/scripts/docker_image_content_gate.sh +0 -5
- package/scripts/export-builder-api-evidence.js +0 -262
- package/scripts/install-local.js +0 -490
- package/scripts/lib/builder-api-docker-staging-copy.js +0 -60
- package/scripts/lib/builder-api-docker-staging-core.js +0 -183
- package/scripts/lib/docker-image-content-gate-core.js +0 -166
- package/scripts/lib/plan-actor.js +0 -109
- package/scripts/lib/plan-config.js +0 -20
- package/scripts/lib/plan-gates.js +0 -154
- package/scripts/lib/plan-meta.js +0 -104
- package/scripts/lib/plan-parse.js +0 -162
- package/scripts/lib/plan-prevalidate-gates.js +0 -337
- package/scripts/lib/plan-run-core.js +0 -125
- package/scripts/lib/plan-run-report.js +0 -119
- package/scripts/plan-approve.js +0 -24
- package/scripts/plan-archive.js +0 -49
- package/scripts/plan-run.js +0 -13
- package/scripts/plan-set-actor.js +0 -21
- package/scripts/plan-validate.js +0 -80
- package/scripts/pnpm/af.mjs +0 -125
- package/scripts/pnpm/check-quiet.mjs +0 -32
- package/scripts/pnpm/dev-install.mjs +0 -29
- package/scripts/pnpm/dev-reload.mjs +0 -18
- package/scripts/pnpm/help.mjs +0 -55
- package/scripts/pnpm/lib/dev-reload-core.mjs +0 -189
- package/scripts/pnpm/lib/dev-reload-log-capture.mjs +0 -67
- package/scripts/pnpm/lib/dev-reload-log-utils.mjs +0 -32
- package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +0 -124
- package/scripts/pnpm/lib/resolve-app-url.mjs +0 -183
- package/scripts/pnpm/lib/spinner.mjs +0 -42
- package/scripts/pnpm-global-remove.js +0 -48
- package/scripts/stage_builder_api_for_docker.js +0 -65
- package/scripts/sync-builder-api-template.js +0 -44
- package/scripts/test-dataplane-bootstrap.js +0 -331
package/scripts/install-local.js
DELETED
|
@@ -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
|
-
};
|