timsquad 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +347 -0
- package/bin/tsq.js +6 -0
- package/dist/commands/feedback.d.ts +3 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +142 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/full.d.ts +3 -0
- package/dist/commands/full.d.ts.map +1 -0
- package/dist/commands/full.js +87 -0
- package/dist/commands/full.js.map +1 -0
- package/dist/commands/git/commit.d.ts +3 -0
- package/dist/commands/git/commit.d.ts.map +1 -0
- package/dist/commands/git/commit.js +88 -0
- package/dist/commands/git/commit.js.map +1 -0
- package/dist/commands/git/index.d.ts +5 -0
- package/dist/commands/git/index.d.ts.map +1 -0
- package/dist/commands/git/index.js +5 -0
- package/dist/commands/git/index.js.map +1 -0
- package/dist/commands/git/pr.d.ts +3 -0
- package/dist/commands/git/pr.d.ts.map +1 -0
- package/dist/commands/git/pr.js +138 -0
- package/dist/commands/git/pr.js.map +1 -0
- package/dist/commands/git/release.d.ts +3 -0
- package/dist/commands/git/release.d.ts.map +1 -0
- package/dist/commands/git/release.js +158 -0
- package/dist/commands/git/release.js.map +1 -0
- package/dist/commands/git/sync.d.ts +3 -0
- package/dist/commands/git/sync.d.ts.map +1 -0
- package/dist/commands/git/sync.js +132 -0
- package/dist/commands/git/sync.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +150 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +271 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/metrics.d.ts +3 -0
- package/dist/commands/metrics.d.ts.map +1 -0
- package/dist/commands/metrics.js +299 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/commands/quick.d.ts +3 -0
- package/dist/commands/quick.d.ts.map +1 -0
- package/dist/commands/quick.js +136 -0
- package/dist/commands/quick.js.map +1 -0
- package/dist/commands/retro.d.ts +3 -0
- package/dist/commands/retro.d.ts.map +1 -0
- package/dist/commands/retro.js +280 -0
- package/dist/commands/retro.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +213 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +108 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/project.d.ts +47 -0
- package/dist/lib/project.d.ts.map +1 -0
- package/dist/lib/project.js +191 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/template.d.ts +33 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js +151 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/types/config.d.ts +75 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +66 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/feedback.d.ts +59 -0
- package/dist/types/feedback.d.ts.map +1 -0
- package/dist/types/feedback.js +26 -0
- package/dist/types/feedback.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project.d.ts +89 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +44 -0
- package/dist/types/project.js.map +1 -0
- package/dist/utils/colors.d.ts +30 -0
- package/dist/utils/colors.d.ts.map +1 -0
- package/dist/utils/colors.js +54 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/date.d.ts +25 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +65 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/fs.d.ts +49 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +84 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/prompts.d.ts +31 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +95 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/yaml.d.ts +21 -0
- package/dist/utils/yaml.d.ts.map +1 -0
- package/dist/utils/yaml.js +40 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +71 -0
- package/templates/common/CLAUDE.md.template +254 -0
- package/templates/common/claude/agents/tsq-dba.md +290 -0
- package/templates/common/claude/agents/tsq-designer.md +304 -0
- package/templates/common/claude/agents/tsq-developer.md +118 -0
- package/templates/common/claude/agents/tsq-planner.md +90 -0
- package/templates/common/claude/agents/tsq-prompter.md +336 -0
- package/templates/common/claude/agents/tsq-qa.md +134 -0
- package/templates/common/claude/agents/tsq-retro.md +168 -0
- package/templates/common/claude/agents/tsq-security.md +190 -0
- package/templates/common/claude/skills/architecture/SKILL.md +123 -0
- package/templates/common/claude/skills/backend/node/SKILL.md +1015 -0
- package/templates/common/claude/skills/coding/SKILL.md +171 -0
- package/templates/common/claude/skills/database/prisma/SKILL.md +357 -0
- package/templates/common/claude/skills/frontend/nextjs/SKILL.md +279 -0
- package/templates/common/claude/skills/frontend/react/SKILL.md +1729 -0
- package/templates/common/claude/skills/methodology/bdd/SKILL.md +234 -0
- package/templates/common/claude/skills/methodology/ddd/SKILL.md +311 -0
- package/templates/common/claude/skills/methodology/tdd/SKILL.md +512 -0
- package/templates/common/claude/skills/planning/SKILL.md +90 -0
- package/templates/common/claude/skills/security/SKILL.md +234 -0
- package/templates/common/claude/skills/testing/SKILL.md +146 -0
- package/templates/common/claude/skills/typescript/SKILL.md +435 -0
- package/templates/common/config.template.yaml +131 -0
- package/templates/common/timsquad/architectures/clean/ARCHITECTURE.md +49 -0
- package/templates/common/timsquad/architectures/clean/backend.xml +210 -0
- package/templates/common/timsquad/architectures/clean/frontend.xml +148 -0
- package/templates/common/timsquad/architectures/fsd/ARCHITECTURE.md +67 -0
- package/templates/common/timsquad/architectures/fsd/frontend.xml +288 -0
- package/templates/common/timsquad/architectures/hexagonal/ARCHITECTURE.md +60 -0
- package/templates/common/timsquad/architectures/hexagonal/backend.xml +300 -0
- package/templates/common/timsquad/constraints/competency-framework.xml +501 -0
- package/templates/common/timsquad/constraints/ssot-schema.xml +433 -0
- package/templates/common/timsquad/feedback/feedback-router.sh +341 -0
- package/templates/common/timsquad/feedback/routing-rules.yaml +352 -0
- package/templates/common/timsquad/generators/data-design.xml +290 -0
- package/templates/common/timsquad/generators/prd.xml +280 -0
- package/templates/common/timsquad/generators/requirements.xml +220 -0
- package/templates/common/timsquad/generators/service-spec.xml +266 -0
- package/templates/common/timsquad/logs/_example.md +81 -0
- package/templates/common/timsquad/logs/_template.md +46 -0
- package/templates/common/timsquad/patterns/cqrs.xml +127 -0
- package/templates/common/timsquad/patterns/event-sourcing.xml +85 -0
- package/templates/common/timsquad/patterns/repository.xml +64 -0
- package/templates/common/timsquad/process/state-machine.xml +343 -0
- package/templates/common/timsquad/process/validation-rules.xml +308 -0
- package/templates/common/timsquad/process/workflow-base.xml +202 -0
- package/templates/common/timsquad/retrospective/cycle-report.template.md +205 -0
- package/templates/common/timsquad/retrospective/metrics/metrics-schema.json +203 -0
- package/templates/common/timsquad/retrospective/patterns/failure-patterns.md +199 -0
- package/templates/common/timsquad/retrospective/patterns/success-patterns.md +262 -0
- package/templates/common/timsquad/retrospective/retrospective-config.xml +294 -0
- package/templates/common/timsquad/retrospective/retrospective-state.xml +210 -0
- package/templates/common/timsquad/ssot/adr/ADR-000-template.md +121 -0
- package/templates/common/timsquad/ssot/adr/ADR-001-example.md +115 -0
- package/templates/common/timsquad/ssot/data-design.template.md +132 -0
- package/templates/common/timsquad/ssot/deployment-spec.template.md +384 -0
- package/templates/common/timsquad/ssot/env-config.template.md +346 -0
- package/templates/common/timsquad/ssot/error-codes.template.md +114 -0
- package/templates/common/timsquad/ssot/functional-spec.template.md +185 -0
- package/templates/common/timsquad/ssot/glossary.template.md +148 -0
- package/templates/common/timsquad/ssot/integration-spec.template.md +391 -0
- package/templates/common/timsquad/ssot/planning.template.md +94 -0
- package/templates/common/timsquad/ssot/prd.template.md +102 -0
- package/templates/common/timsquad/ssot/requirements.template.md +117 -0
- package/templates/common/timsquad/ssot/security-spec.template.md +309 -0
- package/templates/common/timsquad/ssot/service-spec.template.md +194 -0
- package/templates/common/timsquad/ssot/test-spec.template.md +264 -0
- package/templates/common/timsquad/ssot/ui-ux-spec.template.md +262 -0
- package/templates/common/timsquad/state/workspace.xml +217 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { colors, printHeader, printError, printSuccess, printKeyValue } from '../utils/colors.js';
|
|
4
|
+
import { findProjectRoot } from '../lib/project.js';
|
|
5
|
+
import { exists, readFile, listFiles } from '../utils/fs.js';
|
|
6
|
+
import { getDateString, getTimestamp } from '../utils/date.js';
|
|
7
|
+
export function registerMetricsCommand(program) {
|
|
8
|
+
const metricsCmd = program
|
|
9
|
+
.command('metrics')
|
|
10
|
+
.description('Collect and view project metrics');
|
|
11
|
+
// tsq metrics collect
|
|
12
|
+
metricsCmd
|
|
13
|
+
.command('collect')
|
|
14
|
+
.description('Collect metrics from logs')
|
|
15
|
+
.option('-d, --days <days>', 'Days to analyze', '7')
|
|
16
|
+
.action(async (options) => {
|
|
17
|
+
try {
|
|
18
|
+
await collectMetrics(parseInt(options.days, 10));
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
printError(error.message);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
// tsq metrics summary
|
|
26
|
+
metricsCmd
|
|
27
|
+
.command('summary')
|
|
28
|
+
.description('Show metrics summary')
|
|
29
|
+
.action(async () => {
|
|
30
|
+
try {
|
|
31
|
+
await showMetricsSummary();
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
printError(error.message);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
// tsq metrics export
|
|
39
|
+
metricsCmd
|
|
40
|
+
.command('export')
|
|
41
|
+
.description('Export metrics to JSON')
|
|
42
|
+
.option('-o, --output <file>', 'Output file path')
|
|
43
|
+
.action(async (options) => {
|
|
44
|
+
try {
|
|
45
|
+
await exportMetrics(options.output);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
printError(error.message);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async function collectMetrics(days) {
|
|
54
|
+
const projectRoot = await findProjectRoot();
|
|
55
|
+
if (!projectRoot) {
|
|
56
|
+
throw new Error('Not a TimSquad project');
|
|
57
|
+
}
|
|
58
|
+
printHeader('Collecting Metrics');
|
|
59
|
+
printKeyValue('Period', `Last ${days} days`);
|
|
60
|
+
const now = new Date();
|
|
61
|
+
const startDate = new Date(now.getTime() - days * 24 * 60 * 60 * 1000);
|
|
62
|
+
// Collect log statistics
|
|
63
|
+
const logsDir = path.join(projectRoot, '.timsquad', 'logs');
|
|
64
|
+
const logStats = await collectLogStats(logsDir, startDate);
|
|
65
|
+
// Collect feedback statistics
|
|
66
|
+
const feedbackStats = await collectFeedbackStats(logsDir, startDate);
|
|
67
|
+
// Collect SSOT statistics
|
|
68
|
+
const ssotDir = path.join(projectRoot, '.timsquad', 'ssot');
|
|
69
|
+
const ssotStats = await collectSSOTStats(ssotDir);
|
|
70
|
+
// Create metrics data
|
|
71
|
+
const metrics = {
|
|
72
|
+
collectedAt: getTimestamp(),
|
|
73
|
+
period: {
|
|
74
|
+
start: startDate.toISOString().split('T')[0],
|
|
75
|
+
end: now.toISOString().split('T')[0],
|
|
76
|
+
},
|
|
77
|
+
logs: logStats,
|
|
78
|
+
feedback: feedbackStats,
|
|
79
|
+
ssot: ssotStats,
|
|
80
|
+
};
|
|
81
|
+
// Save metrics
|
|
82
|
+
const metricsDir = path.join(projectRoot, '.timsquad', 'retrospective', 'metrics');
|
|
83
|
+
await fs.ensureDir(metricsDir);
|
|
84
|
+
const metricsFile = path.join(metricsDir, `metrics-${getDateString()}.json`);
|
|
85
|
+
await fs.writeJson(metricsFile, metrics, { spaces: 2 });
|
|
86
|
+
printSuccess('Metrics collected');
|
|
87
|
+
console.log(colors.path(`\nSaved to: ${metricsFile}`));
|
|
88
|
+
// Show summary
|
|
89
|
+
console.log('');
|
|
90
|
+
await displayMetrics(metrics);
|
|
91
|
+
}
|
|
92
|
+
async function collectLogStats(logsDir, startDate) {
|
|
93
|
+
const stats = {
|
|
94
|
+
total: 0,
|
|
95
|
+
byAgent: {},
|
|
96
|
+
byType: {},
|
|
97
|
+
};
|
|
98
|
+
if (!await exists(logsDir)) {
|
|
99
|
+
return stats;
|
|
100
|
+
}
|
|
101
|
+
const files = await listFiles('*.md', logsDir);
|
|
102
|
+
const startDateStr = startDate.toISOString().split('T')[0];
|
|
103
|
+
for (const file of files) {
|
|
104
|
+
// Skip templates
|
|
105
|
+
if (file.startsWith('_'))
|
|
106
|
+
continue;
|
|
107
|
+
// Parse filename: YYYY-MM-DD-agent.md
|
|
108
|
+
const match = file.match(/^(\d{4}-\d{2}-\d{2})-([a-z]+)\.md$/);
|
|
109
|
+
if (!match)
|
|
110
|
+
continue;
|
|
111
|
+
const [, dateStr, agent] = match;
|
|
112
|
+
// Check date range
|
|
113
|
+
if (dateStr < startDateStr)
|
|
114
|
+
continue;
|
|
115
|
+
stats.total++;
|
|
116
|
+
stats.byAgent[agent] = (stats.byAgent[agent] || 0) + 1;
|
|
117
|
+
// Count entries in the file
|
|
118
|
+
try {
|
|
119
|
+
const content = await readFile(path.join(logsDir, file));
|
|
120
|
+
const workEntries = (content.match(/## \d{2}:\d{2}:\d{2} \[work\]/g) || []).length;
|
|
121
|
+
const errorEntries = (content.match(/## \d{2}:\d{2}:\d{2} \[error\]/g) || []).length;
|
|
122
|
+
const decisionEntries = (content.match(/## \d{2}:\d{2}:\d{2} \[decision\]/g) || []).length;
|
|
123
|
+
stats.byType['work'] = (stats.byType['work'] || 0) + workEntries;
|
|
124
|
+
stats.byType['error'] = (stats.byType['error'] || 0) + errorEntries;
|
|
125
|
+
stats.byType['decision'] = (stats.byType['decision'] || 0) + decisionEntries;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Ignore read errors
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return stats;
|
|
132
|
+
}
|
|
133
|
+
async function collectFeedbackStats(logsDir, startDate) {
|
|
134
|
+
const stats = {
|
|
135
|
+
total: 0,
|
|
136
|
+
byLevel: {},
|
|
137
|
+
};
|
|
138
|
+
if (!await exists(logsDir)) {
|
|
139
|
+
return stats;
|
|
140
|
+
}
|
|
141
|
+
const files = await listFiles('*-feedback.md', logsDir);
|
|
142
|
+
const startDateStr = startDate.toISOString().split('T')[0];
|
|
143
|
+
for (const file of files) {
|
|
144
|
+
// Parse filename: YYYY-MM-DD-feedback.md
|
|
145
|
+
const match = file.match(/^(\d{4}-\d{2}-\d{2})-feedback\.md$/);
|
|
146
|
+
if (!match)
|
|
147
|
+
continue;
|
|
148
|
+
const [, dateStr] = match;
|
|
149
|
+
// Check date range
|
|
150
|
+
if (dateStr < startDateStr)
|
|
151
|
+
continue;
|
|
152
|
+
// Count feedback entries
|
|
153
|
+
try {
|
|
154
|
+
const content = await readFile(path.join(logsDir, file));
|
|
155
|
+
const level1 = (content.match(/\[Level 1\]/g) || []).length;
|
|
156
|
+
const level2 = (content.match(/\[Level 2\]/g) || []).length;
|
|
157
|
+
const level3 = (content.match(/\[Level 3\]/g) || []).length;
|
|
158
|
+
stats.byLevel['1'] = (stats.byLevel['1'] || 0) + level1;
|
|
159
|
+
stats.byLevel['2'] = (stats.byLevel['2'] || 0) + level2;
|
|
160
|
+
stats.byLevel['3'] = (stats.byLevel['3'] || 0) + level3;
|
|
161
|
+
stats.total += level1 + level2 + level3;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Ignore read errors
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return stats;
|
|
168
|
+
}
|
|
169
|
+
async function collectSSOTStats(ssotDir) {
|
|
170
|
+
const stats = {
|
|
171
|
+
documentsCount: 0,
|
|
172
|
+
filledCount: 0,
|
|
173
|
+
completionRate: 0,
|
|
174
|
+
};
|
|
175
|
+
if (!await exists(ssotDir)) {
|
|
176
|
+
return stats;
|
|
177
|
+
}
|
|
178
|
+
const files = await listFiles('*.md', ssotDir);
|
|
179
|
+
for (const file of files) {
|
|
180
|
+
// Skip templates
|
|
181
|
+
if (file.includes('template'))
|
|
182
|
+
continue;
|
|
183
|
+
stats.documentsCount++;
|
|
184
|
+
// Check if document has content
|
|
185
|
+
try {
|
|
186
|
+
const content = await readFile(path.join(ssotDir, file));
|
|
187
|
+
// Consider filled if more than 200 characters of non-template content
|
|
188
|
+
const cleanContent = content
|
|
189
|
+
.replace(/^#.*$/gm, '')
|
|
190
|
+
.replace(/^\s*$/gm, '')
|
|
191
|
+
.trim();
|
|
192
|
+
if (cleanContent.length > 200) {
|
|
193
|
+
stats.filledCount++;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Ignore read errors
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
stats.completionRate = stats.documentsCount > 0
|
|
201
|
+
? Math.round((stats.filledCount / stats.documentsCount) * 100)
|
|
202
|
+
: 0;
|
|
203
|
+
return stats;
|
|
204
|
+
}
|
|
205
|
+
async function showMetricsSummary() {
|
|
206
|
+
const projectRoot = await findProjectRoot();
|
|
207
|
+
if (!projectRoot) {
|
|
208
|
+
throw new Error('Not a TimSquad project');
|
|
209
|
+
}
|
|
210
|
+
printHeader('Metrics Summary');
|
|
211
|
+
// Load latest metrics
|
|
212
|
+
const metricsDir = path.join(projectRoot, '.timsquad', 'retrospective', 'metrics');
|
|
213
|
+
if (!await exists(metricsDir)) {
|
|
214
|
+
console.log(colors.dim('No metrics collected yet'));
|
|
215
|
+
console.log(colors.dim('\nRun: tsq metrics collect'));
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const files = await listFiles('metrics-*.json', metricsDir);
|
|
219
|
+
files.sort().reverse();
|
|
220
|
+
if (files.length === 0) {
|
|
221
|
+
console.log(colors.dim('No metrics collected yet'));
|
|
222
|
+
console.log(colors.dim('\nRun: tsq metrics collect'));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Load latest metrics
|
|
226
|
+
const latestFile = path.join(metricsDir, files[0]);
|
|
227
|
+
const metrics = await fs.readJson(latestFile);
|
|
228
|
+
await displayMetrics(metrics);
|
|
229
|
+
}
|
|
230
|
+
async function displayMetrics(metrics) {
|
|
231
|
+
printKeyValue('Collected at', metrics.collectedAt);
|
|
232
|
+
printKeyValue('Period', `${metrics.period.start} ~ ${metrics.period.end}`);
|
|
233
|
+
console.log(colors.subheader('\n📊 Log Statistics'));
|
|
234
|
+
printKeyValue('Total log files', String(metrics.logs.total));
|
|
235
|
+
if (Object.keys(metrics.logs.byAgent).length > 0) {
|
|
236
|
+
console.log(colors.dim('\nBy Agent:'));
|
|
237
|
+
Object.entries(metrics.logs.byAgent)
|
|
238
|
+
.sort((a, b) => b[1] - a[1])
|
|
239
|
+
.forEach(([agent, count]) => {
|
|
240
|
+
console.log(` ${agent.padEnd(12)} ${colors.highlight(String(count))}`);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (Object.keys(metrics.logs.byType).length > 0) {
|
|
244
|
+
console.log(colors.dim('\nBy Type:'));
|
|
245
|
+
Object.entries(metrics.logs.byType)
|
|
246
|
+
.sort((a, b) => b[1] - a[1])
|
|
247
|
+
.forEach(([type, count]) => {
|
|
248
|
+
console.log(` ${type.padEnd(12)} ${colors.highlight(String(count))}`);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
console.log(colors.subheader('\n📝 Feedback Statistics'));
|
|
252
|
+
printKeyValue('Total feedback', String(metrics.feedback.total));
|
|
253
|
+
if (Object.keys(metrics.feedback.byLevel).length > 0) {
|
|
254
|
+
console.log(colors.dim('\nBy Level:'));
|
|
255
|
+
['1', '2', '3'].forEach(level => {
|
|
256
|
+
const count = metrics.feedback.byLevel[level] || 0;
|
|
257
|
+
const label = level === '1' ? '구현 수정' : level === '2' ? '설계 수정' : '기획 수정';
|
|
258
|
+
console.log(` Level ${level} (${label.padEnd(6)}) ${colors.highlight(String(count))}`);
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
console.log(colors.subheader('\n📄 SSOT Status'));
|
|
262
|
+
printKeyValue('Documents', String(metrics.ssot.documentsCount));
|
|
263
|
+
printKeyValue('Filled', String(metrics.ssot.filledCount));
|
|
264
|
+
printKeyValue('Completion rate', `${metrics.ssot.completionRate}%`);
|
|
265
|
+
}
|
|
266
|
+
async function exportMetrics(outputPath) {
|
|
267
|
+
const projectRoot = await findProjectRoot();
|
|
268
|
+
if (!projectRoot) {
|
|
269
|
+
throw new Error('Not a TimSquad project');
|
|
270
|
+
}
|
|
271
|
+
// Load all metrics
|
|
272
|
+
const metricsDir = path.join(projectRoot, '.timsquad', 'retrospective', 'metrics');
|
|
273
|
+
if (!await exists(metricsDir)) {
|
|
274
|
+
throw new Error('No metrics collected yet. Run: tsq metrics collect');
|
|
275
|
+
}
|
|
276
|
+
const files = await listFiles('metrics-*.json', metricsDir);
|
|
277
|
+
if (files.length === 0) {
|
|
278
|
+
throw new Error('No metrics collected yet. Run: tsq metrics collect');
|
|
279
|
+
}
|
|
280
|
+
// Load all metrics files
|
|
281
|
+
const allMetrics = [];
|
|
282
|
+
for (const file of files.sort()) {
|
|
283
|
+
const data = await fs.readJson(path.join(metricsDir, file));
|
|
284
|
+
allMetrics.push(data);
|
|
285
|
+
}
|
|
286
|
+
// Determine output path
|
|
287
|
+
const output = outputPath || path.join(projectRoot, `timsquad-metrics-export-${getDateString()}.json`);
|
|
288
|
+
// Export
|
|
289
|
+
const exportData = {
|
|
290
|
+
exportedAt: getTimestamp(),
|
|
291
|
+
projectRoot,
|
|
292
|
+
metricsCount: allMetrics.length,
|
|
293
|
+
metrics: allMetrics,
|
|
294
|
+
};
|
|
295
|
+
await fs.writeJson(output, exportData, { spaces: 2 });
|
|
296
|
+
printSuccess('Metrics exported');
|
|
297
|
+
console.log(colors.path(`\n${output}`));
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/commands/metrics.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAwB/D,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,UAAU,GAAG,OAAO;SACvB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kCAAkC,CAAC,CAAC;IAEnD,sBAAsB;IACtB,UAAU;SACP,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,GAAG,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,sBAAsB;IACtB,UAAU;SACP,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,kBAAkB,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,qBAAqB;IACrB,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;SACjD,MAAM,CAAC,KAAK,EAAE,OAA4B,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAClC,aAAa,CAAC,QAAQ,EAAE,QAAQ,IAAI,OAAO,CAAC,CAAC;IAE7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAEvE,yBAAyB;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE3D,8BAA8B;IAC9B,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAErE,0BAA0B;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAElD,sBAAsB;IACtB,MAAM,OAAO,GAAgB;QAC3B,WAAW,EAAE,YAAY,EAAE;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5C,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACrC;QACD,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,aAAa;QACvB,IAAI,EAAE,SAAS;KAChB,CAAC;IAEF,eAAe;IACf,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IACnF,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAE/B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,aAAa,EAAE,OAAO,CAAC,CAAC;IAC7E,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAExD,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC,CAAC;IAEvD,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAe,EACf,SAAe;IAEf,MAAM,KAAK,GAAwB;QACjC,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,iBAAiB;QACjB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAEnC,sCAAsC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;QAEjC,mBAAmB;QACnB,IAAI,OAAO,GAAG,YAAY;YAAE,SAAS;QAErC,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvD,4BAA4B;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACnF,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACrF,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAE3F,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC;YACjE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC;YACpE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,OAAe,EACf,SAAe;IAEf,MAAM,KAAK,GAA4B;QACrC,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,yCAAyC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;QAE1B,mBAAmB;QACnB,IAAI,OAAO,GAAG,YAAY;YAAE,SAAS;QAErC,yBAAyB;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAEzD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC5D,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC5D,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAE5D,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;YACxD,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;YACxD,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;YACxD,KAAK,CAAC,KAAK,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAwB;QACjC,cAAc,EAAE,CAAC;QACjB,WAAW,EAAE,CAAC;QACd,cAAc,EAAE,CAAC;KAClB,CAAC;IAEF,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,iBAAiB;QACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,SAAS;QAExC,KAAK,CAAC,cAAc,EAAE,CAAC;QAEvB,gCAAgC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACzD,sEAAsE;YACtE,MAAM,YAAY,GAAG,OAAO;iBACzB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;iBACtB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;iBACtB,IAAI,EAAE,CAAC;YAEV,IAAI,YAAY,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC9B,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC;QAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC;QAC9D,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAE/B,sBAAsB;IACtB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IAEnF,IAAI,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAEvB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAgB,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE3D,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,OAAoB;IAChD,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,aAAa,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAE3E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACrD,aAAa,CAAC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7D,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;aACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACP,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;aAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAC1D,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEhE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACvC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAClD,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAChE,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1D,aAAa,CAAC,iBAAiB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,UAAmB;IAC9C,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IAEnF,IAAI,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,yBAAyB;IACzB,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,wBAAwB;IACxB,MAAM,MAAM,GAAG,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,2BAA2B,aAAa,EAAE,OAAO,CAAC,CAAC;IAEvG,SAAS;IACT,MAAM,UAAU,GAAG;QACjB,UAAU,EAAE,YAAY,EAAE;QAC1B,WAAW;QACX,YAAY,EAAE,UAAU,CAAC,MAAM;QAC/B,OAAO,EAAE,UAAU;KACpB,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAEtD,YAAY,CAAC,kBAAkB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick.d.ts","sourceRoot":"","sources":["../../src/commands/quick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwCpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa3D"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { colors, printHeader, printError, printSuccess, printWarning, printKeyValue } from '../utils/colors.js';
|
|
3
|
+
import { findProjectRoot } from '../lib/project.js';
|
|
4
|
+
import { exists, writeFile, readFile } from '../utils/fs.js';
|
|
5
|
+
import { getDateString, getTimeString } from '../utils/date.js';
|
|
6
|
+
import { promptConfirm } from '../utils/prompts.js';
|
|
7
|
+
const DEFAULT_QUICK_CONFIG = {
|
|
8
|
+
keywords: [
|
|
9
|
+
'수정', '고쳐', '바꿔', '변경',
|
|
10
|
+
'fix', 'change', 'update',
|
|
11
|
+
'오타', 'typo', '색상', '텍스트',
|
|
12
|
+
'style', 'css', 'color', 'text',
|
|
13
|
+
],
|
|
14
|
+
conditions: {
|
|
15
|
+
single_file_change: true,
|
|
16
|
+
ssot_update_required: false,
|
|
17
|
+
new_feature: false,
|
|
18
|
+
api_change: false,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
export function registerQuickCommand(program) {
|
|
22
|
+
program
|
|
23
|
+
.command('q <task>')
|
|
24
|
+
.alias('quick')
|
|
25
|
+
.description('Quick mode for simple tasks (bypasses SSOT/Planner)')
|
|
26
|
+
.action(async (task) => {
|
|
27
|
+
try {
|
|
28
|
+
await runQuickMode(task);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
printError(error.message);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async function runQuickMode(task) {
|
|
37
|
+
const projectRoot = await findProjectRoot();
|
|
38
|
+
if (!projectRoot) {
|
|
39
|
+
throw new Error('Not a TimSquad project. Run "tsq init" first.');
|
|
40
|
+
}
|
|
41
|
+
printHeader('Quick Mode');
|
|
42
|
+
// Analyze task complexity
|
|
43
|
+
const analysis = analyzeTaskComplexity(task);
|
|
44
|
+
printKeyValue('Task', task);
|
|
45
|
+
printKeyValue('Complexity', analysis.isQuick ? 'Simple' : 'Complex');
|
|
46
|
+
printKeyValue('Confidence', `${Math.round(analysis.confidence * 100)}%`);
|
|
47
|
+
if (!analysis.isQuick) {
|
|
48
|
+
console.log('');
|
|
49
|
+
printWarning(`This task may require Full mode: ${analysis.reason}`);
|
|
50
|
+
const proceed = await promptConfirm('Proceed with Quick mode anyway?', false);
|
|
51
|
+
if (!proceed) {
|
|
52
|
+
console.log(colors.dim('\nSwitch to Full mode with: tsq f "' + task + '"'));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
console.log('');
|
|
57
|
+
console.log(colors.dim('Quick mode executes tasks directly without SSOT checks.'));
|
|
58
|
+
console.log(colors.dim('Agent: Developer (direct call)'));
|
|
59
|
+
console.log('');
|
|
60
|
+
// Log the quick task
|
|
61
|
+
await logQuickTask(projectRoot, task, analysis);
|
|
62
|
+
printSuccess('Quick task logged');
|
|
63
|
+
console.log(colors.dim(`\nLog: .timsquad/logs/quick/${getDateString()}.md`));
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log(colors.subheader('Instructions for Claude:'));
|
|
66
|
+
console.log(colors.dim('─'.repeat(40)));
|
|
67
|
+
console.log(`Execute this simple task directly:`);
|
|
68
|
+
console.log(colors.highlight(`\n ${task}\n`));
|
|
69
|
+
console.log(colors.dim('No SSOT check needed. Minimal logging.'));
|
|
70
|
+
console.log(colors.dim('─'.repeat(40)));
|
|
71
|
+
}
|
|
72
|
+
function analyzeTaskComplexity(task) {
|
|
73
|
+
const lowerTask = task.toLowerCase();
|
|
74
|
+
let confidence = 0.5;
|
|
75
|
+
let isQuick = false;
|
|
76
|
+
let reason = 'Unknown complexity';
|
|
77
|
+
// Check for quick keywords
|
|
78
|
+
const quickKeywords = DEFAULT_QUICK_CONFIG.keywords;
|
|
79
|
+
const hasQuickKeyword = quickKeywords.some(k => lowerTask.includes(k));
|
|
80
|
+
if (hasQuickKeyword) {
|
|
81
|
+
confidence += 0.3;
|
|
82
|
+
isQuick = true;
|
|
83
|
+
reason = 'Contains quick mode keyword';
|
|
84
|
+
}
|
|
85
|
+
// Check for complex indicators
|
|
86
|
+
const complexPatterns = [
|
|
87
|
+
{ pattern: /api|endpoint|엔드포인트/, reason: 'API change detected' },
|
|
88
|
+
{ pattern: /feature|기능|새로운/, reason: 'New feature detected' },
|
|
89
|
+
{ pattern: /database|db|테이블|스키마/, reason: 'Database change detected' },
|
|
90
|
+
{ pattern: /auth|인증|로그인|권한/, reason: 'Authentication change detected' },
|
|
91
|
+
{ pattern: /아키텍처|architecture|구조|리팩토링/, reason: 'Architecture change detected' },
|
|
92
|
+
];
|
|
93
|
+
for (const { pattern, reason: complexReason } of complexPatterns) {
|
|
94
|
+
if (pattern.test(lowerTask)) {
|
|
95
|
+
confidence -= 0.3;
|
|
96
|
+
isQuick = false;
|
|
97
|
+
reason = complexReason;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Adjust confidence based on task length
|
|
102
|
+
if (task.length < 20) {
|
|
103
|
+
confidence += 0.1;
|
|
104
|
+
}
|
|
105
|
+
else if (task.length > 100) {
|
|
106
|
+
confidence -= 0.2;
|
|
107
|
+
}
|
|
108
|
+
// Clamp confidence
|
|
109
|
+
confidence = Math.max(0.1, Math.min(0.95, confidence));
|
|
110
|
+
return {
|
|
111
|
+
isQuick: isQuick && confidence > 0.4,
|
|
112
|
+
reason,
|
|
113
|
+
suggestedAgent: 'developer',
|
|
114
|
+
confidence,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
async function logQuickTask(projectRoot, task, analysis) {
|
|
118
|
+
const date = getDateString();
|
|
119
|
+
const time = getTimeString();
|
|
120
|
+
const logDir = path.join(projectRoot, '.timsquad', 'logs', 'quick');
|
|
121
|
+
const logFile = path.join(logDir, `${date}.md`);
|
|
122
|
+
let content = '';
|
|
123
|
+
if (await exists(logFile)) {
|
|
124
|
+
content = await readFile(logFile);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
content = `# Quick Mode Log - ${date}\n\n`;
|
|
128
|
+
}
|
|
129
|
+
content += `## ${time} - Developer\n\n`;
|
|
130
|
+
content += `- **Task**: ${task}\n`;
|
|
131
|
+
content += `- **Confidence**: ${Math.round(analysis.confidence * 100)}%\n`;
|
|
132
|
+
content += `- **Status**: Pending\n`;
|
|
133
|
+
content += `\n---\n\n`;
|
|
134
|
+
await writeFile(logFile, content);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=quick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick.js","sourceRoot":"","sources":["../../src/commands/quick.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retro.d.ts","sourceRoot":"","sources":["../../src/commands/retro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkF3D"}
|