@noodleseed/one 0.157.0 → 0.159.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.
- package/README.md +8 -5
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +4 -0
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/local-readiness.d.ts.map +1 -1
- package/dist/commands/local-readiness.js +8 -0
- package/dist/commands/local-readiness.js.map +1 -1
- package/dist/commands/project-setup.d.ts.map +1 -1
- package/dist/commands/project-setup.js +83 -47
- package/dist/commands/project-setup.js.map +1 -1
- package/dist/first-run.d.ts +1 -0
- package/dist/first-run.d.ts.map +1 -1
- package/dist/first-run.js +119 -46
- package/dist/first-run.js.map +1 -1
- package/dist/import-scaffold.d.ts +5 -0
- package/dist/import-scaffold.d.ts.map +1 -0
- package/dist/import-scaffold.js +41 -0
- package/dist/import-scaffold.js.map +1 -0
- package/dist/mcp-import.d.ts.map +1 -1
- package/dist/mcp-import.js +18 -15
- package/dist/mcp-import.js.map +1 -1
- package/dist/openapi-import.d.ts.map +1 -1
- package/dist/openapi-import.js +106 -53
- package/dist/openapi-import.js.map +1 -1
- package/dist/plugin-mode/plugin-operation-contract.d.ts +142 -3
- package/dist/plugin-mode/plugin-operation-contract.d.ts.map +1 -1
- package/dist/plugin-mode/plugin-operation-contract.js +13 -2
- package/dist/plugin-mode/plugin-operation-contract.js.map +1 -1
- package/dist/plugin-mode/plugin-operation-tools.d.ts.map +1 -1
- package/dist/plugin-mode/plugin-operation-tools.js +27 -8
- package/dist/plugin-mode/plugin-operation-tools.js.map +1 -1
- package/dist/project-bootstrap-install.d.ts +14 -0
- package/dist/project-bootstrap-install.d.ts.map +1 -0
- package/dist/project-bootstrap-install.js +73 -0
- package/dist/project-bootstrap-install.js.map +1 -0
- package/dist/project-bootstrap-launch.d.ts +27 -0
- package/dist/project-bootstrap-launch.d.ts.map +1 -0
- package/dist/project-bootstrap-launch.js +64 -0
- package/dist/project-bootstrap-launch.js.map +1 -0
- package/dist/project-bootstrap-process.d.ts +19 -0
- package/dist/project-bootstrap-process.d.ts.map +1 -0
- package/dist/project-bootstrap-process.js +60 -0
- package/dist/project-bootstrap-process.js.map +1 -0
- package/dist/project-bootstrap-report.d.ts +55 -0
- package/dist/project-bootstrap-report.d.ts.map +1 -0
- package/dist/project-bootstrap-report.js +30 -0
- package/dist/project-bootstrap-report.js.map +1 -0
- package/dist/project-bootstrap-state.d.ts +87 -0
- package/dist/project-bootstrap-state.d.ts.map +1 -0
- package/dist/project-bootstrap-state.js +125 -0
- package/dist/project-bootstrap-state.js.map +1 -0
- package/dist/project-bootstrap.d.ts +36 -0
- package/dist/project-bootstrap.d.ts.map +1 -0
- package/dist/project-bootstrap.js +243 -0
- package/dist/project-bootstrap.js.map +1 -0
- package/dist/project-scaffold-templates.d.ts +1 -1
- package/dist/project-scaffold-templates.d.ts.map +1 -1
- package/dist/project-scaffold-templates.js +17 -12
- package/dist/project-scaffold-templates.js.map +1 -1
- package/dist/project-toolchain.d.ts +13 -0
- package/dist/project-toolchain.d.ts.map +1 -0
- package/dist/project-toolchain.js +73 -0
- package/dist/project-toolchain.js.map +1 -0
- package/dist/project.d.ts +2 -0
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +40 -9
- package/dist/project.js.map +1 -1
- package/dist/widget-scaffold-template.d.ts.map +1 -1
- package/dist/widget-scaffold-template.js +5 -10
- package/dist/widget-scaffold-template.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +2 -2
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-bootstrap-skill.js +2 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +3 -2
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-bootstrap-authoring.js +1 -1
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-bootstrap-pre-auth.js +26 -4
- package/node_modules/@noodle-borg/openapi-import/dist/index.js +76 -53
- package/node_modules/@noodle-borg/openapi-import/dist/request-body.js +125 -0
- package/node_modules/@noodle-borg/openapi-import/dist/request-input.js +139 -0
- package/node_modules/@noodle-borg/openapi-import/dist/response-schema.js +17 -4
- package/node_modules/@noodle-borg/service/package.json +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { closeSync, constants, fstatSync, lstatSync, mkdirSync, openSync, readSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export const BOOTSTRAP_STAGES = [
|
|
6
|
+
'scaffold',
|
|
7
|
+
'install',
|
|
8
|
+
'context',
|
|
9
|
+
'validate',
|
|
10
|
+
'behavior',
|
|
11
|
+
'types',
|
|
12
|
+
'launch',
|
|
13
|
+
];
|
|
14
|
+
const stageSchema = z.enum(BOOTSTRAP_STAGES);
|
|
15
|
+
export const bootstrapFailureSchema = z.strictObject({
|
|
16
|
+
stage: stageSchema,
|
|
17
|
+
code: z.enum([
|
|
18
|
+
'command_failed',
|
|
19
|
+
'command_timeout',
|
|
20
|
+
'missing_executable',
|
|
21
|
+
'context_invalid',
|
|
22
|
+
'verification_failed',
|
|
23
|
+
'dependency_mismatch',
|
|
24
|
+
'configuration_conflict',
|
|
25
|
+
'package_manager_unsupported',
|
|
26
|
+
'cancelled',
|
|
27
|
+
]),
|
|
28
|
+
});
|
|
29
|
+
const versionSchema = z
|
|
30
|
+
.string()
|
|
31
|
+
.max(128)
|
|
32
|
+
.regex(/^\d+\.\d+\.\d+(?:[-+][\w.+-]+)?$/);
|
|
33
|
+
const stateSchema = z
|
|
34
|
+
.object({
|
|
35
|
+
schemaVersion: z.literal(1),
|
|
36
|
+
cliVersion: versionSchema,
|
|
37
|
+
packageManager: z.enum(['npm', 'pnpm', 'yarn']),
|
|
38
|
+
managerVersion: versionSchema.optional(),
|
|
39
|
+
launchedAgent: z.enum(['codex', 'claude-code']).optional(),
|
|
40
|
+
completed: z.array(stageSchema).max(BOOTSTRAP_STAGES.length),
|
|
41
|
+
inProgress: stageSchema.optional(),
|
|
42
|
+
failed: bootstrapFailureSchema.optional(),
|
|
43
|
+
dependencyFingerprint: z
|
|
44
|
+
.string()
|
|
45
|
+
.regex(/^[a-f0-9]{64}$/)
|
|
46
|
+
.optional(),
|
|
47
|
+
})
|
|
48
|
+
.strict()
|
|
49
|
+
.refine((state) => new Set(state.completed).size === state.completed.length &&
|
|
50
|
+
(!state.inProgress || !state.completed.includes(state.inProgress)) &&
|
|
51
|
+
(!state.failed || !state.completed.includes(state.failed.stage)));
|
|
52
|
+
const MAX_STATE_BYTES = 16 * 1024;
|
|
53
|
+
const stateError = () => new Error('Bootstrap state is unreadable or not owned by this setup format.');
|
|
54
|
+
function stateDirectory(project) {
|
|
55
|
+
const path = join(project, '.noodle');
|
|
56
|
+
try {
|
|
57
|
+
const stat = lstatSync(path);
|
|
58
|
+
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
59
|
+
throw stateError();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error.code !== 'ENOENT')
|
|
63
|
+
throw stateError();
|
|
64
|
+
}
|
|
65
|
+
return path;
|
|
66
|
+
}
|
|
67
|
+
export function readBootstrapState(project) {
|
|
68
|
+
let descriptor;
|
|
69
|
+
try {
|
|
70
|
+
const path = join(stateDirectory(project), 'setup.json');
|
|
71
|
+
try {
|
|
72
|
+
descriptor = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error.code === 'ENOENT')
|
|
76
|
+
return undefined;
|
|
77
|
+
throw stateError();
|
|
78
|
+
}
|
|
79
|
+
const stat = fstatSync(descriptor);
|
|
80
|
+
if (!stat.isFile() || stat.size > MAX_STATE_BYTES)
|
|
81
|
+
throw stateError();
|
|
82
|
+
const buffer = Buffer.alloc(MAX_STATE_BYTES + 1);
|
|
83
|
+
let length = 0;
|
|
84
|
+
while (length < buffer.length) {
|
|
85
|
+
const count = readSync(descriptor, buffer, length, buffer.length - length, length);
|
|
86
|
+
if (count === 0)
|
|
87
|
+
break;
|
|
88
|
+
length += count;
|
|
89
|
+
}
|
|
90
|
+
if (length > MAX_STATE_BYTES)
|
|
91
|
+
throw stateError();
|
|
92
|
+
const parsed = stateSchema.safeParse(JSON.parse(buffer.subarray(0, length).toString('utf8')));
|
|
93
|
+
if (!parsed.success)
|
|
94
|
+
throw stateError();
|
|
95
|
+
return parsed.data;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
throw stateError();
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
if (descriptor !== undefined)
|
|
102
|
+
closeSync(descriptor);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function writeBootstrapState(project, state) {
|
|
106
|
+
const parsed = stateSchema.safeParse(state);
|
|
107
|
+
if (!parsed.success)
|
|
108
|
+
throw stateError();
|
|
109
|
+
// A malformed/unowned existing record is never treated as permission to replace it.
|
|
110
|
+
readBootstrapState(project);
|
|
111
|
+
const directory = stateDirectory(project);
|
|
112
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
113
|
+
const temporary = join(directory, `.setup-${randomBytes(12).toString('hex')}.tmp`);
|
|
114
|
+
try {
|
|
115
|
+
writeFileSync(temporary, `${JSON.stringify(parsed.data)}\n`, { mode: 0o600, flag: 'wx' });
|
|
116
|
+
renameSync(temporary, join(directory, 'setup.json'));
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
throw stateError();
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
rmSync(temporary, { force: true });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=project-bootstrap-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-bootstrap-state.js","sourceRoot":"","sources":["../src/project-bootstrap-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AgentTarget } from '@noodle-borg/agent-kit';
|
|
2
|
+
import { type AgentSetupReport, setupAgentsWithResolvedSkills } from './agents.js';
|
|
3
|
+
import { type DocsMcpResult } from './commands/docs-mcp.js';
|
|
4
|
+
import type { ConfigLocation } from './config.js';
|
|
5
|
+
import { type InitProjectOptions, type InitProjectResult } from './project.js';
|
|
6
|
+
import { type BootstrapLaunchTarget, launchBootstrapAgent } from './project-bootstrap-launch.js';
|
|
7
|
+
import { type BootstrapExecutor } from './project-bootstrap-process.js';
|
|
8
|
+
import { type BootstrapReport } from './project-bootstrap-report.js';
|
|
9
|
+
export type { BootstrapReport } from './project-bootstrap-report.js';
|
|
10
|
+
import { type BootstrapStage } from './project-bootstrap-state.js';
|
|
11
|
+
import { type ProjectPackageManager } from './project-toolchain.js';
|
|
12
|
+
export interface BootstrapProjectOptions extends InitProjectOptions {
|
|
13
|
+
readonly install?: boolean;
|
|
14
|
+
readonly packageManager?: ProjectPackageManager;
|
|
15
|
+
readonly launch?: BootstrapLaunchTarget;
|
|
16
|
+
readonly docsMcp?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface BootstrapProjectResult extends InitProjectResult {
|
|
19
|
+
readonly agents?: AgentSetupReport;
|
|
20
|
+
readonly setup: BootstrapReport;
|
|
21
|
+
readonly docsMcp?: DocsMcpResult;
|
|
22
|
+
readonly warnings?: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
interface BootstrapDependencies {
|
|
25
|
+
readonly env: NodeJS.ProcessEnv;
|
|
26
|
+
readonly configLocation?: ConfigLocation;
|
|
27
|
+
readonly execute?: BootstrapExecutor;
|
|
28
|
+
readonly setupContext?: typeof setupAgentsWithResolvedSkills;
|
|
29
|
+
readonly interactive?: boolean;
|
|
30
|
+
readonly launchAgent?: typeof launchBootstrapAgent;
|
|
31
|
+
readonly chooseAgent?: (agents: readonly AgentTarget[], env: NodeJS.ProcessEnv) => Promise<BootstrapLaunchTarget>;
|
|
32
|
+
readonly progress?: (stage: BootstrapStage, status: 'running' | 'complete') => void;
|
|
33
|
+
}
|
|
34
|
+
/** One canonical local orchestration shared by init and the guided first-run projection. */
|
|
35
|
+
export declare function bootstrapProject(options: BootstrapProjectOptions, dependencies: BootstrapDependencies): Promise<BootstrapProjectResult>;
|
|
36
|
+
//# sourceMappingURL=project-bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-bootstrap.d.ts","sourceRoot":"","sources":["../src/project-bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,KAAK,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAe,MAAM,cAAc,CAAC;AAQ5F,OAAO,EAEL,KAAK,qBAAqB,EAE1B,oBAAoB,EACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,gCAAgC,CAAC;AAC7F,OAAO,EAAE,KAAK,eAAe,EAA0B,MAAM,+BAA+B,CAAC;AAE7F,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,wBAAwB,CAAC;AAGhC,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AACD,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AACD,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,6BAA6B,CAAC;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,CACrB,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,KAAK,IAAI,CAAC;CACrF;AASD,4FAA4F;AAC5F,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,EAChC,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAyPjC"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { setupAgentsWithResolvedSkills } from './agents.js';
|
|
3
|
+
import { writeDocsMcpConfig } from './commands/docs-mcp.js';
|
|
4
|
+
import { initProject } from './project.js';
|
|
5
|
+
import { bootstrapDependencyFingerprint, bootstrapLockfiles, hasCompletedBootstrapLock, installedBootstrapCli, readBootstrapManifest, } from './project-bootstrap-install.js';
|
|
6
|
+
import { assertBootstrapLaunchAllowed, isRunningCodingAgent, launchBootstrapAgent, } from './project-bootstrap-launch.js';
|
|
7
|
+
import { runBootstrapProcess } from './project-bootstrap-process.js';
|
|
8
|
+
import { bootstrapJsonSucceeded } from './project-bootstrap-report.js';
|
|
9
|
+
import { readBootstrapState, writeBootstrapState, } from './project-bootstrap-state.js';
|
|
10
|
+
import { installArguments, selectPackageManager, } from './project-toolchain.js';
|
|
11
|
+
import { currentCliVersion } from './update.js';
|
|
12
|
+
function quote(value) {
|
|
13
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
14
|
+
}
|
|
15
|
+
function agentSelection(agents) {
|
|
16
|
+
return agents.length === 2 ? 'all' : (agents[0] ?? 'none');
|
|
17
|
+
}
|
|
18
|
+
/** One canonical local orchestration shared by init and the guided first-run projection. */
|
|
19
|
+
export async function bootstrapProject(options, dependencies) {
|
|
20
|
+
const project = resolve(options.dir ?? '.');
|
|
21
|
+
const agents = options.agentTargets ?? ['codex', 'claude-code'];
|
|
22
|
+
let launch = options.launch ?? 'none';
|
|
23
|
+
assertBootstrapLaunchAllowed(launch, agents, dependencies.interactive ?? false, dependencies.env, options.install !== false);
|
|
24
|
+
const previous = readBootstrapState(project);
|
|
25
|
+
const manifest = readBootstrapManifest(project);
|
|
26
|
+
const manager = selectPackageManager({
|
|
27
|
+
...(options.packageManager
|
|
28
|
+
? { requested: options.packageManager }
|
|
29
|
+
: previous
|
|
30
|
+
? { requested: previous.packageManager }
|
|
31
|
+
: {}),
|
|
32
|
+
...(manifest?.packageManager ? { packageManager: manifest.packageManager } : {}),
|
|
33
|
+
lockfiles: bootstrapLockfiles(project),
|
|
34
|
+
...(dependencies.env.npm_config_user_agent
|
|
35
|
+
? { userAgent: dependencies.env.npm_config_user_agent }
|
|
36
|
+
: {}),
|
|
37
|
+
});
|
|
38
|
+
const version = currentCliVersion();
|
|
39
|
+
const resume = () => `npx --yes @noodleseed/one@${version} init ${quote(project)} --package-manager ${manager} --agents ${agentSelection(agents)}${options.docsMcp === false ? ' --no-docs-mcp' : ''}${launch === 'none' ? '' : ` --launch ${launch}`}`;
|
|
40
|
+
if (!options.dryRun)
|
|
41
|
+
dependencies.progress?.('scaffold', 'running');
|
|
42
|
+
const result = initProject(options);
|
|
43
|
+
let state = {
|
|
44
|
+
schemaVersion: 1,
|
|
45
|
+
cliVersion: version,
|
|
46
|
+
packageManager: manager,
|
|
47
|
+
completed: [],
|
|
48
|
+
};
|
|
49
|
+
let agentReport;
|
|
50
|
+
let docsMcpReport;
|
|
51
|
+
const warnings = [];
|
|
52
|
+
const connectDocs = () => {
|
|
53
|
+
if (options.docsMcp !== false && agents.length) {
|
|
54
|
+
try {
|
|
55
|
+
docsMcpReport = writeDocsMcpConfig(project, { dryRun: options.dryRun ?? false });
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
warnings.push('Docs MCP configuration was preserved but could not be reconciled; inspect .mcp.json and re-run init --no-install.');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const execute = dependencies.execute ?? runBootstrapProcess;
|
|
63
|
+
const processOptions = {
|
|
64
|
+
cwd: project,
|
|
65
|
+
env: { ...dependencies.env, NOODLE_DISABLE_UPDATE_CHECK: '1' },
|
|
66
|
+
};
|
|
67
|
+
const save = () => {
|
|
68
|
+
if (!options.dryRun && options.install !== false)
|
|
69
|
+
writeBootstrapState(project, state);
|
|
70
|
+
};
|
|
71
|
+
const begin = (stage) => {
|
|
72
|
+
state = { ...state, inProgress: stage };
|
|
73
|
+
save();
|
|
74
|
+
dependencies.progress?.(stage, 'running');
|
|
75
|
+
};
|
|
76
|
+
const complete = (stage) => {
|
|
77
|
+
const { inProgress: _inProgress, failed: _failed, ...rest } = state;
|
|
78
|
+
state = { ...rest, completed: [...state.completed.filter((value) => value !== stage), stage] };
|
|
79
|
+
save();
|
|
80
|
+
dependencies.progress?.(stage, 'complete');
|
|
81
|
+
};
|
|
82
|
+
const report = (failed) => {
|
|
83
|
+
if (failed) {
|
|
84
|
+
const { inProgress: _inProgress, ...rest } = state;
|
|
85
|
+
state = { ...rest, failed };
|
|
86
|
+
save();
|
|
87
|
+
}
|
|
88
|
+
const ready = !failed && state.completed.includes('types');
|
|
89
|
+
const resumeCommand = resume();
|
|
90
|
+
return {
|
|
91
|
+
...result,
|
|
92
|
+
...(agentReport ? { agents: agentReport } : {}),
|
|
93
|
+
...(docsMcpReport ? { docsMcp: docsMcpReport } : {}),
|
|
94
|
+
...(warnings.length ? { warnings } : {}),
|
|
95
|
+
setup: {
|
|
96
|
+
ready,
|
|
97
|
+
packageManager: manager,
|
|
98
|
+
completed: state.completed,
|
|
99
|
+
...(failed ? { failed } : {}),
|
|
100
|
+
resumeCommand,
|
|
101
|
+
nextSteps: ready
|
|
102
|
+
? [
|
|
103
|
+
{
|
|
104
|
+
command: `${manager} run dev`,
|
|
105
|
+
reason: 'After binding declared configuration, adapt and test your real application boundary; synthetic proof is not customer or hosted verification.',
|
|
106
|
+
},
|
|
107
|
+
]
|
|
108
|
+
: [
|
|
109
|
+
{
|
|
110
|
+
command: resumeCommand,
|
|
111
|
+
reason: failed
|
|
112
|
+
? failed.code === 'package_manager_unsupported'
|
|
113
|
+
? 'Yarn cannot install this release’s bundled runtime. Preserve this project; use --no-install for files-only work, or choose npm/pnpm in a separate project. Do not replace its lockfile.'
|
|
114
|
+
: failed.code === 'dependency_mismatch'
|
|
115
|
+
? 'The existing project pins a different CLI release. Use that pinned CLI, or explicitly review an SDK upgrade before resuming; setup does not silently rewrite package.json.'
|
|
116
|
+
: `Repair the ${failed.stage} step (${failed.code}), then resume without overwriting customer files.`
|
|
117
|
+
: 'Install dependencies and run local verification when ready.',
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
restartRequired: agents.length > 0 && !state.completed.includes('launch'),
|
|
121
|
+
proof: ready ? 'local-synthetic' : 'unverified',
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
if (options.dryRun) {
|
|
126
|
+
if (agents.length)
|
|
127
|
+
agentReport = await (dependencies.setupContext ?? setupAgentsWithResolvedSkills)({ agents, project, write: false, force: options.force ?? false, json: true }, processOptions.env, dependencies.configLocation);
|
|
128
|
+
connectDocs();
|
|
129
|
+
return report();
|
|
130
|
+
}
|
|
131
|
+
complete('scaffold');
|
|
132
|
+
let cli;
|
|
133
|
+
if (options.install !== false) {
|
|
134
|
+
begin('install');
|
|
135
|
+
if (manager === 'yarn')
|
|
136
|
+
return report({ stage: 'install', code: 'package_manager_unsupported' });
|
|
137
|
+
const localManifest = readBootstrapManifest(project);
|
|
138
|
+
if ((localManifest?.devDependencies?.['@noodleseed/one'] ??
|
|
139
|
+
localManifest?.dependencies?.['@noodleseed/one']) !== version)
|
|
140
|
+
return report({ stage: 'install', code: 'dependency_mismatch' });
|
|
141
|
+
const detected = await execute(manager, ['--version'], {
|
|
142
|
+
...processOptions,
|
|
143
|
+
timeoutMs: 10_000,
|
|
144
|
+
maxOutputBytes: 1024,
|
|
145
|
+
});
|
|
146
|
+
if (!detected.ok)
|
|
147
|
+
return report({ stage: 'install', code: detected.code });
|
|
148
|
+
const managerVersion = detected.stdout.trim();
|
|
149
|
+
if (!/^\d+\.\d+\.\d+(?:[-+][\w.+-]+)?$/.test(managerVersion))
|
|
150
|
+
return report({ stage: 'install', code: 'verification_failed' });
|
|
151
|
+
if (localManifest?.packageManager &&
|
|
152
|
+
localManifest.packageManager !== `${manager}@${managerVersion}`)
|
|
153
|
+
return report({ stage: 'install', code: 'configuration_conflict' });
|
|
154
|
+
state = { ...state, managerVersion };
|
|
155
|
+
cli = installedBootstrapCli(project, version);
|
|
156
|
+
const unchanged = previous?.completed.includes('install') &&
|
|
157
|
+
previous.cliVersion === version &&
|
|
158
|
+
previous.managerVersion === managerVersion &&
|
|
159
|
+
previous.packageManager === manager &&
|
|
160
|
+
previous.dependencyFingerprint === bootstrapDependencyFingerprint(project) &&
|
|
161
|
+
cli !== undefined;
|
|
162
|
+
if (!unchanged) {
|
|
163
|
+
const installed = await execute(manager, installArguments(manager, managerVersion, hasCompletedBootstrapLock(project, manager)), processOptions);
|
|
164
|
+
if (!installed.ok)
|
|
165
|
+
return report({ stage: 'install', code: installed.code });
|
|
166
|
+
cli = installedBootstrapCli(project, version);
|
|
167
|
+
if (!cli || !hasCompletedBootstrapLock(project, manager))
|
|
168
|
+
return report({ stage: 'install', code: 'verification_failed' });
|
|
169
|
+
}
|
|
170
|
+
state = { ...state, dependencyFingerprint: bootstrapDependencyFingerprint(project) };
|
|
171
|
+
complete('install');
|
|
172
|
+
}
|
|
173
|
+
if (agents.length > 0) {
|
|
174
|
+
begin('context');
|
|
175
|
+
try {
|
|
176
|
+
agentReport = await (dependencies.setupContext ?? setupAgentsWithResolvedSkills)({ agents, project, write: true, force: options.force ?? false, json: true }, processOptions.env, dependencies.configLocation);
|
|
177
|
+
connectDocs();
|
|
178
|
+
if (!agentReport.ok || agentReport.files.some((file) => file.action === 'skipped'))
|
|
179
|
+
return report({ stage: 'context', code: 'context_invalid' });
|
|
180
|
+
if (cli) {
|
|
181
|
+
const verified = await execute(process.execPath, [
|
|
182
|
+
cli,
|
|
183
|
+
'agents',
|
|
184
|
+
'doctor',
|
|
185
|
+
'--project',
|
|
186
|
+
project,
|
|
187
|
+
'--agents',
|
|
188
|
+
agentSelection(agents),
|
|
189
|
+
'--json',
|
|
190
|
+
], processOptions);
|
|
191
|
+
if (!verified.ok)
|
|
192
|
+
return report({ stage: 'context', code: verified.code });
|
|
193
|
+
if (!bootstrapJsonSucceeded(verified.stdout))
|
|
194
|
+
return report({ stage: 'context', code: 'verification_failed' });
|
|
195
|
+
}
|
|
196
|
+
complete('context');
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return report({ stage: 'context', code: 'context_invalid' });
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (!cli)
|
|
203
|
+
return report();
|
|
204
|
+
for (const [stage, command, args] of [
|
|
205
|
+
['validate', process.execPath, [cli, 'validate', '--json']],
|
|
206
|
+
['behavior', manager, ['run', 'test']],
|
|
207
|
+
['types', manager, ['run', 'typecheck']],
|
|
208
|
+
]) {
|
|
209
|
+
begin(stage);
|
|
210
|
+
const checked = await execute(command, args, processOptions);
|
|
211
|
+
if (!checked.ok)
|
|
212
|
+
return report({ stage, code: checked.code });
|
|
213
|
+
if (stage === 'validate' && !bootstrapJsonSucceeded(checked.stdout))
|
|
214
|
+
return report({ stage, code: 'verification_failed' });
|
|
215
|
+
complete(stage);
|
|
216
|
+
}
|
|
217
|
+
if (options.launch === undefined &&
|
|
218
|
+
!previous &&
|
|
219
|
+
!manifest &&
|
|
220
|
+
dependencies.interactive &&
|
|
221
|
+
!isRunningCodingAgent(dependencies.env) &&
|
|
222
|
+
agents.length &&
|
|
223
|
+
dependencies.chooseAgent) {
|
|
224
|
+
launch = await dependencies.chooseAgent(agents, dependencies.env);
|
|
225
|
+
assertBootstrapLaunchAllowed(launch, agents, true, dependencies.env, true);
|
|
226
|
+
}
|
|
227
|
+
if (launch !== 'none') {
|
|
228
|
+
if (previous?.completed.includes('launch') && previous.launchedAgent === launch) {
|
|
229
|
+
state = { ...state, launchedAgent: launch };
|
|
230
|
+
complete('launch');
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
begin('launch');
|
|
234
|
+
const launched = await (dependencies.launchAgent ?? launchBootstrapAgent)(launch, project, dependencies.env);
|
|
235
|
+
if (!launched.ok)
|
|
236
|
+
return report({ stage: 'launch', code: launched.code });
|
|
237
|
+
state = { ...state, launchedAgent: launch };
|
|
238
|
+
complete('launch');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return report();
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=project-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-bootstrap.js","sourceRoot":"","sources":["../src/project-bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,5 +10,5 @@ export declare function title(value: string): string;
|
|
|
10
10
|
export declare function manifestName(value: string): string;
|
|
11
11
|
export declare function helloFiles(name: string, agentTargets: readonly ProjectAgentTarget[]): Record<string, string>;
|
|
12
12
|
export declare function httpApiFiles(name: string, agentTargets: readonly ProjectAgentTarget[]): Record<string, string>;
|
|
13
|
-
export declare function commonFiles(name: string, template: InitTemplate, agentTargets: readonly ProjectAgentTarget[], serverTs: string,
|
|
13
|
+
export declare function commonFiles(name: string, template: InitTemplate, agentTargets: readonly ProjectAgentTarget[], serverTs: string, extraDependencies: readonly string[]): Record<string, string>;
|
|
14
14
|
//# sourceMappingURL=project-scaffold-templates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-scaffold-templates.d.ts","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"project-scaffold-templates.d.ts","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAMrE,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3C;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AACD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,kBAAkB,EAAE,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BxB;AACD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,kBAAkB,EAAE,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoDxB;AACD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,SAAS,kBAAkB,EAAE,EAC3C,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,SAAS,MAAM,EAAE,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4IxB"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { SCAFFOLD_MODELS, scaffoldEnvironment } from './project-scaffold-model.js';
|
|
2
2
|
import { scaffoldBehaviorTest } from './project-scaffold-test-template.js';
|
|
3
|
+
import { projectDependencyPins } from './project-toolchain.js';
|
|
4
|
+
import { currentCliVersion } from './update.js';
|
|
3
5
|
export function title(value) {
|
|
4
6
|
return value
|
|
5
7
|
.split('-')
|
|
@@ -33,7 +35,7 @@ export default server('${serverName}', { title: '${title(name)}', version: '1.0.
|
|
|
33
35
|
},
|
|
34
36
|
}),
|
|
35
37
|
]);
|
|
36
|
-
`,
|
|
38
|
+
`, []);
|
|
37
39
|
}
|
|
38
40
|
export function httpApiFiles(name, agentTargets) {
|
|
39
41
|
const serverName = manifestName(name);
|
|
@@ -80,9 +82,9 @@ export default server('${serverName}', {
|
|
|
80
82
|
},
|
|
81
83
|
}),
|
|
82
84
|
]);
|
|
83
|
-
`,
|
|
85
|
+
`, []);
|
|
84
86
|
}
|
|
85
|
-
export function commonFiles(name, template, agentTargets, serverTs,
|
|
87
|
+
export function commonFiles(name, template, agentTargets, serverTs, extraDependencies) {
|
|
86
88
|
const model = SCAFFOLD_MODELS[template];
|
|
87
89
|
const agentCheck = 'vitest run --dir test && noodle validate --json && tsc --noEmit' +
|
|
88
90
|
(model.widget ? ' && noodle check --json' : '');
|
|
@@ -117,13 +119,13 @@ export function commonFiles(name, template, agentTargets, serverTs, extraDevDepe
|
|
|
117
119
|
...(agentCheckChatgpt ? { 'agent:check:chatgpt': agentCheckChatgpt } : {}),
|
|
118
120
|
'agent:commands': 'noodle commands --json',
|
|
119
121
|
},
|
|
120
|
-
devDependencies:
|
|
121
|
-
'@noodleseed/one'
|
|
122
|
-
vitest
|
|
123
|
-
typescript
|
|
124
|
-
'@types/node'
|
|
125
|
-
...
|
|
126
|
-
|
|
122
|
+
devDependencies: projectDependencyPins([
|
|
123
|
+
'@noodleseed/one',
|
|
124
|
+
'vitest',
|
|
125
|
+
'typescript',
|
|
126
|
+
'@types/node',
|
|
127
|
+
...extraDependencies,
|
|
128
|
+
]),
|
|
127
129
|
}, null, 2)}\n`,
|
|
128
130
|
'test/server.test.ts': scaffoldBehaviorTest(model),
|
|
129
131
|
'tsconfig.json': `${JSON.stringify({
|
|
@@ -150,6 +152,7 @@ export function commonFiles(name, template, agentTargets, serverTs, extraDevDepe
|
|
|
150
152
|
'.env.*',
|
|
151
153
|
'!.env.example',
|
|
152
154
|
'.noodle/',
|
|
155
|
+
'.yarn/',
|
|
153
156
|
'',
|
|
154
157
|
].join('\n'),
|
|
155
158
|
'README.md': `# ${title(name)}
|
|
@@ -157,10 +160,12 @@ export function commonFiles(name, template, agentTargets, serverTs, extraDevDepe
|
|
|
157
160
|
## Run locally (no account, no login)
|
|
158
161
|
|
|
159
162
|
\`\`\`sh
|
|
160
|
-
npm
|
|
161
|
-
npm test
|
|
163
|
+
npm run agent:check
|
|
162
164
|
\`\`\`
|
|
163
165
|
|
|
166
|
+
Init already installed pinned project-local tooling and ran these checks unless you selected \`--no-install\`.
|
|
167
|
+
For files-only or failed setup, rerun \`npx --yes @noodleseed/one@${currentCliVersion()} init .\`; modified files survive.
|
|
168
|
+
Use the selected package manager consistently (\`pnpm run\` / \`yarn run\` instead of \`npm run\`).
|
|
164
169
|
The generated tests compile the authored source, list tools, check a representative result and reject invalid
|
|
165
170
|
input. They copy source into temporary fixture storage, never copy customer credentials, and make no hosted
|
|
166
171
|
requests. Use your existing package manager consistently. A fixture pass is not a customer-integration pass.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-scaffold-templates.js","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"project-scaffold-templates.js","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type ProjectPackageManager = 'npm' | 'pnpm' | 'yarn';
|
|
2
|
+
export declare function projectDependencyPins(names: readonly string[]): Record<string, string>;
|
|
3
|
+
export declare function isProjectPackageManager(value: unknown): value is ProjectPackageManager;
|
|
4
|
+
export declare const PROJECT_LOCKFILES: Readonly<Record<string, ProjectPackageManager>>;
|
|
5
|
+
export declare function selectPackageManager(input: {
|
|
6
|
+
readonly requested?: ProjectPackageManager;
|
|
7
|
+
readonly packageManager?: string;
|
|
8
|
+
readonly lockfiles?: readonly string[];
|
|
9
|
+
readonly userAgent?: string;
|
|
10
|
+
}): ProjectPackageManager;
|
|
11
|
+
/** Installation stays local, retains existing locks and never runs dependency lifecycle scripts. */
|
|
12
|
+
export declare function installArguments(manager: ProjectPackageManager, version: string, locked: boolean): string[];
|
|
13
|
+
//# sourceMappingURL=project-toolchain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-toolchain.d.ts","sourceRoot":"","sources":["../src/project-toolchain.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAe5D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQtF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAEtF;AAED,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAK7E,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,qBAAqB,CAqBxB;AAED,oGAAoG;AACpG,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,MAAM,EAAE,CAoBV"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { currentCliVersion } from './update.js';
|
|
2
|
+
/** Versions qualified with the generated profiles. System Release supplies the CLI's own version. */
|
|
3
|
+
const TOOLCHAIN = {
|
|
4
|
+
vitest: '4.1.8',
|
|
5
|
+
typescript: '6.0.3',
|
|
6
|
+
vite: '8.1.0',
|
|
7
|
+
'@vitejs/plugin-react': '6.1.1',
|
|
8
|
+
'@types/node': '24.13.1',
|
|
9
|
+
react: '19.2.7',
|
|
10
|
+
'react-dom': '19.2.7',
|
|
11
|
+
'@types/react': '19.2.17',
|
|
12
|
+
'@types/react-dom': '19.2.3',
|
|
13
|
+
};
|
|
14
|
+
export function projectDependencyPins(names) {
|
|
15
|
+
return Object.fromEntries(names.map((name) => {
|
|
16
|
+
const version = name === '@noodleseed/one' ? currentCliVersion() : TOOLCHAIN[name];
|
|
17
|
+
if (!version)
|
|
18
|
+
throw new Error('Starter dependency has no qualified version.');
|
|
19
|
+
return [name, version];
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
export function isProjectPackageManager(value) {
|
|
23
|
+
return value === 'npm' || value === 'pnpm' || value === 'yarn';
|
|
24
|
+
}
|
|
25
|
+
export const PROJECT_LOCKFILES = {
|
|
26
|
+
'package-lock.json': 'npm',
|
|
27
|
+
'npm-shrinkwrap.json': 'npm',
|
|
28
|
+
'pnpm-lock.yaml': 'pnpm',
|
|
29
|
+
'yarn.lock': 'yarn',
|
|
30
|
+
};
|
|
31
|
+
export function selectPackageManager(input) {
|
|
32
|
+
const owners = new Set((input.lockfiles ?? [])
|
|
33
|
+
.map((name) => PROJECT_LOCKFILES[name])
|
|
34
|
+
.filter((owner) => owner !== undefined));
|
|
35
|
+
if (input.packageManager !== undefined) {
|
|
36
|
+
const declared = /^(npm|pnpm|yarn)@\d+\.\d+\.\d+(?:[-+][\w.+-]+)?$/.exec(input.packageManager)?.[1];
|
|
37
|
+
if (!isProjectPackageManager(declared))
|
|
38
|
+
throw new Error('unsupported package manager declaration');
|
|
39
|
+
owners.add(declared);
|
|
40
|
+
}
|
|
41
|
+
if (input.requested)
|
|
42
|
+
owners.add(input.requested);
|
|
43
|
+
if (owners.size > 1)
|
|
44
|
+
throw new Error('package-manager conflict: preserve the existing manager and lockfile');
|
|
45
|
+
const existing = [...owners][0];
|
|
46
|
+
if (existing)
|
|
47
|
+
return existing;
|
|
48
|
+
const invoking = input.userAgent?.split('/')[0];
|
|
49
|
+
return isProjectPackageManager(invoking) ? invoking : 'npm';
|
|
50
|
+
}
|
|
51
|
+
/** Installation stays local, retains existing locks and never runs dependency lifecycle scripts. */
|
|
52
|
+
export function installArguments(manager, version, locked) {
|
|
53
|
+
const major = Number(/^(\d+)\./.exec(version)?.[1]);
|
|
54
|
+
if (!Number.isSafeInteger(major) || major < 1)
|
|
55
|
+
throw new Error('Package manager version could not be verified.');
|
|
56
|
+
if (manager === 'npm')
|
|
57
|
+
return [
|
|
58
|
+
locked ? 'ci' : 'install',
|
|
59
|
+
'--ignore-scripts',
|
|
60
|
+
'--no-audit',
|
|
61
|
+
'--no-fund',
|
|
62
|
+
'--workspaces=false',
|
|
63
|
+
];
|
|
64
|
+
if (manager === 'pnpm')
|
|
65
|
+
return [
|
|
66
|
+
'install',
|
|
67
|
+
locked ? '--frozen-lockfile' : '--no-frozen-lockfile',
|
|
68
|
+
'--ignore-scripts',
|
|
69
|
+
'--ignore-workspace',
|
|
70
|
+
];
|
|
71
|
+
throw new Error('Yarn cannot install the CLI bundled runtime; preserve its existing lockfile.');
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=project-toolchain.js.map
|