@mknightzzz/stw 0.1.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/LICENSE +21 -0
- package/README.md +277 -0
- package/dist/agentic-fallback.d.ts +3 -0
- package/dist/agentic-fallback.js +32 -0
- package/dist/agentic-fallback.js.map +1 -0
- package/dist/agentic-prompt.d.ts +2 -0
- package/dist/agentic-prompt.js +68 -0
- package/dist/agentic-prompt.js.map +1 -0
- package/dist/agentic-runtime.d.ts +48 -0
- package/dist/agentic-runtime.js +149 -0
- package/dist/agentic-runtime.js.map +1 -0
- package/dist/agentic-types.d.ts +37 -0
- package/dist/agentic-types.js +2 -0
- package/dist/agentic-types.js.map +1 -0
- package/dist/agents.d.ts +7 -0
- package/dist/agents.js +2 -0
- package/dist/agents.js.map +1 -0
- package/dist/assignments.d.ts +7 -0
- package/dist/assignments.js +125 -0
- package/dist/assignments.js.map +1 -0
- package/dist/checkpoint.d.ts +35 -0
- package/dist/checkpoint.js +78 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/circuit-breaker.d.ts +17 -0
- package/dist/circuit-breaker.js +65 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/claim.d.ts +6 -0
- package/dist/claim.js +135 -0
- package/dist/claim.js.map +1 -0
- package/dist/clarity-gate.d.ts +12 -0
- package/dist/clarity-gate.js +83 -0
- package/dist/clarity-gate.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +38 -0
- package/dist/cli.js.map +1 -0
- package/dist/command-dispatch.d.ts +45 -0
- package/dist/command-dispatch.js +206 -0
- package/dist/command-dispatch.js.map +1 -0
- package/dist/command-parser.d.ts +11 -0
- package/dist/command-parser.js +101 -0
- package/dist/command-parser.js.map +1 -0
- package/dist/commands/clean.d.ts +10 -0
- package/dist/commands/clean.js +133 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/execution.d.ts +2 -0
- package/dist/commands/execution.js +327 -0
- package/dist/commands/execution.js.map +1 -0
- package/dist/commands/go.d.ts +2 -0
- package/dist/commands/go.js +197 -0
- package/dist/commands/go.js.map +1 -0
- package/dist/commands/helpers.d.ts +44 -0
- package/dist/commands/helpers.js +231 -0
- package/dist/commands/helpers.js.map +1 -0
- package/dist/commands/idea.d.ts +2 -0
- package/dist/commands/idea.js +89 -0
- package/dist/commands/idea.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +94 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/integration.d.ts +7 -0
- package/dist/commands/integration.js +139 -0
- package/dist/commands/integration.js.map +1 -0
- package/dist/commands/maintenance.d.ts +2 -0
- package/dist/commands/maintenance.js +301 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.js +356 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.js +198 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/spec.d.ts +2 -0
- package/dist/commands/spec.js +35 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/stats.d.ts +2 -0
- package/dist/commands/stats.js +80 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/task-ops.d.ts +2 -0
- package/dist/commands/task-ops.js +406 -0
- package/dist/commands/task-ops.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.js +338 -0
- package/dist/config.js.map +1 -0
- package/dist/cost.d.ts +30 -0
- package/dist/cost.js +167 -0
- package/dist/cost.js.map +1 -0
- package/dist/crash-recovery.d.ts +9 -0
- package/dist/crash-recovery.js +42 -0
- package/dist/crash-recovery.js.map +1 -0
- package/dist/diagnostic.d.ts +48 -0
- package/dist/diagnostic.js +328 -0
- package/dist/diagnostic.js.map +1 -0
- package/dist/doctor.d.ts +31 -0
- package/dist/doctor.js +225 -0
- package/dist/doctor.js.map +1 -0
- package/dist/drift.d.ts +11 -0
- package/dist/drift.js +57 -0
- package/dist/drift.js.map +1 -0
- package/dist/git-utils.d.ts +20 -0
- package/dist/git-utils.js +206 -0
- package/dist/git-utils.js.map +1 -0
- package/dist/gitlab.d.ts +54 -0
- package/dist/gitlab.js +101 -0
- package/dist/gitlab.js.map +1 -0
- package/dist/idea.d.ts +35 -0
- package/dist/idea.js +251 -0
- package/dist/idea.js.map +1 -0
- package/dist/import-resolution.d.ts +13 -0
- package/dist/import-resolution.js +111 -0
- package/dist/import-resolution.js.map +1 -0
- package/dist/inbox-renderer.d.ts +2 -0
- package/dist/inbox-renderer.js +67 -0
- package/dist/inbox-renderer.js.map +1 -0
- package/dist/init.d.ts +105 -0
- package/dist/init.js +235 -0
- package/dist/init.js.map +1 -0
- package/dist/llm-reviewer.d.ts +14 -0
- package/dist/llm-reviewer.js +109 -0
- package/dist/llm-reviewer.js.map +1 -0
- package/dist/lock.d.ts +26 -0
- package/dist/lock.js +76 -0
- package/dist/lock.js.map +1 -0
- package/dist/logger.d.ts +24 -0
- package/dist/logger.js +40 -0
- package/dist/logger.js.map +1 -0
- package/dist/math-utils.d.ts +2 -0
- package/dist/math-utils.js +7 -0
- package/dist/math-utils.js.map +1 -0
- package/dist/mechanical-review.d.ts +30 -0
- package/dist/mechanical-review.js +76 -0
- package/dist/mechanical-review.js.map +1 -0
- package/dist/merge.d.ts +83 -0
- package/dist/merge.js +363 -0
- package/dist/merge.js.map +1 -0
- package/dist/parallel.d.ts +35 -0
- package/dist/parallel.js +214 -0
- package/dist/parallel.js.map +1 -0
- package/dist/plan-validation.d.ts +19 -0
- package/dist/plan-validation.js +253 -0
- package/dist/plan-validation.js.map +1 -0
- package/dist/planner-prompt.d.ts +33 -0
- package/dist/planner-prompt.js +244 -0
- package/dist/planner-prompt.js.map +1 -0
- package/dist/planner.d.ts +29 -0
- package/dist/planner.js +511 -0
- package/dist/planner.js.map +1 -0
- package/dist/poller.d.ts +34 -0
- package/dist/poller.js +91 -0
- package/dist/poller.js.map +1 -0
- package/dist/progress.d.ts +34 -0
- package/dist/progress.js +122 -0
- package/dist/progress.js.map +1 -0
- package/dist/prompt-builder.d.ts +51 -0
- package/dist/prompt-builder.js +481 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/provider.d.ts +14 -0
- package/dist/provider.js +278 -0
- package/dist/provider.js.map +1 -0
- package/dist/question-handler.d.ts +18 -0
- package/dist/question-handler.js +154 -0
- package/dist/question-handler.js.map +1 -0
- package/dist/question-triage.d.ts +31 -0
- package/dist/question-triage.js +175 -0
- package/dist/question-triage.js.map +1 -0
- package/dist/repo-detection.d.ts +8 -0
- package/dist/repo-detection.js +18 -0
- package/dist/repo-detection.js.map +1 -0
- package/dist/retry-context.d.ts +2 -0
- package/dist/retry-context.js +196 -0
- package/dist/retry-context.js.map +1 -0
- package/dist/router.d.ts +18 -0
- package/dist/router.js +137 -0
- package/dist/router.js.map +1 -0
- package/dist/run-artifact-types.d.ts +43 -0
- package/dist/run-artifact-types.js +2 -0
- package/dist/run-artifact-types.js.map +1 -0
- package/dist/run-summary.d.ts +14 -0
- package/dist/run-summary.js +347 -0
- package/dist/run-summary.js.map +1 -0
- package/dist/run-sync.d.ts +11 -0
- package/dist/run-sync.js +110 -0
- package/dist/run-sync.js.map +1 -0
- package/dist/run.d.ts +26 -0
- package/dist/run.js +150 -0
- package/dist/run.js.map +1 -0
- package/dist/scope-expansion.d.ts +10 -0
- package/dist/scope-expansion.js +117 -0
- package/dist/scope-expansion.js.map +1 -0
- package/dist/scope.d.ts +4 -0
- package/dist/scope.js +37 -0
- package/dist/scope.js.map +1 -0
- package/dist/scorecard.d.ts +18 -0
- package/dist/scorecard.js +128 -0
- package/dist/scorecard.js.map +1 -0
- package/dist/spec-templates.d.ts +2 -0
- package/dist/spec-templates.js +285 -0
- package/dist/spec-templates.js.map +1 -0
- package/dist/spec-validator.d.ts +8 -0
- package/dist/spec-validator.js +144 -0
- package/dist/spec-validator.js.map +1 -0
- package/dist/status.d.ts +68 -0
- package/dist/status.js +261 -0
- package/dist/status.js.map +1 -0
- package/dist/storage.d.ts +9 -0
- package/dist/storage.js +35 -0
- package/dist/storage.js.map +1 -0
- package/dist/task-executor-completion.d.ts +12 -0
- package/dist/task-executor-completion.js +67 -0
- package/dist/task-executor-completion.js.map +1 -0
- package/dist/task-executor-fallback.d.ts +20 -0
- package/dist/task-executor-fallback.js +12 -0
- package/dist/task-executor-fallback.js.map +1 -0
- package/dist/task-executor.d.ts +34 -0
- package/dist/task-executor.js +521 -0
- package/dist/task-executor.js.map +1 -0
- package/dist/task-graph.d.ts +11 -0
- package/dist/task-graph.js +226 -0
- package/dist/task-graph.js.map +1 -0
- package/dist/task-pipeline-helpers.d.ts +45 -0
- package/dist/task-pipeline-helpers.js +160 -0
- package/dist/task-pipeline-helpers.js.map +1 -0
- package/dist/task-review.d.ts +51 -0
- package/dist/task-review.js +410 -0
- package/dist/task-review.js.map +1 -0
- package/dist/transitions.d.ts +13 -0
- package/dist/transitions.js +104 -0
- package/dist/transitions.js.map +1 -0
- package/dist/types.d.ts +405 -0
- package/dist/types.js +101 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +23 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation.d.ts +19 -0
- package/dist/validation.js +73 -0
- package/dist/validation.js.map +1 -0
- package/dist/worker-response.d.ts +12 -0
- package/dist/worker-response.js +60 -0
- package/dist/worker-response.js.map +1 -0
- package/dist/worker-runner.d.ts +19 -0
- package/dist/worker-runner.js +347 -0
- package/dist/worker-runner.js.map +1 -0
- package/dist/worktree-cleanup.d.ts +44 -0
- package/dist/worktree-cleanup.js +325 -0
- package/dist/worktree-cleanup.js.map +1 -0
- package/dist/worktree.d.ts +22 -0
- package/dist/worktree.js +213 -0
- package/dist/worktree.js.map +1 -0
- package/examples/spec.md +58 -0
- package/package.json +66 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Task, WorkerOutputFailureClass } from './types.js';
|
|
2
|
+
export interface DiagnosticFileEntry {
|
|
3
|
+
path: string;
|
|
4
|
+
content: string;
|
|
5
|
+
truncated: boolean;
|
|
6
|
+
source: 'error_path' | 'diff_file' | 'task_target';
|
|
7
|
+
}
|
|
8
|
+
export interface DiagnosticResult {
|
|
9
|
+
schema_version: 1;
|
|
10
|
+
task_id: string;
|
|
11
|
+
error_summary: string;
|
|
12
|
+
files: DiagnosticFileEntry[];
|
|
13
|
+
total_chars: number;
|
|
14
|
+
file_count: number;
|
|
15
|
+
caps_applied: {
|
|
16
|
+
max_files: number;
|
|
17
|
+
max_bytes_per_file: number;
|
|
18
|
+
max_total_chars: number;
|
|
19
|
+
};
|
|
20
|
+
artifact_path?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface DiagnosticInput {
|
|
23
|
+
task: Task;
|
|
24
|
+
cwd: string;
|
|
25
|
+
stderr: string;
|
|
26
|
+
stdout?: string;
|
|
27
|
+
diff?: string;
|
|
28
|
+
artifactDir?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function analyzeDiagnostic(input: DiagnosticInput): Promise<DiagnosticResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Classifies a worker output failure into one of the defined failure classes.
|
|
33
|
+
*
|
|
34
|
+
* Classification rules (evaluated in order):
|
|
35
|
+
* 1. truncated_json — raw content ends mid-structure (last non-whitespace char is not a closing bracket/brace/quote)
|
|
36
|
+
* 2. malformed_json — JSON.parse throws
|
|
37
|
+
* 3. missing_schema_version — parsed OK but schema_version !== 1
|
|
38
|
+
* 4. invalid_payload_shape — any other structural violation (wrong task_id, missing files array, etc.)
|
|
39
|
+
*/
|
|
40
|
+
export declare function classifyWorkerOutputFailure(rawContent: string, errorMessage: string): WorkerOutputFailureClass;
|
|
41
|
+
/**
|
|
42
|
+
* Builds a WorkerOutputFailureEvent for persistence as a task artifact.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildWorkerOutputFailureEvent(taskId: string, rawContent: string, errorMessage: string): import('./types.js').WorkerOutputFailureEvent;
|
|
45
|
+
/**
|
|
46
|
+
* Persists a WorkerOutputFailureEvent to <artifactDir>/worker_output_failure.json.
|
|
47
|
+
*/
|
|
48
|
+
export declare function persistWorkerOutputFailureEvent(artifactDir: string, event: import('./types.js').WorkerOutputFailureEvent): void;
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { readFileSync, existsSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { writeAtomic, writeJson } from './storage.js';
|
|
4
|
+
const MAX_FILES = 5;
|
|
5
|
+
const MAX_BYTES_PER_FILE = 8192;
|
|
6
|
+
const MAX_TOTAL_CHARS = 32000;
|
|
7
|
+
const CONTEXT_LINES = 50;
|
|
8
|
+
const BINARY_EXTENSIONS = new Set([
|
|
9
|
+
'.png',
|
|
10
|
+
'.jpg',
|
|
11
|
+
'.jpeg',
|
|
12
|
+
'.gif',
|
|
13
|
+
'.bmp',
|
|
14
|
+
'.ico',
|
|
15
|
+
'.webp',
|
|
16
|
+
'.pdf',
|
|
17
|
+
'.zip',
|
|
18
|
+
'.tar',
|
|
19
|
+
'.gz',
|
|
20
|
+
'.bz2',
|
|
21
|
+
'.xz',
|
|
22
|
+
'.7z',
|
|
23
|
+
'.exe',
|
|
24
|
+
'.dll',
|
|
25
|
+
'.so',
|
|
26
|
+
'.dylib',
|
|
27
|
+
'.bin',
|
|
28
|
+
'.wasm',
|
|
29
|
+
'.mp3',
|
|
30
|
+
'.mp4',
|
|
31
|
+
'.wav',
|
|
32
|
+
'.ogg',
|
|
33
|
+
'.avi',
|
|
34
|
+
'.mov',
|
|
35
|
+
'.ttf',
|
|
36
|
+
'.woff',
|
|
37
|
+
'.woff2',
|
|
38
|
+
'.eot',
|
|
39
|
+
'.lock',
|
|
40
|
+
]);
|
|
41
|
+
const GENERATED_PATTERNS = [
|
|
42
|
+
/node_modules\//,
|
|
43
|
+
/\.min\.(js|css)$/,
|
|
44
|
+
/dist\//,
|
|
45
|
+
/build\//,
|
|
46
|
+
/\.d\.ts$/,
|
|
47
|
+
/coverage\//,
|
|
48
|
+
/\.next\//,
|
|
49
|
+
/\.nuxt\//,
|
|
50
|
+
];
|
|
51
|
+
function isBinaryOrGenerated(filePath) {
|
|
52
|
+
const ext = filePath.slice(filePath.lastIndexOf('.')).toLowerCase();
|
|
53
|
+
if (BINARY_EXTENSIONS.has(ext))
|
|
54
|
+
return true;
|
|
55
|
+
return GENERATED_PATTERNS.some((re) => re.test(filePath));
|
|
56
|
+
}
|
|
57
|
+
function extractLinesAround(content, errorLines) {
|
|
58
|
+
if (errorLines.length === 0)
|
|
59
|
+
return content;
|
|
60
|
+
const lines = content.split('\n');
|
|
61
|
+
const included = new Set();
|
|
62
|
+
for (const ln of errorLines) {
|
|
63
|
+
const idx = ln - 1;
|
|
64
|
+
for (let i = Math.max(0, idx - CONTEXT_LINES); i <= Math.min(lines.length - 1, idx + CONTEXT_LINES); i++) {
|
|
65
|
+
included.add(i);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const sorted = [...included].sort((a, b) => a - b);
|
|
69
|
+
const result = [];
|
|
70
|
+
let prev = -1;
|
|
71
|
+
for (const idx of sorted) {
|
|
72
|
+
if (prev !== -1 && idx > prev + 1) {
|
|
73
|
+
result.push(`... (lines ${prev + 2}\u2013${idx} omitted) ...`);
|
|
74
|
+
}
|
|
75
|
+
result.push(lines[idx] ?? '');
|
|
76
|
+
prev = idx;
|
|
77
|
+
}
|
|
78
|
+
return result.join('\n');
|
|
79
|
+
}
|
|
80
|
+
function parseErrorLines(stderr, filePath) {
|
|
81
|
+
const lines = [];
|
|
82
|
+
const escaped = filePath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
83
|
+
const re = new RegExp(`(?:${escaped}|${escaped.split('/').pop() ?? ''})(?::(\\d+)|\\((\\d+),)`, 'g');
|
|
84
|
+
let m;
|
|
85
|
+
while ((m = re.exec(stderr)) !== null) {
|
|
86
|
+
const n = parseInt(m[1] ?? m[2] ?? '', 10);
|
|
87
|
+
if (!isNaN(n) && n > 0)
|
|
88
|
+
lines.push(n);
|
|
89
|
+
}
|
|
90
|
+
return [...new Set(lines)];
|
|
91
|
+
}
|
|
92
|
+
function readFileBounded(absPath) {
|
|
93
|
+
try {
|
|
94
|
+
const stat = statSync(absPath);
|
|
95
|
+
if (!stat.isFile())
|
|
96
|
+
return null;
|
|
97
|
+
if (stat.size > MAX_BYTES_PER_FILE) {
|
|
98
|
+
return (readFileSync(absPath, 'utf-8').slice(0, MAX_BYTES_PER_FILE) +
|
|
99
|
+
`\n... (truncated, file is ${stat.size} bytes) ...`);
|
|
100
|
+
}
|
|
101
|
+
return readFileSync(absPath, 'utf-8');
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function extractDiffFilePaths(diff) {
|
|
108
|
+
const paths = [];
|
|
109
|
+
for (const line of diff.split('\n')) {
|
|
110
|
+
const m = line.match(/^(?:\+\+\+|---) [ab]\/(.+)$/);
|
|
111
|
+
if (m && m[1] && m[1] !== '/dev/null') {
|
|
112
|
+
paths.push(m[1]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return [...new Set(paths)];
|
|
116
|
+
}
|
|
117
|
+
function extractErrorPaths(stderr, cwd) {
|
|
118
|
+
const candidates = new Set();
|
|
119
|
+
const re = /([^\s"']+\.(?:ts|js|tsx|jsx|mts|mjs|cts|cjs))(?:[:|(])/g;
|
|
120
|
+
let m;
|
|
121
|
+
while ((m = re.exec(stderr)) !== null) {
|
|
122
|
+
let p = m[1];
|
|
123
|
+
p = p.replace(/^\.\//, '');
|
|
124
|
+
if (p.startsWith('/')) {
|
|
125
|
+
if (p.startsWith(cwd)) {
|
|
126
|
+
p = p.slice(cwd.length).replace(/^\//, '');
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
candidates.add(p);
|
|
133
|
+
}
|
|
134
|
+
return [...candidates];
|
|
135
|
+
}
|
|
136
|
+
export async function analyzeDiagnostic(input) {
|
|
137
|
+
const { task, cwd, stderr, stdout = '', diff = '', artifactDir } = input;
|
|
138
|
+
const combinedErrorText = [stderr, stdout].filter(Boolean).join('\n');
|
|
139
|
+
const errorPaths = extractErrorPaths(combinedErrorText, cwd);
|
|
140
|
+
const diffPaths = extractDiffFilePaths(diff);
|
|
141
|
+
const taskTargets = task.scope.files ?? [];
|
|
142
|
+
const seen = new Set();
|
|
143
|
+
const ordered = [];
|
|
144
|
+
for (const p of errorPaths) {
|
|
145
|
+
if (!seen.has(p)) {
|
|
146
|
+
seen.add(p);
|
|
147
|
+
ordered.push({ path: p, source: 'error_path' });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
for (const p of diffPaths) {
|
|
151
|
+
if (!seen.has(p)) {
|
|
152
|
+
seen.add(p);
|
|
153
|
+
ordered.push({ path: p, source: 'diff_file' });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
for (const p of taskTargets) {
|
|
157
|
+
const normalised = p.replace(/^\.\//, '');
|
|
158
|
+
if (!seen.has(normalised)) {
|
|
159
|
+
seen.add(normalised);
|
|
160
|
+
ordered.push({ path: normalised, source: 'task_target' });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const eligible = ordered.filter((c) => !isBinaryOrGenerated(c.path));
|
|
164
|
+
const selected = eligible.slice(0, MAX_FILES);
|
|
165
|
+
const entries = [];
|
|
166
|
+
let totalChars = 0;
|
|
167
|
+
for (const candidate of selected) {
|
|
168
|
+
if (totalChars >= MAX_TOTAL_CHARS)
|
|
169
|
+
break;
|
|
170
|
+
const absPath = join(cwd, candidate.path);
|
|
171
|
+
if (!existsSync(absPath))
|
|
172
|
+
continue;
|
|
173
|
+
let content = readFileBounded(absPath);
|
|
174
|
+
if (content === null)
|
|
175
|
+
continue;
|
|
176
|
+
const errorLines = parseErrorLines(combinedErrorText, candidate.path);
|
|
177
|
+
if (errorLines.length > 0) {
|
|
178
|
+
content = extractLinesAround(content, errorLines);
|
|
179
|
+
}
|
|
180
|
+
const remaining = MAX_TOTAL_CHARS - totalChars;
|
|
181
|
+
let truncated = content.length > MAX_BYTES_PER_FILE;
|
|
182
|
+
if (content.length > remaining) {
|
|
183
|
+
content = content.slice(0, remaining) + '\n... (truncated to fit total context limit) ...';
|
|
184
|
+
truncated = true;
|
|
185
|
+
}
|
|
186
|
+
totalChars += content.length;
|
|
187
|
+
entries.push({
|
|
188
|
+
path: candidate.path,
|
|
189
|
+
content,
|
|
190
|
+
truncated,
|
|
191
|
+
source: candidate.source,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
const errorSummary = combinedErrorText.slice(0, 2000);
|
|
195
|
+
const result = {
|
|
196
|
+
schema_version: 1,
|
|
197
|
+
task_id: task.id,
|
|
198
|
+
error_summary: errorSummary,
|
|
199
|
+
files: entries,
|
|
200
|
+
total_chars: totalChars,
|
|
201
|
+
file_count: entries.length,
|
|
202
|
+
caps_applied: {
|
|
203
|
+
max_files: MAX_FILES,
|
|
204
|
+
max_bytes_per_file: MAX_BYTES_PER_FILE,
|
|
205
|
+
max_total_chars: MAX_TOTAL_CHARS,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
if (artifactDir) {
|
|
209
|
+
const artifactPath = join(artifactDir, 'diagnostic.json');
|
|
210
|
+
try {
|
|
211
|
+
validateDiagnosticResult(result);
|
|
212
|
+
writeAtomic(artifactPath, JSON.stringify(result, null, 2) + '\n');
|
|
213
|
+
result.artifact_path = artifactPath;
|
|
214
|
+
}
|
|
215
|
+
catch { }
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
function validateDiagnosticResult(result) {
|
|
220
|
+
if (typeof result !== 'object' || result === null) {
|
|
221
|
+
throw new Error('DiagnosticResult must be an object');
|
|
222
|
+
}
|
|
223
|
+
const r = result;
|
|
224
|
+
if (r['schema_version'] !== 1)
|
|
225
|
+
throw new Error('schema_version must be 1');
|
|
226
|
+
if (typeof r['task_id'] !== 'string')
|
|
227
|
+
throw new Error('task_id must be a string');
|
|
228
|
+
if (typeof r['error_summary'] !== 'string')
|
|
229
|
+
throw new Error('error_summary must be a string');
|
|
230
|
+
if (!Array.isArray(r['files']))
|
|
231
|
+
throw new Error('files must be an array');
|
|
232
|
+
for (const f of r['files']) {
|
|
233
|
+
if (typeof f !== 'object' || f === null)
|
|
234
|
+
throw new Error('each file entry must be an object');
|
|
235
|
+
const fe = f;
|
|
236
|
+
if (typeof fe['path'] !== 'string')
|
|
237
|
+
throw new Error('file.path must be a string');
|
|
238
|
+
if (typeof fe['content'] !== 'string')
|
|
239
|
+
throw new Error('file.content must be a string');
|
|
240
|
+
if (typeof fe['truncated'] !== 'boolean')
|
|
241
|
+
throw new Error('file.truncated must be a boolean');
|
|
242
|
+
}
|
|
243
|
+
JSON.parse(JSON.stringify(result));
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Classifies a worker output failure into one of the defined failure classes.
|
|
247
|
+
*
|
|
248
|
+
* Classification rules (evaluated in order):
|
|
249
|
+
* 1. truncated_json — raw content ends mid-structure (last non-whitespace char is not a closing bracket/brace/quote)
|
|
250
|
+
* 2. malformed_json — JSON.parse throws
|
|
251
|
+
* 3. missing_schema_version — parsed OK but schema_version !== 1
|
|
252
|
+
* 4. invalid_payload_shape — any other structural violation (wrong task_id, missing files array, etc.)
|
|
253
|
+
*/
|
|
254
|
+
export function classifyWorkerOutputFailure(rawContent, errorMessage) {
|
|
255
|
+
// Check for truncated JSON first: content that looks like it started JSON but was cut off
|
|
256
|
+
const trimmed = rawContent.trim();
|
|
257
|
+
if (trimmed.length > 0 && trimmed.startsWith('{')) {
|
|
258
|
+
// Try to parse; if it fails check if it looks truncated
|
|
259
|
+
try {
|
|
260
|
+
JSON.parse(trimmed);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// Heuristic: truncated if the last meaningful char is not a valid JSON terminator
|
|
264
|
+
const lastChar = trimmed[trimmed.length - 1];
|
|
265
|
+
// 'true' ends in 'e', 'false' in 'e', 'null' in 'l'
|
|
266
|
+
// A truly truncated JSON object won't end with '}'
|
|
267
|
+
if (lastChar !== '}' && lastChar !== ']') {
|
|
268
|
+
return 'truncated_json';
|
|
269
|
+
}
|
|
270
|
+
return 'malformed_json';
|
|
271
|
+
}
|
|
272
|
+
// Parsed OK — check schema_version
|
|
273
|
+
const parsed = JSON.parse(trimmed);
|
|
274
|
+
if (parsed['schema_version'] !== 1) {
|
|
275
|
+
return 'missing_schema_version';
|
|
276
|
+
}
|
|
277
|
+
return 'invalid_payload_shape';
|
|
278
|
+
}
|
|
279
|
+
// Content doesn't start with '{' but is non-empty
|
|
280
|
+
if (trimmed.length > 0) {
|
|
281
|
+
// Try JSON parse anyway
|
|
282
|
+
try {
|
|
283
|
+
const parsed = JSON.parse(trimmed);
|
|
284
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
285
|
+
if (parsed['schema_version'] !== 1) {
|
|
286
|
+
return 'missing_schema_version';
|
|
287
|
+
}
|
|
288
|
+
return 'invalid_payload_shape';
|
|
289
|
+
}
|
|
290
|
+
return 'malformed_json';
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
return 'malformed_json';
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Empty content or provider/transport related messages
|
|
297
|
+
if (errorMessage.includes('empty') ||
|
|
298
|
+
errorMessage.includes('timeout') ||
|
|
299
|
+
errorMessage.includes('network') ||
|
|
300
|
+
errorMessage.includes('HTTP ')) {
|
|
301
|
+
return 'provider_transport_failure';
|
|
302
|
+
}
|
|
303
|
+
return 'malformed_json';
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Builds a WorkerOutputFailureEvent for persistence as a task artifact.
|
|
307
|
+
*/
|
|
308
|
+
export function buildWorkerOutputFailureEvent(taskId, rawContent, errorMessage) {
|
|
309
|
+
const failureClass = classifyWorkerOutputFailure(rawContent, errorMessage);
|
|
310
|
+
const preview = rawContent.slice(0, 500);
|
|
311
|
+
return {
|
|
312
|
+
schema_version: 1,
|
|
313
|
+
task_id: taskId,
|
|
314
|
+
failure_class: failureClass,
|
|
315
|
+
message: errorMessage,
|
|
316
|
+
raw_content_length: rawContent.length,
|
|
317
|
+
raw_content_preview: preview,
|
|
318
|
+
timestamp: new Date().toISOString(),
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Persists a WorkerOutputFailureEvent to <artifactDir>/worker_output_failure.json.
|
|
323
|
+
*/
|
|
324
|
+
export function persistWorkerOutputFailureEvent(artifactDir, event) {
|
|
325
|
+
const eventPath = join(artifactDir, 'worker_output_failure.json');
|
|
326
|
+
writeJson(eventPath, event);
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=diagnostic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../src/diagnostic.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface DoctorCheck {
|
|
2
|
+
name: string;
|
|
3
|
+
passed: boolean;
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export interface DoctorOptions {
|
|
7
|
+
repoRoot: string;
|
|
8
|
+
stwRoot: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Minimum known-good Claude Code version for live agentic verification.
|
|
12
|
+
* Versions below this may not support required features.
|
|
13
|
+
*/
|
|
14
|
+
export declare const MIN_CLAUDE_CODE_VERSION = "1.0.34";
|
|
15
|
+
/**
|
|
16
|
+
* Checks if Claude Code is installed and meets minimum version requirement.
|
|
17
|
+
* Returns version info if available, or null if not available/too old.
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkClaudeCodeVersion(): {
|
|
20
|
+
available: boolean;
|
|
21
|
+
version: string | null;
|
|
22
|
+
parsedVersion: {
|
|
23
|
+
major: number;
|
|
24
|
+
minor: number;
|
|
25
|
+
patch: number;
|
|
26
|
+
} | null;
|
|
27
|
+
meetsMinimum: boolean;
|
|
28
|
+
ready: boolean;
|
|
29
|
+
message: string;
|
|
30
|
+
};
|
|
31
|
+
export declare function runDoctor(options: DoctorOptions): DoctorCheck[];
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { loadConfig, resolveAllAgenticBackends, getDefaultAgenticBackend } from './config.js';
|
|
5
|
+
import { listOrphanedWorktrees } from './worktree-cleanup.js';
|
|
6
|
+
/**
|
|
7
|
+
* Minimum known-good Claude Code version for live agentic verification.
|
|
8
|
+
* Versions below this may not support required features.
|
|
9
|
+
*/
|
|
10
|
+
export const MIN_CLAUDE_CODE_VERSION = '1.0.34';
|
|
11
|
+
/**
|
|
12
|
+
* Parses a Claude Code version string into comparable components.
|
|
13
|
+
* Handles formats like "1.0.34", "v1.0.34", "Claude Code 1.0.34", etc.
|
|
14
|
+
*/
|
|
15
|
+
function parseClaudeCodeVersion(versionOutput) {
|
|
16
|
+
// Match various version formats: 1.0.34, v1.0.34, Claude Code 1.0.34, etc.
|
|
17
|
+
const match = versionOutput.match(/(\d+)\.(\d+)\.(\d+)/);
|
|
18
|
+
if (!match)
|
|
19
|
+
return null;
|
|
20
|
+
return {
|
|
21
|
+
major: parseInt(match[1], 10),
|
|
22
|
+
minor: parseInt(match[2], 10),
|
|
23
|
+
patch: parseInt(match[3], 10),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Compares two version objects. Returns:
|
|
28
|
+
* - negative if a < b
|
|
29
|
+
* - zero if a === b
|
|
30
|
+
* - positive if a > b
|
|
31
|
+
*/
|
|
32
|
+
function compareVersions(a, b) {
|
|
33
|
+
if (a.major !== b.major)
|
|
34
|
+
return a.major - b.major;
|
|
35
|
+
if (a.minor !== b.minor)
|
|
36
|
+
return a.minor - b.minor;
|
|
37
|
+
return a.patch - b.patch;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Checks if Claude Code is installed and meets minimum version requirement.
|
|
41
|
+
* Returns version info if available, or null if not available/too old.
|
|
42
|
+
*/
|
|
43
|
+
export function checkClaudeCodeVersion() {
|
|
44
|
+
const command = 'claude';
|
|
45
|
+
// Try to get version using 'claude --version'
|
|
46
|
+
let versionOutput;
|
|
47
|
+
try {
|
|
48
|
+
versionOutput = execFileSync(command, ['--version'], {
|
|
49
|
+
encoding: 'utf-8',
|
|
50
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Try alternative: 'claude version' subcommand
|
|
55
|
+
try {
|
|
56
|
+
versionOutput = execFileSync(command, ['version'], {
|
|
57
|
+
encoding: 'utf-8',
|
|
58
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Claude Code not installed or not responding to version queries
|
|
63
|
+
return {
|
|
64
|
+
available: false,
|
|
65
|
+
version: null,
|
|
66
|
+
parsedVersion: null,
|
|
67
|
+
meetsMinimum: false,
|
|
68
|
+
ready: false,
|
|
69
|
+
message: `Claude Code not available - 'claude' command not found or not responding to --version`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const version = versionOutput.trim();
|
|
74
|
+
const parsedVersion = parseClaudeCodeVersion(version);
|
|
75
|
+
if (!parsedVersion) {
|
|
76
|
+
return {
|
|
77
|
+
available: true,
|
|
78
|
+
version: version || 'unknown',
|
|
79
|
+
parsedVersion: null,
|
|
80
|
+
meetsMinimum: false,
|
|
81
|
+
ready: false,
|
|
82
|
+
message: `Claude Code found but version could not be parsed from: ${version || '(empty)'}`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const minVersion = parseClaudeCodeVersion(MIN_CLAUDE_CODE_VERSION);
|
|
86
|
+
const meetsMinimum = minVersion ? compareVersions(parsedVersion, minVersion) >= 0 : false;
|
|
87
|
+
if (!meetsMinimum) {
|
|
88
|
+
return {
|
|
89
|
+
available: true,
|
|
90
|
+
version,
|
|
91
|
+
parsedVersion,
|
|
92
|
+
meetsMinimum: false,
|
|
93
|
+
ready: false,
|
|
94
|
+
message: `Claude Code version ${version} is below minimum required ${MIN_CLAUDE_CODE_VERSION}`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
available: true,
|
|
99
|
+
version,
|
|
100
|
+
parsedVersion,
|
|
101
|
+
meetsMinimum: true,
|
|
102
|
+
ready: true,
|
|
103
|
+
message: `Claude Code version ${version} (meets minimum ${MIN_CLAUDE_CODE_VERSION})`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export function runDoctor(options) {
|
|
107
|
+
const checks = [];
|
|
108
|
+
try {
|
|
109
|
+
execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {
|
|
110
|
+
cwd: options.repoRoot,
|
|
111
|
+
encoding: 'utf-8',
|
|
112
|
+
stdio: 'pipe',
|
|
113
|
+
});
|
|
114
|
+
checks.push({ name: 'git-repo', passed: true, message: 'Git repository found' });
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
checks.push({ name: 'git-repo', passed: false, message: 'Not inside a git repository' });
|
|
118
|
+
}
|
|
119
|
+
const configPath = join(options.stwRoot, 'config.yml');
|
|
120
|
+
if (existsSync(configPath)) {
|
|
121
|
+
checks.push({ name: 'config', passed: true, message: 'config.yml found' });
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
checks.push({ name: 'config', passed: false, message: 'config.yml not found' });
|
|
125
|
+
}
|
|
126
|
+
// Check API keys from config
|
|
127
|
+
if (existsSync(configPath)) {
|
|
128
|
+
try {
|
|
129
|
+
const config = loadConfig(configPath);
|
|
130
|
+
for (const [providerName, providerDef] of Object.entries(config.providers)) {
|
|
131
|
+
const envVar = providerDef.api_key_env;
|
|
132
|
+
if (process.env[envVar]) {
|
|
133
|
+
checks.push({ name: `api-key-${providerName}`, passed: true, message: `${envVar} is set` });
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
checks.push({
|
|
137
|
+
name: `api-key-${providerName}`,
|
|
138
|
+
passed: false,
|
|
139
|
+
message: `${envVar} is not set — run: export ${envVar}=your-key`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Config load will be checked separately
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Only check glab auth if config has a gitlab section
|
|
149
|
+
let hasGitlabConfig = false;
|
|
150
|
+
if (existsSync(configPath)) {
|
|
151
|
+
try {
|
|
152
|
+
const config = loadConfig(configPath);
|
|
153
|
+
hasGitlabConfig = !!config.gitlab;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Config load errors handled elsewhere
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (hasGitlabConfig) {
|
|
160
|
+
try {
|
|
161
|
+
execFileSync('glab', ['auth', 'status'], {
|
|
162
|
+
cwd: options.repoRoot,
|
|
163
|
+
encoding: 'utf-8',
|
|
164
|
+
stdio: 'pipe',
|
|
165
|
+
});
|
|
166
|
+
checks.push({ name: 'glab-auth', passed: true, message: 'glab authenticated' });
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
checks.push({ name: 'glab-auth', passed: false, message: 'glab not authenticated - run: glab auth login' });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Check Claude Code version and readiness for live verification
|
|
173
|
+
const claudeCheck = checkClaudeCodeVersion();
|
|
174
|
+
checks.push({
|
|
175
|
+
name: 'claude-code-version',
|
|
176
|
+
passed: claudeCheck.ready,
|
|
177
|
+
message: claudeCheck.message,
|
|
178
|
+
});
|
|
179
|
+
if (existsSync(configPath)) {
|
|
180
|
+
try {
|
|
181
|
+
const config = loadConfig(configPath);
|
|
182
|
+
const selectedBackend = getDefaultAgenticBackend(config);
|
|
183
|
+
const backendChecks = resolveAllAgenticBackends(config, { cwd: options.repoRoot }).map((resolution) => {
|
|
184
|
+
const selectedSuffix = resolution.backend === selectedBackend ? '; selected default backend' : '';
|
|
185
|
+
const configPathMessage = resolution.configPath
|
|
186
|
+
? `config path ${resolution.configPathSource === 'config' ? 'from config' : 'default'}: ${resolution.configPath} (${resolution.configExists ? 'found' : 'missing'} at ${resolution.resolvedConfigPath})`
|
|
187
|
+
: 'no config path';
|
|
188
|
+
return {
|
|
189
|
+
name: `agentic-${resolution.backend}`,
|
|
190
|
+
passed: resolution.available,
|
|
191
|
+
message: resolution.available
|
|
192
|
+
? `available via command ${resolution.commandSource === 'config' ? 'from config' : 'default'}: ${resolution.command}; ${configPathMessage}${selectedSuffix}`
|
|
193
|
+
: `unavailable via command ${resolution.commandSource === 'config' ? 'from config' : 'default'}: ${resolution.command}; ${configPathMessage}; ${resolution.installHint}${selectedSuffix}`,
|
|
194
|
+
};
|
|
195
|
+
});
|
|
196
|
+
checks.push(...backendChecks);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
200
|
+
checks.push({
|
|
201
|
+
name: 'agentic-backends',
|
|
202
|
+
passed: false,
|
|
203
|
+
message: `Could not inspect agentic backends: ${message}`,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
const orphans = listOrphanedWorktrees(options.repoRoot);
|
|
209
|
+
if (orphans.length > 0) {
|
|
210
|
+
checks.push({
|
|
211
|
+
name: 'worktrees',
|
|
212
|
+
passed: false,
|
|
213
|
+
message: `${orphans.length} orphaned worktree(s) - run: stw cleanup`,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
checks.push({ name: 'worktrees', passed: true, message: 'No orphaned worktrees' });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
checks.push({ name: 'worktrees', passed: false, message: 'Could not check worktrees' });
|
|
222
|
+
}
|
|
223
|
+
return checks;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/drift.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface DriftCheckOptions {
|
|
2
|
+
repoRoot: string;
|
|
3
|
+
baseBranch: string;
|
|
4
|
+
runBranch: string;
|
|
5
|
+
}
|
|
6
|
+
export interface DriftCheckResult {
|
|
7
|
+
hasConflicts: boolean;
|
|
8
|
+
conflictFiles: string[];
|
|
9
|
+
mergeTreeOutput: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function checkDrift(options: DriftCheckOptions): DriftCheckResult;
|