ai-sdlc 0.3.1-alpha.2-alpha.1 → 0.3.1-alpha.2-alpha.2
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/dist/agents/verification.d.ts +23 -3
- package/dist/agents/verification.d.ts.map +1 -1
- package/dist/agents/verification.js +93 -11
- package/dist/agents/verification.js.map +1 -1
- package/dist/cli/commands.d.ts +8 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +67 -2
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/formatting.d.ts +15 -0
- package/dist/cli/formatting.d.ts.map +1 -1
- package/dist/cli/formatting.js +34 -0
- package/dist/cli/formatting.js.map +1 -1
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +6 -4
- package/dist/cli/runner.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +92 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/stack-detector.d.ts +28 -0
- package/dist/core/stack-detector.d.ts.map +1 -0
- package/dist/core/stack-detector.js +395 -0
- package/dist/core/stack-detector.js.map +1 -0
- package/dist/core/story-logger.d.ts +51 -1
- package/dist/core/story-logger.d.ts.map +1 -1
- package/dist/core/story-logger.js +69 -3
- package/dist/core/story-logger.js.map +1 -1
- package/dist/core/story.d.ts.map +1 -1
- package/dist/core/story.js +8 -4
- package/dist/core/story.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/services/gh-cli.d.ts +81 -0
- package/dist/services/gh-cli.d.ts.map +1 -1
- package/dist/services/gh-cli.js +257 -0
- package/dist/services/gh-cli.js.map +1 -1
- package/dist/services/ticket-provider/github-provider.d.ts +27 -12
- package/dist/services/ticket-provider/github-provider.d.ts.map +1 -1
- package/dist/services/ticket-provider/github-provider.js +51 -17
- package/dist/services/ticket-provider/github-provider.js.map +1 -1
- package/dist/types/index.d.ts +36 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Story } from '../types/index.js';
|
|
1
|
+
import { Story, ProjectConfig } from '../types/index.js';
|
|
2
2
|
export interface VerificationResult {
|
|
3
3
|
passed: boolean;
|
|
4
4
|
failures: number;
|
|
@@ -18,13 +18,33 @@ export interface VerificationOptions {
|
|
|
18
18
|
requirePassingTests?: boolean;
|
|
19
19
|
skipDependencyCheck?: boolean;
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Resolves the effective project directory for dependency installation.
|
|
23
|
+
* If a project config specifies a subdirectory, use that; otherwise use workingDir.
|
|
24
|
+
*
|
|
25
|
+
* @param workingDir - The base working directory
|
|
26
|
+
* @param project - Optional project configuration with path
|
|
27
|
+
* @returns The resolved directory for running commands
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveProjectDir(workingDir: string, project?: ProjectConfig): string;
|
|
30
|
+
/**
|
|
31
|
+
* Finds the first project with a detectable stack in the working directory.
|
|
32
|
+
* Checks config first, then falls back to auto-detection.
|
|
33
|
+
*
|
|
34
|
+
* @param workingDir - The working directory to search
|
|
35
|
+
* @returns The primary project config, or undefined if none found
|
|
36
|
+
*/
|
|
37
|
+
export declare function findPrimaryProject(workingDir: string): ProjectConfig | undefined;
|
|
21
38
|
/**
|
|
22
39
|
* Ensures dependencies are installed before running tests/build.
|
|
23
40
|
* Checks if node_modules exists and has packages. If not, runs the appropriate install command.
|
|
24
|
-
*
|
|
41
|
+
* Now supports subdirectory projects and non-Node.js stacks.
|
|
42
|
+
*
|
|
43
|
+
* @param workingDir - The base working directory
|
|
44
|
+
* @param project - Optional project configuration (if not provided, will auto-detect)
|
|
25
45
|
* @returns Result indicating if install was needed and any error that occurred
|
|
26
46
|
*/
|
|
27
|
-
export declare function ensureDependenciesInstalled(workingDir: string): {
|
|
47
|
+
export declare function ensureDependenciesInstalled(workingDir: string, project?: ProjectConfig): {
|
|
28
48
|
installed: boolean;
|
|
29
49
|
error?: string;
|
|
30
50
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/agents/verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/agents/verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQzD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClG,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClG,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAYD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAKrF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAoBhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,aAAa,GACtB;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA8DxC;AAuGD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAyF7B"}
|
|
@@ -3,6 +3,7 @@ import { spawn, spawnSync } from 'child_process';
|
|
|
3
3
|
import { ProcessManager } from '../core/process-manager.js';
|
|
4
4
|
import { existsSync, readdirSync } from 'fs';
|
|
5
5
|
import path from 'path';
|
|
6
|
+
import { detectProjects, getPrimaryProject } from '../core/stack-detector.js';
|
|
6
7
|
/**
|
|
7
8
|
* Lock file to package manager mapping
|
|
8
9
|
*/
|
|
@@ -10,20 +11,75 @@ const LOCK_FILE_TO_PM = {
|
|
|
10
11
|
'package-lock.json': 'npm',
|
|
11
12
|
'yarn.lock': 'yarn',
|
|
12
13
|
'pnpm-lock.yaml': 'pnpm',
|
|
14
|
+
'bun.lockb': 'bun',
|
|
13
15
|
};
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the effective project directory for dependency installation.
|
|
18
|
+
* If a project config specifies a subdirectory, use that; otherwise use workingDir.
|
|
19
|
+
*
|
|
20
|
+
* @param workingDir - The base working directory
|
|
21
|
+
* @param project - Optional project configuration with path
|
|
22
|
+
* @returns The resolved directory for running commands
|
|
23
|
+
*/
|
|
24
|
+
export function resolveProjectDir(workingDir, project) {
|
|
25
|
+
if (!project || project.path === '.') {
|
|
26
|
+
return workingDir;
|
|
27
|
+
}
|
|
28
|
+
return path.join(workingDir, project.path);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Finds the first project with a detectable stack in the working directory.
|
|
32
|
+
* Checks config first, then falls back to auto-detection.
|
|
33
|
+
*
|
|
34
|
+
* @param workingDir - The working directory to search
|
|
35
|
+
* @returns The primary project config, or undefined if none found
|
|
36
|
+
*/
|
|
37
|
+
export function findPrimaryProject(workingDir) {
|
|
38
|
+
try {
|
|
39
|
+
const config = loadConfig(workingDir);
|
|
40
|
+
// First check if projects are configured
|
|
41
|
+
if (config?.projects && config.projects.length > 0) {
|
|
42
|
+
return getPrimaryProject(config.projects);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Config loading failed, fall through to auto-detection
|
|
47
|
+
}
|
|
48
|
+
// Fall back to auto-detection
|
|
49
|
+
try {
|
|
50
|
+
const detected = detectProjects(workingDir);
|
|
51
|
+
return getPrimaryProject(detected);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Detection failed, return undefined
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
14
58
|
/**
|
|
15
59
|
* Ensures dependencies are installed before running tests/build.
|
|
16
60
|
* Checks if node_modules exists and has packages. If not, runs the appropriate install command.
|
|
17
|
-
*
|
|
61
|
+
* Now supports subdirectory projects and non-Node.js stacks.
|
|
62
|
+
*
|
|
63
|
+
* @param workingDir - The base working directory
|
|
64
|
+
* @param project - Optional project configuration (if not provided, will auto-detect)
|
|
18
65
|
* @returns Result indicating if install was needed and any error that occurred
|
|
19
66
|
*/
|
|
20
|
-
export function ensureDependenciesInstalled(workingDir) {
|
|
21
|
-
|
|
67
|
+
export function ensureDependenciesInstalled(workingDir, project) {
|
|
68
|
+
// Resolve the actual project directory
|
|
69
|
+
const projectDir = resolveProjectDir(workingDir, project);
|
|
70
|
+
// If no project provided, try to find one
|
|
71
|
+
const effectiveProject = project ?? findPrimaryProject(workingDir);
|
|
72
|
+
// If we have a configured install command from project, use it
|
|
73
|
+
if (effectiveProject?.commands.install) {
|
|
74
|
+
return runInstallCommand(effectiveProject.commands.install, projectDir);
|
|
75
|
+
}
|
|
76
|
+
// Fall back to Node.js detection for backward compatibility
|
|
77
|
+
const packageJsonPath = path.join(projectDir, 'package.json');
|
|
22
78
|
// Skip if not a Node.js project
|
|
23
79
|
if (!existsSync(packageJsonPath)) {
|
|
24
80
|
return { installed: false };
|
|
25
81
|
}
|
|
26
|
-
const nodeModulesPath = path.join(
|
|
82
|
+
const nodeModulesPath = path.join(projectDir, 'node_modules');
|
|
27
83
|
// Check if node_modules exists and has contents
|
|
28
84
|
let hasNodeModules = false;
|
|
29
85
|
if (existsSync(nodeModulesPath)) {
|
|
@@ -42,14 +98,34 @@ export function ensureDependenciesInstalled(workingDir) {
|
|
|
42
98
|
// Detect package manager from lock file
|
|
43
99
|
let packageManager = 'npm';
|
|
44
100
|
for (const [lockFile, pm] of Object.entries(LOCK_FILE_TO_PM)) {
|
|
45
|
-
if (existsSync(path.join(
|
|
101
|
+
if (existsSync(path.join(projectDir, lockFile))) {
|
|
46
102
|
packageManager = pm;
|
|
47
103
|
break;
|
|
48
104
|
}
|
|
49
105
|
}
|
|
50
106
|
// Run install command
|
|
51
107
|
const result = spawnSync(packageManager, ['install'], {
|
|
52
|
-
cwd:
|
|
108
|
+
cwd: projectDir,
|
|
109
|
+
encoding: 'utf-8',
|
|
110
|
+
shell: false,
|
|
111
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
112
|
+
timeout: 120000, // 2 minute timeout
|
|
113
|
+
});
|
|
114
|
+
if (result.status !== 0) {
|
|
115
|
+
const stderr = result.stderr?.toString() || '';
|
|
116
|
+
return { installed: false, error: `Failed to install dependencies: ${stderr}` };
|
|
117
|
+
}
|
|
118
|
+
return { installed: true };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Runs a custom install command in the specified directory.
|
|
122
|
+
*/
|
|
123
|
+
function runInstallCommand(command, cwd) {
|
|
124
|
+
const parts = command.match(/(?:[^\s"]+|"[^"]*")+/g) || [command];
|
|
125
|
+
const executable = parts[0];
|
|
126
|
+
const args = parts.slice(1).map(arg => arg.replace(/^"|"$/g, ''));
|
|
127
|
+
const result = spawnSync(executable, args, {
|
|
128
|
+
cwd,
|
|
53
129
|
encoding: 'utf-8',
|
|
54
130
|
shell: false,
|
|
55
131
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -128,6 +204,9 @@ export async function verifyImplementation(story, workingDir, options = {}) {
|
|
|
128
204
|
const testTimeout = config.timeouts?.testTimeout || 300000;
|
|
129
205
|
const buildTimeout = config.timeouts?.buildTimeout || 120000;
|
|
130
206
|
const requirePassingTests = options.requirePassingTests ?? config.tdd?.requirePassingTestsForComplete ?? true;
|
|
207
|
+
// Resolve project directory for subdirectory projects
|
|
208
|
+
const primaryProject = findPrimaryProject(workingDir);
|
|
209
|
+
const projectDir = resolveProjectDir(workingDir, primaryProject);
|
|
131
210
|
const timestamp = new Date().toISOString();
|
|
132
211
|
let testsPassed = true;
|
|
133
212
|
let testsOutput = '';
|
|
@@ -137,7 +216,7 @@ export async function verifyImplementation(story, workingDir, options = {}) {
|
|
|
137
216
|
let buildRan = false;
|
|
138
217
|
// Ensure dependencies are installed before running tests/build
|
|
139
218
|
if (!options.skipDependencyCheck) {
|
|
140
|
-
const depResult = ensureDependenciesInstalled(workingDir);
|
|
219
|
+
const depResult = ensureDependenciesInstalled(workingDir, primaryProject);
|
|
141
220
|
if (depResult.error) {
|
|
142
221
|
return {
|
|
143
222
|
passed: false,
|
|
@@ -148,16 +227,19 @@ export async function verifyImplementation(story, workingDir, options = {}) {
|
|
|
148
227
|
};
|
|
149
228
|
}
|
|
150
229
|
}
|
|
230
|
+
// Determine the correct directory for running commands
|
|
231
|
+
// For subdirectory projects, commands should run in the project directory
|
|
232
|
+
const commandDir = projectDir;
|
|
151
233
|
// Run build first - tests require successful compilation
|
|
152
234
|
if (options.runBuild) {
|
|
153
235
|
buildRan = true;
|
|
154
|
-
const buildResult = await options.runBuild(
|
|
236
|
+
const buildResult = await options.runBuild(commandDir, buildTimeout);
|
|
155
237
|
buildPassed = buildResult.success;
|
|
156
238
|
buildOutput = buildResult.output;
|
|
157
239
|
}
|
|
158
240
|
else if (config.buildCommand) {
|
|
159
241
|
buildRan = true;
|
|
160
|
-
const buildResult = await runCommandAsync(config.buildCommand,
|
|
242
|
+
const buildResult = await runCommandAsync(config.buildCommand, commandDir, buildTimeout);
|
|
161
243
|
buildPassed = buildResult.success;
|
|
162
244
|
buildOutput = buildResult.output;
|
|
163
245
|
}
|
|
@@ -174,13 +256,13 @@ export async function verifyImplementation(story, workingDir, options = {}) {
|
|
|
174
256
|
// Run tests only after successful build (or when no build command exists)
|
|
175
257
|
if (options.runTests) {
|
|
176
258
|
testsRan = true;
|
|
177
|
-
const testResult = await options.runTests(
|
|
259
|
+
const testResult = await options.runTests(commandDir, testTimeout);
|
|
178
260
|
testsPassed = testResult.success;
|
|
179
261
|
testsOutput = testResult.output;
|
|
180
262
|
}
|
|
181
263
|
else if (config.testCommand) {
|
|
182
264
|
testsRan = true;
|
|
183
|
-
const testResult = await runCommandAsync(config.testCommand,
|
|
265
|
+
const testResult = await runCommandAsync(config.testCommand, commandDir, testTimeout);
|
|
184
266
|
testsPassed = testResult.success;
|
|
185
267
|
testsOutput = testResult.output;
|
|
186
268
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/agents/verification.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/agents/verification.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands.d.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { Story, ActionType, PreFlightResult } from '../types/index.js';
|
|
2
2
|
import { importIssue } from './commands/import-issue.js';
|
|
3
3
|
import { linkIssue } from './commands/link-issue.js';
|
|
4
|
+
/**
|
|
5
|
+
* Options for the init command
|
|
6
|
+
*/
|
|
7
|
+
export interface InitOptions {
|
|
8
|
+
/** Skip project detection for faster initialization */
|
|
9
|
+
quick?: boolean;
|
|
10
|
+
}
|
|
4
11
|
/**
|
|
5
12
|
* Initialize the .ai-sdlc folder structure
|
|
6
13
|
*/
|
|
7
|
-
export declare function init(): Promise<void>;
|
|
14
|
+
export declare function init(options?: InitOptions): Promise<void>;
|
|
8
15
|
/**
|
|
9
16
|
* Show current board state
|
|
10
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -3,7 +3,8 @@ import fs from 'fs';
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import * as readline from 'readline';
|
|
5
5
|
import { spawnSync } from 'child_process';
|
|
6
|
-
import { getSdlcRoot, loadConfig, initConfig, validateWorktreeBasePath, DEFAULT_WORKTREE_CONFIG } from '../core/config.js';
|
|
6
|
+
import { getSdlcRoot, loadConfig, initConfig, validateWorktreeBasePath, DEFAULT_WORKTREE_CONFIG, saveConfig } from '../core/config.js';
|
|
7
|
+
import { detectProjects, formatDetectedProjects, getPrimaryProject } from '../core/stack-detector.js';
|
|
7
8
|
import { initializeKanban, kanbanExists, assessState, getBoardStats, findStoryBySlug, findStoriesByStatus } from '../core/kanban.js';
|
|
8
9
|
import { createStory, parseStory, resetRPIVCycle, isAtMaxRetries, unblockStory, getStory, findStoryById, updateStoryField, writeStory, sanitizeStoryId, autoCompleteStoryAfterReview, incrementImplementationRetryCount, resetImplementationRetryCount, getEffectiveMaxImplementationRetries, isAtMaxImplementationRetries, updateStoryStatus } from '../core/story.js';
|
|
9
10
|
import { GitWorktreeService, getLastCompletedPhase, getNextPhase } from '../core/worktree.js';
|
|
@@ -31,11 +32,12 @@ const DIVERGENCE_WARNING_THRESHOLD = 10;
|
|
|
31
32
|
/**
|
|
32
33
|
* Initialize the .ai-sdlc folder structure
|
|
33
34
|
*/
|
|
34
|
-
export async function init() {
|
|
35
|
+
export async function init(options = {}) {
|
|
35
36
|
const spinner = ora('Initializing ai-sdlc...').start();
|
|
36
37
|
try {
|
|
37
38
|
const config = initConfig();
|
|
38
39
|
const sdlcRoot = getSdlcRoot();
|
|
40
|
+
const workingDir = process.cwd();
|
|
39
41
|
const c = getThemedChalk(config);
|
|
40
42
|
if (kanbanExists(sdlcRoot)) {
|
|
41
43
|
spinner.info('ai-sdlc already initialized');
|
|
@@ -45,6 +47,69 @@ export async function init() {
|
|
|
45
47
|
spinner.succeed(c.success('Initialized .ai-sdlc/'));
|
|
46
48
|
console.log(c.dim(' └── stories/'));
|
|
47
49
|
console.log();
|
|
50
|
+
// Skip detection if --quick flag is set
|
|
51
|
+
if (options.quick) {
|
|
52
|
+
console.log(c.info('Get started:'));
|
|
53
|
+
console.log(c.dim(` ai-sdlc add "Your first story"`));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Detect project structure
|
|
57
|
+
spinner.start('Detecting project structure...');
|
|
58
|
+
const detectedProjects = detectProjects(workingDir);
|
|
59
|
+
if (detectedProjects.length === 0) {
|
|
60
|
+
spinner.info('No recognizable project structure detected');
|
|
61
|
+
console.log(c.dim(' You can manually configure testCommand and buildCommand in .ai-sdlc.json'));
|
|
62
|
+
console.log();
|
|
63
|
+
console.log(c.info('Get started:'));
|
|
64
|
+
console.log(c.dim(` ai-sdlc add "Your first story"`));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
spinner.succeed('Project structure detected');
|
|
68
|
+
console.log();
|
|
69
|
+
console.log(formatDetectedProjects(detectedProjects));
|
|
70
|
+
console.log();
|
|
71
|
+
// Prompt for confirmation
|
|
72
|
+
const rl = readline.createInterface({
|
|
73
|
+
input: process.stdin,
|
|
74
|
+
output: process.stdout,
|
|
75
|
+
});
|
|
76
|
+
const answer = await new Promise((resolve) => {
|
|
77
|
+
rl.question(c.info('Configure commands for these projects? [Y/n] '), (ans) => {
|
|
78
|
+
rl.close();
|
|
79
|
+
resolve(ans.trim().toLowerCase());
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
if (answer === 'n' || answer === 'no') {
|
|
83
|
+
console.log(c.dim(' Skipping project configuration'));
|
|
84
|
+
console.log();
|
|
85
|
+
console.log(c.info('Get started:'));
|
|
86
|
+
console.log(c.dim(` ai-sdlc add "Your first story"`));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Update config with detected projects
|
|
90
|
+
const updatedConfig = { ...config };
|
|
91
|
+
// For single project at root, set top-level commands
|
|
92
|
+
const primaryProject = getPrimaryProject(detectedProjects);
|
|
93
|
+
if (primaryProject && primaryProject.path === '.') {
|
|
94
|
+
updatedConfig.testCommand = primaryProject.commands.test;
|
|
95
|
+
updatedConfig.buildCommand = primaryProject.commands.build;
|
|
96
|
+
updatedConfig.installCommand = primaryProject.commands.install;
|
|
97
|
+
updatedConfig.startCommand = primaryProject.commands.start;
|
|
98
|
+
}
|
|
99
|
+
// If there are subdirectory projects or multiple projects, save them
|
|
100
|
+
if (detectedProjects.length > 1 || (primaryProject && primaryProject.path !== '.')) {
|
|
101
|
+
updatedConfig.projects = detectedProjects;
|
|
102
|
+
// For subdirectory projects, also set root-level commands from primary
|
|
103
|
+
if (primaryProject) {
|
|
104
|
+
updatedConfig.testCommand = primaryProject.commands.test;
|
|
105
|
+
updatedConfig.buildCommand = primaryProject.commands.build;
|
|
106
|
+
updatedConfig.installCommand = primaryProject.commands.install;
|
|
107
|
+
updatedConfig.startCommand = primaryProject.commands.start;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
saveConfig(updatedConfig, workingDir);
|
|
111
|
+
console.log(c.success('✓ Configuration saved to .ai-sdlc.json'));
|
|
112
|
+
console.log();
|
|
48
113
|
console.log(c.info('Get started:'));
|
|
49
114
|
console.log(c.dim(` ai-sdlc add "Your first story"`));
|
|
50
115
|
}
|