ai-sdlc 0.2.0-alpha.5 → 0.2.0-alpha.50
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 +53 -1058
- package/dist/agents/implementation.d.ts +6 -0
- package/dist/agents/implementation.d.ts.map +1 -1
- package/dist/agents/implementation.js +151 -13
- package/dist/agents/implementation.js.map +1 -1
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +61 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +443 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/planning.d.ts +1 -1
- package/dist/agents/planning.d.ts.map +1 -1
- package/dist/agents/planning.js +55 -4
- package/dist/agents/planning.js.map +1 -1
- package/dist/agents/refinement.d.ts.map +1 -1
- package/dist/agents/refinement.js +22 -3
- package/dist/agents/refinement.js.map +1 -1
- package/dist/agents/research.d.ts +85 -1
- package/dist/agents/research.d.ts.map +1 -1
- package/dist/agents/research.js +506 -16
- package/dist/agents/research.js.map +1 -1
- package/dist/agents/review.d.ts +77 -2
- package/dist/agents/review.d.ts.map +1 -1
- package/dist/agents/review.js +615 -93
- package/dist/agents/review.js.map +1 -1
- package/dist/agents/rework.d.ts.map +1 -1
- package/dist/agents/rework.js +22 -3
- package/dist/agents/rework.js.map +1 -1
- package/dist/agents/single-task.d.ts +41 -0
- package/dist/agents/single-task.d.ts.map +1 -0
- package/dist/agents/single-task.js +357 -0
- package/dist/agents/single-task.js.map +1 -0
- package/dist/agents/state-assessor.d.ts +3 -3
- package/dist/agents/state-assessor.d.ts.map +1 -1
- package/dist/agents/state-assessor.js +6 -6
- package/dist/agents/state-assessor.js.map +1 -1
- package/dist/agents/test-pattern-detector.d.ts +49 -0
- package/dist/agents/test-pattern-detector.d.ts.map +1 -0
- package/dist/agents/test-pattern-detector.js +273 -0
- package/dist/agents/test-pattern-detector.js.map +1 -0
- package/dist/agents/verification.d.ts +11 -0
- package/dist/agents/verification.d.ts.map +1 -1
- package/dist/agents/verification.js +97 -12
- package/dist/agents/verification.js.map +1 -1
- package/dist/cli/commands/migrate.js +1 -1
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands.d.ts +65 -3
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +1108 -204
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +20 -3
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +19 -11
- package/dist/cli/runner.js.map +1 -1
- package/dist/core/auth.d.ts +43 -0
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +105 -1
- package/dist/core/auth.js.map +1 -1
- package/dist/core/client.d.ts +6 -0
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +57 -3
- package/dist/core/client.js.map +1 -1
- package/dist/core/config.d.ts +24 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +100 -3
- package/dist/core/config.js.map +1 -1
- package/dist/core/conflict-detector.d.ts +108 -0
- package/dist/core/conflict-detector.d.ts.map +1 -0
- package/dist/core/conflict-detector.js +413 -0
- package/dist/core/conflict-detector.js.map +1 -0
- package/dist/core/git-utils.d.ts +28 -0
- package/dist/core/git-utils.d.ts.map +1 -0
- package/dist/core/git-utils.js +146 -0
- package/dist/core/git-utils.js.map +1 -0
- package/dist/core/index.d.ts +19 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +19 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/kanban.d.ts +1 -1
- package/dist/core/kanban.d.ts.map +1 -1
- package/dist/core/kanban.js +7 -6
- package/dist/core/kanban.js.map +1 -1
- package/dist/core/llm-utils.d.ts +103 -0
- package/dist/core/llm-utils.d.ts.map +1 -0
- package/dist/core/llm-utils.js +368 -0
- package/dist/core/llm-utils.js.map +1 -0
- package/dist/core/logger.d.ts +92 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +221 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/story-logger.d.ts +102 -0
- package/dist/core/story-logger.d.ts.map +1 -0
- package/dist/core/story-logger.js +265 -0
- package/dist/core/story-logger.js.map +1 -0
- package/dist/core/story.d.ts +89 -20
- package/dist/core/story.d.ts.map +1 -1
- package/dist/core/story.js +297 -52
- package/dist/core/story.js.map +1 -1
- package/dist/core/task-parser.d.ts +59 -0
- package/dist/core/task-parser.d.ts.map +1 -0
- package/dist/core/task-parser.js +235 -0
- package/dist/core/task-parser.js.map +1 -0
- package/dist/core/task-progress.d.ts +92 -0
- package/dist/core/task-progress.d.ts.map +1 -0
- package/dist/core/task-progress.js +280 -0
- package/dist/core/task-progress.js.map +1 -0
- package/dist/core/workflow-state.d.ts +45 -6
- package/dist/core/workflow-state.d.ts.map +1 -1
- package/dist/core/workflow-state.js +201 -12
- package/dist/core/workflow-state.js.map +1 -1
- package/dist/core/worktree.d.ts +77 -0
- package/dist/core/worktree.d.ts.map +1 -0
- package/dist/core/worktree.js +246 -0
- package/dist/core/worktree.js.map +1 -0
- package/dist/index.js +135 -5
- package/dist/index.js.map +1 -1
- package/dist/services/error-classifier.d.ts +119 -0
- package/dist/services/error-classifier.d.ts.map +1 -0
- package/dist/services/error-classifier.js +182 -0
- package/dist/services/error-classifier.js.map +1 -0
- package/dist/types/index.d.ts +336 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +4 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { parseStory, writeStory, updateStoryStatus } from '../core/story.js';
|
|
2
2
|
import { runAgentQuery } from '../core/client.js';
|
|
3
|
+
import { getLogger } from '../core/logger.js';
|
|
3
4
|
import path from 'path';
|
|
4
5
|
const REFINEMENT_SYSTEM_PROMPT = `You are a product refinement specialist. Your job is to take raw story ideas from the backlog and transform them into well-defined, actionable user stories.
|
|
5
6
|
|
|
@@ -22,8 +23,14 @@ At the end of your response, include:
|
|
|
22
23
|
* ready-to-implement user story.
|
|
23
24
|
*/
|
|
24
25
|
export async function runRefinementAgent(storyPath, sdlcRoot, options = {}) {
|
|
26
|
+
const logger = getLogger();
|
|
27
|
+
const startTime = Date.now();
|
|
25
28
|
const story = parseStory(storyPath);
|
|
26
29
|
const changesMade = [];
|
|
30
|
+
logger.info('refinement', 'Starting refinement phase', {
|
|
31
|
+
storyId: story.frontmatter.id,
|
|
32
|
+
status: story.frontmatter.status,
|
|
33
|
+
});
|
|
27
34
|
try {
|
|
28
35
|
const prompt = `Please refine this story:
|
|
29
36
|
|
|
@@ -65,10 +72,16 @@ Format your response as markdown that will replace the story content.`;
|
|
|
65
72
|
// Update timestamp
|
|
66
73
|
story.frontmatter.updated = new Date().toISOString().split('T')[0];
|
|
67
74
|
// Write the story
|
|
68
|
-
writeStory(story);
|
|
75
|
+
await writeStory(story);
|
|
69
76
|
// Update status to ready
|
|
70
|
-
const movedStory = updateStoryStatus(story, 'ready');
|
|
77
|
+
const movedStory = await updateStoryStatus(story, 'ready');
|
|
71
78
|
changesMade.push('Updated status to ready');
|
|
79
|
+
logger.info('refinement', 'Refinement phase complete', {
|
|
80
|
+
storyId: story.frontmatter.id,
|
|
81
|
+
durationMs: Date.now() - startTime,
|
|
82
|
+
newStatus: 'ready',
|
|
83
|
+
changesCount: changesMade.length,
|
|
84
|
+
});
|
|
72
85
|
return {
|
|
73
86
|
success: true,
|
|
74
87
|
story: movedStory,
|
|
@@ -76,11 +89,17 @@ Format your response as markdown that will replace the story content.`;
|
|
|
76
89
|
};
|
|
77
90
|
}
|
|
78
91
|
catch (error) {
|
|
92
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
93
|
+
logger.error('refinement', 'Refinement phase failed', {
|
|
94
|
+
storyId: story.frontmatter.id,
|
|
95
|
+
durationMs: Date.now() - startTime,
|
|
96
|
+
error: errorMessage,
|
|
97
|
+
});
|
|
79
98
|
return {
|
|
80
99
|
success: false,
|
|
81
100
|
story,
|
|
82
101
|
changesMade,
|
|
83
|
-
error:
|
|
102
|
+
error: errorMessage,
|
|
84
103
|
};
|
|
85
104
|
}
|
|
86
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refinement.js","sourceRoot":"","sources":["../../src/agents/refinement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAyB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"refinement.js","sourceRoot":"","sources":["../../src/agents/refinement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AgentProgressCallback } from '../core/client.js';
|
|
2
|
-
import { AgentResult } from '../types/index.js';
|
|
2
|
+
import { Story, AgentResult, FARScore } from '../types/index.js';
|
|
3
3
|
export interface AgentOptions {
|
|
4
4
|
/** Context from a previous review failure - must address these issues */
|
|
5
5
|
reworkContext?: string;
|
|
@@ -13,4 +13,88 @@ export interface AgentOptions {
|
|
|
13
13
|
* and gathering relevant information.
|
|
14
14
|
*/
|
|
15
15
|
export declare function runResearchAgent(storyPath: string, sdlcRoot: string, options?: AgentOptions): Promise<AgentResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Gather context about the codebase for research.
|
|
18
|
+
*
|
|
19
|
+
* Collects information about:
|
|
20
|
+
* - Project configuration files (package.json, tsconfig.json, etc.)
|
|
21
|
+
* - Directory structure
|
|
22
|
+
* - Source files
|
|
23
|
+
* - Test files (for understanding testing patterns)
|
|
24
|
+
* - Configuration files (for discovering config patterns)
|
|
25
|
+
*
|
|
26
|
+
* @param sdlcRoot - Path to the .ai-sdlc directory
|
|
27
|
+
* @returns Formatted context string with codebase information
|
|
28
|
+
*/
|
|
29
|
+
export declare function gatherCodebaseContext(sdlcRoot: string): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Determine if web research would add value based on story content and codebase context.
|
|
32
|
+
*
|
|
33
|
+
* Web research is triggered when:
|
|
34
|
+
* 1. External dependencies are referenced (libraries, APIs, frameworks)
|
|
35
|
+
* 2. Unfamiliar APIs/patterns are mentioned
|
|
36
|
+
* 3. Library-specific documentation is needed
|
|
37
|
+
* 4. Best practices are requested
|
|
38
|
+
*
|
|
39
|
+
* Web research is skipped when:
|
|
40
|
+
* - Topic is purely internal (refactoring, moving code, internal utilities)
|
|
41
|
+
* - No external dependencies mentioned
|
|
42
|
+
*/
|
|
43
|
+
export declare function shouldPerformWebResearch(story: Story, codebaseContext: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Sanitize web research content for safe storage and display.
|
|
46
|
+
* Removes ANSI escape sequences, control characters, and potential injection vectors.
|
|
47
|
+
*
|
|
48
|
+
* Security rationale: Web research content comes from external sources (LLM, web tools)
|
|
49
|
+
* and must be sanitized before storage to prevent:
|
|
50
|
+
* - ANSI injection (terminal control sequence attacks)
|
|
51
|
+
* - Markdown injection (malicious formatting)
|
|
52
|
+
* - Control character injection (null bytes, bell characters, etc.)
|
|
53
|
+
*
|
|
54
|
+
* @param text - Raw web research content from external source
|
|
55
|
+
* @returns Sanitized text safe for storage in markdown files
|
|
56
|
+
*/
|
|
57
|
+
export declare function sanitizeWebResearchContent(text: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Sanitize text for logging to prevent log injection attacks.
|
|
60
|
+
* Replaces newlines with spaces and truncates for readability.
|
|
61
|
+
*
|
|
62
|
+
* Security rationale: Log injection attacks use newlines to inject fake log entries.
|
|
63
|
+
* By replacing newlines with spaces, we ensure each log() call produces exactly one log line.
|
|
64
|
+
*
|
|
65
|
+
* @param text - Raw text that will be logged
|
|
66
|
+
* @returns Sanitized text safe for logging (single line, truncated)
|
|
67
|
+
*/
|
|
68
|
+
export declare function sanitizeForLogging(text: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Sanitize codebase context before including in LLM prompts.
|
|
71
|
+
* Escapes dangerous patterns that could cause prompt injection.
|
|
72
|
+
*
|
|
73
|
+
* Security rationale: Codebase files may contain malicious content from:
|
|
74
|
+
* - Compromised dependencies
|
|
75
|
+
* - Malicious commits
|
|
76
|
+
* - Untrusted contributors
|
|
77
|
+
*
|
|
78
|
+
* We must prevent prompt injection by escaping patterns that could:
|
|
79
|
+
* - Terminate the prompt early (triple backticks)
|
|
80
|
+
* - Inject commands or instructions
|
|
81
|
+
* - Confuse the LLM's understanding of structure
|
|
82
|
+
*
|
|
83
|
+
* @param text - Raw codebase context
|
|
84
|
+
* @returns Sanitized text safe for LLM prompts
|
|
85
|
+
*/
|
|
86
|
+
export declare function sanitizeCodebaseContext(text: string): string;
|
|
87
|
+
/**
|
|
88
|
+
* Parse FAR evaluation from web research finding text.
|
|
89
|
+
* Expected format from LLM:
|
|
90
|
+
* **FAR Score**: Factuality: 5, Actionability: 4, Relevance: 5
|
|
91
|
+
* **Justification**: Official documentation provides...
|
|
92
|
+
*
|
|
93
|
+
* Returns default scores (2, 2, 2) with parsingSucceeded: false if parsing fails.
|
|
94
|
+
* Default of 2 (rather than 3) indicates uncertainty rather than average quality.
|
|
95
|
+
*
|
|
96
|
+
* @param finding - Web research finding text to parse
|
|
97
|
+
* @returns FARScore with parsed or default values and parsing status
|
|
98
|
+
*/
|
|
99
|
+
export declare function evaluateFAR(finding: string): FARScore;
|
|
16
100
|
//# sourceMappingURL=research.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/agents/research.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/agents/research.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAgLjE,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAsGtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmG7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAiCvF;AAeD;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8B/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBvD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA6B5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAuDrD"}
|