feat: auto --init flag, headless prompts, and prompt sanitizer (#1417)
* fix: Created 10 headless prompt files (5 workflows + 5 agents) in sdk/p… - "sdk/prompts/workflows/execute-plan.md" - "sdk/prompts/workflows/research-phase.md" - "sdk/prompts/workflows/plan-phase.md" - "sdk/prompts/workflows/verify-phase.md" - "sdk/prompts/workflows/discuss-phase.md" - "sdk/prompts/agents/gsd-executor.md" - "sdk/prompts/agents/gsd-phase-researcher.md" - "sdk/prompts/agents/gsd-planner.md" GSD-Task: S01/T02 * feat: Created prompt-sanitizer.ts, wired headless prompt loading into P… - "sdk/src/prompt-sanitizer.ts" - "sdk/src/phase-prompt.ts" - "sdk/src/gsd-tools.ts" - "sdk/src/gsd-tools.test.ts" - "sdk/src/phase-runner-types.test.ts" GSD-Task: S01/T01 * test: Added 111 unit tests covering sanitizePrompt(), headless prompt l… - "sdk/src/prompt-sanitizer.test.ts" - "sdk/src/headless-prompts.test.ts" - "sdk/src/phase-prompt.test.ts" GSD-Task: S01/T03 * feat: Wired sdkPromptsDir preference and sanitizePrompt into InitRunner… - "sdk/src/init-runner.ts" - "sdk/package.json" GSD-Task: S02/T01 * feat: add --init flag to auto command for single-command PRD-to-execution gsd-sdk auto --init @path/to/prd.md now bootstraps the project (init) then immediately runs the autonomous phase execution loop. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: add remaining headless prompt files and templates Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: Extended init-runner.test.ts with 7 sdkPromptsDir preference and… - "sdk/src/init-runner.test.ts" GSD-Task: S02/T03 --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -67,9 +67,9 @@ const hasCopilot = args.includes('--copilot');
|
||||
const hasAntigravity = args.includes('--antigravity');
|
||||
const hasCursor = args.includes('--cursor');
|
||||
const hasWindsurf = args.includes('--windsurf');
|
||||
const hasSdk = args.includes('--sdk');
|
||||
const hasBoth = args.includes('--both'); // Legacy flag, keeps working
|
||||
const hasAll = args.includes('--all');
|
||||
const hasSdk = args.includes('--sdk');
|
||||
const hasUninstall = args.includes('--uninstall') || args.includes('-u');
|
||||
|
||||
// Runtime selection - can be set by flags or interactive prompt
|
||||
@@ -4695,11 +4695,12 @@ function handleStatusline(settings, isInteractive, callback) {
|
||||
* @returns {boolean} true if install succeeded
|
||||
*/
|
||||
function installSdk() {
|
||||
const sdkPkg = '@gsd-build/sdk@latest';
|
||||
const sdkVersion = pkg.version;
|
||||
const sdkPkg = `@gsd-build/sdk@${sdkVersion}`;
|
||||
console.log(`\n ${cyan}Installing GSD SDK...${reset}`);
|
||||
console.log(` ${dim}npm install -g ${sdkPkg}${reset}\n`);
|
||||
try {
|
||||
require('child_process').execSync(`npm install -g --force --no-fund --loglevel=error ${sdkPkg}`, { stdio: 'pipe' });
|
||||
require('child_process').execSync(`npm install -g ${sdkPkg}`, { stdio: 'inherit' });
|
||||
console.log(`\n ${green}✓${reset} GSD SDK installed (${cyan}gsd-sdk${reset} command available)`);
|
||||
return true;
|
||||
} catch (e) {
|
||||
@@ -4883,39 +4884,39 @@ function installAllRuntimes(runtimes, isGlobal, isInteractive) {
|
||||
const primaryStatuslineResult = results.find(r => statuslineRuntimes.includes(r.runtime));
|
||||
|
||||
const finalize = (shouldInstallStatusline) => {
|
||||
for (const result of results) {
|
||||
const useStatusline = statuslineRuntimes.includes(result.runtime) && shouldInstallStatusline;
|
||||
finishInstall(
|
||||
result.settingsPath,
|
||||
result.settings,
|
||||
result.statuslineCommand,
|
||||
useStatusline,
|
||||
result.runtime,
|
||||
isGlobal
|
||||
);
|
||||
}
|
||||
};
|
||||
// Handle SDK installation before printing final summaries
|
||||
const printSummaries = () => {
|
||||
for (const result of results) {
|
||||
const useStatusline = statuslineRuntimes.includes(result.runtime) && shouldInstallStatusline;
|
||||
finishInstall(
|
||||
result.settingsPath,
|
||||
result.settings,
|
||||
result.statuslineCommand,
|
||||
useStatusline,
|
||||
result.runtime,
|
||||
isGlobal
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const afterFinalize = () => {
|
||||
if (hasSdk) {
|
||||
// --sdk flag: install without prompting
|
||||
installSdk();
|
||||
printSummaries();
|
||||
} else if (isInteractive) {
|
||||
promptSdk((wantsSdk) => {
|
||||
if (wantsSdk) installSdk();
|
||||
printSummaries();
|
||||
});
|
||||
} else {
|
||||
printSummaries();
|
||||
}
|
||||
};
|
||||
|
||||
const finalizeAndSdk = (shouldInstallStatusline) => {
|
||||
finalize(shouldInstallStatusline);
|
||||
afterFinalize();
|
||||
};
|
||||
|
||||
if (primaryStatuslineResult) {
|
||||
handleStatusline(primaryStatuslineResult.settings, isInteractive, finalizeAndSdk);
|
||||
handleStatusline(primaryStatuslineResult.settings, isInteractive, finalize);
|
||||
} else {
|
||||
finalizeAndSdk(false);
|
||||
finalize(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user