ai-sdlc 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +847 -0
- package/dist/agents/implementation.d.ts +11 -0
- package/dist/agents/implementation.d.ts.map +1 -0
- package/dist/agents/implementation.js +123 -0
- package/dist/agents/implementation.js.map +1 -0
- package/dist/agents/index.d.ts +7 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +8 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/planning.d.ts +9 -0
- package/dist/agents/planning.d.ts.map +1 -0
- package/dist/agents/planning.js +84 -0
- package/dist/agents/planning.js.map +1 -0
- package/dist/agents/refinement.d.ts +10 -0
- package/dist/agents/refinement.d.ts.map +1 -0
- package/dist/agents/refinement.js +98 -0
- package/dist/agents/refinement.js.map +1 -0
- package/dist/agents/research.d.ts +16 -0
- package/dist/agents/research.d.ts.map +1 -0
- package/dist/agents/research.js +141 -0
- package/dist/agents/research.js.map +1 -0
- package/dist/agents/review.d.ts +24 -0
- package/dist/agents/review.d.ts.map +1 -0
- package/dist/agents/review.js +740 -0
- package/dist/agents/review.js.map +1 -0
- package/dist/agents/rework.d.ts +17 -0
- package/dist/agents/rework.d.ts.map +1 -0
- package/dist/agents/rework.js +139 -0
- package/dist/agents/rework.js.map +1 -0
- package/dist/agents/state-assessor.d.ts +21 -0
- package/dist/agents/state-assessor.d.ts.map +1 -0
- package/dist/agents/state-assessor.js +29 -0
- package/dist/agents/state-assessor.js.map +1 -0
- package/dist/cli/commands.d.ts +87 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +1183 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/formatting.d.ts +68 -0
- package/dist/cli/formatting.d.ts.map +1 -0
- package/dist/cli/formatting.js +194 -0
- package/dist/cli/formatting.js.map +1 -0
- package/dist/cli/runner.d.ts +57 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +272 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/story-utils.d.ts +19 -0
- package/dist/cli/story-utils.d.ts.map +1 -0
- package/dist/cli/story-utils.js +44 -0
- package/dist/cli/story-utils.js.map +1 -0
- package/dist/cli/table-renderer.d.ts +22 -0
- package/dist/cli/table-renderer.d.ts.map +1 -0
- package/dist/cli/table-renderer.js +159 -0
- package/dist/cli/table-renderer.js.map +1 -0
- package/dist/core/auth.d.ts +39 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +128 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/client.d.ts +73 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +140 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/config.d.ts +48 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +330 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/kanban.d.ts +34 -0
- package/dist/core/kanban.d.ts.map +1 -0
- package/dist/core/kanban.js +253 -0
- package/dist/core/kanban.js.map +1 -0
- package/dist/core/story.d.ts +91 -0
- package/dist/core/story.d.ts.map +1 -0
- package/dist/core/story.js +349 -0
- package/dist/core/story.js.map +1 -0
- package/dist/core/theme.d.ts +17 -0
- package/dist/core/theme.d.ts.map +1 -0
- package/dist/core/theme.js +136 -0
- package/dist/core/theme.js.map +1 -0
- package/dist/core/workflow-state.d.ts +56 -0
- package/dist/core/workflow-state.d.ts.map +1 -0
- package/dist/core/workflow-state.js +162 -0
- package/dist/core/workflow-state.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +228 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +38 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/workflow-state.d.ts +54 -0
- package/dist/types/workflow-state.d.ts.map +1 -0
- package/dist/types/workflow-state.js +5 -0
- package/dist/types/workflow-state.js.map +1 -0
- package/package.json +71 -0
- package/templates/story.md +35 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { platform } from 'os';
|
|
3
|
+
/**
|
|
4
|
+
* Get API key/token from various sources in order of preference:
|
|
5
|
+
* 1. ANTHROPIC_API_KEY environment variable (direct API key)
|
|
6
|
+
* 2. CLAUDE_CODE_OAUTH_TOKEN environment variable (OAuth token)
|
|
7
|
+
* 3. macOS Keychain (Claude Code credentials)
|
|
8
|
+
*/
|
|
9
|
+
export function getApiKey() {
|
|
10
|
+
// First check environment variables
|
|
11
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
12
|
+
return process.env.ANTHROPIC_API_KEY;
|
|
13
|
+
}
|
|
14
|
+
if (process.env.CLAUDE_CODE_OAUTH_TOKEN) {
|
|
15
|
+
return process.env.CLAUDE_CODE_OAUTH_TOKEN;
|
|
16
|
+
}
|
|
17
|
+
// Try macOS Keychain
|
|
18
|
+
if (platform() === 'darwin') {
|
|
19
|
+
const keychainKey = getApiKeyFromKeychain();
|
|
20
|
+
if (keychainKey) {
|
|
21
|
+
return keychainKey;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if the API key is an OAuth token
|
|
28
|
+
*/
|
|
29
|
+
export function isOAuthToken(key) {
|
|
30
|
+
return key.startsWith('sk-ant-oat');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if the API key is a direct API key
|
|
34
|
+
*/
|
|
35
|
+
export function isDirectApiKey(key) {
|
|
36
|
+
return key.startsWith('sk-ant-api');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get the credential type for a given key
|
|
40
|
+
*/
|
|
41
|
+
export function getCredentialType(key) {
|
|
42
|
+
if (!key)
|
|
43
|
+
return 'none';
|
|
44
|
+
if (isOAuthToken(key))
|
|
45
|
+
return 'oauth_token';
|
|
46
|
+
return 'api_key';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Configure environment variables for the Agent SDK based on credential type.
|
|
50
|
+
* The Agent SDK uses:
|
|
51
|
+
* - ANTHROPIC_API_KEY for direct API keys
|
|
52
|
+
* - CLAUDE_CODE_OAUTH_TOKEN for OAuth tokens
|
|
53
|
+
*/
|
|
54
|
+
export function configureAgentSdkAuth() {
|
|
55
|
+
const key = getApiKey();
|
|
56
|
+
if (!key) {
|
|
57
|
+
return { configured: false, type: 'none' };
|
|
58
|
+
}
|
|
59
|
+
const credType = getCredentialType(key);
|
|
60
|
+
if (credType === 'oauth_token') {
|
|
61
|
+
// Set OAuth token for Agent SDK
|
|
62
|
+
process.env.CLAUDE_CODE_OAUTH_TOKEN = key;
|
|
63
|
+
// Clear API key to avoid confusion
|
|
64
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Set API key
|
|
68
|
+
process.env.ANTHROPIC_API_KEY = key;
|
|
69
|
+
delete process.env.CLAUDE_CODE_OAUTH_TOKEN;
|
|
70
|
+
}
|
|
71
|
+
return { configured: true, type: credType };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get API key from macOS Keychain
|
|
75
|
+
* Claude Code stores OAuth credentials in "Claude Code-credentials"
|
|
76
|
+
*/
|
|
77
|
+
function getApiKeyFromKeychain() {
|
|
78
|
+
try {
|
|
79
|
+
// Try to get Claude Code OAuth credentials
|
|
80
|
+
const credentials = execSync('security find-generic-password -s "Claude Code-credentials" -w 2>/dev/null', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
81
|
+
if (credentials) {
|
|
82
|
+
// The credentials are stored as JSON
|
|
83
|
+
try {
|
|
84
|
+
const parsed = JSON.parse(credentials);
|
|
85
|
+
// Check for Claude AI OAuth format: {"claudeAiOauth":{"accessToken":"..."}}
|
|
86
|
+
if (parsed.claudeAiOauth?.accessToken) {
|
|
87
|
+
return parsed.claudeAiOauth.accessToken;
|
|
88
|
+
}
|
|
89
|
+
// Check for legacy format: {"accessToken":"..."}
|
|
90
|
+
if (parsed.accessToken) {
|
|
91
|
+
return parsed.accessToken;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// If not JSON, it might be the raw token
|
|
96
|
+
if (credentials.startsWith('sk-') || credentials.length > 20) {
|
|
97
|
+
return credentials;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Keychain access failed - that's okay, we'll fall back
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check if API key is available from any source
|
|
109
|
+
*/
|
|
110
|
+
export function hasApiKey() {
|
|
111
|
+
return getApiKey() !== null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get the source of the API key (for display purposes)
|
|
115
|
+
*/
|
|
116
|
+
export function getApiKeySource() {
|
|
117
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
118
|
+
return 'env';
|
|
119
|
+
}
|
|
120
|
+
if (platform() === 'darwin') {
|
|
121
|
+
const keychainKey = getApiKeyFromKeychain();
|
|
122
|
+
if (keychainKey) {
|
|
123
|
+
return 'keychain';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return 'none';
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { CredentialType } from './auth.js';
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown when an agent query times out
|
|
4
|
+
*/
|
|
5
|
+
export declare class AgentTimeoutError extends Error {
|
|
6
|
+
constructor(timeoutMs: number);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Progress event types from the Agent SDK
|
|
10
|
+
*/
|
|
11
|
+
export type AgentProgressEvent = {
|
|
12
|
+
type: 'session_start';
|
|
13
|
+
sessionId: string;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'tool_start';
|
|
16
|
+
toolName: string;
|
|
17
|
+
input?: Record<string, unknown>;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'tool_end';
|
|
20
|
+
toolName: string;
|
|
21
|
+
result?: unknown;
|
|
22
|
+
} | {
|
|
23
|
+
type: 'assistant_message';
|
|
24
|
+
content: string;
|
|
25
|
+
} | {
|
|
26
|
+
type: 'completion';
|
|
27
|
+
} | {
|
|
28
|
+
type: 'error';
|
|
29
|
+
message: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Callback for receiving real-time progress from agent execution
|
|
33
|
+
*/
|
|
34
|
+
export type AgentProgressCallback = (event: AgentProgressEvent) => void;
|
|
35
|
+
export interface AgentQueryOptions {
|
|
36
|
+
prompt: string;
|
|
37
|
+
systemPrompt?: string;
|
|
38
|
+
workingDirectory?: string;
|
|
39
|
+
model?: string;
|
|
40
|
+
/** Timeout in milliseconds. Defaults to config value or 10 minutes. */
|
|
41
|
+
timeout?: number;
|
|
42
|
+
/** Callback for real-time progress updates */
|
|
43
|
+
onProgress?: AgentProgressCallback;
|
|
44
|
+
}
|
|
45
|
+
export interface AgentMessage {
|
|
46
|
+
type: string;
|
|
47
|
+
subtype?: string;
|
|
48
|
+
content?: string | Array<{
|
|
49
|
+
type: string;
|
|
50
|
+
text?: string;
|
|
51
|
+
name?: string;
|
|
52
|
+
}>;
|
|
53
|
+
tool_name?: string;
|
|
54
|
+
input?: Record<string, unknown>;
|
|
55
|
+
result?: unknown;
|
|
56
|
+
error?: {
|
|
57
|
+
message: string;
|
|
58
|
+
type?: string;
|
|
59
|
+
tool?: string;
|
|
60
|
+
};
|
|
61
|
+
session_id?: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Run an agent query using the Claude Agent SDK.
|
|
65
|
+
* Automatically configures authentication from environment or keychain.
|
|
66
|
+
* CLAUDE.md discovery is handled automatically by the SDK when settingSources includes 'project'.
|
|
67
|
+
*/
|
|
68
|
+
export declare function runAgentQuery(options: AgentQueryOptions): Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* Get the current credential type being used
|
|
71
|
+
*/
|
|
72
|
+
export declare function getCurrentCredentialType(): CredentialType;
|
|
73
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAuD,cAAc,EAAE,MAAM,WAAW,CAAC;AAIhG;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,SAAS,EAAE,MAAM;CAK9B;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgBD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2G/E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,cAAc,CAEzD"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
import { configureAgentSdkAuth, getApiKey, getCredentialType } from './auth.js';
|
|
3
|
+
import { loadConfig, DEFAULT_TIMEOUTS } from './config.js';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
/**
|
|
6
|
+
* Error thrown when an agent query times out
|
|
7
|
+
*/
|
|
8
|
+
export class AgentTimeoutError extends Error {
|
|
9
|
+
constructor(timeoutMs) {
|
|
10
|
+
const timeoutSec = Math.round(timeoutMs / 1000);
|
|
11
|
+
super(`Agent query timed out after ${timeoutSec} seconds. Consider increasing 'timeouts.agentTimeout' in .agentic-sdlc.json`);
|
|
12
|
+
this.name = 'AgentTimeoutError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Validate that the working directory is within safe boundaries
|
|
17
|
+
*/
|
|
18
|
+
function isValidWorkingDirectory(workingDir) {
|
|
19
|
+
try {
|
|
20
|
+
const normalized = path.resolve(workingDir);
|
|
21
|
+
const projectRoot = path.resolve(process.cwd());
|
|
22
|
+
// Allow working directory to be the project root or any subdirectory
|
|
23
|
+
return normalized.startsWith(projectRoot) || normalized === projectRoot;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Run an agent query using the Claude Agent SDK.
|
|
31
|
+
* Automatically configures authentication from environment or keychain.
|
|
32
|
+
* CLAUDE.md discovery is handled automatically by the SDK when settingSources includes 'project'.
|
|
33
|
+
*/
|
|
34
|
+
export async function runAgentQuery(options) {
|
|
35
|
+
// Configure authentication
|
|
36
|
+
const authResult = configureAgentSdkAuth();
|
|
37
|
+
if (!authResult.configured) {
|
|
38
|
+
throw new Error('No API key or OAuth token found. Set ANTHROPIC_API_KEY or sign in to Claude Code.');
|
|
39
|
+
}
|
|
40
|
+
// Validate and normalize working directory
|
|
41
|
+
const workingDir = path.resolve(options.workingDirectory || process.cwd());
|
|
42
|
+
if (!isValidWorkingDirectory(workingDir)) {
|
|
43
|
+
throw new Error('Invalid working directory: path is outside project boundaries');
|
|
44
|
+
}
|
|
45
|
+
// Load configuration to get settingSources and timeout
|
|
46
|
+
const config = loadConfig(workingDir);
|
|
47
|
+
const settingSources = config.settingSources || [];
|
|
48
|
+
const timeout = options.timeout ?? config.timeouts?.agentTimeout ?? DEFAULT_TIMEOUTS.agentTimeout;
|
|
49
|
+
const results = [];
|
|
50
|
+
const response = query({
|
|
51
|
+
prompt: options.prompt,
|
|
52
|
+
options: {
|
|
53
|
+
model: options.model || 'claude-sonnet-4-5-20250929',
|
|
54
|
+
systemPrompt: options.systemPrompt,
|
|
55
|
+
cwd: workingDir,
|
|
56
|
+
permissionMode: 'acceptEdits',
|
|
57
|
+
settingSources: settingSources,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
// Create a timeout promise
|
|
61
|
+
let timeoutId;
|
|
62
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
63
|
+
timeoutId = setTimeout(() => {
|
|
64
|
+
reject(new AgentTimeoutError(timeout));
|
|
65
|
+
}, timeout);
|
|
66
|
+
});
|
|
67
|
+
// Process the async generator with timeout
|
|
68
|
+
const processMessages = async () => {
|
|
69
|
+
try {
|
|
70
|
+
for await (const message of response) {
|
|
71
|
+
switch (message.type) {
|
|
72
|
+
case 'system':
|
|
73
|
+
if (message.subtype === 'init' && message.session_id) {
|
|
74
|
+
options.onProgress?.({ type: 'session_start', sessionId: message.session_id });
|
|
75
|
+
}
|
|
76
|
+
else if (message.subtype === 'completion') {
|
|
77
|
+
options.onProgress?.({ type: 'completion' });
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
case 'assistant':
|
|
81
|
+
const content = message.content;
|
|
82
|
+
if (typeof content === 'string') {
|
|
83
|
+
results.push(content);
|
|
84
|
+
options.onProgress?.({ type: 'assistant_message', content });
|
|
85
|
+
}
|
|
86
|
+
else if (Array.isArray(content)) {
|
|
87
|
+
for (const block of content) {
|
|
88
|
+
if (block.type === 'text' && block.text) {
|
|
89
|
+
results.push(block.text);
|
|
90
|
+
options.onProgress?.({ type: 'assistant_message', content: block.text });
|
|
91
|
+
}
|
|
92
|
+
else if (block.type === 'tool_use' && block.name) {
|
|
93
|
+
// Tool use request from assistant
|
|
94
|
+
options.onProgress?.({ type: 'tool_start', toolName: block.name });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
break;
|
|
99
|
+
case 'tool_call':
|
|
100
|
+
options.onProgress?.({
|
|
101
|
+
type: 'tool_start',
|
|
102
|
+
toolName: message.tool_name || 'unknown',
|
|
103
|
+
input: message.input
|
|
104
|
+
});
|
|
105
|
+
break;
|
|
106
|
+
case 'tool_result':
|
|
107
|
+
options.onProgress?.({
|
|
108
|
+
type: 'tool_end',
|
|
109
|
+
toolName: message.tool_name || 'unknown',
|
|
110
|
+
result: message.result
|
|
111
|
+
});
|
|
112
|
+
break;
|
|
113
|
+
case 'result':
|
|
114
|
+
if (message.subtype === 'success' && typeof message.result === 'string') {
|
|
115
|
+
results.push(message.result);
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
case 'error':
|
|
119
|
+
options.onProgress?.({ type: 'error', message: message.error?.message || 'Agent error' });
|
|
120
|
+
throw new Error(message.error?.message || 'Agent error');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return results.join('\n');
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
if (timeoutId) {
|
|
127
|
+
clearTimeout(timeoutId);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
// Race between the agent query and the timeout
|
|
132
|
+
return Promise.race([processMessages(), timeoutPromise]);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get the current credential type being used
|
|
136
|
+
*/
|
|
137
|
+
export function getCurrentCredentialType() {
|
|
138
|
+
return getCredentialType(getApiKey());
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Config, StageGateConfig, RefinementConfig, ReviewConfig, TimeoutConfig } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Default timeout configuration
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_TIMEOUTS: TimeoutConfig;
|
|
6
|
+
export declare const DEFAULT_CONFIG: Config;
|
|
7
|
+
/**
|
|
8
|
+
* Get the SDLC root folder path
|
|
9
|
+
* Respects AGENTIC_SDLC_ROOT env var if set (useful for testing)
|
|
10
|
+
*/
|
|
11
|
+
export declare function getSdlcRoot(workingDir?: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Load configuration from the working directory
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadConfig(workingDir?: string): Config;
|
|
16
|
+
/**
|
|
17
|
+
* Save configuration to the working directory
|
|
18
|
+
*/
|
|
19
|
+
export declare function saveConfig(config: Config, workingDir?: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Update stage gate configuration
|
|
22
|
+
*/
|
|
23
|
+
export declare function updateStageGates(gates: Partial<StageGateConfig>, workingDir?: string): Config;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a specific stage gate is enabled
|
|
26
|
+
*/
|
|
27
|
+
export declare function isStageGateEnabled(gate: keyof StageGateConfig, workingDir?: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Initialize configuration file with defaults
|
|
30
|
+
*/
|
|
31
|
+
export declare function initConfig(workingDir?: string): Config;
|
|
32
|
+
/**
|
|
33
|
+
* Update refinement configuration
|
|
34
|
+
*/
|
|
35
|
+
export declare function updateRefinementConfig(refinementConfig: Partial<RefinementConfig>, workingDir?: string): Config;
|
|
36
|
+
/**
|
|
37
|
+
* Get the maximum number of refinement iterations allowed
|
|
38
|
+
*/
|
|
39
|
+
export declare function getMaxRefinementIterations(workingDir?: string): number;
|
|
40
|
+
/**
|
|
41
|
+
* Validate review configuration
|
|
42
|
+
*/
|
|
43
|
+
export declare function validateReviewConfig(reviewConfig: ReviewConfig): ReviewConfig;
|
|
44
|
+
/**
|
|
45
|
+
* Update review configuration
|
|
46
|
+
*/
|
|
47
|
+
export declare function updateReviewConfig(reviewConfig: Partial<ReviewConfig>, workingDir?: string): Config;
|
|
48
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAI3G;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAI9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MA2B5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,GAAE,MAAsB,GAAG,MAAM,CAOtE;AAyHD;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,GAAE,MAAsB,GAAG,MAAM,CAoFrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAsB,GAAG,IAAI,CAGnF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,UAAU,GAAE,MAAsB,GACjC,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,eAAe,EAC3B,UAAU,GAAE,MAAsB,GACjC,OAAO,CAGT;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,GAAE,MAAsB,GAAG,MAAM,CAQrE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAC3C,UAAU,GAAE,MAAsB,GACjC,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,GAAE,MAAsB,GAAG,MAAM,CAGrF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY,CA8B7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,EACnC,UAAU,GAAE,MAAsB,GACjC,MAAM,CASR"}
|