@su-record/vibe 3.0.0 → 3.1.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/hooks/scripts/__tests__/.vibe/command-log.txt +3 -78
- package/hooks/scripts/__tests__/.vibe/memories/memories.db +0 -0
- package/hooks/scripts/__tests__/.vibe/memories/memories.db-shm +0 -0
- package/hooks/scripts/__tests__/.vibe/memories/memories.db-wal +0 -0
- package/hooks/scripts/__tests__/clone-behaviors.test.js +64 -0
- package/hooks/scripts/__tests__/clone-merge-responsive.test.js +106 -0
- package/hooks/scripts/clone-extract.js +242 -28
- package/hooks/scripts/clone-merge-responsive.js +184 -0
- package/hooks/scripts/clone-spec.js +33 -8
- package/hooks/scripts/clone-validate.js +15 -9
- package/package.json +5 -2
- package/skills/clone/SKILL.md +132 -55
- package/skills/vibe.clone/SKILL.md +39 -19
- package/dist/cli/llm/gemini-commands.d.ts +0 -25
- package/dist/cli/llm/gemini-commands.d.ts.map +0 -1
- package/dist/cli/llm/gemini-commands.js +0 -143
- package/dist/cli/llm/gemini-commands.js.map +0 -1
- package/dist/cli/postinstall/codex-agents.d.ts +0 -24
- package/dist/cli/postinstall/codex-agents.d.ts.map +0 -1
- package/dist/cli/postinstall/codex-agents.js +0 -114
- package/dist/cli/postinstall/codex-agents.js.map +0 -1
- package/dist/cli/postinstall/codex-instruction.d.ts +0 -10
- package/dist/cli/postinstall/codex-instruction.d.ts.map +0 -1
- package/dist/cli/postinstall/codex-instruction.js +0 -56
- package/dist/cli/postinstall/codex-instruction.js.map +0 -1
- package/dist/cli/postinstall/gemini-agents.d.ts +0 -12
- package/dist/cli/postinstall/gemini-agents.d.ts.map +0 -1
- package/dist/cli/postinstall/gemini-agents.js +0 -80
- package/dist/cli/postinstall/gemini-agents.js.map +0 -1
- package/dist/cli/postinstall/gemini-instruction.d.ts +0 -10
- package/dist/cli/postinstall/gemini-instruction.d.ts.map +0 -1
- package/dist/cli/postinstall/gemini-instruction.js +0 -59
- package/dist/cli/postinstall/gemini-instruction.js.map +0 -1
- package/dist/infra/lib/ContextCompressor.d.ts +0 -104
- package/dist/infra/lib/ContextCompressor.d.ts.map +0 -1
- package/dist/infra/lib/ContextCompressor.js +0 -297
- package/dist/infra/lib/ContextCompressor.js.map +0 -1
- package/dist/infra/lib/ContextCompressor.test.d.ts +0 -2
- package/dist/infra/lib/ContextCompressor.test.d.ts.map +0 -1
- package/dist/infra/lib/ContextCompressor.test.js +0 -25
- package/dist/infra/lib/ContextCompressor.test.js.map +0 -1
- package/dist/infra/lib/ProgressTracker.d.ts +0 -73
- package/dist/infra/lib/ProgressTracker.d.ts.map +0 -1
- package/dist/infra/lib/ProgressTracker.js +0 -267
- package/dist/infra/lib/ProgressTracker.js.map +0 -1
- package/dist/infra/lib/TokenBudgetTracker.d.ts +0 -68
- package/dist/infra/lib/TokenBudgetTracker.d.ts.map +0 -1
- package/dist/infra/lib/TokenBudgetTracker.js +0 -191
- package/dist/infra/lib/TokenBudgetTracker.js.map +0 -1
- package/dist/infra/lib/autonomy/AuditStore.d.ts +0 -63
- package/dist/infra/lib/autonomy/AuditStore.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/AuditStore.js +0 -185
- package/dist/infra/lib/autonomy/AuditStore.js.map +0 -1
- package/dist/infra/lib/autonomy/AutonomyConfig.d.ts +0 -84
- package/dist/infra/lib/autonomy/AutonomyConfig.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/AutonomyConfig.js +0 -49
- package/dist/infra/lib/autonomy/AutonomyConfig.js.map +0 -1
- package/dist/infra/lib/autonomy/AutonomyOrchestrator.d.ts +0 -78
- package/dist/infra/lib/autonomy/AutonomyOrchestrator.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/AutonomyOrchestrator.js +0 -246
- package/dist/infra/lib/autonomy/AutonomyOrchestrator.js.map +0 -1
- package/dist/infra/lib/autonomy/BackgroundMonitor.d.ts +0 -36
- package/dist/infra/lib/autonomy/BackgroundMonitor.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/BackgroundMonitor.js +0 -138
- package/dist/infra/lib/autonomy/BackgroundMonitor.js.map +0 -1
- package/dist/infra/lib/autonomy/CollaborationProtocol.d.ts +0 -56
- package/dist/infra/lib/autonomy/CollaborationProtocol.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/CollaborationProtocol.js +0 -122
- package/dist/infra/lib/autonomy/CollaborationProtocol.js.map +0 -1
- package/dist/infra/lib/autonomy/ConfirmationManager.d.ts +0 -42
- package/dist/infra/lib/autonomy/ConfirmationManager.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/ConfirmationManager.js +0 -200
- package/dist/infra/lib/autonomy/ConfirmationManager.js.map +0 -1
- package/dist/infra/lib/autonomy/ConfirmationStore.d.ts +0 -55
- package/dist/infra/lib/autonomy/ConfirmationStore.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/ConfirmationStore.js +0 -130
- package/dist/infra/lib/autonomy/ConfirmationStore.js.map +0 -1
- package/dist/infra/lib/autonomy/EventBus.d.ts +0 -20
- package/dist/infra/lib/autonomy/EventBus.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/EventBus.js +0 -119
- package/dist/infra/lib/autonomy/EventBus.js.map +0 -1
- package/dist/infra/lib/autonomy/EventOutbox.d.ts +0 -32
- package/dist/infra/lib/autonomy/EventOutbox.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/EventOutbox.js +0 -152
- package/dist/infra/lib/autonomy/EventOutbox.js.map +0 -1
- package/dist/infra/lib/autonomy/NotificationDispatcher.d.ts +0 -24
- package/dist/infra/lib/autonomy/NotificationDispatcher.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/NotificationDispatcher.js +0 -112
- package/dist/infra/lib/autonomy/NotificationDispatcher.js.map +0 -1
- package/dist/infra/lib/autonomy/PolicyEngine.d.ts +0 -76
- package/dist/infra/lib/autonomy/PolicyEngine.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/PolicyEngine.js +0 -208
- package/dist/infra/lib/autonomy/PolicyEngine.js.map +0 -1
- package/dist/infra/lib/autonomy/ProactiveAnalyzer.d.ts +0 -61
- package/dist/infra/lib/autonomy/ProactiveAnalyzer.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/ProactiveAnalyzer.js +0 -236
- package/dist/infra/lib/autonomy/ProactiveAnalyzer.js.map +0 -1
- package/dist/infra/lib/autonomy/RiskClassifier.d.ts +0 -35
- package/dist/infra/lib/autonomy/RiskClassifier.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/RiskClassifier.js +0 -147
- package/dist/infra/lib/autonomy/RiskClassifier.js.map +0 -1
- package/dist/infra/lib/autonomy/SecuritySentinel.d.ts +0 -51
- package/dist/infra/lib/autonomy/SecuritySentinel.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/SecuritySentinel.js +0 -162
- package/dist/infra/lib/autonomy/SecuritySentinel.js.map +0 -1
- package/dist/infra/lib/autonomy/SuggestionStore.d.ts +0 -54
- package/dist/infra/lib/autonomy/SuggestionStore.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/SuggestionStore.js +0 -144
- package/dist/infra/lib/autonomy/SuggestionStore.js.map +0 -1
- package/dist/infra/lib/autonomy/TaskDecomposer.d.ts +0 -38
- package/dist/infra/lib/autonomy/TaskDecomposer.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/TaskDecomposer.js +0 -175
- package/dist/infra/lib/autonomy/TaskDecomposer.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/audit-store.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/audit-store.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/audit-store.test.js +0 -198
- package/dist/infra/lib/autonomy/__tests__/audit-store.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/event-bus.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/event-bus.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/event-bus.test.js +0 -225
- package/dist/infra/lib/autonomy/__tests__/event-bus.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/event-core.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/event-core.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/event-core.test.js +0 -194
- package/dist/infra/lib/autonomy/__tests__/event-core.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/governance.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/governance.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/governance.test.js +0 -540
- package/dist/infra/lib/autonomy/__tests__/governance.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/integration.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/integration.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/integration.test.js +0 -480
- package/dist/infra/lib/autonomy/__tests__/integration.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/proactive.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/proactive.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/proactive.test.js +0 -410
- package/dist/infra/lib/autonomy/__tests__/proactive.test.js.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/sentinel.test.d.ts +0 -2
- package/dist/infra/lib/autonomy/__tests__/sentinel.test.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/__tests__/sentinel.test.js +0 -486
- package/dist/infra/lib/autonomy/__tests__/sentinel.test.js.map +0 -1
- package/dist/infra/lib/autonomy/index.d.ts +0 -18
- package/dist/infra/lib/autonomy/index.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/index.js +0 -22
- package/dist/infra/lib/autonomy/index.js.map +0 -1
- package/dist/infra/lib/autonomy/schemas.d.ts +0 -317
- package/dist/infra/lib/autonomy/schemas.d.ts.map +0 -1
- package/dist/infra/lib/autonomy/schemas.js +0 -90
- package/dist/infra/lib/autonomy/schemas.js.map +0 -1
- package/dist/infra/lib/claude/index.d.ts +0 -5
- package/dist/infra/lib/claude/index.d.ts.map +0 -1
- package/dist/infra/lib/claude/index.js +0 -5
- package/dist/infra/lib/claude/index.js.map +0 -1
- package/dist/infra/lib/claude/storage.d.ts +0 -12
- package/dist/infra/lib/claude/storage.d.ts.map +0 -1
- package/dist/infra/lib/claude/storage.js +0 -54
- package/dist/infra/lib/claude/storage.js.map +0 -1
- package/dist/infra/lib/gemini/auth.d.ts +0 -18
- package/dist/infra/lib/gemini/auth.d.ts.map +0 -1
- package/dist/infra/lib/gemini/auth.js +0 -32
- package/dist/infra/lib/gemini/auth.js.map +0 -1
- package/dist/infra/lib/gemini/capabilities.d.ts +0 -28
- package/dist/infra/lib/gemini/capabilities.d.ts.map +0 -1
- package/dist/infra/lib/gemini/capabilities.js +0 -178
- package/dist/infra/lib/gemini/capabilities.js.map +0 -1
- package/dist/infra/lib/gemini/chat.d.ts +0 -35
- package/dist/infra/lib/gemini/chat.d.ts.map +0 -1
- package/dist/infra/lib/gemini/chat.js +0 -161
- package/dist/infra/lib/gemini/chat.js.map +0 -1
- package/dist/infra/lib/gemini/completion.d.ts +0 -12
- package/dist/infra/lib/gemini/completion.d.ts.map +0 -1
- package/dist/infra/lib/gemini/completion.js +0 -13
- package/dist/infra/lib/gemini/completion.js.map +0 -1
- package/dist/infra/lib/gemini/constants.d.ts +0 -8
- package/dist/infra/lib/gemini/constants.d.ts.map +0 -1
- package/dist/infra/lib/gemini/constants.js +0 -11
- package/dist/infra/lib/gemini/constants.js.map +0 -1
- package/dist/infra/lib/gemini/index.d.ts +0 -13
- package/dist/infra/lib/gemini/index.d.ts.map +0 -1
- package/dist/infra/lib/gemini/index.js +0 -12
- package/dist/infra/lib/gemini/index.js.map +0 -1
- package/dist/infra/lib/gemini/models.d.ts +0 -11
- package/dist/infra/lib/gemini/models.d.ts.map +0 -1
- package/dist/infra/lib/gemini/models.js +0 -38
- package/dist/infra/lib/gemini/models.js.map +0 -1
- package/dist/infra/lib/gemini/orchestration.d.ts +0 -33
- package/dist/infra/lib/gemini/orchestration.d.ts.map +0 -1
- package/dist/infra/lib/gemini/orchestration.js +0 -62
- package/dist/infra/lib/gemini/orchestration.js.map +0 -1
- package/dist/infra/lib/gemini/types.d.ts +0 -115
- package/dist/infra/lib/gemini/types.d.ts.map +0 -1
- package/dist/infra/lib/gemini/types.js +0 -5
- package/dist/infra/lib/gemini/types.js.map +0 -1
- package/dist/infra/orchestrator/AgentAnnouncer.d.ts +0 -64
- package/dist/infra/orchestrator/AgentAnnouncer.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentAnnouncer.js +0 -127
- package/dist/infra/orchestrator/AgentAnnouncer.js.map +0 -1
- package/dist/infra/orchestrator/AgentAnnouncer.test.d.ts +0 -5
- package/dist/infra/orchestrator/AgentAnnouncer.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentAnnouncer.test.js +0 -119
- package/dist/infra/orchestrator/AgentAnnouncer.test.js.map +0 -1
- package/dist/infra/orchestrator/AgentExecutor.d.ts +0 -22
- package/dist/infra/orchestrator/AgentExecutor.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentExecutor.js +0 -272
- package/dist/infra/orchestrator/AgentExecutor.js.map +0 -1
- package/dist/infra/orchestrator/AgentManager.d.ts +0 -72
- package/dist/infra/orchestrator/AgentManager.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentManager.js +0 -183
- package/dist/infra/orchestrator/AgentManager.js.map +0 -1
- package/dist/infra/orchestrator/AgentManifestCache.d.ts +0 -54
- package/dist/infra/orchestrator/AgentManifestCache.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentManifestCache.js +0 -191
- package/dist/infra/orchestrator/AgentManifestCache.js.map +0 -1
- package/dist/infra/orchestrator/AgentRegistry.d.ts +0 -76
- package/dist/infra/orchestrator/AgentRegistry.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentRegistry.js +0 -217
- package/dist/infra/orchestrator/AgentRegistry.js.map +0 -1
- package/dist/infra/orchestrator/AgentRegistry.test.d.ts +0 -5
- package/dist/infra/orchestrator/AgentRegistry.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/AgentRegistry.test.js +0 -122
- package/dist/infra/orchestrator/AgentRegistry.test.js.map +0 -1
- package/dist/infra/orchestrator/BackgroundManager.d.ts +0 -128
- package/dist/infra/orchestrator/BackgroundManager.d.ts.map +0 -1
- package/dist/infra/orchestrator/BackgroundManager.js +0 -620
- package/dist/infra/orchestrator/BackgroundManager.js.map +0 -1
- package/dist/infra/orchestrator/BackgroundManager.test.d.ts +0 -6
- package/dist/infra/orchestrator/BackgroundManager.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/BackgroundManager.test.js +0 -162
- package/dist/infra/orchestrator/BackgroundManager.test.js.map +0 -1
- package/dist/infra/orchestrator/CheckpointManager.d.ts +0 -54
- package/dist/infra/orchestrator/CheckpointManager.d.ts.map +0 -1
- package/dist/infra/orchestrator/CheckpointManager.js +0 -121
- package/dist/infra/orchestrator/CheckpointManager.js.map +0 -1
- package/dist/infra/orchestrator/CodexAgentRuntime.d.ts +0 -12
- package/dist/infra/orchestrator/CodexAgentRuntime.d.ts.map +0 -1
- package/dist/infra/orchestrator/CodexAgentRuntime.js +0 -94
- package/dist/infra/orchestrator/CodexAgentRuntime.js.map +0 -1
- package/dist/infra/orchestrator/CodexAgentRuntime.test.d.ts +0 -2
- package/dist/infra/orchestrator/CodexAgentRuntime.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/CodexAgentRuntime.test.js +0 -37
- package/dist/infra/orchestrator/CodexAgentRuntime.test.js.map +0 -1
- package/dist/infra/orchestrator/LLMCluster.d.ts +0 -82
- package/dist/infra/orchestrator/LLMCluster.d.ts.map +0 -1
- package/dist/infra/orchestrator/LLMCluster.js +0 -146
- package/dist/infra/orchestrator/LLMCluster.js.map +0 -1
- package/dist/infra/orchestrator/MultiLlmResearch.d.ts +0 -31
- package/dist/infra/orchestrator/MultiLlmResearch.d.ts.map +0 -1
- package/dist/infra/orchestrator/MultiLlmResearch.js +0 -160
- package/dist/infra/orchestrator/MultiLlmResearch.js.map +0 -1
- package/dist/infra/orchestrator/PhasePipeline.d.ts +0 -122
- package/dist/infra/orchestrator/PhasePipeline.d.ts.map +0 -1
- package/dist/infra/orchestrator/PhasePipeline.js +0 -385
- package/dist/infra/orchestrator/PhasePipeline.js.map +0 -1
- package/dist/infra/orchestrator/PhaseResultStore.d.ts +0 -39
- package/dist/infra/orchestrator/PhaseResultStore.d.ts.map +0 -1
- package/dist/infra/orchestrator/PhaseResultStore.js +0 -151
- package/dist/infra/orchestrator/PhaseResultStore.js.map +0 -1
- package/dist/infra/orchestrator/SessionStore.d.ts +0 -40
- package/dist/infra/orchestrator/SessionStore.d.ts.map +0 -1
- package/dist/infra/orchestrator/SessionStore.js +0 -116
- package/dist/infra/orchestrator/SessionStore.js.map +0 -1
- package/dist/infra/orchestrator/SmartRouter.d.ts +0 -90
- package/dist/infra/orchestrator/SmartRouter.d.ts.map +0 -1
- package/dist/infra/orchestrator/SmartRouter.js +0 -277
- package/dist/infra/orchestrator/SmartRouter.js.map +0 -1
- package/dist/infra/orchestrator/SmartRouter.test.d.ts +0 -5
- package/dist/infra/orchestrator/SmartRouter.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/SmartRouter.test.js +0 -484
- package/dist/infra/orchestrator/SmartRouter.test.js.map +0 -1
- package/dist/infra/orchestrator/SwarmOrchestrator.d.ts +0 -143
- package/dist/infra/orchestrator/SwarmOrchestrator.d.ts.map +0 -1
- package/dist/infra/orchestrator/SwarmOrchestrator.js +0 -378
- package/dist/infra/orchestrator/SwarmOrchestrator.js.map +0 -1
- package/dist/infra/orchestrator/SwarmOrchestrator.test.d.ts +0 -5
- package/dist/infra/orchestrator/SwarmOrchestrator.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js +0 -95
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js.map +0 -1
- package/dist/infra/orchestrator/agentDiscovery.d.ts +0 -26
- package/dist/infra/orchestrator/agentDiscovery.d.ts.map +0 -1
- package/dist/infra/orchestrator/agentDiscovery.js +0 -175
- package/dist/infra/orchestrator/agentDiscovery.js.map +0 -1
- package/dist/infra/orchestrator/backgroundAgent.d.ts +0 -9
- package/dist/infra/orchestrator/backgroundAgent.d.ts.map +0 -1
- package/dist/infra/orchestrator/backgroundAgent.js +0 -10
- package/dist/infra/orchestrator/backgroundAgent.js.map +0 -1
- package/dist/infra/orchestrator/index.d.ts +0 -207
- package/dist/infra/orchestrator/index.d.ts.map +0 -1
- package/dist/infra/orchestrator/index.js +0 -362
- package/dist/infra/orchestrator/index.js.map +0 -1
- package/dist/infra/orchestrator/orchestrator.d.ts +0 -60
- package/dist/infra/orchestrator/orchestrator.d.ts.map +0 -1
- package/dist/infra/orchestrator/orchestrator.js +0 -214
- package/dist/infra/orchestrator/orchestrator.js.map +0 -1
- package/dist/infra/orchestrator/parallelResearch.d.ts +0 -27
- package/dist/infra/orchestrator/parallelResearch.d.ts.map +0 -1
- package/dist/infra/orchestrator/parallelResearch.js +0 -285
- package/dist/infra/orchestrator/parallelResearch.js.map +0 -1
- package/dist/infra/orchestrator/types.d.ts +0 -205
- package/dist/infra/orchestrator/types.d.ts.map +0 -1
- package/dist/infra/orchestrator/types.js +0 -87
- package/dist/infra/orchestrator/types.js.map +0 -1
- package/dist/infra/orchestrator/types.test.d.ts +0 -2
- package/dist/infra/orchestrator/types.test.d.ts.map +0 -1
- package/dist/infra/orchestrator/types.test.js +0 -57
- package/dist/infra/orchestrator/types.test.js.map +0 -1
- package/dist/tools/semantic/analyzeDependencyGraph.d.ts +0 -12
- package/dist/tools/semantic/analyzeDependencyGraph.d.ts.map +0 -1
- package/dist/tools/semantic/analyzeDependencyGraph.js +0 -359
- package/dist/tools/semantic/analyzeDependencyGraph.js.map +0 -1
- package/dist/tools/semantic/astGrep.d.ts +0 -25
- package/dist/tools/semantic/astGrep.d.ts.map +0 -1
- package/dist/tools/semantic/astGrep.js +0 -324
- package/dist/tools/semantic/astGrep.js.map +0 -1
- package/dist/tools/semantic/astGrep.test.d.ts +0 -2
- package/dist/tools/semantic/astGrep.test.d.ts.map +0 -1
- package/dist/tools/semantic/astGrep.test.js +0 -74
- package/dist/tools/semantic/astGrep.test.js.map +0 -1
- package/dist/tools/semantic/findReferences.d.ts +0 -9
- package/dist/tools/semantic/findReferences.d.ts.map +0 -1
- package/dist/tools/semantic/findReferences.js +0 -200
- package/dist/tools/semantic/findReferences.js.map +0 -1
- package/dist/tools/semantic/findSymbol.d.ts +0 -8
- package/dist/tools/semantic/findSymbol.d.ts.map +0 -1
- package/dist/tools/semantic/findSymbol.js +0 -204
- package/dist/tools/semantic/findSymbol.js.map +0 -1
- package/dist/tools/semantic/index.d.ts +0 -9
- package/dist/tools/semantic/index.d.ts.map +0 -1
- package/dist/tools/semantic/index.js +0 -11
- package/dist/tools/semantic/index.js.map +0 -1
- package/dist/tools/semantic/lsp.d.ts +0 -68
- package/dist/tools/semantic/lsp.d.ts.map +0 -1
- package/dist/tools/semantic/lsp.js +0 -561
- package/dist/tools/semantic/lsp.js.map +0 -1
- package/dist/tools/spec/e2eTestGenerator.d.ts +0 -61
- package/dist/tools/spec/e2eTestGenerator.d.ts.map +0 -1
- package/dist/tools/spec/e2eTestGenerator.js +0 -255
- package/dist/tools/spec/e2eTestGenerator.js.map +0 -1
- package/dist/tools/spec/specVersioning.d.ts +0 -76
- package/dist/tools/spec/specVersioning.d.ts.map +0 -1
- package/dist/tools/spec/specVersioning.js +0 -236
- package/dist/tools/spec/specVersioning.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"e2eTestGenerator.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/e2eTestGenerator.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,iCAAiC;AACjC,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,kBAAkB;AAClB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iBAAiB;AACjB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,YAAY;AACZ,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAoClF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,EAAE,CAgE/E;AAMD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,SAAS,EAAE,eAAe,EAAE,EAC5B,WAAW,EAAE,MAAM,GAClB,gBAAgB,EAAE,CAuFpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,mBAAwB,GAChC,mBAAmB,CAyCrB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAY3E"}
|
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E Test Generator - SPEC acceptance criteria + Feature scenarios → Playwright test skeletons
|
|
3
|
-
*/
|
|
4
|
-
import * as fs from 'fs';
|
|
5
|
-
import * as path from 'path';
|
|
6
|
-
// ============================================
|
|
7
|
-
// Parsing Functions
|
|
8
|
-
// ============================================
|
|
9
|
-
/**
|
|
10
|
-
* SPEC의 <acceptance> 블록에서 Phase별 criteria 추출
|
|
11
|
-
*/
|
|
12
|
-
export function parseAcceptanceCriteria(specContent) {
|
|
13
|
-
const results = [];
|
|
14
|
-
// <acceptance> 블록 추출
|
|
15
|
-
const acceptanceMatch = specContent.match(/<acceptance>([\s\S]*?)<\/acceptance>/);
|
|
16
|
-
if (!acceptanceMatch)
|
|
17
|
-
return results;
|
|
18
|
-
const block = acceptanceMatch[1];
|
|
19
|
-
// Phase별로 분할
|
|
20
|
-
const phasePattern = /###\s*Phase\s*(\d+)[:\s]*([^\n]*)\n([\s\S]*?)(?=###\s*Phase|\s*$)/gi;
|
|
21
|
-
let match;
|
|
22
|
-
while ((match = phasePattern.exec(block)) !== null) {
|
|
23
|
-
const phaseNum = match[1];
|
|
24
|
-
const phaseName = match[2].trim();
|
|
25
|
-
const criteriaBlock = match[3];
|
|
26
|
-
// - [ ] 패턴으로 criteria 추출
|
|
27
|
-
const criteria = [];
|
|
28
|
-
const criteriaPattern = /- \[ \] (.+)/g;
|
|
29
|
-
let criterionMatch;
|
|
30
|
-
while ((criterionMatch = criteriaPattern.exec(criteriaBlock)) !== null) {
|
|
31
|
-
criteria.push(criterionMatch[1].trim());
|
|
32
|
-
}
|
|
33
|
-
if (criteria.length > 0) {
|
|
34
|
-
results.push({
|
|
35
|
-
phase: phaseNum,
|
|
36
|
-
phaseName,
|
|
37
|
-
criteria,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return results;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Feature 파일에서 Gherkin 시나리오 추출 (Given/When/Then 포함)
|
|
45
|
-
*/
|
|
46
|
-
export function parseGherkinScenarios(featureContent) {
|
|
47
|
-
const results = [];
|
|
48
|
-
// Phase 추출
|
|
49
|
-
const phasePattern = /##\s*Phase\s*(\d+)[:\s]*([^\n]*)\n([\s\S]*?)(?=##\s*Phase|\s*$)/gi;
|
|
50
|
-
let phaseMatch;
|
|
51
|
-
while ((phaseMatch = phasePattern.exec(featureContent)) !== null) {
|
|
52
|
-
const phaseNum = phaseMatch[1];
|
|
53
|
-
const phaseBlock = phaseMatch[3];
|
|
54
|
-
// 시나리오 추출
|
|
55
|
-
const scenarioPattern = /###\s*Scenario\s*\d*[:\s]*([^\n]*)\n```gherkin\n([\s\S]*?)```(?:\n\*\*Verification\*\*[:\s]*([^\n]*))?/gi;
|
|
56
|
-
let scenarioMatch;
|
|
57
|
-
while ((scenarioMatch = scenarioPattern.exec(phaseBlock)) !== null) {
|
|
58
|
-
const name = scenarioMatch[1].trim();
|
|
59
|
-
const gherkinBlock = scenarioMatch[2];
|
|
60
|
-
const verification = scenarioMatch[3]?.trim();
|
|
61
|
-
const given = [];
|
|
62
|
-
const when = [];
|
|
63
|
-
const then = [];
|
|
64
|
-
const and = [];
|
|
65
|
-
// Gherkin 라인 파싱
|
|
66
|
-
const lines = gherkinBlock.split('\n').map(l => l.trim()).filter(Boolean);
|
|
67
|
-
let currentSection = null;
|
|
68
|
-
for (const line of lines) {
|
|
69
|
-
if (line.startsWith('Scenario:'))
|
|
70
|
-
continue;
|
|
71
|
-
if (line.startsWith('Given ')) {
|
|
72
|
-
currentSection = 'given';
|
|
73
|
-
given.push(line.replace(/^Given /, ''));
|
|
74
|
-
}
|
|
75
|
-
else if (line.startsWith('When ')) {
|
|
76
|
-
currentSection = 'when';
|
|
77
|
-
when.push(line.replace(/^When /, ''));
|
|
78
|
-
}
|
|
79
|
-
else if (line.startsWith('Then ')) {
|
|
80
|
-
currentSection = 'then';
|
|
81
|
-
then.push(line.replace(/^Then /, ''));
|
|
82
|
-
}
|
|
83
|
-
else if (line.startsWith('And ')) {
|
|
84
|
-
const text = line.replace(/^And /, '');
|
|
85
|
-
and.push(text);
|
|
86
|
-
// And는 직전 섹션에 추가
|
|
87
|
-
if (currentSection === 'given')
|
|
88
|
-
given.push(text);
|
|
89
|
-
else if (currentSection === 'when')
|
|
90
|
-
when.push(text);
|
|
91
|
-
else if (currentSection === 'then')
|
|
92
|
-
then.push(text);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
results.push({
|
|
96
|
-
name,
|
|
97
|
-
phase: phaseNum,
|
|
98
|
-
given,
|
|
99
|
-
when,
|
|
100
|
-
then,
|
|
101
|
-
and,
|
|
102
|
-
verification,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
return results;
|
|
107
|
-
}
|
|
108
|
-
// ============================================
|
|
109
|
-
// Generation Functions
|
|
110
|
-
// ============================================
|
|
111
|
-
/**
|
|
112
|
-
* Playwright test skeleton 생성
|
|
113
|
-
*/
|
|
114
|
-
export function generatePlaywrightSkeleton(criteria, scenarios, featureName) {
|
|
115
|
-
const tests = [];
|
|
116
|
-
for (const phase of criteria) {
|
|
117
|
-
const phaseScenarios = scenarios.filter(s => s.phase === phase.phase);
|
|
118
|
-
const slugName = slugify(phase.phaseName || `phase-${phase.phase}`);
|
|
119
|
-
const fileName = `phase-${phase.phase}-${slugName}.spec.ts`;
|
|
120
|
-
let content = `import { test, expect } from '@playwright/test';\n\n`;
|
|
121
|
-
content += `test.describe('Phase ${phase.phase}: ${phase.phaseName}', () => {\n`;
|
|
122
|
-
let scenarioCount = 0;
|
|
123
|
-
// Gherkin 시나리오 → test blocks
|
|
124
|
-
for (const scenario of phaseScenarios) {
|
|
125
|
-
content += `\n test('${escapeQuotes(scenario.name)}', async ({ page }) => {\n`;
|
|
126
|
-
if (scenario.given.length > 0) {
|
|
127
|
-
content += ` // Given\n`;
|
|
128
|
-
for (const g of scenario.given) {
|
|
129
|
-
content += ` // - ${g}\n`;
|
|
130
|
-
}
|
|
131
|
-
content += ` // TODO: Setup test preconditions\n\n`;
|
|
132
|
-
}
|
|
133
|
-
if (scenario.when.length > 0) {
|
|
134
|
-
content += ` // When\n`;
|
|
135
|
-
for (const w of scenario.when) {
|
|
136
|
-
content += ` // - ${w}\n`;
|
|
137
|
-
}
|
|
138
|
-
content += ` // TODO: Execute action\n\n`;
|
|
139
|
-
}
|
|
140
|
-
if (scenario.then.length > 0) {
|
|
141
|
-
content += ` // Then\n`;
|
|
142
|
-
for (const t of scenario.then) {
|
|
143
|
-
content += ` // - ${t}\n`;
|
|
144
|
-
}
|
|
145
|
-
content += ` // TODO: Assert expected outcome\n`;
|
|
146
|
-
}
|
|
147
|
-
if (scenario.verification) {
|
|
148
|
-
content += `\n // Verification: ${scenario.verification}\n`;
|
|
149
|
-
}
|
|
150
|
-
content += ` });\n`;
|
|
151
|
-
scenarioCount++;
|
|
152
|
-
}
|
|
153
|
-
// 매칭되지 않은 AC → 추가 test blocks
|
|
154
|
-
const coveredByScenario = new Set(phaseScenarios.flatMap(s => {
|
|
155
|
-
// verification 필드에서 AC 번호 추출
|
|
156
|
-
const match = s.verification?.match(/#(\d+)/);
|
|
157
|
-
return match ? [parseInt(match[1]) - 1] : [];
|
|
158
|
-
}));
|
|
159
|
-
for (let i = 0; i < phase.criteria.length; i++) {
|
|
160
|
-
if (!coveredByScenario.has(i) && phaseScenarios.length > 0) {
|
|
161
|
-
// 시나리오가 이미 있고 이 AC가 커버되지 않은 경우에만 추가
|
|
162
|
-
content += `\n test('AC: ${escapeQuotes(phase.criteria[i])}', async ({ page }) => {\n`;
|
|
163
|
-
content += ` // TODO: Implement test for acceptance criterion\n`;
|
|
164
|
-
content += ` // AC: Phase ${phase.phase} - ${phase.criteria[i]}\n`;
|
|
165
|
-
content += ` });\n`;
|
|
166
|
-
scenarioCount++;
|
|
167
|
-
}
|
|
168
|
-
else if (phaseScenarios.length === 0) {
|
|
169
|
-
// Feature 시나리오가 없으면 AC에서만 생성
|
|
170
|
-
content += `\n test('${escapeQuotes(phase.criteria[i])}', async ({ page }) => {\n`;
|
|
171
|
-
content += ` // TODO: Implement test for acceptance criterion\n`;
|
|
172
|
-
content += ` // AC: Phase ${phase.phase} - ${phase.criteria[i]}\n`;
|
|
173
|
-
content += ` });\n`;
|
|
174
|
-
scenarioCount++;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
content += `});\n`;
|
|
178
|
-
tests.push({
|
|
179
|
-
fileName,
|
|
180
|
-
content,
|
|
181
|
-
scenarioCount,
|
|
182
|
-
phase: `Phase ${phase.phase}: ${phase.phaseName}`,
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
return tests;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* 메인 함수: SPEC + Feature → E2E test skeletons
|
|
189
|
-
*/
|
|
190
|
-
export function generateE2ETests(featureName, options = {}) {
|
|
191
|
-
const { projectPath = process.cwd(), specPath = `.claude/vibe/specs/${featureName}.md`, featurePath = `.claude/vibe/features/${featureName}.feature`, outputDir = `tests/e2e/${featureName}`, } = options;
|
|
192
|
-
// SPEC 파일 읽기
|
|
193
|
-
const specFullPath = path.join(projectPath, specPath);
|
|
194
|
-
const specContent = readFileSafe(specFullPath);
|
|
195
|
-
// Feature 파일 읽기 (split 구조도 지원)
|
|
196
|
-
let featureFullPath = path.join(projectPath, featurePath);
|
|
197
|
-
let featureContent = readFileSafe(featureFullPath);
|
|
198
|
-
// split 구조: {feature-name}/_index.feature
|
|
199
|
-
if (!featureContent) {
|
|
200
|
-
const splitPath = path.join(projectPath, `.claude/vibe/features/${featureName}/_index.feature`);
|
|
201
|
-
featureContent = readFileSafe(splitPath);
|
|
202
|
-
if (featureContent)
|
|
203
|
-
featureFullPath = splitPath;
|
|
204
|
-
}
|
|
205
|
-
// 파싱
|
|
206
|
-
const criteria = specContent ? parseAcceptanceCriteria(specContent) : [];
|
|
207
|
-
const scenarios = featureContent ? parseGherkinScenarios(featureContent) : [];
|
|
208
|
-
// 생성
|
|
209
|
-
const tests = generatePlaywrightSkeleton(criteria, scenarios, featureName);
|
|
210
|
-
const totalScenarios = tests.reduce((sum, t) => sum + t.scenarioCount, 0);
|
|
211
|
-
return {
|
|
212
|
-
featureName,
|
|
213
|
-
tests,
|
|
214
|
-
totalScenarios,
|
|
215
|
-
outputDir,
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* 생성 결과 요약을 포맷팅
|
|
220
|
-
*/
|
|
221
|
-
export function formatGenerationSummary(result) {
|
|
222
|
-
if (result.tests.length === 0) {
|
|
223
|
-
return 'No acceptance criteria or feature scenarios found to generate tests.';
|
|
224
|
-
}
|
|
225
|
-
let output = `Generated E2E test skeletons:\n`;
|
|
226
|
-
for (const test of result.tests) {
|
|
227
|
-
output += ` ${result.outputDir}/${test.fileName} (${test.scenarioCount} scenarios)\n`;
|
|
228
|
-
}
|
|
229
|
-
output += ` Total: ${result.totalScenarios} test skeletons across ${result.tests.length} files\n`;
|
|
230
|
-
return output;
|
|
231
|
-
}
|
|
232
|
-
// ============================================
|
|
233
|
-
// Helper Functions
|
|
234
|
-
// ============================================
|
|
235
|
-
function readFileSafe(filePath) {
|
|
236
|
-
try {
|
|
237
|
-
return fs.readFileSync(filePath, 'utf-8');
|
|
238
|
-
}
|
|
239
|
-
catch {
|
|
240
|
-
return null;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
function slugify(text) {
|
|
244
|
-
return text
|
|
245
|
-
.toLowerCase()
|
|
246
|
-
.replace(/[^a-z0-9\s-]/g, '')
|
|
247
|
-
.replace(/\s+/g, '-')
|
|
248
|
-
.replace(/-+/g, '-')
|
|
249
|
-
.replace(/^-|-$/g, '')
|
|
250
|
-
.slice(0, 40);
|
|
251
|
-
}
|
|
252
|
-
function escapeQuotes(text) {
|
|
253
|
-
return text.replace(/'/g, "\\'");
|
|
254
|
-
}
|
|
255
|
-
//# sourceMappingURL=e2eTestGenerator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"e2eTestGenerator.js","sourceRoot":"","sources":["../../../src/tools/spec/e2eTestGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SPEC Versioning - SPEC 버전 관리 및 Changelog 자동 생성
|
|
3
|
-
*/
|
|
4
|
-
/** SPEC 버전 정보 */
|
|
5
|
-
export interface SpecVersion {
|
|
6
|
-
version: string;
|
|
7
|
-
date: string;
|
|
8
|
-
author?: string;
|
|
9
|
-
changes: ChangeEntry[];
|
|
10
|
-
gitTag?: string;
|
|
11
|
-
gitCommit?: string;
|
|
12
|
-
}
|
|
13
|
-
/** 변경 항목 */
|
|
14
|
-
export interface ChangeEntry {
|
|
15
|
-
type: 'added' | 'changed' | 'removed' | 'fixed';
|
|
16
|
-
description: string;
|
|
17
|
-
section?: string;
|
|
18
|
-
requirementId?: string;
|
|
19
|
-
}
|
|
20
|
-
/** 버전 히스토리 */
|
|
21
|
-
export interface VersionHistory {
|
|
22
|
-
featureName: string;
|
|
23
|
-
currentVersion: string;
|
|
24
|
-
versions: SpecVersion[];
|
|
25
|
-
}
|
|
26
|
-
/** 버전 범프 타입 */
|
|
27
|
-
export type BumpType = 'major' | 'minor' | 'patch';
|
|
28
|
-
/**
|
|
29
|
-
* SPEC 버전 범프
|
|
30
|
-
*/
|
|
31
|
-
export declare function bumpSpecVersion(specPath: string, bumpType: BumpType, changes: ChangeEntry[]): SpecVersion;
|
|
32
|
-
/**
|
|
33
|
-
* 버전 추출
|
|
34
|
-
*/
|
|
35
|
-
export declare function extractVersion(content: string): string | null;
|
|
36
|
-
/**
|
|
37
|
-
* 버전 증가
|
|
38
|
-
*/
|
|
39
|
-
export declare function incrementVersion(version: string, bumpType: BumpType): string;
|
|
40
|
-
/**
|
|
41
|
-
* Changelog 생성
|
|
42
|
-
*/
|
|
43
|
-
export declare function generateChangelog(history: VersionHistory): string;
|
|
44
|
-
/**
|
|
45
|
-
* Git 태그 생성
|
|
46
|
-
*/
|
|
47
|
-
export declare function createGitTag(featureName: string, version: string, message?: string): {
|
|
48
|
-
success: boolean;
|
|
49
|
-
tag: string;
|
|
50
|
-
error?: string;
|
|
51
|
-
};
|
|
52
|
-
/**
|
|
53
|
-
* SPEC 변경사항 감지 (Git diff 기반)
|
|
54
|
-
*/
|
|
55
|
-
export declare function detectSpecChanges(specPath: string, baseRef?: string): ChangeEntry[];
|
|
56
|
-
/**
|
|
57
|
-
* 최신 SPEC 커밋 조회
|
|
58
|
-
*/
|
|
59
|
-
export declare function getLatestSpecCommit(specPath: string): string | null;
|
|
60
|
-
/**
|
|
61
|
-
* SPEC 버전 히스토리 로드
|
|
62
|
-
*/
|
|
63
|
-
export declare function loadVersionHistory(specDir: string, featureName: string): VersionHistory;
|
|
64
|
-
/**
|
|
65
|
-
* SPEC 버전 히스토리 저장
|
|
66
|
-
*/
|
|
67
|
-
export declare function saveVersionHistory(specDir: string, history: VersionHistory): void;
|
|
68
|
-
/**
|
|
69
|
-
* Baseline 태깅 (릴리즈 준비 완료 표시)
|
|
70
|
-
*/
|
|
71
|
-
export declare function createBaseline(featureName: string, specPath: string): {
|
|
72
|
-
success: boolean;
|
|
73
|
-
baselineName: string;
|
|
74
|
-
error?: string;
|
|
75
|
-
};
|
|
76
|
-
//# sourceMappingURL=specVersioning.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"specVersioning.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/specVersioning.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,iBAAiB;AACjB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,YAAY;AACZ,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,cAAc;AACd,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,eAAe;AACf,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAMnD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,EAAE,GACrB,WAAW,CAgBb;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAU5E;AA4BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CA0BjE;AAoBD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAcnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAiB,GACzB,WAAW,EAAE,CAyCf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,CAavF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAGjF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsB5D"}
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SPEC Versioning - SPEC 버전 관리 및 Changelog 자동 생성
|
|
3
|
-
*/
|
|
4
|
-
import * as fs from 'fs';
|
|
5
|
-
import * as path from 'path';
|
|
6
|
-
import { execSync } from 'child_process';
|
|
7
|
-
// ============================================
|
|
8
|
-
// Version Management
|
|
9
|
-
// ============================================
|
|
10
|
-
/**
|
|
11
|
-
* SPEC 버전 범프
|
|
12
|
-
*/
|
|
13
|
-
export function bumpSpecVersion(specPath, bumpType, changes) {
|
|
14
|
-
const content = fs.readFileSync(specPath, 'utf-8');
|
|
15
|
-
const currentVersion = extractVersion(content) || '0.0.0';
|
|
16
|
-
const newVersion = incrementVersion(currentVersion, bumpType);
|
|
17
|
-
// 프론트매터 업데이트
|
|
18
|
-
const updatedContent = updateFrontmatterVersion(content, newVersion);
|
|
19
|
-
fs.writeFileSync(specPath, updatedContent);
|
|
20
|
-
const version = {
|
|
21
|
-
version: newVersion,
|
|
22
|
-
date: new Date().toISOString().split('T')[0],
|
|
23
|
-
changes,
|
|
24
|
-
};
|
|
25
|
-
return version;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* 버전 추출
|
|
29
|
-
*/
|
|
30
|
-
export function extractVersion(content) {
|
|
31
|
-
const match = content.match(/version:\s*['"]?(\d+\.\d+\.\d+)['"]?/);
|
|
32
|
-
return match ? match[1] : null;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* 버전 증가
|
|
36
|
-
*/
|
|
37
|
-
export function incrementVersion(version, bumpType) {
|
|
38
|
-
const parts = version.split('.').map(Number);
|
|
39
|
-
switch (bumpType) {
|
|
40
|
-
case 'major':
|
|
41
|
-
return `${parts[0] + 1}.0.0`;
|
|
42
|
-
case 'minor':
|
|
43
|
-
return `${parts[0]}.${parts[1] + 1}.0`;
|
|
44
|
-
case 'patch':
|
|
45
|
-
return `${parts[0]}.${parts[1]}.${parts[2] + 1}`;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* 프론트매터 버전 업데이트
|
|
50
|
-
*/
|
|
51
|
-
function updateFrontmatterVersion(content, newVersion) {
|
|
52
|
-
const now = new Date().toISOString();
|
|
53
|
-
// version 필드 업데이트 또는 추가
|
|
54
|
-
if (content.match(/version:/)) {
|
|
55
|
-
content = content.replace(/version:\s*['"]?\d+\.\d+\.\d+['"]?/, `version: ${newVersion}`);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
// 프론트매터에 version 추가
|
|
59
|
-
content = content.replace(/^(---\n)/, `$1version: ${newVersion}\n`);
|
|
60
|
-
}
|
|
61
|
-
// lastUpdated 업데이트
|
|
62
|
-
if (content.match(/lastUpdated:/)) {
|
|
63
|
-
content = content.replace(/lastUpdated:\s*[^\n]+/, `lastUpdated: ${now}`);
|
|
64
|
-
}
|
|
65
|
-
return content;
|
|
66
|
-
}
|
|
67
|
-
// ============================================
|
|
68
|
-
// Changelog Generation
|
|
69
|
-
// ============================================
|
|
70
|
-
/**
|
|
71
|
-
* Changelog 생성
|
|
72
|
-
*/
|
|
73
|
-
export function generateChangelog(history) {
|
|
74
|
-
let changelog = `# Changelog: ${history.featureName}\n\n`;
|
|
75
|
-
changelog += `Current Version: ${history.currentVersion}\n\n`;
|
|
76
|
-
for (const version of history.versions.slice().reverse()) {
|
|
77
|
-
changelog += `## [${version.version}] - ${version.date}\n\n`;
|
|
78
|
-
if (version.gitTag) {
|
|
79
|
-
changelog += `Git Tag: ${version.gitTag}\n\n`;
|
|
80
|
-
}
|
|
81
|
-
// 타입별 그룹화
|
|
82
|
-
const grouped = groupChangesByType(version.changes);
|
|
83
|
-
for (const [type, entries] of Object.entries(grouped)) {
|
|
84
|
-
changelog += `### ${capitalizeFirst(type)}\n\n`;
|
|
85
|
-
for (const entry of entries) {
|
|
86
|
-
const prefix = entry.requirementId ? `[${entry.requirementId}] ` : '';
|
|
87
|
-
const section = entry.section ? ` (${entry.section})` : '';
|
|
88
|
-
changelog += `- ${prefix}${entry.description}${section}\n`;
|
|
89
|
-
}
|
|
90
|
-
changelog += '\n';
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return changelog;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* 변경사항을 타입별로 그룹화
|
|
97
|
-
*/
|
|
98
|
-
function groupChangesByType(changes) {
|
|
99
|
-
const grouped = {};
|
|
100
|
-
for (const change of changes) {
|
|
101
|
-
if (!grouped[change.type]) {
|
|
102
|
-
grouped[change.type] = [];
|
|
103
|
-
}
|
|
104
|
-
grouped[change.type].push(change);
|
|
105
|
-
}
|
|
106
|
-
return grouped;
|
|
107
|
-
}
|
|
108
|
-
// ============================================
|
|
109
|
-
// Git Integration
|
|
110
|
-
// ============================================
|
|
111
|
-
/**
|
|
112
|
-
* Git 태그 생성
|
|
113
|
-
*/
|
|
114
|
-
export function createGitTag(featureName, version, message) {
|
|
115
|
-
const tag = `spec/${featureName}/v${version}`;
|
|
116
|
-
const tagMessage = message || `SPEC ${featureName} version ${version}`;
|
|
117
|
-
try {
|
|
118
|
-
execSync(`git tag -a "${tag}" -m "${tagMessage}"`, { encoding: 'utf-8' });
|
|
119
|
-
return { success: true, tag };
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
return {
|
|
123
|
-
success: false,
|
|
124
|
-
tag,
|
|
125
|
-
error: error instanceof Error ? error.message : String(error),
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* SPEC 변경사항 감지 (Git diff 기반)
|
|
131
|
-
*/
|
|
132
|
-
export function detectSpecChanges(specPath, baseRef = 'HEAD~1') {
|
|
133
|
-
const changes = [];
|
|
134
|
-
try {
|
|
135
|
-
const diff = execSync(`git diff ${baseRef} -- "${specPath}"`, { encoding: 'utf-8' });
|
|
136
|
-
// 추가된 라인 분석
|
|
137
|
-
const addedLines = diff.match(/^\+[^+].*/gm) || [];
|
|
138
|
-
for (const line of addedLines) {
|
|
139
|
-
const cleanLine = line.slice(1).trim();
|
|
140
|
-
if (cleanLine.match(/^- \[ \]/) || cleanLine.match(/^1\. \[ \]/)) {
|
|
141
|
-
changes.push({
|
|
142
|
-
type: 'added',
|
|
143
|
-
description: cleanLine.replace(/^[-\d.]+\s*\[ \]\s*/, ''),
|
|
144
|
-
section: 'Task',
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
// 삭제된 라인 분석
|
|
149
|
-
const removedLines = diff.match(/^-[^-].*/gm) || [];
|
|
150
|
-
for (const line of removedLines) {
|
|
151
|
-
const cleanLine = line.slice(1).trim();
|
|
152
|
-
if (cleanLine.match(/^- \[ \]/) || cleanLine.match(/^1\. \[ \]/)) {
|
|
153
|
-
changes.push({
|
|
154
|
-
type: 'removed',
|
|
155
|
-
description: cleanLine.replace(/^[-\d.]+\s*\[ \]\s*/, ''),
|
|
156
|
-
section: 'Task',
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
// Git diff 실패 (파일이 새로 생성됨 등)
|
|
163
|
-
changes.push({
|
|
164
|
-
type: 'added',
|
|
165
|
-
description: 'Initial SPEC creation',
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
return changes;
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* 최신 SPEC 커밋 조회
|
|
172
|
-
*/
|
|
173
|
-
export function getLatestSpecCommit(specPath) {
|
|
174
|
-
try {
|
|
175
|
-
const commit = execSync(`git log -1 --format=%H -- "${specPath}"`, { encoding: 'utf-8' });
|
|
176
|
-
return commit.trim() || null;
|
|
177
|
-
}
|
|
178
|
-
catch {
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* SPEC 버전 히스토리 로드
|
|
184
|
-
*/
|
|
185
|
-
export function loadVersionHistory(specDir, featureName) {
|
|
186
|
-
const historyPath = path.join(specDir, `${featureName}.versions.json`);
|
|
187
|
-
try {
|
|
188
|
-
const content = fs.readFileSync(historyPath, 'utf-8');
|
|
189
|
-
return JSON.parse(content);
|
|
190
|
-
}
|
|
191
|
-
catch {
|
|
192
|
-
return {
|
|
193
|
-
featureName,
|
|
194
|
-
currentVersion: '0.0.0',
|
|
195
|
-
versions: [],
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* SPEC 버전 히스토리 저장
|
|
201
|
-
*/
|
|
202
|
-
export function saveVersionHistory(specDir, history) {
|
|
203
|
-
const historyPath = path.join(specDir, `${history.featureName}.versions.json`);
|
|
204
|
-
fs.writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Baseline 태깅 (릴리즈 준비 완료 표시)
|
|
208
|
-
*/
|
|
209
|
-
export function createBaseline(featureName, specPath) {
|
|
210
|
-
const content = fs.readFileSync(specPath, 'utf-8');
|
|
211
|
-
const version = extractVersion(content) || '1.0.0';
|
|
212
|
-
const timestamp = new Date().toISOString().replace(/[:-]/g, '').split('.')[0];
|
|
213
|
-
const baselineName = `baseline/${featureName}-v${version}-${timestamp}`;
|
|
214
|
-
try {
|
|
215
|
-
// Baseline 커밋
|
|
216
|
-
execSync(`git add "${specPath}"`, { encoding: 'utf-8' });
|
|
217
|
-
execSync(`git commit -m "SPEC baseline: ${featureName} v${version}"`, { encoding: 'utf-8' });
|
|
218
|
-
// Baseline 태그
|
|
219
|
-
execSync(`git tag "${baselineName}" -m "Baseline for ${featureName} v${version}"`, { encoding: 'utf-8' });
|
|
220
|
-
return { success: true, baselineName };
|
|
221
|
-
}
|
|
222
|
-
catch (error) {
|
|
223
|
-
return {
|
|
224
|
-
success: false,
|
|
225
|
-
baselineName,
|
|
226
|
-
error: error instanceof Error ? error.message : String(error),
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
// ============================================
|
|
231
|
-
// Helpers
|
|
232
|
-
// ============================================
|
|
233
|
-
function capitalizeFirst(str) {
|
|
234
|
-
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
235
|
-
}
|
|
236
|
-
//# sourceMappingURL=specVersioning.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"specVersioning.js","sourceRoot":"","sources":["../../../src/tools/spec/specVersioning.ts"],"names":[],"mappings":"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"}
|