@noodleseed/one 0.156.0 → 0.158.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 +68 -43
- 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/assistant-gateway/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/service/package.json +1 -1
- package/node_modules/@noodleseed/assistant/package.json +1 -1
- package/package.json +2 -2
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-toolchain.js","sourceRoot":"","sources":["../src/project-toolchain.ts"],"names":[],"mappings":"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"}
|
package/dist/project.d.ts
CHANGED
|
@@ -89,6 +89,8 @@ export declare function writeProjectDeployment(deployment: ProjectDeployment, cw
|
|
|
89
89
|
* re-run `noodle init` to assert a baseline without clobbering edits.
|
|
90
90
|
*/
|
|
91
91
|
export declare function initProject(options?: InitProjectOptions): InitProjectResult;
|
|
92
|
+
/** One customer-file reconcile path for built-in starters and generated imports. */
|
|
93
|
+
export declare function writeProjectScaffold(options: Pick<InitProjectOptions, 'dir' | 'force' | 'dryRun'>, files: Readonly<Record<string, string>>): InitProjectResult;
|
|
92
94
|
export declare function resolveLinkedEntrypoint(cwd?: string): string | undefined;
|
|
93
95
|
/**
|
|
94
96
|
* The entrypoint a local author-loop command (`dev`, `validate`, `test`, `tools`/`resources`/`prompts`)
|
package/dist/project.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
package/dist/project.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from 'node:fs';
|
|
1
|
+
import { chmodSync, closeSync, constants, existsSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, statSync, writeFileSync, } from 'node:fs';
|
|
2
2
|
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
3
3
|
import { ACCESS_MODES } from '@noodle-borg/wire-contracts';
|
|
4
4
|
import { DEFAULT_SERVICE_URL, slug } from './deploy.js';
|
|
@@ -152,6 +152,18 @@ export function initProject(options = {}) {
|
|
|
152
152
|
const name = slug(options.name ?? basename(dir) ?? 'noodle-app');
|
|
153
153
|
if (!isTemplate(template))
|
|
154
154
|
throw new Error('init: --template must be saas, hello, http-api, or widget');
|
|
155
|
+
const files = template === 'saas'
|
|
156
|
+
? widgetFiles(name, options.agentTargets ?? ['codex', 'claude-code'], 'saas')
|
|
157
|
+
: template === 'hello'
|
|
158
|
+
? helloFiles(name, options.agentTargets ?? ['codex', 'claude-code'])
|
|
159
|
+
: template === 'http-api'
|
|
160
|
+
? httpApiFiles(name, options.agentTargets ?? ['codex', 'claude-code'])
|
|
161
|
+
: widgetFiles(name, options.agentTargets ?? ['codex', 'claude-code']);
|
|
162
|
+
return writeProjectScaffold(options, files);
|
|
163
|
+
}
|
|
164
|
+
/** One customer-file reconcile path for built-in starters and generated imports. */
|
|
165
|
+
export function writeProjectScaffold(options, files) {
|
|
166
|
+
const dir = resolve(options.dir ?? '.');
|
|
155
167
|
if (existsSync(dir)) {
|
|
156
168
|
if (!statSync(dir).isDirectory())
|
|
157
169
|
throw new Error('init: target path is not a directory');
|
|
@@ -162,25 +174,44 @@ export function initProject(options = {}) {
|
|
|
162
174
|
throw new Error('init: target directory is not empty; pass --force to add Noodle files anyway');
|
|
163
175
|
}
|
|
164
176
|
}
|
|
165
|
-
const files = template === 'saas'
|
|
166
|
-
? widgetFiles(name, options.agentTargets ?? ['codex', 'claude-code'], 'saas')
|
|
167
|
-
: template === 'hello'
|
|
168
|
-
? helloFiles(name, options.agentTargets ?? ['codex', 'claude-code'])
|
|
169
|
-
: template === 'http-api'
|
|
170
|
-
? httpApiFiles(name, options.agentTargets ?? ['codex', 'claude-code'])
|
|
171
|
-
: widgetFiles(name, options.agentTargets ?? ['codex', 'claude-code']);
|
|
172
177
|
const results = [];
|
|
178
|
+
// Check the whole write set before changing anything. A customer symlink is not permission to
|
|
179
|
+
// read or overwrite its destination, including when an explicit --force applies to this project.
|
|
180
|
+
for (const path of Object.keys(files))
|
|
181
|
+
assertScaffoldPath(dir, path);
|
|
173
182
|
for (const [path, content] of Object.entries(files)) {
|
|
174
183
|
const full = join(dir, path);
|
|
175
184
|
const action = reconcileFileAction(full, content, options.force === true);
|
|
176
185
|
if (!options.dryRun && (action === 'created' || action === 'overwritten')) {
|
|
177
186
|
mkdirSync(dirname(full), { recursive: true });
|
|
178
|
-
|
|
187
|
+
const descriptor = openSync(full, constants.O_WRONLY |
|
|
188
|
+
constants.O_NOFOLLOW |
|
|
189
|
+
(action === 'created' ? constants.O_CREAT | constants.O_EXCL : constants.O_TRUNC));
|
|
190
|
+
try {
|
|
191
|
+
writeFileSync(descriptor, content);
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
closeSync(descriptor);
|
|
195
|
+
}
|
|
179
196
|
}
|
|
180
197
|
results.push({ path, action });
|
|
181
198
|
}
|
|
182
199
|
return { dir, files: results };
|
|
183
200
|
}
|
|
201
|
+
function assertScaffoldPath(project, path) {
|
|
202
|
+
let current = project;
|
|
203
|
+
for (const part of path.split('/')) {
|
|
204
|
+
current = join(current, part);
|
|
205
|
+
try {
|
|
206
|
+
if (lstatSync(current).isSymbolicLink())
|
|
207
|
+
throw new Error('init: scaffold paths must not traverse a symbolic link; preserve the link and choose a separate project directory.');
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
if (error.code !== 'ENOENT')
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
184
215
|
/**
|
|
185
216
|
* A directory is an existing Noodle project if it has a `.noodle/` dir, a conventional entrypoint, or a
|
|
186
217
|
* `package.json` that references `@noodleseed/one` (so a reconcile still recognizes the project even if the
|