@haoyiyin/workflow 0.2.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/README.md +168 -0
- package/SETUP.md +71 -0
- package/SKILL.md +68 -0
- package/USAGE.md +152 -0
- package/dist/bin/yi-workflow.d.ts +3 -0
- package/dist/bin/yi-workflow.d.ts.map +1 -0
- package/dist/bin/yi-workflow.js +39 -0
- package/dist/bin/yi-workflow.js.map +1 -0
- package/dist/src/agents/contracts.d.ts +120 -0
- package/dist/src/agents/contracts.d.ts.map +1 -0
- package/dist/src/agents/contracts.js +431 -0
- package/dist/src/agents/contracts.js.map +1 -0
- package/dist/src/agents/dispatcher-enhanced.d.ts +68 -0
- package/dist/src/agents/dispatcher-enhanced.d.ts.map +1 -0
- package/dist/src/agents/dispatcher-enhanced.js +290 -0
- package/dist/src/agents/dispatcher-enhanced.js.map +1 -0
- package/dist/src/agents/dispatcher.d.ts +107 -0
- package/dist/src/agents/dispatcher.d.ts.map +1 -0
- package/dist/src/agents/dispatcher.js +454 -0
- package/dist/src/agents/dispatcher.js.map +1 -0
- package/dist/src/agents/index.d.ts +11 -0
- package/dist/src/agents/index.d.ts.map +1 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/index.js.map +1 -0
- package/dist/src/agents/resilience.d.ts +86 -0
- package/dist/src/agents/resilience.d.ts.map +1 -0
- package/dist/src/agents/resilience.js +183 -0
- package/dist/src/agents/resilience.js.map +1 -0
- package/dist/src/agents/token-budget.d.ts +47 -0
- package/dist/src/agents/token-budget.d.ts.map +1 -0
- package/dist/src/agents/token-budget.js +63 -0
- package/dist/src/agents/token-budget.js.map +1 -0
- package/dist/src/agents/types.d.ts +59 -0
- package/dist/src/agents/types.d.ts.map +1 -0
- package/dist/src/agents/types.js +5 -0
- package/dist/src/agents/types.js.map +1 -0
- package/dist/src/guard/main-agent.d.ts +72 -0
- package/dist/src/guard/main-agent.d.ts.map +1 -0
- package/dist/src/guard/main-agent.js +184 -0
- package/dist/src/guard/main-agent.js.map +1 -0
- package/dist/src/hooks/builtin/index.d.ts +9 -0
- package/dist/src/hooks/builtin/index.d.ts.map +1 -0
- package/dist/src/hooks/builtin/index.js +9 -0
- package/dist/src/hooks/builtin/index.js.map +1 -0
- package/dist/src/hooks/builtin/on-error.d.ts +7 -0
- package/dist/src/hooks/builtin/on-error.d.ts.map +1 -0
- package/dist/src/hooks/builtin/on-error.js +15 -0
- package/dist/src/hooks/builtin/on-error.js.map +1 -0
- package/dist/src/hooks/builtin/post-execute.d.ts +7 -0
- package/dist/src/hooks/builtin/post-execute.d.ts.map +1 -0
- package/dist/src/hooks/builtin/post-execute.js +30 -0
- package/dist/src/hooks/builtin/post-execute.js.map +1 -0
- package/dist/src/hooks/builtin/post-plan.d.ts +7 -0
- package/dist/src/hooks/builtin/post-plan.d.ts.map +1 -0
- package/dist/src/hooks/builtin/post-plan.js +15 -0
- package/dist/src/hooks/builtin/post-plan.js.map +1 -0
- package/dist/src/hooks/builtin/pre-execute.d.ts +7 -0
- package/dist/src/hooks/builtin/pre-execute.d.ts.map +1 -0
- package/dist/src/hooks/builtin/pre-execute.js +22 -0
- package/dist/src/hooks/builtin/pre-execute.js.map +1 -0
- package/dist/src/hooks/builtin/pre-plan.d.ts +7 -0
- package/dist/src/hooks/builtin/pre-plan.d.ts.map +1 -0
- package/dist/src/hooks/builtin/pre-plan.js +19 -0
- package/dist/src/hooks/builtin/pre-plan.js.map +1 -0
- package/dist/src/hooks/index.d.ts +8 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +4 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/loader.d.ts +16 -0
- package/dist/src/hooks/loader.d.ts.map +1 -0
- package/dist/src/hooks/loader.js +77 -0
- package/dist/src/hooks/loader.js.map +1 -0
- package/dist/src/hooks/manager.d.ts +20 -0
- package/dist/src/hooks/manager.d.ts.map +1 -0
- package/dist/src/hooks/manager.js +76 -0
- package/dist/src/hooks/manager.js.map +1 -0
- package/dist/src/hooks/types-enhanced.d.ts +30 -0
- package/dist/src/hooks/types-enhanced.d.ts.map +1 -0
- package/dist/src/hooks/types-enhanced.js +22 -0
- package/dist/src/hooks/types-enhanced.js.map +1 -0
- package/dist/src/hooks/types.d.ts +27 -0
- package/dist/src/hooks/types.d.ts.map +1 -0
- package/dist/src/hooks/types.js +2 -0
- package/dist/src/hooks/types.js.map +1 -0
- package/dist/src/index.d.ts +43 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +41 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/persistence/index.d.ts +7 -0
- package/dist/src/persistence/index.d.ts.map +1 -0
- package/dist/src/persistence/index.js +6 -0
- package/dist/src/persistence/index.js.map +1 -0
- package/dist/src/persistence/plan-md.d.ts +11 -0
- package/dist/src/persistence/plan-md.d.ts.map +1 -0
- package/dist/src/persistence/plan-md.js +125 -0
- package/dist/src/persistence/plan-md.js.map +1 -0
- package/dist/src/persistence/state-md.d.ts +17 -0
- package/dist/src/persistence/state-md.d.ts.map +1 -0
- package/dist/src/persistence/state-md.js +143 -0
- package/dist/src/persistence/state-md.js.map +1 -0
- package/dist/src/persistence/types.d.ts +85 -0
- package/dist/src/persistence/types.d.ts.map +1 -0
- package/dist/src/persistence/types.js +5 -0
- package/dist/src/persistence/types.js.map +1 -0
- package/dist/src/router/classifier.d.ts +108 -0
- package/dist/src/router/classifier.d.ts.map +1 -0
- package/dist/src/router/classifier.js +476 -0
- package/dist/src/router/classifier.js.map +1 -0
- package/dist/src/router/guard.d.ts +128 -0
- package/dist/src/router/guard.d.ts.map +1 -0
- package/dist/src/router/guard.js +370 -0
- package/dist/src/router/guard.js.map +1 -0
- package/dist/src/router/index.d.ts +10 -0
- package/dist/src/router/index.d.ts.map +1 -0
- package/dist/src/router/index.js +8 -0
- package/dist/src/router/index.js.map +1 -0
- package/dist/src/router/router.d.ts +58 -0
- package/dist/src/router/router.d.ts.map +1 -0
- package/dist/src/router/router.js +78 -0
- package/dist/src/router/router.js.map +1 -0
- package/dist/src/router/types.d.ts +100 -0
- package/dist/src/router/types.d.ts.map +1 -0
- package/dist/src/router/types.js +24 -0
- package/dist/src/router/types.js.map +1 -0
- package/dist/src/skills/agents-md/index.d.ts +9 -0
- package/dist/src/skills/agents-md/index.d.ts.map +1 -0
- package/dist/src/skills/agents-md/index.js +28 -0
- package/dist/src/skills/agents-md/index.js.map +1 -0
- package/dist/src/skills/execute-plan/index.d.ts +141 -0
- package/dist/src/skills/execute-plan/index.d.ts.map +1 -0
- package/dist/src/skills/execute-plan/index.js +784 -0
- package/dist/src/skills/execute-plan/index.js.map +1 -0
- package/dist/src/skills/index.d.ts +14 -0
- package/dist/src/skills/index.d.ts.map +1 -0
- package/dist/src/skills/index.js +10 -0
- package/dist/src/skills/index.js.map +1 -0
- package/dist/src/skills/quick-task/index.d.ts +75 -0
- package/dist/src/skills/quick-task/index.d.ts.map +1 -0
- package/dist/src/skills/quick-task/index.js +284 -0
- package/dist/src/skills/quick-task/index.js.map +1 -0
- package/dist/src/skills/registry.d.ts +15 -0
- package/dist/src/skills/registry.d.ts.map +1 -0
- package/dist/src/skills/registry.js +44 -0
- package/dist/src/skills/registry.js.map +1 -0
- package/dist/src/skills/review-diff/index.d.ts +96 -0
- package/dist/src/skills/review-diff/index.d.ts.map +1 -0
- package/dist/src/skills/review-diff/index.js +316 -0
- package/dist/src/skills/review-diff/index.js.map +1 -0
- package/dist/src/skills/skill.d.ts +24 -0
- package/dist/src/skills/skill.d.ts.map +1 -0
- package/dist/src/skills/skill.js +39 -0
- package/dist/src/skills/skill.js.map +1 -0
- package/dist/src/skills/systematic-debugging/index.d.ts +90 -0
- package/dist/src/skills/systematic-debugging/index.d.ts.map +1 -0
- package/dist/src/skills/systematic-debugging/index.js +305 -0
- package/dist/src/skills/systematic-debugging/index.js.map +1 -0
- package/dist/src/skills/tdd/index.d.ts +103 -0
- package/dist/src/skills/tdd/index.d.ts.map +1 -0
- package/dist/src/skills/tdd/index.js +338 -0
- package/dist/src/skills/tdd/index.js.map +1 -0
- package/dist/src/skills/to-plan/index-enhanced.d.ts +100 -0
- package/dist/src/skills/to-plan/index-enhanced.d.ts.map +1 -0
- package/dist/src/skills/to-plan/index-enhanced.js +452 -0
- package/dist/src/skills/to-plan/index-enhanced.js.map +1 -0
- package/dist/src/skills/to-plan/index.d.ts +131 -0
- package/dist/src/skills/to-plan/index.d.ts.map +1 -0
- package/dist/src/skills/to-plan/index.js +460 -0
- package/dist/src/skills/to-plan/index.js.map +1 -0
- package/dist/src/skills/types.d.ts +44 -0
- package/dist/src/skills/types.d.ts.map +1 -0
- package/dist/src/skills/types.js +2 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/state/cleanup.d.ts +22 -0
- package/dist/src/state/cleanup.d.ts.map +1 -0
- package/dist/src/state/cleanup.js +87 -0
- package/dist/src/state/cleanup.js.map +1 -0
- package/dist/src/state/index.d.ts +9 -0
- package/dist/src/state/index.d.ts.map +1 -0
- package/dist/src/state/index.js +5 -0
- package/dist/src/state/index.js.map +1 -0
- package/dist/src/state/manager.d.ts +15 -0
- package/dist/src/state/manager.d.ts.map +1 -0
- package/dist/src/state/manager.js +73 -0
- package/dist/src/state/manager.js.map +1 -0
- package/dist/src/state/persistence.d.ts +13 -0
- package/dist/src/state/persistence.d.ts.map +1 -0
- package/dist/src/state/persistence.js +68 -0
- package/dist/src/state/persistence.js.map +1 -0
- package/dist/src/state/types.d.ts +26 -0
- package/dist/src/state/types.d.ts.map +1 -0
- package/dist/src/state/types.js +2 -0
- package/dist/src/state/types.js.map +1 -0
- package/dist/src/state/validator.d.ts +12 -0
- package/dist/src/state/validator.d.ts.map +1 -0
- package/dist/src/state/validator.js +56 -0
- package/dist/src/state/validator.js.map +1 -0
- package/dist/src/types.d.ts +83 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/compress.d.ts +37 -0
- package/dist/src/utils/compress.d.ts.map +1 -0
- package/dist/src/utils/compress.js +298 -0
- package/dist/src/utils/compress.js.map +1 -0
- package/dist/src/utils/git.d.ts +9 -0
- package/dist/src/utils/git.d.ts.map +1 -0
- package/dist/src/utils/git.js +81 -0
- package/dist/src/utils/git.js.map +1 -0
- package/dist/src/utils/index.d.ts +7 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +7 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +6 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +19 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/paths.d.ts +12 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +44 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/package.json +76 -0
- package/scripts/postinstall.js +69 -0
- package/yi-workflow.js +17 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TDD Skill - Enforces RED/GREEN/REFACTOR cycle via subagent dispatch
|
|
3
|
+
*
|
|
4
|
+
* Use case: Implement feature with test-first approach
|
|
5
|
+
* Pattern: RED (write failing test) → GREEN (minimal implementation) →
|
|
6
|
+
* REFACTOR (improve while green) → VERIFY (full suite)
|
|
7
|
+
*
|
|
8
|
+
* Spawns implementer subagent with TDD contract at each phase.
|
|
9
|
+
* Enforces the cycle: no implementation before a failing test exists.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { Skill } from '../skill.js';
|
|
13
|
+
import { createDispatcher } from '../../agents/dispatcher.js';
|
|
14
|
+
import { createMainAgentGuard } from '../../guard/main-agent.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Schemas
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
const TDDInputSchema = z.object({
|
|
19
|
+
behavior: z.string().min(1, 'Behavior to implement is required'),
|
|
20
|
+
testFile: z.string().optional(),
|
|
21
|
+
targetFile: z.string().min(1, 'Target implementation file is required'),
|
|
22
|
+
testLevel: z
|
|
23
|
+
.enum(['unit', 'integration', 'e2e', 'contract'])
|
|
24
|
+
.default('unit'),
|
|
25
|
+
model: z.string().optional(),
|
|
26
|
+
});
|
|
27
|
+
const PhaseResultSchema = z.object({
|
|
28
|
+
phase: z.enum(['red', 'green', 'refactor']),
|
|
29
|
+
status: z.enum(['pass', 'fail', 'skipped']),
|
|
30
|
+
command: z.string(),
|
|
31
|
+
evidence: z.string(),
|
|
32
|
+
});
|
|
33
|
+
const TDDOutputSchema = z.object({
|
|
34
|
+
status: z.enum(['success', 'failure', 'invalid-red']),
|
|
35
|
+
phases: z.array(PhaseResultSchema),
|
|
36
|
+
broaderVerification: z.object({
|
|
37
|
+
command: z.string(),
|
|
38
|
+
result: z.enum(['PASS', 'FAIL', 'NOT_RUN']),
|
|
39
|
+
}),
|
|
40
|
+
filesModified: z.array(z.string()),
|
|
41
|
+
summary: z.string(),
|
|
42
|
+
tokensUsed: z.number(),
|
|
43
|
+
});
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Prompt builders (pure functions)
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
function buildRedPrompt(behavior, targetFile, testFile, testLevel) {
|
|
48
|
+
return [
|
|
49
|
+
`## TDD Phase: RED - Write Failing Test`,
|
|
50
|
+
'',
|
|
51
|
+
`**Behavior**: ${behavior}`,
|
|
52
|
+
`**Test Level**: ${testLevel}`,
|
|
53
|
+
`**Target File**: ${targetFile}`,
|
|
54
|
+
testFile ? `**Test File**: ${testFile}` : '',
|
|
55
|
+
'',
|
|
56
|
+
'## Instructions',
|
|
57
|
+
'',
|
|
58
|
+
'1. Read the target file to understand current state',
|
|
59
|
+
'2. Write a minimal, focused test that MUST fail',
|
|
60
|
+
'3. The test should describe the expected behavior precisely',
|
|
61
|
+
'4. Run the test and confirm it FAILS for the RIGHT reason',
|
|
62
|
+
'',
|
|
63
|
+
'## Validation',
|
|
64
|
+
'',
|
|
65
|
+
'- Test must fail because the behavior is NOT yet implemented',
|
|
66
|
+
'- If the test PASSES immediately, the behavior may already exist',
|
|
67
|
+
'- If test fails due to setup/syntax error, fix the test first',
|
|
68
|
+
'',
|
|
69
|
+
'## Anti-Goals',
|
|
70
|
+
'',
|
|
71
|
+
'- Do NOT implement the feature',
|
|
72
|
+
'- Do NOT write more than one test',
|
|
73
|
+
'- Do NOT modify the target file',
|
|
74
|
+
'',
|
|
75
|
+
'## Output',
|
|
76
|
+
'',
|
|
77
|
+
'Report: test file path, test command used, test output (must show FAIL).',
|
|
78
|
+
'If test unexpectedly passes, output: INVALID_RED',
|
|
79
|
+
]
|
|
80
|
+
.filter(Boolean)
|
|
81
|
+
.join('\n');
|
|
82
|
+
}
|
|
83
|
+
function buildGreenPrompt(behavior, targetFile, testFile, redEvidence) {
|
|
84
|
+
return [
|
|
85
|
+
`## TDD Phase: GREEN - Make Test Pass`,
|
|
86
|
+
'',
|
|
87
|
+
`**Behavior**: ${behavior}`,
|
|
88
|
+
`**Target File**: ${targetFile}`,
|
|
89
|
+
testFile ? `**Test File**: ${testFile}` : '',
|
|
90
|
+
'',
|
|
91
|
+
'## RED Phase Evidence',
|
|
92
|
+
redEvidence.slice(0, 500),
|
|
93
|
+
'',
|
|
94
|
+
'## Instructions',
|
|
95
|
+
'',
|
|
96
|
+
'1. Read the failing test to understand what is expected',
|
|
97
|
+
'2. Write the MINIMAL code to make the test pass',
|
|
98
|
+
'3. Code can be hacky, hardcoded, or ugly — refactor comes next',
|
|
99
|
+
'4. Run the test and confirm it PASSES',
|
|
100
|
+
'',
|
|
101
|
+
'## Anti-Goals',
|
|
102
|
+
'',
|
|
103
|
+
'- Do NOT refactor or prettify the code',
|
|
104
|
+
'- Do NOT add features beyond what the test checks',
|
|
105
|
+
'- Do NOT change the test',
|
|
106
|
+
'- Do NOT write additional tests',
|
|
107
|
+
'',
|
|
108
|
+
'## Output',
|
|
109
|
+
'',
|
|
110
|
+
'Report: implementation summary, test command, test output (must show PASS).',
|
|
111
|
+
].join('\n');
|
|
112
|
+
}
|
|
113
|
+
function buildRefactorPrompt(targetFile) {
|
|
114
|
+
return [
|
|
115
|
+
`## TDD Phase: REFACTOR - Clean Up`,
|
|
116
|
+
'',
|
|
117
|
+
`**Target File**: ${targetFile}`,
|
|
118
|
+
'',
|
|
119
|
+
'## Instructions',
|
|
120
|
+
'',
|
|
121
|
+
'1. Read the current implementation',
|
|
122
|
+
'2. Improve code quality: remove duplication, better naming, extract helpers',
|
|
123
|
+
'3. Run tests after EACH change to stay green',
|
|
124
|
+
'4. Run the full test suite at the end',
|
|
125
|
+
'',
|
|
126
|
+
'## Allowed',
|
|
127
|
+
'',
|
|
128
|
+
'- Rename variables/functions for clarity',
|
|
129
|
+
'- Extract repeated logic into helper functions',
|
|
130
|
+
'- Add type annotations',
|
|
131
|
+
'- Reorganize code for readability',
|
|
132
|
+
'',
|
|
133
|
+
'## Anti-Goals',
|
|
134
|
+
'',
|
|
135
|
+
'- Do NOT change behavior',
|
|
136
|
+
'- Do NOT add new features',
|
|
137
|
+
'- Do NOT modify test expectations',
|
|
138
|
+
'- Do NOT break any test',
|
|
139
|
+
'',
|
|
140
|
+
'## Output',
|
|
141
|
+
'',
|
|
142
|
+
'Report: what was refactored, test command, test output (must show ALL PASS).',
|
|
143
|
+
].join('\n');
|
|
144
|
+
}
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// Skill class
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
export class TDDSkill extends Skill {
|
|
149
|
+
constructor() {
|
|
150
|
+
super({
|
|
151
|
+
name: 'tdd',
|
|
152
|
+
description: 'Enforce RED/GREEN/REFACTOR TDD cycle with isolated implementer subagents',
|
|
153
|
+
requires: [],
|
|
154
|
+
inputSchema: TDDInputSchema,
|
|
155
|
+
outputSchema: TDDOutputSchema,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
async execute(input, context) {
|
|
159
|
+
const { config, logger } = context;
|
|
160
|
+
const dispatcher = createDispatcher(logger);
|
|
161
|
+
const guard = createMainAgentGuard({}, logger);
|
|
162
|
+
const phases = [];
|
|
163
|
+
const filesModified = [];
|
|
164
|
+
let totalTokens = 0;
|
|
165
|
+
guard.activateEmbargo();
|
|
166
|
+
try {
|
|
167
|
+
// ---- Phase 1: RED - Write failing test ----
|
|
168
|
+
logger.info(`[tdd] RED phase: writing failing test for "${input.behavior}"`);
|
|
169
|
+
const redResult = await dispatcher.dispatch({
|
|
170
|
+
role: 'implementer',
|
|
171
|
+
model: input.model || config.defaultModel,
|
|
172
|
+
isolation: 'worktree',
|
|
173
|
+
}, {
|
|
174
|
+
permissions: {
|
|
175
|
+
readFiles: true,
|
|
176
|
+
searchCode: false,
|
|
177
|
+
runCommands: true,
|
|
178
|
+
writeFiles: true,
|
|
179
|
+
gitOperations: false,
|
|
180
|
+
},
|
|
181
|
+
prompt: buildRedPrompt(input.behavior, input.targetFile, input.testFile, input.testLevel),
|
|
182
|
+
owns: input.testFile ? [input.testFile] : [],
|
|
183
|
+
reads: [input.targetFile],
|
|
184
|
+
});
|
|
185
|
+
totalTokens += redResult.tokensUsed;
|
|
186
|
+
if (redResult.output.includes('INVALID_RED')) {
|
|
187
|
+
return {
|
|
188
|
+
status: 'invalid-red',
|
|
189
|
+
phases,
|
|
190
|
+
broaderVerification: { command: '', result: 'NOT_RUN' },
|
|
191
|
+
filesModified,
|
|
192
|
+
summary: 'RED phase invalid: behavior may already exist or test is misconfigured',
|
|
193
|
+
tokensUsed: totalTokens,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
if (redResult.status !== 'success') {
|
|
197
|
+
phases.push({
|
|
198
|
+
phase: 'red',
|
|
199
|
+
status: 'fail',
|
|
200
|
+
command: '',
|
|
201
|
+
evidence: redResult.errors.join(', '),
|
|
202
|
+
});
|
|
203
|
+
return {
|
|
204
|
+
status: 'failure',
|
|
205
|
+
phases,
|
|
206
|
+
broaderVerification: { command: '', result: 'NOT_RUN' },
|
|
207
|
+
filesModified,
|
|
208
|
+
summary: `RED phase failed: ${redResult.errors.join(', ')}`,
|
|
209
|
+
tokensUsed: totalTokens,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
phases.push({
|
|
213
|
+
phase: 'red',
|
|
214
|
+
status: 'pass',
|
|
215
|
+
command: '(test runner)',
|
|
216
|
+
evidence: redResult.output.slice(0, 300),
|
|
217
|
+
});
|
|
218
|
+
if (input.testFile)
|
|
219
|
+
filesModified.push(input.testFile);
|
|
220
|
+
// ---- Phase 2: GREEN - Make test pass ----
|
|
221
|
+
logger.info('[tdd] GREEN phase: implementing minimal code');
|
|
222
|
+
const greenResult = await dispatcher.dispatch({
|
|
223
|
+
role: 'implementer',
|
|
224
|
+
model: input.model || config.defaultModel,
|
|
225
|
+
isolation: 'worktree',
|
|
226
|
+
}, {
|
|
227
|
+
permissions: {
|
|
228
|
+
readFiles: true,
|
|
229
|
+
searchCode: false,
|
|
230
|
+
runCommands: true,
|
|
231
|
+
writeFiles: true,
|
|
232
|
+
gitOperations: false,
|
|
233
|
+
},
|
|
234
|
+
prompt: buildGreenPrompt(input.behavior, input.targetFile, input.testFile, redResult.output),
|
|
235
|
+
owns: [input.targetFile],
|
|
236
|
+
reads: [],
|
|
237
|
+
});
|
|
238
|
+
totalTokens += greenResult.tokensUsed;
|
|
239
|
+
if (greenResult.status !== 'success') {
|
|
240
|
+
phases.push({
|
|
241
|
+
phase: 'green',
|
|
242
|
+
status: 'fail',
|
|
243
|
+
command: '',
|
|
244
|
+
evidence: greenResult.errors.join(', '),
|
|
245
|
+
});
|
|
246
|
+
return {
|
|
247
|
+
status: 'failure',
|
|
248
|
+
phases,
|
|
249
|
+
broaderVerification: { command: '', result: 'NOT_RUN' },
|
|
250
|
+
filesModified,
|
|
251
|
+
summary: `GREEN phase failed: ${greenResult.errors.join(', ')}`,
|
|
252
|
+
tokensUsed: totalTokens,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
phases.push({
|
|
256
|
+
phase: 'green',
|
|
257
|
+
status: 'pass',
|
|
258
|
+
command: '(test runner)',
|
|
259
|
+
evidence: greenResult.output.slice(0, 300),
|
|
260
|
+
});
|
|
261
|
+
filesModified.push(input.targetFile);
|
|
262
|
+
// ---- Phase 3: REFACTOR - Clean up while staying green ----
|
|
263
|
+
logger.info('[tdd] REFACTOR phase: improving code quality');
|
|
264
|
+
const refactorResult = await dispatcher.dispatch({
|
|
265
|
+
role: 'implementer',
|
|
266
|
+
model: input.model || config.defaultModel,
|
|
267
|
+
isolation: 'worktree',
|
|
268
|
+
}, {
|
|
269
|
+
permissions: {
|
|
270
|
+
readFiles: true,
|
|
271
|
+
searchCode: false,
|
|
272
|
+
runCommands: true,
|
|
273
|
+
writeFiles: true,
|
|
274
|
+
gitOperations: false,
|
|
275
|
+
},
|
|
276
|
+
prompt: buildRefactorPrompt(input.targetFile),
|
|
277
|
+
owns: [input.targetFile],
|
|
278
|
+
reads: [],
|
|
279
|
+
});
|
|
280
|
+
totalTokens += refactorResult.tokensUsed;
|
|
281
|
+
phases.push({
|
|
282
|
+
phase: 'refactor',
|
|
283
|
+
status: refactorResult.status === 'success' ? 'pass' : 'skipped',
|
|
284
|
+
command: '(test runner)',
|
|
285
|
+
evidence: refactorResult.output.slice(0, 300),
|
|
286
|
+
});
|
|
287
|
+
// ---- Phase 4: Broader verification ----
|
|
288
|
+
logger.info('[tdd] Running broader verification');
|
|
289
|
+
const verifyResult = await dispatcher.dispatch({
|
|
290
|
+
role: 'verifier',
|
|
291
|
+
model: input.model || config.defaultModel,
|
|
292
|
+
}, {
|
|
293
|
+
permissions: {
|
|
294
|
+
readFiles: false,
|
|
295
|
+
searchCode: false,
|
|
296
|
+
runCommands: true,
|
|
297
|
+
writeFiles: false,
|
|
298
|
+
gitOperations: false,
|
|
299
|
+
},
|
|
300
|
+
prompt: [
|
|
301
|
+
'Run broader verification for the TDD implementation:',
|
|
302
|
+
'',
|
|
303
|
+
`Behavior: ${input.behavior}`,
|
|
304
|
+
`Target: ${input.targetFile}`,
|
|
305
|
+
'',
|
|
306
|
+
'1. Run the full test suite (not just the new test)',
|
|
307
|
+
'2. Check for regressions',
|
|
308
|
+
'3. Verify the behavior works end-to-end if applicable',
|
|
309
|
+
'',
|
|
310
|
+
'Return: command executed, exit code, summary of results.',
|
|
311
|
+
].join('\n'),
|
|
312
|
+
owns: [],
|
|
313
|
+
reads: [],
|
|
314
|
+
});
|
|
315
|
+
totalTokens += verifyResult.tokensUsed;
|
|
316
|
+
const redStatus = phases[0]?.status ?? 'fail';
|
|
317
|
+
const greenStatus = phases[1]?.status ?? 'fail';
|
|
318
|
+
const refactorStatus = phases[2]?.status ?? 'skipped';
|
|
319
|
+
return {
|
|
320
|
+
status: 'success',
|
|
321
|
+
phases,
|
|
322
|
+
broaderVerification: {
|
|
323
|
+
command: '(verification)',
|
|
324
|
+
result: verifyResult.status === 'success' ? 'PASS' : 'FAIL',
|
|
325
|
+
},
|
|
326
|
+
filesModified: [...new Set(filesModified)],
|
|
327
|
+
summary: `TDD complete: RED(${redStatus}) → GREEN(${greenStatus}) → REFACTOR(${refactorStatus}). Used ${totalTokens} tokens.`,
|
|
328
|
+
tokensUsed: totalTokens,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
finally {
|
|
332
|
+
guard.deactivateEmbargo();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
export const tddSkill = new TDDSkill();
|
|
337
|
+
export default tddSkill;
|
|
338
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/skills/tdd/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced Plan Skill - Orchestrates analysis, debugging, and planning
|
|
3
|
+
*
|
|
4
|
+
* Architecture: Orchestrator pattern
|
|
5
|
+
* - Analyzes input to determine what preprocessing is needed
|
|
6
|
+
* - May spawn debugging subagent for bug investigation
|
|
7
|
+
* - Delegates actual planning to planner subagent
|
|
8
|
+
* - Wave grouping and validation
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* "/to-plan 实现登录功能" → Direct planning
|
|
12
|
+
* "/to-plan 出现xxbug,查明原因并制定计划" → Debug → Plan
|
|
13
|
+
* "/to-plan 性能问题,先分析再计划" → Explore → Plan
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
import { Skill } from '../skill.js';
|
|
17
|
+
import type { SkillContext } from '../types.js';
|
|
18
|
+
import type { Plan, Wave } from '../../persistence/types.js';
|
|
19
|
+
declare const PlanInputSchema: z.ZodObject<{
|
|
20
|
+
goal: z.ZodString;
|
|
21
|
+
constraints: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
22
|
+
model: z.ZodOptional<z.ZodString>;
|
|
23
|
+
previousIssues: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
24
|
+
symptom: z.ZodOptional<z.ZodString>;
|
|
25
|
+
reproduceCommand: z.ZodOptional<z.ZodString>;
|
|
26
|
+
logs: z.ZodOptional<z.ZodString>;
|
|
27
|
+
recentChanges: z.ZodOptional<z.ZodString>;
|
|
28
|
+
}, "strip", z.ZodTypeAny, {
|
|
29
|
+
goal: string;
|
|
30
|
+
model?: string | undefined;
|
|
31
|
+
symptom?: string | undefined;
|
|
32
|
+
reproduceCommand?: string | undefined;
|
|
33
|
+
logs?: string | undefined;
|
|
34
|
+
recentChanges?: string | undefined;
|
|
35
|
+
constraints?: string[] | undefined;
|
|
36
|
+
previousIssues?: string[] | undefined;
|
|
37
|
+
}, {
|
|
38
|
+
goal: string;
|
|
39
|
+
model?: string | undefined;
|
|
40
|
+
symptom?: string | undefined;
|
|
41
|
+
reproduceCommand?: string | undefined;
|
|
42
|
+
logs?: string | undefined;
|
|
43
|
+
recentChanges?: string | undefined;
|
|
44
|
+
constraints?: string[] | undefined;
|
|
45
|
+
previousIssues?: string[] | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
declare const PlanOutputSchema: z.ZodObject<{
|
|
48
|
+
plan: z.ZodType<Plan, z.ZodTypeDef, Plan>;
|
|
49
|
+
waves: z.ZodArray<z.ZodType<Wave, z.ZodTypeDef, Wave>, "many">;
|
|
50
|
+
rootCause: z.ZodOptional<z.ZodString>;
|
|
51
|
+
confidence: z.ZodOptional<z.ZodEnum<["high", "medium", "low"]>>;
|
|
52
|
+
analysisPerformed: z.ZodBoolean;
|
|
53
|
+
tokensUsed: z.ZodNumber;
|
|
54
|
+
}, "strip", z.ZodTypeAny, {
|
|
55
|
+
tokensUsed: number;
|
|
56
|
+
plan: Plan;
|
|
57
|
+
waves: Wave[];
|
|
58
|
+
analysisPerformed: boolean;
|
|
59
|
+
rootCause?: string | undefined;
|
|
60
|
+
confidence?: "low" | "medium" | "high" | undefined;
|
|
61
|
+
}, {
|
|
62
|
+
tokensUsed: number;
|
|
63
|
+
plan: Plan;
|
|
64
|
+
waves: Wave[];
|
|
65
|
+
analysisPerformed: boolean;
|
|
66
|
+
rootCause?: string | undefined;
|
|
67
|
+
confidence?: "low" | "medium" | "high" | undefined;
|
|
68
|
+
}>;
|
|
69
|
+
type PlanInput = z.infer<typeof PlanInputSchema>;
|
|
70
|
+
type PlanOutput = z.infer<typeof PlanOutputSchema>;
|
|
71
|
+
export declare class ToPlanSkill extends Skill<PlanInput, PlanOutput> {
|
|
72
|
+
protected name: string;
|
|
73
|
+
protected description: string;
|
|
74
|
+
protected requires: string[];
|
|
75
|
+
execute(input: PlanInput, context: SkillContext): Promise<PlanOutput>;
|
|
76
|
+
/**
|
|
77
|
+
* Analyze input to determine what preprocessing is needed
|
|
78
|
+
*/
|
|
79
|
+
private analyzeInput;
|
|
80
|
+
/**
|
|
81
|
+
* Run systematic debugging using debugging skill
|
|
82
|
+
*/
|
|
83
|
+
private runDebugging;
|
|
84
|
+
/**
|
|
85
|
+
* Run exploration to gather context
|
|
86
|
+
*/
|
|
87
|
+
private runExploration;
|
|
88
|
+
/**
|
|
89
|
+
* Spawn planner subagent with fresh context
|
|
90
|
+
*/
|
|
91
|
+
private spawnPlannerSubagent;
|
|
92
|
+
private buildDebuggingPrompt;
|
|
93
|
+
private buildPlannerPrompt;
|
|
94
|
+
private parsePlanResponse;
|
|
95
|
+
private validatePlan;
|
|
96
|
+
private groupIntoWaves;
|
|
97
|
+
private triggerHook;
|
|
98
|
+
}
|
|
99
|
+
export {};
|
|
100
|
+
//# sourceMappingURL=index-enhanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-enhanced.d.ts","sourceRoot":"","sources":["../../../../src/skills/to-plan/index-enhanced.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAQ,IAAI,EAAE,MAAM,4BAA4B,CAAA;AAQlE,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUnB,CAAA;AAEF,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;EASpB,CAAA;AAEF,KAAK,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAChD,KAAK,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAElD,qBAAa,WAAY,SAAQ,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC;IAC3D,SAAS,CAAC,IAAI,SAAY;IAC1B,SAAS,CAAC,WAAW,SAAgF;IACrG,SAAS,CAAC,QAAQ,WAAyC;IAErD,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAqH3E;;OAEG;IACH,OAAO,CAAC,YAAY;IAyCpB;;OAEG;YACW,YAAY;IAsD1B;;OAEG;YACW,cAAc;IAwC5B;;OAEG;YACW,oBAAoB;IA2BlC,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,kBAAkB;IAyC1B,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,YAAY;IAsDpB,OAAO,CAAC,cAAc;YAkCR,WAAW;CAe1B"}
|