timsquad 3.7.1 → 3.8.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.ko.md +3 -2
- package/README.md +39 -4
- package/dist/commands/audit.d.ts +6 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +111 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/log.d.ts +6 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +85 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/next.d.ts +15 -0
- package/dist/commands/next.d.ts.map +1 -0
- package/dist/commands/next.js +146 -0
- package/dist/commands/next.js.map +1 -0
- package/dist/commands/plan.d.ts +6 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +83 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/retro.d.ts +6 -0
- package/dist/commands/retro.d.ts.map +1 -0
- package/dist/commands/retro.js +74 -0
- package/dist/commands/retro.js.map +1 -0
- package/dist/commands/spec.d.ts +6 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +56 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +99 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +12 -10
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/meta-cache.d.ts +2 -1
- package/dist/daemon/meta-cache.d.ts.map +1 -1
- package/dist/daemon/meta-cache.js +20 -4
- package/dist/daemon/meta-cache.js.map +1 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +14 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/planning-parser.d.ts +65 -0
- package/dist/lib/planning-parser.d.ts.map +1 -0
- package/dist/lib/planning-parser.js +306 -0
- package/dist/lib/planning-parser.js.map +1 -0
- package/dist/lib/skill-generator.d.ts.map +1 -1
- package/dist/lib/skill-generator.js +7 -3
- package/dist/lib/skill-generator.js.map +1 -1
- package/dist/lib/template.d.ts.map +1 -1
- package/dist/lib/template.js +16 -5
- package/dist/lib/template.js.map +1 -1
- package/dist/lib/workflow-state.d.ts +77 -0
- package/dist/lib/workflow-state.d.ts.map +1 -1
- package/dist/lib/workflow-state.js +194 -0
- package/dist/lib/workflow-state.js.map +1 -1
- package/dist/types/config.d.ts +14 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +13 -2
- package/dist/types/config.js.map +1 -1
- package/package.json +1 -1
- package/templates/base/agents/base/tsq-librarian.md +1 -1
- package/templates/base/scripts/calculate-retro-metrics.sh +46 -0
- package/templates/base/scripts/check-circular-deps.sh +82 -0
- package/templates/base/scripts/cleanup-trails.sh +44 -0
- package/templates/base/scripts/generate-prd-traceability.sh +91 -0
- package/templates/base/scripts/manage-fp-registry.sh +83 -0
- package/templates/base/scripts/validate-gherkin.sh +113 -0
- package/templates/base/skills/tsq-controller/SKILL.md +60 -37
- package/templates/base/skills/tsq-controller/references/model-routing.md +38 -0
- package/templates/base/skills/tsq-controller/references/wave-dispatch.md +50 -0
- package/templates/base/skills/tsq-full/SKILL.md +12 -9
- package/templates/base/skills/tsq-grill/SKILL.md +60 -55
- package/templates/base/skills/tsq-grill/references/interview-guide.md +86 -0
- package/templates/base/skills/tsq-inspect/SKILL.md +108 -0
- package/templates/base/skills/tsq-inspect/references/checklist.md +162 -0
- package/templates/base/skills/tsq-start/SKILL.md +17 -44
- package/templates/base/skills/tsq-start/references/onboarding-steps.md +85 -0
- package/templates/platforms/claude-code/scripts/build-gate.sh +25 -2
- package/templates/platforms/claude-code/scripts/check-capability.sh +41 -10
- package/templates/platforms/claude-code/scripts/completion-guard.sh +79 -3
- package/templates/platforms/claude-code/scripts/detect-env.sh +124 -0
- package/templates/platforms/claude-code/scripts/stale-guard.sh +47 -0
- package/templates/platforms/claude-code/scripts/subagent-stop.sh +41 -2
- package/templates/platforms/claude-code/scripts/tdd-guard.sh +57 -0
- package/templates/platforms/claude-code/scripts/validate-completion-report.sh +86 -0
- package/templates/platforms/claude-code/settings.json +10 -0
- package/templates/project-types/fintech/config.yaml +1 -1
- package/templates/project-types/mobile-app/config.yaml +1 -1
- package/templates/project-types/web-app/config.yaml +1 -1
- package/templates/project-types/web-service/config.yaml +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AutomationConfig } from '../types/config.js';
|
|
2
|
+
import type { PlanningDocument } from './planning-parser.js';
|
|
2
3
|
/**
|
|
3
4
|
* Tracked task in a sequence
|
|
4
5
|
*/
|
|
@@ -45,4 +46,80 @@ export declare function isSequenceComplete(seq: SequenceWorkflowState): boolean;
|
|
|
45
46
|
* Returns null if 0 or multiple matches (ambiguous)
|
|
46
47
|
*/
|
|
47
48
|
export declare function findSequenceForAgent(state: WorkflowState, agent: string): string | null;
|
|
49
|
+
/**
|
|
50
|
+
* Normalize task ID to 3-digit padded canonical form.
|
|
51
|
+
* P1-S1-T1 → P1-S001-T001
|
|
52
|
+
*/
|
|
53
|
+
export declare function normalizeTaskId(taskId: string): string;
|
|
54
|
+
/**
|
|
55
|
+
* Completed task record for tsq next --complete
|
|
56
|
+
*/
|
|
57
|
+
export interface CompletedTaskRecord {
|
|
58
|
+
taskId: string;
|
|
59
|
+
completedAt: string;
|
|
60
|
+
agent?: string;
|
|
61
|
+
summary?: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Phase status result for tsq next --phase-status
|
|
65
|
+
*/
|
|
66
|
+
export interface PhaseStatus {
|
|
67
|
+
phaseId: string;
|
|
68
|
+
totalTasks: number;
|
|
69
|
+
completedTasks: number;
|
|
70
|
+
isComplete: boolean;
|
|
71
|
+
missingTasks: string[];
|
|
72
|
+
actionRequired?: 'phase-complete' | 'continue';
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Next task result for tsq next
|
|
76
|
+
*/
|
|
77
|
+
export interface NextTaskResult {
|
|
78
|
+
taskId: string;
|
|
79
|
+
phaseId: string;
|
|
80
|
+
sequenceId: string;
|
|
81
|
+
title: string;
|
|
82
|
+
description: string;
|
|
83
|
+
agent?: string;
|
|
84
|
+
outputs?: string[];
|
|
85
|
+
dependencies?: string[];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the set of completed task IDs from workflow state
|
|
89
|
+
*/
|
|
90
|
+
export declare function getCompletedTaskIds(state: WorkflowState): Set<string>;
|
|
91
|
+
/**
|
|
92
|
+
* Extended workflow state with task-level tracking
|
|
93
|
+
*/
|
|
94
|
+
export interface WorkflowStateV2 extends WorkflowState {
|
|
95
|
+
completed_task_ids: string[];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Mark a task as complete in workflow state
|
|
99
|
+
*/
|
|
100
|
+
export declare function markTaskComplete(projectRoot: string, record: CompletedTaskRecord): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Find the next incomplete task based on planning document and workflow state
|
|
103
|
+
*/
|
|
104
|
+
export declare function findNextTask(doc: PlanningDocument, state: WorkflowState): NextTaskResult | null;
|
|
105
|
+
/**
|
|
106
|
+
* Wave result: batch of independent tasks that can run in parallel
|
|
107
|
+
*/
|
|
108
|
+
export interface WaveResult {
|
|
109
|
+
wave: NextTaskResult[];
|
|
110
|
+
totalRemaining: number;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Find the next wave of independent tasks (parallel dispatch)
|
|
114
|
+
* Tasks with no unmet dependencies can run simultaneously.
|
|
115
|
+
*/
|
|
116
|
+
export declare function findNextWave(doc: PlanningDocument, state: WorkflowState): WaveResult | null;
|
|
117
|
+
/**
|
|
118
|
+
* Get phase status based on planning document and workflow state
|
|
119
|
+
*/
|
|
120
|
+
export declare function getPhaseStatus(doc: PlanningDocument, state: WorkflowState, phaseId?: string): PhaseStatus | null;
|
|
121
|
+
/**
|
|
122
|
+
* Append a one-line progress entry to phase-memory.md
|
|
123
|
+
*/
|
|
124
|
+
export declare function appendPhaseMemoryProgress(projectRoot: string, taskId: string, summary: string): Promise<void>;
|
|
48
125
|
//# sourceMappingURL=workflow-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-state.d.ts","sourceRoot":"","sources":["../../src/lib/workflow-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-state.d.ts","sourceRoot":"","sources":["../../src/lib/workflow-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,4 +64,198 @@ export function findSequenceForAgent(state, agent) {
|
|
|
64
64
|
}
|
|
65
65
|
return matches.length === 1 ? matches[0] : null;
|
|
66
66
|
}
|
|
67
|
+
// ─── Task ID normalization ───────────────────────────────────────
|
|
68
|
+
/**
|
|
69
|
+
* Normalize task ID to 3-digit padded canonical form.
|
|
70
|
+
* P1-S1-T1 → P1-S001-T001
|
|
71
|
+
*/
|
|
72
|
+
export function normalizeTaskId(taskId) {
|
|
73
|
+
const match = taskId.match(/^P(\d+)-S(\d+)-T(\d+)$/);
|
|
74
|
+
if (!match)
|
|
75
|
+
return taskId;
|
|
76
|
+
return `P${match[1]}-S${match[2].padStart(3, '0')}-T${match[3].padStart(3, '0')}`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the set of completed task IDs from workflow state
|
|
80
|
+
*/
|
|
81
|
+
export function getCompletedTaskIds(state) {
|
|
82
|
+
const ids = new Set();
|
|
83
|
+
for (const seq of Object.values(state.sequences)) {
|
|
84
|
+
for (const task of seq.completed_tasks) {
|
|
85
|
+
// Only treat task_log as ID if it matches the canonical format
|
|
86
|
+
if (task.task_log && /^P\d+-S\d+-T\d+$/.test(task.task_log)) {
|
|
87
|
+
ids.add(normalizeTaskId(task.task_log));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Also check the dedicated completed_tasks field
|
|
92
|
+
const v2 = state;
|
|
93
|
+
if (Array.isArray(v2.completed_task_ids)) {
|
|
94
|
+
for (const id of v2.completed_task_ids) {
|
|
95
|
+
ids.add(id);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return ids;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Mark a task as complete in workflow state
|
|
102
|
+
*/
|
|
103
|
+
export async function markTaskComplete(projectRoot, record) {
|
|
104
|
+
const state = await loadWorkflowState(projectRoot);
|
|
105
|
+
// Initialize completed_task_ids if not present
|
|
106
|
+
if (!state.completed_task_ids) {
|
|
107
|
+
state.completed_task_ids = [];
|
|
108
|
+
}
|
|
109
|
+
// Normalize task ID to 3-digit padded form (P1-S1-T1 → P1-S001-T001)
|
|
110
|
+
const normalizedId = normalizeTaskId(record.taskId);
|
|
111
|
+
// Add task ID if not already present
|
|
112
|
+
if (!state.completed_task_ids.includes(normalizedId)) {
|
|
113
|
+
state.completed_task_ids.push(normalizedId);
|
|
114
|
+
}
|
|
115
|
+
// Also track in sequence if applicable (extract sequence ID from task ID)
|
|
116
|
+
const seqIdMatch = normalizedId.match(/^(P\d+-S\d+)-T\d+$/);
|
|
117
|
+
if (seqIdMatch) {
|
|
118
|
+
const seqId = seqIdMatch[1];
|
|
119
|
+
if (!state.sequences[seqId]) {
|
|
120
|
+
const phaseMatch = normalizedId.match(/^(P\d+)/);
|
|
121
|
+
state.sequences[seqId] = {
|
|
122
|
+
status: 'in_progress',
|
|
123
|
+
phase: phaseMatch ? phaseMatch[1] : 'unknown',
|
|
124
|
+
expected_agents: [],
|
|
125
|
+
completed_tasks: [],
|
|
126
|
+
report_path: null,
|
|
127
|
+
l2_created: false,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
state.sequences[seqId].completed_tasks.push({
|
|
131
|
+
agent: record.agent || 'developer',
|
|
132
|
+
task_log: normalizedId,
|
|
133
|
+
completed_at: record.completedAt,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
await saveWorkflowState(projectRoot, state);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Find the next incomplete task based on planning document and workflow state
|
|
140
|
+
*/
|
|
141
|
+
export function findNextTask(doc, state) {
|
|
142
|
+
const completedIds = getCompletedTaskIds(state);
|
|
143
|
+
for (const phase of doc.phases) {
|
|
144
|
+
for (const seq of phase.sequences) {
|
|
145
|
+
for (const task of seq.tasks) {
|
|
146
|
+
if (!completedIds.has(task.id)) {
|
|
147
|
+
return {
|
|
148
|
+
taskId: task.id,
|
|
149
|
+
phaseId: phase.id,
|
|
150
|
+
sequenceId: seq.id,
|
|
151
|
+
title: task.title,
|
|
152
|
+
description: task.description,
|
|
153
|
+
agent: task.agent,
|
|
154
|
+
outputs: task.outputs,
|
|
155
|
+
dependencies: task.dependencies,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return null; // All tasks complete
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Find the next wave of independent tasks (parallel dispatch)
|
|
165
|
+
* Tasks with no unmet dependencies can run simultaneously.
|
|
166
|
+
*/
|
|
167
|
+
export function findNextWave(doc, state) {
|
|
168
|
+
const completedIds = getCompletedTaskIds(state);
|
|
169
|
+
const allTasks = [];
|
|
170
|
+
// Collect all incomplete tasks
|
|
171
|
+
for (const phase of doc.phases) {
|
|
172
|
+
for (const seq of phase.sequences) {
|
|
173
|
+
for (const task of seq.tasks) {
|
|
174
|
+
if (!completedIds.has(task.id)) {
|
|
175
|
+
allTasks.push({
|
|
176
|
+
taskId: task.id,
|
|
177
|
+
phaseId: phase.id,
|
|
178
|
+
sequenceId: seq.id,
|
|
179
|
+
title: task.title,
|
|
180
|
+
description: task.description,
|
|
181
|
+
agent: task.agent,
|
|
182
|
+
outputs: task.outputs,
|
|
183
|
+
dependencies: task.dependencies,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (allTasks.length === 0)
|
|
190
|
+
return null;
|
|
191
|
+
// Find tasks whose dependencies are all completed
|
|
192
|
+
const ready = allTasks.filter(task => {
|
|
193
|
+
if (!task.dependencies || task.dependencies.length === 0)
|
|
194
|
+
return true;
|
|
195
|
+
return task.dependencies.every(dep => completedIds.has(normalizeTaskId(dep)));
|
|
196
|
+
});
|
|
197
|
+
// If no ready tasks (circular dep or all blocked), fall back to first task
|
|
198
|
+
const wave = ready.length > 0 ? ready : [allTasks[0]];
|
|
199
|
+
return {
|
|
200
|
+
wave,
|
|
201
|
+
totalRemaining: allTasks.length,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get phase status based on planning document and workflow state
|
|
206
|
+
*/
|
|
207
|
+
export function getPhaseStatus(doc, state, phaseId) {
|
|
208
|
+
const completedIds = getCompletedTaskIds(state);
|
|
209
|
+
// Determine which phase to check
|
|
210
|
+
const targetPhaseId = phaseId || state.current_phase?.id;
|
|
211
|
+
if (!targetPhaseId) {
|
|
212
|
+
// Find first phase with incomplete tasks
|
|
213
|
+
for (const phase of doc.phases) {
|
|
214
|
+
const allTasks = phase.sequences.flatMap(s => s.tasks);
|
|
215
|
+
const incomplete = allTasks.filter(t => !completedIds.has(t.id));
|
|
216
|
+
if (incomplete.length > 0) {
|
|
217
|
+
return buildPhaseStatus(phase, completedIds);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
const phase = doc.phases.find(p => p.id === targetPhaseId);
|
|
223
|
+
if (!phase)
|
|
224
|
+
return null;
|
|
225
|
+
return buildPhaseStatus(phase, completedIds);
|
|
226
|
+
}
|
|
227
|
+
function buildPhaseStatus(phase, completedIds) {
|
|
228
|
+
const allTaskIds = phase.sequences.flatMap(s => s.tasks.map(t => t.id));
|
|
229
|
+
const missingTasks = allTaskIds.filter(id => !completedIds.has(id));
|
|
230
|
+
return {
|
|
231
|
+
phaseId: phase.id,
|
|
232
|
+
totalTasks: allTaskIds.length,
|
|
233
|
+
completedTasks: allTaskIds.length - missingTasks.length,
|
|
234
|
+
isComplete: missingTasks.length === 0,
|
|
235
|
+
missingTasks,
|
|
236
|
+
actionRequired: missingTasks.length === 0 ? 'phase-complete' : 'continue',
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Append a one-line progress entry to phase-memory.md
|
|
241
|
+
*/
|
|
242
|
+
export async function appendPhaseMemoryProgress(projectRoot, taskId, summary) {
|
|
243
|
+
const memoryPath = path.join(projectRoot, '.timsquad', 'state', 'phase-memory.md');
|
|
244
|
+
const progressLine = `- [${new Date().toISOString().slice(0, 16)}] ${taskId}: ${summary}\n`;
|
|
245
|
+
if (await fs.pathExists(memoryPath)) {
|
|
246
|
+
const content = await fs.readFile(memoryPath, 'utf-8');
|
|
247
|
+
// Find or create ## Progress section
|
|
248
|
+
if (content.includes('## Progress')) {
|
|
249
|
+
const updated = content.replace(/## Progress\n/, `## Progress\n${progressLine}`);
|
|
250
|
+
await fs.writeFile(memoryPath, updated, 'utf-8');
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
await fs.appendFile(memoryPath, `\n## Progress\n${progressLine}`, 'utf-8');
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
await fs.ensureDir(path.dirname(memoryPath));
|
|
258
|
+
await fs.writeFile(memoryPath, `# Phase Memory\n\n## Progress\n${progressLine}`, 'utf-8');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
67
261
|
//# sourceMappingURL=workflow-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../src/lib/workflow-state.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../src/lib/workflow-state.ts"],"names":[],"mappings":"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"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -30,6 +30,15 @@ export interface AgentConfig {
|
|
|
30
30
|
model: 'opus' | 'sonnet' | 'haiku';
|
|
31
31
|
enabled: boolean;
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Model routing configuration
|
|
35
|
+
* Controller가 태스크 복잡도/phase에 따라 모델을 동적 선택
|
|
36
|
+
*/
|
|
37
|
+
export type ModelRoutingStrategy = 'aggressive' | 'balanced' | 'conservative';
|
|
38
|
+
export interface ModelRoutingConfig {
|
|
39
|
+
enabled: boolean;
|
|
40
|
+
strategy: ModelRoutingStrategy;
|
|
41
|
+
}
|
|
33
42
|
/**
|
|
34
43
|
* Quality settings
|
|
35
44
|
*/
|
|
@@ -118,6 +127,7 @@ export interface TimsquadConfig {
|
|
|
118
127
|
methodology: MethodologyConfig;
|
|
119
128
|
stack: StackConfig;
|
|
120
129
|
agents: Partial<Record<AgentType, AgentConfig>>;
|
|
130
|
+
model_routing?: ModelRoutingConfig;
|
|
121
131
|
knowledge: KnowledgeConfig;
|
|
122
132
|
quality: QualityConfig;
|
|
123
133
|
naming?: NamingConfig;
|
|
@@ -170,6 +180,10 @@ export declare const DOMAIN_KNOWLEDGE_MAP: Partial<Record<Domain, string[]>>;
|
|
|
170
180
|
* Auto-selects skills based on detected/configured stack
|
|
171
181
|
*/
|
|
172
182
|
export declare const STACK_SKILL_MAP: Record<string, string[]>;
|
|
183
|
+
/**
|
|
184
|
+
* Default model routing configuration
|
|
185
|
+
*/
|
|
186
|
+
export declare const DEFAULT_MODEL_ROUTING: ModelRoutingConfig;
|
|
173
187
|
/**
|
|
174
188
|
* Build agents config from preset
|
|
175
189
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
|
package/dist/types/config.js
CHANGED
|
@@ -74,7 +74,7 @@ export const BASE_SKILLS = [
|
|
|
74
74
|
'tsq-update', 'tsq-delete',
|
|
75
75
|
'tsq-grill', 'tsq-decompose',
|
|
76
76
|
'tsq-product-audit', 'tsq-debugging', 'tsq-stability',
|
|
77
|
-
'tsq-quick', 'tsq-full',
|
|
77
|
+
'tsq-quick', 'tsq-full', 'tsq-inspect',
|
|
78
78
|
];
|
|
79
79
|
/**
|
|
80
80
|
* Knowledge presets by project type.
|
|
@@ -166,7 +166,14 @@ const AGENT_MODELS = {
|
|
|
166
166
|
security: 'sonnet',
|
|
167
167
|
dba: 'sonnet',
|
|
168
168
|
designer: 'sonnet',
|
|
169
|
-
librarian: '
|
|
169
|
+
librarian: 'haiku',
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* Default model routing configuration
|
|
173
|
+
*/
|
|
174
|
+
export const DEFAULT_MODEL_ROUTING = {
|
|
175
|
+
enabled: true,
|
|
176
|
+
strategy: 'balanced',
|
|
170
177
|
};
|
|
171
178
|
/**
|
|
172
179
|
* Build agents config from preset
|
|
@@ -226,6 +233,10 @@ export const FINTECH_CONFIG_OVERRIDES = {
|
|
|
226
233
|
branching: 'gitflow',
|
|
227
234
|
review: 'required',
|
|
228
235
|
},
|
|
236
|
+
model_routing: {
|
|
237
|
+
enabled: true,
|
|
238
|
+
strategy: 'conservative',
|
|
239
|
+
},
|
|
229
240
|
quality: {
|
|
230
241
|
test_coverage: {
|
|
231
242
|
minimum: 90,
|
package/dist/types/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# calculate-retro-metrics.sh — L1 태스크 로그 → metrics.json 집계
|
|
3
|
+
# Usage: bash .timsquad/scripts/calculate-retro-metrics.sh [project_root]
|
|
4
|
+
# Output: JSON metrics to stdout + .timsquad/retrospective/metrics/latest.json
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
ROOT="${1:-.}"
|
|
8
|
+
LOGS_DIR="$ROOT/.timsquad/logs/tasks"
|
|
9
|
+
METRICS_DIR="$ROOT/.timsquad/retrospective/metrics"
|
|
10
|
+
|
|
11
|
+
if [ ! -d "$LOGS_DIR" ]; then
|
|
12
|
+
echo '{"total":0,"reason":"no task logs found"}'
|
|
13
|
+
exit 0
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
# Check jq availability
|
|
17
|
+
if ! command -v jq &>/dev/null; then
|
|
18
|
+
echo '{"error":"jq is required but not installed"}' >&2
|
|
19
|
+
exit 1
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
# Aggregate metrics from all L1 task log JSON files
|
|
23
|
+
metrics=$(find "$LOGS_DIR" -name '*.json' -type f | while read -r f; do
|
|
24
|
+
jq -c '{
|
|
25
|
+
status: (.status // "unknown"),
|
|
26
|
+
agent: (.agent // "unknown"),
|
|
27
|
+
duration_ms: (.duration_ms // 0),
|
|
28
|
+
files_changed: ((.mechanical.files // []) | length)
|
|
29
|
+
}' "$f" 2>/dev/null || true
|
|
30
|
+
done | jq -s '{
|
|
31
|
+
total: length,
|
|
32
|
+
success_count: [.[] | select(.status == "completed" or .status == "success")] | length,
|
|
33
|
+
failure_count: [.[] | select(.status == "failure" or .status == "error")] | length,
|
|
34
|
+
partial_count: [.[] | select(.status == "partial")] | length,
|
|
35
|
+
avg_duration_ms: (if length > 0 then ([.[].duration_ms] | add / length | floor) else 0 end),
|
|
36
|
+
total_files_changed: ([.[].files_changed] | add // 0),
|
|
37
|
+
agent_distribution: (group_by(.agent) | map({key: .[0].agent, value: length}) | from_entries),
|
|
38
|
+
success_rate: (if length > 0 then (([.[] | select(.status == "completed" or .status == "success")] | length) * 100 / length | floor) else 0 end),
|
|
39
|
+
generated_at: (now | todate)
|
|
40
|
+
}')
|
|
41
|
+
|
|
42
|
+
# Save to file
|
|
43
|
+
mkdir -p "$METRICS_DIR"
|
|
44
|
+
echo "$metrics" | jq '.' > "$METRICS_DIR/latest.json"
|
|
45
|
+
|
|
46
|
+
echo "$metrics"
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# check-circular-deps.sh — planning.md DAG 순환 의존성 탐지
|
|
3
|
+
# Usage: bash .timsquad/scripts/check-circular-deps.sh [planning.md path]
|
|
4
|
+
# Output: JSON {verdict, cycles}
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
PLANNING="${1:-.timsquad/ssot/planning.md}"
|
|
8
|
+
|
|
9
|
+
if [ ! -f "$PLANNING" ]; then
|
|
10
|
+
echo '{"verdict":"skip","cycles":[],"reason":"planning.md not found"}'
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
# Task ID와 depends_on 추출 (### Task 헤딩 + metadata)
|
|
15
|
+
declare -A DEPS
|
|
16
|
+
current_task=""
|
|
17
|
+
|
|
18
|
+
while IFS= read -r line; do
|
|
19
|
+
if [[ "$line" =~ ^###[[:space:]]+.*\(([A-Z][0-9]+-S[0-9]+-T[0-9]+)\) ]]; then
|
|
20
|
+
current_task="${BASH_REMATCH[1]}"
|
|
21
|
+
DEPS["$current_task"]=""
|
|
22
|
+
elif [[ -n "$current_task" && "$line" =~ depends_on:[[:space:]]*(.+) ]]; then
|
|
23
|
+
DEPS["$current_task"]="${BASH_REMATCH[1]}"
|
|
24
|
+
elif [[ "$line" =~ ^###[[:space:]] ]]; then
|
|
25
|
+
current_task=""
|
|
26
|
+
fi
|
|
27
|
+
done < "$PLANNING"
|
|
28
|
+
|
|
29
|
+
# Topological sort with cycle detection (Kahn's algorithm)
|
|
30
|
+
declare -A IN_DEGREE
|
|
31
|
+
declare -A ADJ
|
|
32
|
+
|
|
33
|
+
for task in "${!DEPS[@]}"; do
|
|
34
|
+
[ -z "${IN_DEGREE[$task]+x}" ] && IN_DEGREE["$task"]=0
|
|
35
|
+
IFS=',' read -ra dep_list <<< "${DEPS[$task]}"
|
|
36
|
+
for dep in "${dep_list[@]}"; do
|
|
37
|
+
dep=$(echo "$dep" | xargs)
|
|
38
|
+
[ -z "$dep" ] && continue
|
|
39
|
+
ADJ["$dep"]+="$task "
|
|
40
|
+
IN_DEGREE["$task"]=$(( ${IN_DEGREE[$task]:-0} + 1 ))
|
|
41
|
+
[ -z "${IN_DEGREE[$dep]+x}" ] && IN_DEGREE["$dep"]=0
|
|
42
|
+
done
|
|
43
|
+
done
|
|
44
|
+
|
|
45
|
+
# BFS
|
|
46
|
+
queue=()
|
|
47
|
+
for task in "${!IN_DEGREE[@]}"; do
|
|
48
|
+
[ "${IN_DEGREE[$task]}" -eq 0 ] && queue+=("$task")
|
|
49
|
+
done
|
|
50
|
+
|
|
51
|
+
sorted=0
|
|
52
|
+
i=0
|
|
53
|
+
while [ $i -lt ${#queue[@]} ]; do
|
|
54
|
+
node="${queue[$i]}"
|
|
55
|
+
((i++))
|
|
56
|
+
((sorted++))
|
|
57
|
+
for neighbor in ${ADJ[$node]:-}; do
|
|
58
|
+
IN_DEGREE["$neighbor"]=$(( ${IN_DEGREE[$neighbor]} - 1 ))
|
|
59
|
+
[ "${IN_DEGREE[$neighbor]}" -eq 0 ] && queue+=("$neighbor")
|
|
60
|
+
done
|
|
61
|
+
done
|
|
62
|
+
|
|
63
|
+
total=${#IN_DEGREE[@]}
|
|
64
|
+
|
|
65
|
+
if [ "$total" -eq 0 ]; then
|
|
66
|
+
echo '{"verdict":"skip","cycles":[],"reason":"no tasks with dependencies found"}'
|
|
67
|
+
exit 0
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
if [ "$sorted" -eq "$total" ]; then
|
|
71
|
+
echo '{"verdict":"pass","cycles":[],"total_tasks":'"$total"'}'
|
|
72
|
+
exit 0
|
|
73
|
+
else
|
|
74
|
+
# Collect tasks in cycle
|
|
75
|
+
cycle_tasks=()
|
|
76
|
+
for task in "${!IN_DEGREE[@]}"; do
|
|
77
|
+
[ "${IN_DEGREE[$task]}" -gt 0 ] && cycle_tasks+=("\"$task\"")
|
|
78
|
+
done
|
|
79
|
+
cycle_json=$(IFS=,; echo "${cycle_tasks[*]}")
|
|
80
|
+
echo '{"verdict":"fail","cycles":['"$cycle_json"'],"total_tasks":'"$total"',"sorted":'"$sorted"'}'
|
|
81
|
+
exit 1
|
|
82
|
+
fi
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# cleanup-trails.sh — trail 아카이브 10개 초과 시 자동 정리
|
|
3
|
+
# Usage: bash .timsquad/scripts/cleanup-trails.sh [project_root] [max_count]
|
|
4
|
+
# Output: JSON {archived, remaining}
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
ROOT="${1:-.}"
|
|
8
|
+
MAX_COUNT="${2:-10}"
|
|
9
|
+
TRAILS_DIR="$ROOT/.timsquad/trails"
|
|
10
|
+
ARCHIVE_DIR="$TRAILS_DIR/.archive"
|
|
11
|
+
|
|
12
|
+
if [ ! -d "$TRAILS_DIR" ]; then
|
|
13
|
+
echo '{"archived":0,"remaining":0,"reason":"trails directory not found"}'
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# Count trail files (exclude .archive directory)
|
|
18
|
+
trail_files=()
|
|
19
|
+
while IFS= read -r -d '' f; do
|
|
20
|
+
trail_files+=("$f")
|
|
21
|
+
done < <(find "$TRAILS_DIR" -maxdepth 1 -type f -print0 | sort -z)
|
|
22
|
+
|
|
23
|
+
count=${#trail_files[@]}
|
|
24
|
+
|
|
25
|
+
if [ "$count" -le "$MAX_COUNT" ]; then
|
|
26
|
+
echo '{"archived":0,"remaining":'"$count"'}'
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Archive oldest files beyond MAX_COUNT
|
|
31
|
+
to_archive=$((count - MAX_COUNT))
|
|
32
|
+
archive_month=$(date -u +%Y-%m)
|
|
33
|
+
archive_dest="$ARCHIVE_DIR/$archive_month"
|
|
34
|
+
mkdir -p "$archive_dest"
|
|
35
|
+
|
|
36
|
+
archived=0
|
|
37
|
+
for ((i=0; i<to_archive; i++)); do
|
|
38
|
+
file="${trail_files[$i]}"
|
|
39
|
+
mv "$file" "$archive_dest/"
|
|
40
|
+
((archived++))
|
|
41
|
+
done
|
|
42
|
+
|
|
43
|
+
remaining=$((count - archived))
|
|
44
|
+
echo '{"archived":'"$archived"',"remaining":'"$remaining"',"archive_path":"'"$archive_dest"'"}'
|