musubi-sdd 5.1.0 → 5.6.1
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.ja.md +106 -48
- package/README.md +110 -32
- package/bin/musubi-analyze.js +74 -67
- package/bin/musubi-browser.js +27 -26
- package/bin/musubi-change.js +48 -47
- package/bin/musubi-checkpoint.js +10 -7
- package/bin/musubi-convert.js +25 -25
- package/bin/musubi-costs.js +27 -10
- package/bin/musubi-gui.js +52 -46
- package/bin/musubi-init.js +1952 -10
- package/bin/musubi-orchestrate.js +327 -239
- package/bin/musubi-remember.js +69 -56
- package/bin/musubi-resolve.js +53 -45
- package/bin/musubi-trace.js +51 -22
- package/bin/musubi-validate.js +39 -30
- package/bin/musubi-workflow.js +33 -34
- package/bin/musubi.js +39 -2
- package/package.json +1 -1
- package/src/agents/agent-loop.js +94 -95
- package/src/agents/agentic/code-generator.js +119 -109
- package/src/agents/agentic/code-reviewer.js +105 -108
- package/src/agents/agentic/index.js +4 -4
- package/src/agents/browser/action-executor.js +13 -13
- package/src/agents/browser/ai-comparator.js +11 -10
- package/src/agents/browser/context-manager.js +6 -6
- package/src/agents/browser/index.js +5 -5
- package/src/agents/browser/nl-parser.js +31 -46
- package/src/agents/browser/screenshot.js +2 -2
- package/src/agents/browser/test-generator.js +6 -4
- package/src/agents/function-tool.js +71 -65
- package/src/agents/index.js +7 -7
- package/src/agents/schema-generator.js +98 -94
- package/src/analyzers/ast-extractor.js +158 -146
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +241 -126
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +77 -81
- package/src/analyzers/security-analyzer.js +19 -11
- package/src/analyzers/stuck-detector.js +19 -17
- package/src/converters/index.js +78 -57
- package/src/converters/ir/types.js +12 -12
- package/src/converters/parsers/musubi-parser.js +134 -126
- package/src/converters/parsers/openapi-parser.js +70 -53
- package/src/converters/parsers/speckit-parser.js +239 -175
- package/src/converters/writers/musubi-writer.js +123 -118
- package/src/converters/writers/speckit-writer.js +124 -113
- package/src/generators/rust-migration-generator.js +512 -0
- package/src/gui/public/index.html +1365 -1211
- package/src/gui/server.js +41 -40
- package/src/gui/services/file-watcher.js +23 -8
- package/src/gui/services/project-scanner.js +26 -20
- package/src/gui/services/replanning-service.js +27 -23
- package/src/gui/services/traceability-service.js +8 -8
- package/src/gui/services/workflow-service.js +14 -7
- package/src/index.js +151 -0
- package/src/integrations/cicd.js +90 -104
- package/src/integrations/codegraph-mcp.js +643 -0
- package/src/integrations/documentation.js +142 -103
- package/src/integrations/examples.js +95 -80
- package/src/integrations/github-client.js +17 -17
- package/src/integrations/index.js +5 -5
- package/src/integrations/mcp/index.js +21 -21
- package/src/integrations/mcp/mcp-context-provider.js +76 -78
- package/src/integrations/mcp/mcp-discovery.js +74 -72
- package/src/integrations/mcp/mcp-tool-registry.js +99 -94
- package/src/integrations/mcp-connector.js +70 -66
- package/src/integrations/platforms.js +50 -49
- package/src/integrations/tool-discovery.js +37 -31
- package/src/llm-providers/anthropic-provider.js +11 -11
- package/src/llm-providers/base-provider.js +16 -18
- package/src/llm-providers/copilot-provider.js +22 -19
- package/src/llm-providers/index.js +26 -25
- package/src/llm-providers/ollama-provider.js +11 -11
- package/src/llm-providers/openai-provider.js +12 -12
- package/src/managers/agent-memory.js +36 -24
- package/src/managers/checkpoint-manager.js +4 -8
- package/src/managers/delta-spec.js +19 -19
- package/src/managers/index.js +13 -4
- package/src/managers/memory-condenser.js +35 -45
- package/src/managers/repo-skill-manager.js +57 -31
- package/src/managers/skill-loader.js +25 -22
- package/src/managers/skill-tools.js +36 -72
- package/src/managers/workflow.js +30 -22
- package/src/monitoring/cost-tracker.js +48 -46
- package/src/monitoring/incident-manager.js +116 -106
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +75 -62
- package/src/monitoring/quality-dashboard.js +45 -41
- package/src/monitoring/release-manager.js +63 -53
- package/src/orchestration/agent-skill-binding.js +39 -47
- package/src/orchestration/error-handler.js +65 -107
- package/src/orchestration/guardrails/base-guardrail.js +26 -24
- package/src/orchestration/guardrails/guardrail-rules.js +50 -64
- package/src/orchestration/guardrails/index.js +5 -5
- package/src/orchestration/guardrails/input-guardrail.js +58 -45
- package/src/orchestration/guardrails/output-guardrail.js +104 -81
- package/src/orchestration/guardrails/safety-check.js +79 -79
- package/src/orchestration/index.js +38 -55
- package/src/orchestration/mcp-tool-adapters.js +96 -99
- package/src/orchestration/orchestration-engine.js +21 -21
- package/src/orchestration/pattern-registry.js +60 -45
- package/src/orchestration/patterns/auto.js +34 -47
- package/src/orchestration/patterns/group-chat.js +59 -65
- package/src/orchestration/patterns/handoff.js +67 -65
- package/src/orchestration/patterns/human-in-loop.js +51 -72
- package/src/orchestration/patterns/nested.js +25 -40
- package/src/orchestration/patterns/sequential.js +35 -34
- package/src/orchestration/patterns/swarm.js +63 -56
- package/src/orchestration/patterns/triage.js +150 -109
- package/src/orchestration/reasoning/index.js +9 -9
- package/src/orchestration/reasoning/planning-engine.js +143 -140
- package/src/orchestration/reasoning/reasoning-engine.js +206 -144
- package/src/orchestration/reasoning/self-correction.js +121 -128
- package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
- package/src/orchestration/replanning/alternative-generator.js +37 -42
- package/src/orchestration/replanning/config.js +63 -59
- package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
- package/src/orchestration/replanning/index.js +24 -20
- package/src/orchestration/replanning/plan-evaluator.js +49 -50
- package/src/orchestration/replanning/plan-monitor.js +32 -28
- package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
- package/src/orchestration/replanning/replan-history.js +33 -26
- package/src/orchestration/replanning/replanning-engine.js +106 -108
- package/src/orchestration/skill-executor.js +107 -109
- package/src/orchestration/skill-registry.js +85 -89
- package/src/orchestration/workflow-examples.js +228 -231
- package/src/orchestration/workflow-executor.js +65 -68
- package/src/orchestration/workflow-orchestrator.js +72 -73
- package/src/phase4-integration.js +47 -40
- package/src/phase5-integration.js +89 -30
- package/src/reporters/coverage-report.js +82 -30
- package/src/reporters/hierarchical-reporter.js +498 -0
- package/src/reporters/traceability-matrix-report.js +29 -20
- package/src/resolvers/issue-resolver.js +43 -31
- package/src/steering/advanced-validation.js +133 -124
- package/src/steering/auto-updater.js +60 -73
- package/src/steering/index.js +6 -6
- package/src/steering/quality-metrics.js +41 -35
- package/src/steering/steering-auto-update.js +83 -86
- package/src/steering/steering-validator.js +98 -106
- package/src/steering/template-constraints.js +53 -54
- package/src/templates/agents/claude-code/CLAUDE.md +32 -32
- package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
- package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
- package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
- package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
- package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
- package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
- package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
- package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
- package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
- package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
- package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
- package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
- package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
- package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
- package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
- package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
- package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
- package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
- package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
- package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
- package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
- package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
- package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
- package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
- package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
- package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
- package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
- package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
- package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
- package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
- package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
- package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
- package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
- package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
- package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
- package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
- package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
- package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
- package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
- package/src/templates/agents/codex/AGENTS.md +74 -42
- package/src/templates/agents/cursor/AGENTS.md +74 -42
- package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
- package/src/templates/agents/github-copilot/AGENTS.md +83 -51
- package/src/templates/agents/qwen-code/QWEN.md +74 -42
- package/src/templates/agents/windsurf/AGENTS.md +74 -42
- package/src/templates/architectures/README.md +41 -0
- package/src/templates/architectures/clean-architecture/README.md +113 -0
- package/src/templates/architectures/event-driven/README.md +162 -0
- package/src/templates/architectures/hexagonal/README.md +130 -0
- package/src/templates/index.js +6 -1
- package/src/templates/locale-manager.js +16 -16
- package/src/templates/shared/delta-spec-template.md +20 -13
- package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
- package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
- package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
- package/src/templates/shared/steering/structure.md +95 -0
- package/src/templates/skills/browser-agent.md +21 -16
- package/src/templates/skills/web-gui.md +8 -0
- package/src/templates/template-constraints.js +50 -53
- package/src/validators/advanced-validation.js +30 -36
- package/src/validators/constitutional-validator.js +77 -73
- package/src/validators/critic-system.js +49 -59
- package/src/validators/delta-format.js +59 -55
- package/src/validators/traceability-validator.js +7 -11
|
@@ -43,23 +43,23 @@ describe('AuthService', () => {
|
|
|
43
43
|
const authService = new AuthService(mockUserRepo);
|
|
44
44
|
const email = 'test@example.com';
|
|
45
45
|
const password = 'validPassword123';
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
// Act
|
|
48
48
|
const result = await authService.login(email, password);
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
// Assert
|
|
51
51
|
expect(result.success).toBe(true);
|
|
52
52
|
expect(result.user.email).toBe(email);
|
|
53
53
|
});
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
it('should throw error when credentials are invalid', async () => {
|
|
56
56
|
// Arrange
|
|
57
57
|
const authService = new AuthService(mockUserRepo);
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
// Act & Assert
|
|
60
|
-
await expect(
|
|
61
|
-
|
|
62
|
-
)
|
|
60
|
+
await expect(authService.login('test@example.com', 'wrongPassword')).rejects.toThrow(
|
|
61
|
+
'Invalid credentials'
|
|
62
|
+
);
|
|
63
63
|
});
|
|
64
64
|
});
|
|
65
65
|
});
|
|
@@ -78,17 +78,17 @@ describe('AuthService', () => {
|
|
|
78
78
|
|
|
79
79
|
export class AuthService {
|
|
80
80
|
constructor(private userRepository: UserRepository) {}
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
async login(email: string, password: string): Promise<AuthResult> {
|
|
83
83
|
const user = await this.userRepository.findByEmail(email);
|
|
84
|
-
|
|
84
|
+
|
|
85
85
|
if (!user || !this.verifyPassword(password, user.passwordHash)) {
|
|
86
86
|
throw new Error('Invalid credentials');
|
|
87
87
|
}
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
return { success: true, user };
|
|
90
90
|
}
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
private verifyPassword(password: string, hash: string): boolean {
|
|
93
93
|
// Minimal implementation - just enough to pass test
|
|
94
94
|
return bcrypt.compareSync(password, hash);
|
|
@@ -113,16 +113,16 @@ export class AuthService {
|
|
|
113
113
|
private passwordService: PasswordService, // Extract dependency
|
|
114
114
|
private logger: Logger // Add observability
|
|
115
115
|
) {}
|
|
116
|
-
|
|
116
|
+
|
|
117
117
|
async login(email: string, password: string): Promise<AuthResult> {
|
|
118
118
|
const user = await this.findUserOrFail(email);
|
|
119
119
|
await this.validatePasswordOrFail(password, user);
|
|
120
|
-
|
|
120
|
+
|
|
121
121
|
this.logger.info('User logged in', { userId: user.id });
|
|
122
|
-
|
|
122
|
+
|
|
123
123
|
return { success: true, user };
|
|
124
124
|
}
|
|
125
|
-
|
|
125
|
+
|
|
126
126
|
private async findUserOrFail(email: string): Promise<User> {
|
|
127
127
|
const user = await this.userRepository.findByEmail(email);
|
|
128
128
|
if (!user) {
|
|
@@ -130,7 +130,7 @@ export class AuthService {
|
|
|
130
130
|
}
|
|
131
131
|
return user;
|
|
132
132
|
}
|
|
133
|
-
|
|
133
|
+
|
|
134
134
|
private async validatePasswordOrFail(password: string, user: User): Promise<void> {
|
|
135
135
|
const isValid = await this.passwordService.verify(password, user.passwordHash);
|
|
136
136
|
if (!isValid) {
|
|
@@ -199,7 +199,7 @@ describe('POST /api/auth/login', () => {
|
|
|
199
199
|
const response = await request(app)
|
|
200
200
|
.post('/api/auth/login')
|
|
201
201
|
.send({ email: 'user@test.com', password: 'password123' });
|
|
202
|
-
|
|
202
|
+
|
|
203
203
|
expect(response.status).toBe(200);
|
|
204
204
|
expect(response.body.token).toBeDefined();
|
|
205
205
|
});
|
|
@@ -211,7 +211,7 @@ describe('POST /api/auth/login', () => {
|
|
|
211
211
|
const response = await request(app)
|
|
212
212
|
.post('/api/auth/login')
|
|
213
213
|
.send({ email: 'user@test.com', password: 'wrong' });
|
|
214
|
-
|
|
214
|
+
|
|
215
215
|
expect(response.status).toBe(401);
|
|
216
216
|
});
|
|
217
217
|
});
|
|
@@ -244,32 +244,32 @@ describe('[ClassName]', () => {
|
|
|
244
244
|
// Setup
|
|
245
245
|
let sut: ClassName; // System Under Test
|
|
246
246
|
let mockDependency: jest.Mocked<Dependency>;
|
|
247
|
-
|
|
247
|
+
|
|
248
248
|
beforeEach(() => {
|
|
249
249
|
mockDependency = {
|
|
250
250
|
method: jest.fn(),
|
|
251
251
|
};
|
|
252
252
|
sut = new ClassName(mockDependency);
|
|
253
253
|
});
|
|
254
|
-
|
|
254
|
+
|
|
255
255
|
describe('[methodName]', () => {
|
|
256
256
|
it('should [expected behavior] when [condition]', () => {
|
|
257
257
|
// Arrange
|
|
258
258
|
const input = 'test input';
|
|
259
259
|
mockDependency.method.mockReturnValue('mocked result');
|
|
260
|
-
|
|
260
|
+
|
|
261
261
|
// Act
|
|
262
262
|
const result = sut.methodName(input);
|
|
263
|
-
|
|
263
|
+
|
|
264
264
|
// Assert
|
|
265
265
|
expect(result).toBe('expected result');
|
|
266
266
|
expect(mockDependency.method).toHaveBeenCalledWith(input);
|
|
267
267
|
});
|
|
268
|
-
|
|
268
|
+
|
|
269
269
|
it('should throw [ErrorType] when [error condition]', () => {
|
|
270
270
|
// Arrange
|
|
271
271
|
const invalidInput = null;
|
|
272
|
-
|
|
272
|
+
|
|
273
273
|
// Act & Assert
|
|
274
274
|
expect(() => sut.methodName(invalidInput)).toThrow(ErrorType);
|
|
275
275
|
});
|
|
@@ -284,36 +284,36 @@ describe('[API Endpoint]', () => {
|
|
|
284
284
|
// Setup
|
|
285
285
|
let app: Express;
|
|
286
286
|
let db: TestDatabase;
|
|
287
|
-
|
|
287
|
+
|
|
288
288
|
beforeAll(async () => {
|
|
289
289
|
db = await TestDatabase.create();
|
|
290
290
|
app = createApp({ database: db });
|
|
291
291
|
});
|
|
292
|
-
|
|
292
|
+
|
|
293
293
|
afterAll(async () => {
|
|
294
294
|
await db.close();
|
|
295
295
|
});
|
|
296
|
-
|
|
296
|
+
|
|
297
297
|
beforeEach(async () => {
|
|
298
298
|
await db.clear();
|
|
299
299
|
await db.seed();
|
|
300
300
|
});
|
|
301
|
-
|
|
301
|
+
|
|
302
302
|
describe('[HTTP Method] [Path]', () => {
|
|
303
303
|
it('should return [status] when [condition]', async () => {
|
|
304
304
|
// Arrange
|
|
305
305
|
const payload = { key: 'value' };
|
|
306
|
-
|
|
306
|
+
|
|
307
307
|
// Act
|
|
308
308
|
const response = await request(app)
|
|
309
309
|
.post('/api/resource')
|
|
310
310
|
.set('Authorization', `Bearer ${token}`)
|
|
311
311
|
.send(payload);
|
|
312
|
-
|
|
312
|
+
|
|
313
313
|
// Assert
|
|
314
314
|
expect(response.status).toBe(201);
|
|
315
315
|
expect(response.body.id).toBeDefined();
|
|
316
|
-
|
|
316
|
+
|
|
317
317
|
// Verify side effects
|
|
318
318
|
const record = await db.find('resources', response.body.id);
|
|
319
319
|
expect(record).toBeDefined();
|
|
@@ -327,24 +327,28 @@ describe('[API Endpoint]', () => {
|
|
|
327
327
|
## Common Test-First Mistakes
|
|
328
328
|
|
|
329
329
|
### Mistake 1: Writing Test and Code Together
|
|
330
|
+
|
|
330
331
|
```
|
|
331
332
|
❌ Creating test and implementation in same commit
|
|
332
333
|
✅ Always commit test first, then implementation
|
|
333
334
|
```
|
|
334
335
|
|
|
335
336
|
### Mistake 2: Testing Implementation Details
|
|
337
|
+
|
|
336
338
|
```
|
|
337
339
|
❌ expect(service.internalCache.size).toBe(1);
|
|
338
340
|
✅ expect(service.getData()).toEqual(expectedData);
|
|
339
341
|
```
|
|
340
342
|
|
|
341
343
|
### Mistake 3: Skipping Integration Tests
|
|
344
|
+
|
|
342
345
|
```
|
|
343
346
|
❌ Only unit tests with mocks
|
|
344
347
|
✅ Integration tests first, then unit tests for gaps
|
|
345
348
|
```
|
|
346
349
|
|
|
347
350
|
### Mistake 4: Writing Too Many Tests at Once
|
|
351
|
+
|
|
348
352
|
```
|
|
349
353
|
❌ Writing 10 tests before any implementation
|
|
350
354
|
✅ One test at a time: RED → GREEN → REFACTOR
|
|
@@ -355,16 +359,19 @@ describe('[API Endpoint]', () => {
|
|
|
355
359
|
## Test-First Checklist
|
|
356
360
|
|
|
357
361
|
Before implementation:
|
|
362
|
+
|
|
358
363
|
- [ ] Test file created before source file
|
|
359
364
|
- [ ] Test describes expected behavior
|
|
360
365
|
- [ ] Test is failing (RED)
|
|
361
366
|
|
|
362
367
|
During implementation:
|
|
368
|
+
|
|
363
369
|
- [ ] Minimal code written to pass test
|
|
364
370
|
- [ ] Test is passing (GREEN)
|
|
365
371
|
- [ ] No code without corresponding test
|
|
366
372
|
|
|
367
373
|
After implementation:
|
|
374
|
+
|
|
368
375
|
- [ ] Code refactored for quality
|
|
369
376
|
- [ ] Tests still passing
|
|
370
377
|
- [ ] Test committed before source in git history
|
|
@@ -11,6 +11,7 @@ This document defines the rules for automatically detecting when steering files
|
|
|
11
11
|
### 1. New Dependencies Added
|
|
12
12
|
|
|
13
13
|
**Detection**:
|
|
14
|
+
|
|
14
15
|
```bash
|
|
15
16
|
# package.json changes (Node.js)
|
|
16
17
|
git diff --name-only | grep -E "(package\.json|package-lock\.json)"
|
|
@@ -25,8 +26,10 @@ git diff --name-only | grep -E "go\.(mod|sum)"
|
|
|
25
26
|
**Action**: Update `steering/tech.md` with new dependencies
|
|
26
27
|
|
|
27
28
|
**Example**:
|
|
29
|
+
|
|
28
30
|
```markdown
|
|
29
31
|
# Add to tech.md Dependencies section
|
|
32
|
+
|
|
30
33
|
- **New**: express@4.18.0 (Web framework)
|
|
31
34
|
- **New**: jest@29.0.0 (Testing framework)
|
|
32
35
|
```
|
|
@@ -36,6 +39,7 @@ git diff --name-only | grep -E "go\.(mod|sum)"
|
|
|
36
39
|
### 2. New Directory Structure Created
|
|
37
40
|
|
|
38
41
|
**Detection**:
|
|
42
|
+
|
|
39
43
|
```bash
|
|
40
44
|
# New directories created
|
|
41
45
|
git diff --name-only --diff-filter=A | grep "/" | cut -d'/' -f1 | sort -u
|
|
@@ -44,6 +48,7 @@ git diff --name-only --diff-filter=A | grep "/" | cut -d'/' -f1 | sort -u
|
|
|
44
48
|
**Action**: Update `steering/structure.md` with new directories
|
|
45
49
|
|
|
46
50
|
**Patterns to Watch**:
|
|
51
|
+
|
|
47
52
|
- `src/` - Source code organization
|
|
48
53
|
- `lib/` - Library modules (Constitutional Article I)
|
|
49
54
|
- `tests/` - Test organization
|
|
@@ -55,6 +60,7 @@ git diff --name-only --diff-filter=A | grep "/" | cut -d'/' -f1 | sort -u
|
|
|
55
60
|
### 3. Architecture Pattern Changes
|
|
56
61
|
|
|
57
62
|
**Detection**:
|
|
63
|
+
|
|
58
64
|
```bash
|
|
59
65
|
# Major architectural changes
|
|
60
66
|
git diff --name-only | grep -E "(src/.*index\.(ts|js|py)|main\.(ts|js|py))"
|
|
@@ -66,9 +72,12 @@ find src -type d -maxdepth 2 -newer .git/COMMIT_EDITMSG
|
|
|
66
72
|
**Action**: Update `steering/structure.md` with pattern changes
|
|
67
73
|
|
|
68
74
|
**Example**:
|
|
75
|
+
|
|
69
76
|
```markdown
|
|
70
77
|
# Update Architecture Patterns section
|
|
78
|
+
|
|
71
79
|
## Detected Pattern: Microservices
|
|
80
|
+
|
|
72
81
|
- services/auth/
|
|
73
82
|
- services/user/
|
|
74
83
|
- services/order/
|
|
@@ -79,6 +88,7 @@ find src -type d -maxdepth 2 -newer .git/COMMIT_EDITMSG
|
|
|
79
88
|
### 4. Technology Stack Updates
|
|
80
89
|
|
|
81
90
|
**Detection**:
|
|
91
|
+
|
|
82
92
|
```bash
|
|
83
93
|
# Framework version updates
|
|
84
94
|
git diff package.json | grep -E '"(react|vue|angular|express|fastapi)"'
|
|
@@ -94,6 +104,7 @@ git diff --name-only | grep -E "(webpack|vite|rollup|esbuild)\.config\."
|
|
|
94
104
|
### 5. New Feature Implementation
|
|
95
105
|
|
|
96
106
|
**Detection**:
|
|
107
|
+
|
|
97
108
|
```bash
|
|
98
109
|
# New feature directories
|
|
99
110
|
git diff --name-only --diff-filter=A | grep "storage/features/"
|
|
@@ -146,9 +157,12 @@ git diff --name-only --diff-filter=A | grep "requirements\.md"
|
|
|
146
157
|
**Trigger**: New ADR created in `storage/features/*/design.md`
|
|
147
158
|
|
|
148
159
|
**Action**:
|
|
160
|
+
|
|
149
161
|
```markdown
|
|
150
162
|
# Append to architecture_decisions.md
|
|
163
|
+
|
|
151
164
|
## ADR-XXX: [Decision Title]
|
|
165
|
+
|
|
152
166
|
- **Date**: YYYY-MM-DD
|
|
153
167
|
- **Status**: Accepted
|
|
154
168
|
- **Context**: [Extracted from ADR]
|
|
@@ -160,9 +174,12 @@ git diff --name-only --diff-filter=A | grep "requirements\.md"
|
|
|
160
174
|
**Trigger**: New CI/CD config or build scripts added
|
|
161
175
|
|
|
162
176
|
**Action**:
|
|
177
|
+
|
|
163
178
|
```markdown
|
|
164
179
|
# Update development_workflow.md
|
|
180
|
+
|
|
165
181
|
## Build Process
|
|
182
|
+
|
|
166
183
|
- npm run build (detected from package.json)
|
|
167
184
|
- npm test (detected from package.json)
|
|
168
185
|
```
|
|
@@ -172,9 +189,12 @@ git diff --name-only --diff-filter=A | grep "requirements\.md"
|
|
|
172
189
|
**Trigger**: New business logic files or domain models
|
|
173
190
|
|
|
174
191
|
**Action**:
|
|
192
|
+
|
|
175
193
|
```markdown
|
|
176
194
|
# Update domain_knowledge.md
|
|
195
|
+
|
|
177
196
|
## Core Concepts
|
|
197
|
+
|
|
178
198
|
- User: Represents system users (src/models/user.ts)
|
|
179
199
|
- Order: Purchase transaction (src/models/order.ts)
|
|
180
200
|
```
|
|
@@ -184,9 +204,12 @@ git diff --name-only --diff-filter=A | grep "requirements\.md"
|
|
|
184
204
|
**Trigger**: New CLI commands or scripts added
|
|
185
205
|
|
|
186
206
|
**Action**:
|
|
207
|
+
|
|
187
208
|
```markdown
|
|
188
209
|
# Update suggested_commands.md
|
|
210
|
+
|
|
189
211
|
## Development Commands
|
|
212
|
+
|
|
190
213
|
- `npm run dev` - Start development server
|
|
191
214
|
- `npm run test:watch` - Run tests in watch mode
|
|
192
215
|
```
|
|
@@ -196,9 +219,12 @@ git diff --name-only --diff-filter=A | grep "requirements\.md"
|
|
|
196
219
|
**Trigger**: Post-mortem or retrospective files created
|
|
197
220
|
|
|
198
221
|
**Action**:
|
|
222
|
+
|
|
199
223
|
```markdown
|
|
200
224
|
# Append to lessons_learned.md
|
|
225
|
+
|
|
201
226
|
## [Date]: [Lesson Title]
|
|
227
|
+
|
|
202
228
|
- **Context**: [What happened]
|
|
203
229
|
- **Insight**: [What we learned]
|
|
204
230
|
- **Action**: [What we changed]
|
|
@@ -231,17 +257,21 @@ diff <(grep "Feature" steering/product.md) <(ls storage/features/)
|
|
|
231
257
|
## Detected Issues
|
|
232
258
|
|
|
233
259
|
### tech.md
|
|
260
|
+
|
|
234
261
|
- ⚠️ Missing: express@4.18.0 (added in package.json)
|
|
235
262
|
- ⚠️ Outdated: react@17.0.0 → react@18.2.0
|
|
236
263
|
|
|
237
264
|
### structure.md
|
|
265
|
+
|
|
238
266
|
- ⚠️ Missing directory: src/services/payment/
|
|
239
267
|
- ⚠️ Removed directory: src/legacy/ (no longer exists)
|
|
240
268
|
|
|
241
269
|
### product.md
|
|
270
|
+
|
|
242
271
|
- ⚠️ Missing feature: payment-integration (in storage/features/)
|
|
243
272
|
|
|
244
273
|
## Recommendations
|
|
274
|
+
|
|
245
275
|
1. Run steering skill to update all files
|
|
246
276
|
2. Review changes before committing
|
|
247
277
|
```
|
|
@@ -253,6 +283,7 @@ diff <(grep "Feature" steering/product.md) <(ls storage/features/)
|
|
|
253
283
|
### Git Hooks Integration
|
|
254
284
|
|
|
255
285
|
**pre-commit hook**:
|
|
286
|
+
|
|
256
287
|
```bash
|
|
257
288
|
#!/bin/bash
|
|
258
289
|
# Check if steering files need update
|
|
@@ -34,24 +34,29 @@ We will...
|
|
|
34
34
|
## Consequences
|
|
35
35
|
|
|
36
36
|
### Positive
|
|
37
|
+
|
|
37
38
|
- [Benefit 1]
|
|
38
39
|
- [Benefit 2]
|
|
39
40
|
|
|
40
41
|
### Negative
|
|
42
|
+
|
|
41
43
|
- [Tradeoff 1]
|
|
42
44
|
- [Tradeoff 2]
|
|
43
45
|
|
|
44
46
|
### Neutral
|
|
47
|
+
|
|
45
48
|
- [Neither positive nor negative consequence]
|
|
46
49
|
|
|
47
50
|
## Alternatives Considered
|
|
48
51
|
|
|
49
52
|
### Alternative 1: [Name]
|
|
53
|
+
|
|
50
54
|
- **Pros**: [Benefits]
|
|
51
55
|
- **Cons**: [Drawbacks]
|
|
52
56
|
- **Reason for rejection**: [Why not chosen]
|
|
53
57
|
|
|
54
58
|
### Alternative 2: [Name]
|
|
59
|
+
|
|
55
60
|
- **Pros**: [Benefits]
|
|
56
61
|
- **Cons**: [Drawbacks]
|
|
57
62
|
- **Reason for rejection**: [Why not chosen]
|
|
@@ -81,6 +86,7 @@ Accepted
|
|
|
81
86
|
## Context
|
|
82
87
|
|
|
83
88
|
We need to choose a primary database for our e-commerce platform. The system needs to:
|
|
89
|
+
|
|
84
90
|
- Handle complex relational data (users, orders, products)
|
|
85
91
|
- Support ACID transactions for payment processing
|
|
86
92
|
- Scale to 10,000+ concurrent users
|
|
@@ -93,6 +99,7 @@ Our team has experience with both PostgreSQL and MySQL. The project has 12 month
|
|
|
93
99
|
We will use **PostgreSQL 16** as our primary database.
|
|
94
100
|
|
|
95
101
|
Specific configuration:
|
|
102
|
+
|
|
96
103
|
- Managed PostgreSQL on AWS RDS
|
|
97
104
|
- Primary-replica setup for read scaling
|
|
98
105
|
- pg_trgm extension for full-text search
|
|
@@ -101,6 +108,7 @@ Specific configuration:
|
|
|
101
108
|
## Consequences
|
|
102
109
|
|
|
103
110
|
### Positive
|
|
111
|
+
|
|
104
112
|
- Rich feature set (JSON, full-text search, extensions)
|
|
105
113
|
- Strong ACID compliance for financial transactions
|
|
106
114
|
- Excellent open-source community support
|
|
@@ -108,27 +116,32 @@ Specific configuration:
|
|
|
108
116
|
- Cost-effective (open source)
|
|
109
117
|
|
|
110
118
|
### Negative
|
|
119
|
+
|
|
111
120
|
- More complex configuration than MySQL
|
|
112
121
|
- Requires dedicated DBA knowledge for optimization
|
|
113
122
|
- Memory-intensive for complex queries
|
|
114
123
|
|
|
115
124
|
### Neutral
|
|
125
|
+
|
|
116
126
|
- Similar performance to MySQL for our use case
|
|
117
127
|
- Learning curve for advanced features (CTEs, window functions)
|
|
118
128
|
|
|
119
129
|
## Alternatives Considered
|
|
120
130
|
|
|
121
131
|
### Alternative 1: MySQL 8.0
|
|
132
|
+
|
|
122
133
|
- **Pros**: Simpler setup, lower memory footprint, wide hosting support
|
|
123
134
|
- **Cons**: Weaker JSON support, limited extensions
|
|
124
135
|
- **Reason for rejection**: PostgreSQL's richer feature set better suits complex e-commerce queries
|
|
125
136
|
|
|
126
137
|
### Alternative 2: MongoDB
|
|
138
|
+
|
|
127
139
|
- **Pros**: Flexible schema, horizontal scaling, JSON-native
|
|
128
140
|
- **Cons**: Weak transactions, eventual consistency concerns for payments
|
|
129
141
|
- **Reason for rejection**: ACID transactions required for financial operations
|
|
130
142
|
|
|
131
143
|
### Alternative 3: CockroachDB
|
|
144
|
+
|
|
132
145
|
- **Pros**: Distributed, PostgreSQL-compatible, auto-scaling
|
|
133
146
|
- **Cons**: Higher cost, newer technology, fewer DBAs available
|
|
134
147
|
- **Reason for rejection**: Overkill for initial scale, can migrate later if needed
|
|
@@ -145,30 +158,35 @@ Specific configuration:
|
|
|
145
158
|
## ADR Categories
|
|
146
159
|
|
|
147
160
|
### Technology Selection
|
|
161
|
+
|
|
148
162
|
- Database choice
|
|
149
163
|
- Framework selection
|
|
150
164
|
- Cloud provider
|
|
151
165
|
- Third-party services
|
|
152
166
|
|
|
153
167
|
### Architecture Patterns
|
|
168
|
+
|
|
154
169
|
- Microservices vs. Monolith
|
|
155
170
|
- Event-driven architecture
|
|
156
171
|
- API design (REST vs. GraphQL)
|
|
157
172
|
- Caching strategy
|
|
158
173
|
|
|
159
174
|
### Development Practices
|
|
175
|
+
|
|
160
176
|
- Testing strategy
|
|
161
177
|
- CI/CD approach
|
|
162
178
|
- Code organization
|
|
163
179
|
- Dependency management
|
|
164
180
|
|
|
165
181
|
### Security
|
|
182
|
+
|
|
166
183
|
- Authentication method
|
|
167
184
|
- Authorization model
|
|
168
185
|
- Data encryption
|
|
169
186
|
- Secret management
|
|
170
187
|
|
|
171
188
|
### Performance
|
|
189
|
+
|
|
172
190
|
- Scaling strategy
|
|
173
191
|
- Caching layers
|
|
174
192
|
- Database optimization
|
|
@@ -274,17 +292,17 @@ docs/
|
|
|
274
292
|
|
|
275
293
|
## Active ADRs
|
|
276
294
|
|
|
277
|
-
| ADR
|
|
278
|
-
|
|
295
|
+
| ADR | Title | Date | Status |
|
|
296
|
+
| ------------------------------ | ---------------------------------- | ---------- | -------- |
|
|
279
297
|
| [ADR-001](ADR-001-database.md) | Use PostgreSQL as Primary Database | 2025-01-15 | Accepted |
|
|
280
|
-
| [ADR-002](ADR-002-caching.md)
|
|
281
|
-
| [ADR-003](ADR-003-auth.md)
|
|
298
|
+
| [ADR-002](ADR-002-caching.md) | Use Redis for Caching | 2025-01-16 | Accepted |
|
|
299
|
+
| [ADR-003](ADR-003-auth.md) | Use JWT for Authentication | 2025-01-17 | Accepted |
|
|
282
300
|
|
|
283
301
|
## Superseded ADRs
|
|
284
302
|
|
|
285
|
-
| ADR
|
|
286
|
-
|
|
287
|
-
| [ADR-004](ADR-004-old-api.md) | REST API v1 Design | ADR-010
|
|
303
|
+
| ADR | Title | Superseded By |
|
|
304
|
+
| ----------------------------- | ------------------ | ------------- |
|
|
305
|
+
| [ADR-004](ADR-004-old-api.md) | REST API v1 Design | ADR-010 |
|
|
288
306
|
|
|
289
307
|
## How to Propose a New ADR
|
|
290
308
|
|