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.
Files changed (91) hide show
  1. package/README.ko.md +3 -2
  2. package/README.md +39 -4
  3. package/dist/commands/audit.d.ts +6 -0
  4. package/dist/commands/audit.d.ts.map +1 -0
  5. package/dist/commands/audit.js +111 -0
  6. package/dist/commands/audit.js.map +1 -0
  7. package/dist/commands/log.d.ts +6 -0
  8. package/dist/commands/log.d.ts.map +1 -0
  9. package/dist/commands/log.js +85 -0
  10. package/dist/commands/log.js.map +1 -0
  11. package/dist/commands/next.d.ts +15 -0
  12. package/dist/commands/next.d.ts.map +1 -0
  13. package/dist/commands/next.js +146 -0
  14. package/dist/commands/next.js.map +1 -0
  15. package/dist/commands/plan.d.ts +6 -0
  16. package/dist/commands/plan.d.ts.map +1 -0
  17. package/dist/commands/plan.js +83 -0
  18. package/dist/commands/plan.js.map +1 -0
  19. package/dist/commands/retro.d.ts +6 -0
  20. package/dist/commands/retro.d.ts.map +1 -0
  21. package/dist/commands/retro.js +74 -0
  22. package/dist/commands/retro.js.map +1 -0
  23. package/dist/commands/spec.d.ts +6 -0
  24. package/dist/commands/spec.d.ts.map +1 -0
  25. package/dist/commands/spec.js +56 -0
  26. package/dist/commands/spec.js.map +1 -0
  27. package/dist/commands/status.d.ts +6 -0
  28. package/dist/commands/status.d.ts.map +1 -0
  29. package/dist/commands/status.js +99 -0
  30. package/dist/commands/status.js.map +1 -0
  31. package/dist/daemon/index.d.ts.map +1 -1
  32. package/dist/daemon/index.js +12 -10
  33. package/dist/daemon/index.js.map +1 -1
  34. package/dist/daemon/meta-cache.d.ts +2 -1
  35. package/dist/daemon/meta-cache.d.ts.map +1 -1
  36. package/dist/daemon/meta-cache.js +20 -4
  37. package/dist/daemon/meta-cache.js.map +1 -1
  38. package/dist/index.js +15 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/lib/config.d.ts.map +1 -1
  41. package/dist/lib/config.js +14 -1
  42. package/dist/lib/config.js.map +1 -1
  43. package/dist/lib/planning-parser.d.ts +65 -0
  44. package/dist/lib/planning-parser.d.ts.map +1 -0
  45. package/dist/lib/planning-parser.js +306 -0
  46. package/dist/lib/planning-parser.js.map +1 -0
  47. package/dist/lib/skill-generator.d.ts.map +1 -1
  48. package/dist/lib/skill-generator.js +7 -3
  49. package/dist/lib/skill-generator.js.map +1 -1
  50. package/dist/lib/template.d.ts.map +1 -1
  51. package/dist/lib/template.js +16 -5
  52. package/dist/lib/template.js.map +1 -1
  53. package/dist/lib/workflow-state.d.ts +77 -0
  54. package/dist/lib/workflow-state.d.ts.map +1 -1
  55. package/dist/lib/workflow-state.js +194 -0
  56. package/dist/lib/workflow-state.js.map +1 -1
  57. package/dist/types/config.d.ts +14 -0
  58. package/dist/types/config.d.ts.map +1 -1
  59. package/dist/types/config.js +13 -2
  60. package/dist/types/config.js.map +1 -1
  61. package/package.json +1 -1
  62. package/templates/base/agents/base/tsq-librarian.md +1 -1
  63. package/templates/base/scripts/calculate-retro-metrics.sh +46 -0
  64. package/templates/base/scripts/check-circular-deps.sh +82 -0
  65. package/templates/base/scripts/cleanup-trails.sh +44 -0
  66. package/templates/base/scripts/generate-prd-traceability.sh +91 -0
  67. package/templates/base/scripts/manage-fp-registry.sh +83 -0
  68. package/templates/base/scripts/validate-gherkin.sh +113 -0
  69. package/templates/base/skills/tsq-controller/SKILL.md +60 -37
  70. package/templates/base/skills/tsq-controller/references/model-routing.md +38 -0
  71. package/templates/base/skills/tsq-controller/references/wave-dispatch.md +50 -0
  72. package/templates/base/skills/tsq-full/SKILL.md +12 -9
  73. package/templates/base/skills/tsq-grill/SKILL.md +60 -55
  74. package/templates/base/skills/tsq-grill/references/interview-guide.md +86 -0
  75. package/templates/base/skills/tsq-inspect/SKILL.md +108 -0
  76. package/templates/base/skills/tsq-inspect/references/checklist.md +162 -0
  77. package/templates/base/skills/tsq-start/SKILL.md +17 -44
  78. package/templates/base/skills/tsq-start/references/onboarding-steps.md +85 -0
  79. package/templates/platforms/claude-code/scripts/build-gate.sh +25 -2
  80. package/templates/platforms/claude-code/scripts/check-capability.sh +41 -10
  81. package/templates/platforms/claude-code/scripts/completion-guard.sh +79 -3
  82. package/templates/platforms/claude-code/scripts/detect-env.sh +124 -0
  83. package/templates/platforms/claude-code/scripts/stale-guard.sh +47 -0
  84. package/templates/platforms/claude-code/scripts/subagent-stop.sh +41 -2
  85. package/templates/platforms/claude-code/scripts/tdd-guard.sh +57 -0
  86. package/templates/platforms/claude-code/scripts/validate-completion-report.sh +86 -0
  87. package/templates/platforms/claude-code/settings.json +10 -0
  88. package/templates/project-types/fintech/config.yaml +1 -1
  89. package/templates/project-types/mobile-app/config.yaml +1 -1
  90. package/templates/project-types/web-app/config.yaml +1 -1
  91. 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;AAE3D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,aAAa,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,GAAG,IAAI,CAAC;IACT,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACjD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAoBD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAWnF;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAItE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CAaf"}
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;AAwC1B,MAAM,kBAAkB,GAAqB;IAC3C,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;CACf,CAAC;AAEF,MAAM,aAAa,GAAkB;IACnC,cAAc,EAAE,OAAO;IACvB,UAAU,EAAE,kBAAkB;IAC9B,aAAa,EAAE,IAAI;IACnB,SAAS,EAAE,EAAE;IACb,gBAAgB,EAAE,EAAE;IACpB,gBAAgB,EAAE,EAAE;CACrB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,MAAM,SAAS,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO;YACL,GAAG,aAAa;YAChB,GAAG,IAAI;YACP,UAAU,EAAE,EAAE,GAAG,kBAAkB,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;SAClE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,KAAoB;IAC/E,MAAM,SAAS,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAA0B;IAC3D,IAAI,GAAG,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,OAAO,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAoB,EACpB,KAAa;IAEb,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QACrE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACnD,qDAAqD;QACrD,MAAM,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACrE,IAAI,WAAW;YAAE,SAAS;QAC1B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../src/lib/workflow-state.ts"],"names":[],"mappings":"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"}
@@ -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":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3F;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,sBAAsB,CAAC;IACpC,YAAY,EAAE,mBAAmB,CAAC;IAClC,OAAO,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1C,SAAS,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa,CAAC;IACrD,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,GAAG,YAAY,CAAC;IACtC,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;IAC5C,QAAQ,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxD,GAAG,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IACvC,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,aAAa,CAAC;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,UAAU,GAAG,cAAc,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,eAAe,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE;QACL,+BAA+B;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,8BAA8B;QAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE;QACR,yCAAyC;QACzC,OAAO,EAAE,MAAM,CAAC;QAChB,8BAA8B;QAC9B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,IAAI,EAAE;QACJ,4CAA4C;QAC5C,OAAO,EAAE,MAAM,CAAC;QAChB,8BAA8B;QAC9B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YAa5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,YAAY,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,SAAS,EAAE,OAAO,CAAC;IACnB,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,KAAK,EAAE,OAAO,CAAC;IACf,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,WAAW,CAAC;QAClB,KAAK,EAAE,YAAY,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,WAAW,EAAE,iBAAiB,CAAC;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAChD,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,IAAI,CAAC,EAAE;QACL,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,eAAe,CAAC,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;GAEG;AACH;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,CAQ1D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CA4BvD,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,WAAW,EAAE,MAAM,EAW/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CA2B3D,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,cAAc,EAAE,MAAM,EAMlC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAO9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAMlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAWpD,CAAC;AAeF;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,kBAGnC,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAYzC;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CA4B1D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,OAAO,CAAC,cAAc,CA+B5D,CAAC"}
@@ -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: 'sonnet',
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,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AA0FA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,KAAK,EAAE;QACL,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC;KACpF;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,aAAa;QACtB,WAAW,EAAE,CAAC;KACf;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,oBAAoB;QAC7B,WAAW,EAAE,CAAC;KACf;CACF,CAAC;AAsDF;;GAEG;AACH;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAqC;IAC7D,aAAa,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC;IACxE,aAAa,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC;IACnE,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC;IAC3E,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC;IACpE,UAAU,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC;IACzD,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC;IAC5D,YAAY,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC;CACxE,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAkC;IAC1D,aAAa,EAAE;QACb,WAAW,EAAE,YAAY,EAAE,UAAU;QACrC,cAAc,EAAE,YAAY,EAAE,QAAQ;QACtC,cAAc;KACf;IACD,SAAS,EAAE;QACT,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,cAAc;KACzB;IACD,aAAa,EAAE;QACb,UAAU,EAAE,cAAc,EAAE,YAAY;QACxC,cAAc;KACf;IACD,UAAU,EAAE;QACV,UAAU,EAAE,cAAc;KAC3B;IACD,SAAS,EAAE;QACT,UAAU,EAAE,cAAc,EAAE,YAAY;QACxC,cAAc;KACf;IACD,OAAO,EAAE;QACP,cAAc;KACf;IACD,YAAY,EAAE;QACZ,aAAa,EAAE,UAAU;QACzB,cAAc;KACf;CACF,CAAC;AAEF,wDAAwD;AACxD,MAAM,CAAC,MAAM,WAAW,GAAa;IACnC,cAAc,EAAE,gBAAgB,EAAE,eAAe;IACjD,YAAY,EAAE,aAAa,EAAE,gBAAgB;IAC7C,cAAc,EAAE,kBAAkB;IAClC,WAAW,EAAE,YAAY;IACzB,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,YAAY,EAAE,SAAS;IACpC,YAAY,EAAE,YAAY;IAC1B,WAAW,EAAE,eAAe;IAC5B,mBAAmB,EAAE,eAAe,EAAE,eAAe;IACrD,WAAW,EAAE,UAAU;CACxB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAkC;IAC9D,aAAa,EAAE;QACb,qBAAqB,EAAE,0BAA0B;QACjD,6BAA6B,EAAE,gCAAgC;QAC/D,+BAA+B;KAChC;IACD,SAAS,EAAE;QACT,qBAAqB,EAAE,0BAA0B;QACjD,6BAA6B,EAAE,gCAAgC;KAChE;IACD,aAAa,EAAE;QACb,qBAAqB,EAAE,gCAAgC;QACvD,+BAA+B;KAChC;IACD,UAAU,EAAE;QACV,qBAAqB,EAAE,gCAAgC;KACxD;IACD,SAAS,EAAE;QACT,qBAAqB,EAAE,0BAA0B;QACjD,gCAAgC,EAAE,+BAA+B;KAClE;IACD,OAAO,EAAE;QACP,qBAAqB,EAAE,gCAAgC;KACxD;IACD,YAAY,EAAE;QACZ,qBAAqB,EAAE,gCAAgC;KACxD;CACF,CAAC;AAEF,gCAAgC;AAChC,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,4BAA4B;IAC5B,uBAAuB;IACvB,2BAA2B;IAC3B,qBAAqB;IACrB,mBAAmB;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAsC;IACjE,aAAa,EAAE,EAAE;IACjB,gBAAgB,EAAE,EAAE;IACpB,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;IACrC,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;CACd,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsC;IACrE,aAAa,EAAE,EAAE,EAAG,8CAA8C;IAClE,SAAS,EAAE,EAAE,EAAO,+CAA+C;IACnE,gBAAgB,EAAE,EAAE;IACpB,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,EAAE;CACd,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,OAAO,EAAE,CAAC,WAAW,CAAC;IACtB,QAAQ,EAAE,CAAC,YAAY,CAAC;IACxB,MAAM,EAAE,CAAC,UAAU,CAAC;IACpB,MAAM,EAAE,CAAC,UAAU,CAAC;IACpB,QAAQ,EAAE,CAAC,YAAY,CAAC;IACxB,YAAY,EAAE,CAAC,gBAAgB,CAAC;IAChC,YAAY,EAAE,CAAC,cAAc,CAAC;IAC9B,OAAO,EAAE,CAAC,cAAc,CAAC;IACzB,SAAS,EAAE,CAAC,aAAa,CAAC;IAC1B,MAAM,EAAE,CAAC,UAAU,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,YAAY,GAAmD;IACnE,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,QAAQ;IACnB,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,QAAQ;IACb,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAwB;IAExB,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,SAAS,GAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAE5G,MAAM,MAAM,GAA4C,EAAE,CAAC;IAC3D,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,GAAG;YACd,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;YAC1B,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;SACtC,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoC;IAC7D,WAAW,EAAE;QACX,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,MAAM;QACpB,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,aAAa;QACxB,MAAM,EAAE,UAAU;KACnB;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,YAAY;QACtB,GAAG,EAAE,QAAQ;KACd;IACD,MAAM,EAAE,iBAAiB,CAAC,aAAa,CAAC;IACxC,SAAS,EAAE;QACT,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,CAAC,UAAU,CAAC;KACzB;IACD,OAAO,EAAE;QACP,aAAa,EAAE;YACb,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,EAAE;SAChB;QACD,eAAe,EAAE,UAAU;KAC5B;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA4B;IAC/D,WAAW,EAAE;QACX,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,SAAS;QACvB,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,UAAU;KACnB;IACD,OAAO,EAAE;QACP,aAAa,EAAE;YACb,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,EAAE;SAChB;QACD,eAAe,EAAE,UAAU;KAC5B;IACD,SAAS,EAAE;QACT,OAAO,EAAE,IAAI;QACb,YAAY,EAAE;YACZ,qBAAqB;YACrB,iBAAiB;YACjB,YAAY;YACZ,YAAY;YACZ,uBAAuB;YACvB,qBAAqB;YACrB,qBAAqB;SACtB;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "timsquad",
3
- "version": "3.7.1",
3
+ "version": "3.8.0",
4
4
  "description": "AI Agent Development Process Framework - SSOT 기반 문서 체계, 최적화된 에이전트 롤, 회고적 학습",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3,7 +3,7 @@ name: tsq-librarian
3
3
  description: |
4
4
  Phase 종합 기록 전담 에이전트. 문서 작성/갱신만 수행하고 소스 코드를 수정하지 않습니다.
5
5
  Use when: "기록해줘", "리포트 작성", "Phase 정리", "문서 갱신"
6
- model: sonnet
6
+ model: haiku
7
7
  tools: [Read, Write, Edit, Grep, Glob, Bash]
8
8
  skills: [tsq-protocol, tsq-librarian]
9
9
  ---
@@ -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"'"}'