@su-record/vibe 3.2.13 → 3.2.15
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/CLAUDE.md +15 -14
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/dist/cli/setup/ProjectSetup.d.ts +6 -0
- package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
- package/dist/cli/setup/ProjectSetup.js +19 -13
- package/dist/cli/setup/ProjectSetup.js.map +1 -1
- package/dist/infra/lib/codex-proxy.d.ts +126 -0
- package/dist/infra/lib/codex-proxy.d.ts.map +1 -1
- package/dist/infra/lib/codex-proxy.js +16 -16
- package/dist/infra/lib/codex-proxy.js.map +1 -1
- package/dist/infra/lib/figma/audit.d.ts.map +1 -1
- package/dist/infra/lib/figma/audit.js +0 -2
- package/dist/infra/lib/figma/audit.js.map +1 -1
- package/dist/infra/lib/figma/extract.d.ts +6 -1
- package/dist/infra/lib/figma/extract.d.ts.map +1 -1
- package/dist/infra/lib/figma/extract.js +17 -15
- package/dist/infra/lib/figma/extract.js.map +1 -1
- package/dist/infra/lib/figma/types.d.ts +103 -0
- package/dist/infra/lib/figma/types.d.ts.map +1 -1
- package/dist/infra/lib/figma/types.js +8 -0
- package/dist/infra/lib/figma/types.js.map +1 -1
- package/hooks/hooks.json +1 -1
- package/hooks/scripts/clone-extract.js +16 -1
- package/hooks/scripts/code-check.js +72 -55
- package/hooks/scripts/lib/anchor.js +74 -0
- package/hooks/scripts/lib/console-allow.js +66 -0
- package/hooks/scripts/lib/dispatcher.js +71 -19
- package/hooks/scripts/lib/inbox.js +60 -0
- package/hooks/scripts/loop-ledger.js +24 -1
- package/hooks/scripts/post-edit-dispatcher.js +4 -3
- package/hooks/scripts/post-edit.js +2 -2
- package/package.json +13 -9
- package/skills/vibe/SKILL.md +2 -1
- package/skills/vibe.clone/references/verification-loops.md +6 -3
- package/skills/vibe.loop/SKILL.md +7 -4
- package/skills/vibe.review/SKILL.md +5 -1
- package/skills/vibe.run/references/e2e-and-autofix.md +1 -1
- package/skills/vibe.run/references/process-steps.md +1 -1
- package/vibe/constitution.md +1 -1
- package/vibe/rules/loop-contract.md +40 -3
- package/vibe/rules/quality/checklist.md +3 -3
- package/vibe/templates/constitution-template.md +1 -1
- package/dist/__tests__/agent-model-sync.test.d.ts +0 -2
- package/dist/__tests__/agent-model-sync.test.d.ts.map +0 -1
- package/dist/__tests__/agent-model-sync.test.js +0 -71
- package/dist/__tests__/agent-model-sync.test.js.map +0 -1
- package/dist/__tests__/architecture.test.d.ts +0 -2
- package/dist/__tests__/architecture.test.d.ts.map +0 -1
- package/dist/__tests__/architecture.test.js +0 -207
- package/dist/__tests__/architecture.test.js.map +0 -1
- package/dist/__tests__/skill-namespace.test.d.ts +0 -2
- package/dist/__tests__/skill-namespace.test.d.ts.map +0 -1
- package/dist/__tests__/skill-namespace.test.js +0 -60
- package/dist/__tests__/skill-namespace.test.js.map +0 -1
- package/dist/__tests__/stakes-contract.test.d.ts +0 -2
- package/dist/__tests__/stakes-contract.test.d.ts.map +0 -1
- package/dist/__tests__/stakes-contract.test.js +0 -166
- package/dist/__tests__/stakes-contract.test.js.map +0 -1
- package/dist/__tests__/stuck-semantics.test.d.ts +0 -2
- package/dist/__tests__/stuck-semantics.test.d.ts.map +0 -1
- package/dist/__tests__/stuck-semantics.test.js +0 -109
- package/dist/__tests__/stuck-semantics.test.js.map +0 -1
- package/dist/__tests__/wiring-integrity.test.d.ts +0 -2
- package/dist/__tests__/wiring-integrity.test.d.ts.map +0 -1
- package/dist/__tests__/wiring-integrity.test.js +0 -160
- package/dist/__tests__/wiring-integrity.test.js.map +0 -1
- package/dist/cli/commands/info.test.d.ts +0 -2
- package/dist/cli/commands/info.test.d.ts.map +0 -1
- package/dist/cli/commands/info.test.js +0 -74
- package/dist/cli/commands/info.test.js.map +0 -1
- package/dist/cli/commands/upgrade.test.d.ts +0 -2
- package/dist/cli/commands/upgrade.test.d.ts.map +0 -1
- package/dist/cli/commands/upgrade.test.js +0 -99
- package/dist/cli/commands/upgrade.test.js.map +0 -1
- package/dist/cli/design/design-md-parser.test.d.ts +0 -2
- package/dist/cli/design/design-md-parser.test.d.ts.map +0 -1
- package/dist/cli/design/design-md-parser.test.js +0 -149
- package/dist/cli/design/design-md-parser.test.js.map +0 -1
- package/dist/cli/detect.characterization.test.d.ts +0 -7
- package/dist/cli/detect.characterization.test.d.ts.map +0 -1
- package/dist/cli/detect.characterization.test.js +0 -294
- package/dist/cli/detect.characterization.test.js.map +0 -1
- package/dist/cli/postinstall/fs-utils.test.d.ts +0 -2
- package/dist/cli/postinstall/fs-utils.test.d.ts.map +0 -1
- package/dist/cli/postinstall/fs-utils.test.js +0 -259
- package/dist/cli/postinstall/fs-utils.test.js.map +0 -1
- package/dist/cli/setup/CodexHooks.test.d.ts +0 -2
- package/dist/cli/setup/CodexHooks.test.d.ts.map +0 -1
- package/dist/cli/setup/CodexHooks.test.js +0 -52
- package/dist/cli/setup/CodexHooks.test.js.map +0 -1
- package/dist/cli/setup/GlobalInstaller.test.d.ts +0 -2
- package/dist/cli/setup/GlobalInstaller.test.d.ts.map +0 -1
- package/dist/cli/setup/GlobalInstaller.test.js +0 -16
- package/dist/cli/setup/GlobalInstaller.test.js.map +0 -1
- package/dist/cli/utils/cli-detector.test.d.ts +0 -2
- package/dist/cli/utils/cli-detector.test.d.ts.map +0 -1
- package/dist/cli/utils/cli-detector.test.js +0 -52
- package/dist/cli/utils/cli-detector.test.js.map +0 -1
- package/dist/infra/lib/SkillFrontmatter.test.d.ts +0 -2
- package/dist/infra/lib/SkillFrontmatter.test.d.ts.map +0 -1
- package/dist/infra/lib/SkillFrontmatter.test.js +0 -60
- package/dist/infra/lib/SkillFrontmatter.test.js.map +0 -1
- package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts +0 -2
- package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts.map +0 -1
- package/dist/infra/lib/__tests__/AutomationLevel.test.js +0 -297
- package/dist/infra/lib/__tests__/AutomationLevel.test.js.map +0 -1
- package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts +0 -2
- package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts.map +0 -1
- package/dist/infra/lib/__tests__/ComponentRegistry.test.js +0 -99
- package/dist/infra/lib/__tests__/ComponentRegistry.test.js.map +0 -1
- package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts +0 -2
- package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts.map +0 -1
- package/dist/infra/lib/__tests__/DecisionTracer.test.js +0 -274
- package/dist/infra/lib/__tests__/DecisionTracer.test.js.map +0 -1
- package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts +0 -2
- package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts.map +0 -1
- package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js +0 -350
- package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js.map +0 -1
- package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts +0 -2
- package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts.map +0 -1
- package/dist/infra/lib/__tests__/LoopBreaker.test.js +0 -340
- package/dist/infra/lib/__tests__/LoopBreaker.test.js.map +0 -1
- package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts +0 -2
- package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts.map +0 -1
- package/dist/infra/lib/__tests__/VerificationLoop.test.js +0 -486
- package/dist/infra/lib/__tests__/VerificationLoop.test.js.map +0 -1
- package/dist/infra/lib/config/GlobalConfigManager.test.d.ts +0 -2
- package/dist/infra/lib/config/GlobalConfigManager.test.d.ts.map +0 -1
- package/dist/infra/lib/config/GlobalConfigManager.test.js +0 -9
- package/dist/infra/lib/config/GlobalConfigManager.test.js.map +0 -1
- package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.d.ts +0 -2
- package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.d.ts.map +0 -1
- package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js +0 -43
- package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js.map +0 -1
- package/dist/infra/lib/embedding/__tests__/VectorStore.test.d.ts +0 -2
- package/dist/infra/lib/embedding/__tests__/VectorStore.test.d.ts.map +0 -1
- package/dist/infra/lib/embedding/__tests__/VectorStore.test.js +0 -94
- package/dist/infra/lib/embedding/__tests__/VectorStore.test.js.map +0 -1
- package/dist/infra/lib/embedding/__tests__/cosine.test.d.ts +0 -2
- package/dist/infra/lib/embedding/__tests__/cosine.test.d.ts.map +0 -1
- package/dist/infra/lib/embedding/__tests__/cosine.test.js +0 -73
- package/dist/infra/lib/embedding/__tests__/cosine.test.js.map +0 -1
- package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts +0 -2
- package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts.map +0 -1
- package/dist/infra/lib/evolution/__tests__/deprecation.test.js +0 -251
- package/dist/infra/lib/evolution/__tests__/deprecation.test.js.map +0 -1
- package/dist/infra/lib/evolution/__tests__/eval.test.d.ts +0 -2
- package/dist/infra/lib/evolution/__tests__/eval.test.d.ts.map +0 -1
- package/dist/infra/lib/evolution/__tests__/eval.test.js +0 -603
- package/dist/infra/lib/evolution/__tests__/eval.test.js.map +0 -1
- package/dist/infra/lib/evolution/__tests__/generation.test.d.ts +0 -2
- package/dist/infra/lib/evolution/__tests__/generation.test.d.ts.map +0 -1
- package/dist/infra/lib/evolution/__tests__/generation.test.js +0 -396
- package/dist/infra/lib/evolution/__tests__/generation.test.js.map +0 -1
- package/dist/infra/lib/evolution/__tests__/insight.test.d.ts +0 -2
- package/dist/infra/lib/evolution/__tests__/insight.test.d.ts.map +0 -1
- package/dist/infra/lib/evolution/__tests__/insight.test.js +0 -204
- package/dist/infra/lib/evolution/__tests__/insight.test.js.map +0 -1
- package/dist/infra/lib/evolution/__tests__/integration.test.d.ts +0 -2
- package/dist/infra/lib/evolution/__tests__/integration.test.d.ts.map +0 -1
- package/dist/infra/lib/evolution/__tests__/integration.test.js +0 -206
- package/dist/infra/lib/evolution/__tests__/integration.test.js.map +0 -1
- package/dist/infra/lib/evolution/__tests__/lifecycle.test.d.ts +0 -2
- package/dist/infra/lib/evolution/__tests__/lifecycle.test.d.ts.map +0 -1
- package/dist/infra/lib/evolution/__tests__/lifecycle.test.js +0 -350
- package/dist/infra/lib/evolution/__tests__/lifecycle.test.js.map +0 -1
- package/dist/infra/lib/evolution/__tests__/parity.test.d.ts +0 -2
- package/dist/infra/lib/evolution/__tests__/parity.test.d.ts.map +0 -1
- package/dist/infra/lib/evolution/__tests__/parity.test.js +0 -319
- package/dist/infra/lib/evolution/__tests__/parity.test.js.map +0 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.test.d.ts +0 -5
- package/dist/infra/lib/llm/auth/AuthProfileManager.test.d.ts.map +0 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.test.js +0 -168
- package/dist/infra/lib/llm/auth/AuthProfileManager.test.js.map +0 -1
- package/dist/infra/lib/llm/auth/TokenRefresher.test.d.ts +0 -2
- package/dist/infra/lib/llm/auth/TokenRefresher.test.d.ts.map +0 -1
- package/dist/infra/lib/llm/auth/TokenRefresher.test.js +0 -120
- package/dist/infra/lib/llm/auth/TokenRefresher.test.js.map +0 -1
- package/dist/infra/lib/llm/timeout.test.d.ts +0 -2
- package/dist/infra/lib/llm/timeout.test.d.ts.map +0 -1
- package/dist/infra/lib/llm/timeout.test.js +0 -50
- package/dist/infra/lib/llm/timeout.test.js.map +0 -1
- package/dist/infra/lib/llm-availability.test.d.ts +0 -2
- package/dist/infra/lib/llm-availability.test.d.ts.map +0 -1
- package/dist/infra/lib/llm-availability.test.js +0 -37
- package/dist/infra/lib/llm-availability.test.js.map +0 -1
- package/dist/infra/lib/memory/KnowledgeGraph.test.d.ts +0 -2
- package/dist/infra/lib/memory/KnowledgeGraph.test.d.ts.map +0 -1
- package/dist/infra/lib/memory/KnowledgeGraph.test.js +0 -189
- package/dist/infra/lib/memory/KnowledgeGraph.test.js.map +0 -1
- package/dist/infra/lib/memory/MemorySearch.test.d.ts +0 -2
- package/dist/infra/lib/memory/MemorySearch.test.d.ts.map +0 -1
- package/dist/infra/lib/memory/MemorySearch.test.js +0 -149
- package/dist/infra/lib/memory/MemorySearch.test.js.map +0 -1
- package/dist/infra/lib/memory/MemoryStorage.test.d.ts +0 -2
- package/dist/infra/lib/memory/MemoryStorage.test.d.ts.map +0 -1
- package/dist/infra/lib/memory/MemoryStorage.test.js +0 -198
- package/dist/infra/lib/memory/MemoryStorage.test.js.map +0 -1
- package/dist/infra/lib/memory/SessionRAGRetriever.test.d.ts +0 -2
- package/dist/infra/lib/memory/SessionRAGRetriever.test.d.ts.map +0 -1
- package/dist/infra/lib/memory/SessionRAGRetriever.test.js +0 -180
- package/dist/infra/lib/memory/SessionRAGRetriever.test.js.map +0 -1
- package/dist/infra/lib/memory/SessionRAGStore.test.d.ts +0 -2
- package/dist/infra/lib/memory/SessionRAGStore.test.d.ts.map +0 -1
- package/dist/infra/lib/memory/SessionRAGStore.test.js +0 -326
- package/dist/infra/lib/memory/SessionRAGStore.test.js.map +0 -1
- package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts +0 -2
- package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts.map +0 -1
- package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js +0 -114
- package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js.map +0 -1
- package/dist/infra/lib/memory/__tests__/ReflectionStore.test.d.ts +0 -2
- package/dist/infra/lib/memory/__tests__/ReflectionStore.test.d.ts.map +0 -1
- package/dist/infra/lib/memory/__tests__/ReflectionStore.test.js +0 -196
- package/dist/infra/lib/memory/__tests__/ReflectionStore.test.js.map +0 -1
- package/dist/infra/lib/memory/index.test.d.ts +0 -2
- package/dist/infra/lib/memory/index.test.d.ts.map +0 -1
- package/dist/infra/lib/memory/index.test.js +0 -23
- package/dist/infra/lib/memory/index.test.js.map +0 -1
- package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts +0 -2
- package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts.map +0 -1
- package/dist/infra/lib/telemetry/SkillTelemetry.test.js +0 -124
- package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +0 -1
- package/dist/infra/lib/ui-ux/Bm25Engine.test.d.ts +0 -2
- package/dist/infra/lib/ui-ux/Bm25Engine.test.d.ts.map +0 -1
- package/dist/infra/lib/ui-ux/Bm25Engine.test.js +0 -159
- package/dist/infra/lib/ui-ux/Bm25Engine.test.js.map +0 -1
- package/dist/infra/lib/ui-ux/CsvDataLoader.test.d.ts +0 -2
- package/dist/infra/lib/ui-ux/CsvDataLoader.test.d.ts.map +0 -1
- package/dist/infra/lib/ui-ux/CsvDataLoader.test.js +0 -141
- package/dist/infra/lib/ui-ux/CsvDataLoader.test.js.map +0 -1
- package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.d.ts +0 -2
- package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.d.ts.map +0 -1
- package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.js +0 -370
- package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.js.map +0 -1
- package/dist/infra/lib/ui-ux/SearchService.test.d.ts +0 -2
- package/dist/infra/lib/ui-ux/SearchService.test.d.ts.map +0 -1
- package/dist/infra/lib/ui-ux/SearchService.test.js +0 -215
- package/dist/infra/lib/ui-ux/SearchService.test.js.map +0 -1
- package/dist/test-helpers/index.d.ts +0 -36
- package/dist/test-helpers/index.d.ts.map +0 -1
- package/dist/test-helpers/index.js +0 -85
- package/dist/test-helpers/index.js.map +0 -1
- package/dist/test-helpers/index.test.d.ts +0 -2
- package/dist/test-helpers/index.test.d.ts.map +0 -1
- package/dist/test-helpers/index.test.js +0 -92
- package/dist/test-helpers/index.test.js.map +0 -1
- package/dist/tests/curated-release-notes.test.d.ts +0 -2
- package/dist/tests/curated-release-notes.test.d.ts.map +0 -1
- package/dist/tests/curated-release-notes.test.js +0 -160
- package/dist/tests/curated-release-notes.test.js.map +0 -1
- package/dist/tools/convention/analyzeComplexity.test.d.ts +0 -2
- package/dist/tools/convention/analyzeComplexity.test.d.ts.map +0 -1
- package/dist/tools/convention/analyzeComplexity.test.js +0 -207
- package/dist/tools/convention/analyzeComplexity.test.js.map +0 -1
- package/dist/tools/convention/validateCodeQuality.test.d.ts +0 -2
- package/dist/tools/convention/validateCodeQuality.test.d.ts.map +0 -1
- package/dist/tools/convention/validateCodeQuality.test.js +0 -230
- package/dist/tools/convention/validateCodeQuality.test.js.map +0 -1
- package/dist/tools/loop/validateLoopDefinition.test.d.ts +0 -14
- package/dist/tools/loop/validateLoopDefinition.test.d.ts.map +0 -1
- package/dist/tools/loop/validateLoopDefinition.test.js +0 -229
- package/dist/tools/loop/validateLoopDefinition.test.js.map +0 -1
- package/dist/tools/spec/executionPacket.test.d.ts +0 -2
- package/dist/tools/spec/executionPacket.test.d.ts.map +0 -1
- package/dist/tools/spec/executionPacket.test.js +0 -374
- package/dist/tools/spec/executionPacket.test.js.map +0 -1
- package/dist/tools/spec/prdParser.test.d.ts +0 -6
- package/dist/tools/spec/prdParser.test.d.ts.map +0 -1
- package/dist/tools/spec/prdParser.test.js +0 -332
- package/dist/tools/spec/prdParser.test.js.map +0 -1
- package/dist/tools/spec/specGenerator.test.d.ts +0 -2
- package/dist/tools/spec/specGenerator.test.d.ts.map +0 -1
- package/dist/tools/spec/specGenerator.test.js +0 -130
- package/dist/tools/spec/specGenerator.test.js.map +0 -1
- package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts +0 -10
- package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts.map +0 -1
- package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js +0 -120
- package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js.map +0 -1
- package/dist/tools/spec/traceabilityMatrix.test.d.ts +0 -6
- package/dist/tools/spec/traceabilityMatrix.test.d.ts.map +0 -1
- package/dist/tools/spec/traceabilityMatrix.test.js +0 -359
- package/dist/tools/spec/traceabilityMatrix.test.js.map +0 -1
- package/hooks/scripts/__tests__/.vibe/command-log.txt +0 -3
- package/hooks/scripts/__tests__/auto-test-debounce.test.js +0 -145
- package/hooks/scripts/__tests__/clone-behaviors.test.js +0 -152
- package/hooks/scripts/__tests__/clone-merge-responsive.test.js +0 -106
- package/hooks/scripts/__tests__/code-check-detectors.test.js +0 -213
- package/hooks/scripts/__tests__/code-check-memory-write.test.js +0 -81
- package/hooks/scripts/__tests__/codex-hook-adapter.test.js +0 -64
- package/hooks/scripts/__tests__/curation-index.test.js +0 -157
- package/hooks/scripts/__tests__/dispatcher-inprocess.test.js +0 -99
- package/hooks/scripts/__tests__/figma-extract.test.js +0 -338
- package/hooks/scripts/__tests__/hook-payload.test.js +0 -29
- package/hooks/scripts/__tests__/llm-orchestrate-antigravity.test.js +0 -66
- package/hooks/scripts/__tests__/loop-ledger.test.js +0 -321
- package/hooks/scripts/__tests__/post-edit-dispatcher.test.js +0 -139
- package/hooks/scripts/__tests__/pre-tool-guard.test.js +0 -523
- package/hooks/scripts/__tests__/recipe-extractor.test.js +0 -244
- package/hooks/scripts/__tests__/run-ledger-verify-required.test.js +0 -151
- package/hooks/scripts/__tests__/run-ledger.test.js +0 -481
- package/hooks/scripts/__tests__/scope-from-spec.test.js +0 -215
- package/hooks/scripts/__tests__/sentinel-guard.test.js +0 -263
- package/hooks/scripts/__tests__/step-counter.test.js +0 -459
- package/hooks/scripts/__tests__/utils-npm-root.test.js +0 -99
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stakes-contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stakes-contract.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
/**
|
|
5
|
-
* Stakes-proportional pipeline — 정적 계약 테스트 (SPEC: stakes-proportional-pipeline).
|
|
6
|
-
*
|
|
7
|
-
* 스킬 본문 규칙은 모델이 읽는 계약이므로, 규칙이 각 파일에 존재·유지되는지를
|
|
8
|
-
* 순수 fs 검사로 고정한다 (wiring-integrity 선례). D1–D5 게이트.
|
|
9
|
-
*/
|
|
10
|
-
const ROOT = path.resolve(__dirname, '..', '..');
|
|
11
|
-
function read(rel) {
|
|
12
|
-
return fs.readFileSync(path.join(ROOT, rel), 'utf-8');
|
|
13
|
-
}
|
|
14
|
-
describe('D2 — loop-contract.md: Stakes 매핑 SSOT', () => {
|
|
15
|
-
const doc = read('vibe/rules/loop-contract.md');
|
|
16
|
-
it('stakes 파라미터가 기본값 production 으로 정의된다', () => {
|
|
17
|
-
expect(doc).toMatch(/\|\s*`stakes`\s*\|\s*`production`\s*\|/);
|
|
18
|
-
});
|
|
19
|
-
it('Stakes 매핑 표에 demo/prototype/production 3단계가 있다', () => {
|
|
20
|
-
for (const level of ['`demo`', '`prototype`', '`production`']) {
|
|
21
|
-
expect(doc, `Stakes 표에 ${level} 행 누락`).toContain(level);
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
it('demo/prototype 는 max_iterations 1 + 검증 스크립트 신규 생성 금지', () => {
|
|
25
|
-
expect(doc).toContain('신규 생성 금지');
|
|
26
|
-
expect(doc).toMatch(/`demo`[^\n]*\|\s*1\s*\|/);
|
|
27
|
-
});
|
|
28
|
-
it('불확실 시 상향(production) 원칙이 명시된다', () => {
|
|
29
|
-
expect(doc).toMatch(/불확실하면 항상 상향|불확실하면 상향/);
|
|
30
|
-
});
|
|
31
|
-
it('JUDGE 검증 산출물 절제: git diff --numstat 기반 P2 경고 (advisory)', () => {
|
|
32
|
-
expect(doc).toContain('JUDGE 검증 산출물 절제');
|
|
33
|
-
expect(doc).toContain('git diff --numstat');
|
|
34
|
-
expect(doc).toContain('P2');
|
|
35
|
-
expect(doc).toMatch(/게이트 통과 여부를 바꾸지 않는다/);
|
|
36
|
-
});
|
|
37
|
-
it('production 기본 동작 불변: max_iterations 기본 10 유지', () => {
|
|
38
|
-
expect(doc).toMatch(/\|\s*`max_iterations`\s*\|\s*10\s*\|/);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
describe('D1 — vibe 디스패처: stakes 분류 규칙', () => {
|
|
42
|
-
const doc = read('skills/vibe/SKILL.md');
|
|
43
|
-
it('Phase 1-b Stakes 분류 섹션이 존재한다', () => {
|
|
44
|
-
expect(doc).toContain('Phase 1-b: Stakes 분류');
|
|
45
|
-
});
|
|
46
|
-
it('경량 프로파일 매핑(--max-iter 1, 리뷰 1패스, 검증 스크립트 신규 생성 금지)이 명시된다', () => {
|
|
47
|
-
expect(doc).toContain('--max-iter 1');
|
|
48
|
-
expect(doc).toContain('리뷰 1패스');
|
|
49
|
-
expect(doc).toContain('검증 스크립트 신규 생성 금지');
|
|
50
|
-
});
|
|
51
|
-
it('SSOT 로 loop-contract.md 를 참조한다', () => {
|
|
52
|
-
expect(doc).toMatch(/loop-contract\.md[^\n]*Stakes|Stakes[^\n]*loop-contract\.md/);
|
|
53
|
-
});
|
|
54
|
-
it('불확실 시 상향 + SPEC 승인 편승 질문이 명시된다', () => {
|
|
55
|
-
expect(doc).toContain('불확실하면 상향');
|
|
56
|
-
expect(doc).toMatch(/SPEC 승인 메시지에 stakes 확인 질문/);
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
/**
|
|
60
|
-
* 디스패처의 Stakes 표는 **의도적 사본**이다 — 모델이 다른 파일을 로드하지 않고
|
|
61
|
-
* 판정할 수 있어야 하므로 D1 이 본문 존재를 요구한다. 문제는 사본이 조용히
|
|
62
|
-
* 드리프트한다는 것이고, 실제로 그런 일이 있었다:
|
|
63
|
-
*
|
|
64
|
-
* SSOT `production` | 기본값 — 신호 없음·상충 포함
|
|
65
|
-
* 사본 `production` | 기본값 — 신호 없음 ← "상충 포함" 소실
|
|
66
|
-
*
|
|
67
|
-
* 신호가 상충할 때 상향(production)하지 않으면 리뷰어 셋과 max_iterations 가
|
|
68
|
-
* 통째로 축소된다. 사본을 허용하는 대신 드리프트를 CI 에서 막는다.
|
|
69
|
-
*/
|
|
70
|
-
describe('D1/D2 — Stakes 사본 드리프트 가드', () => {
|
|
71
|
-
const dispatcher = read('skills/vibe/SKILL.md');
|
|
72
|
-
const ssot = read('vibe/rules/loop-contract.md');
|
|
73
|
-
it('상충 신호 → production 상향 규칙이 SSOT 와 사본 양쪽에 있다', () => {
|
|
74
|
-
expect(ssot, 'SSOT production 행에 "상충" 누락').toMatch(/`production`[^\n]*상충/);
|
|
75
|
-
expect(dispatcher, '디스패처 사본 production 행에 "상충" 누락').toMatch(/`production`[^\n]*상충/);
|
|
76
|
-
});
|
|
77
|
-
it('prototype 판정 신호가 SSOT 와 사본 양쪽에서 유지보수 가능성을 언급한다', () => {
|
|
78
|
-
expect(ssot).toMatch(/`prototype`[^\n]*유지보수 가능성/);
|
|
79
|
-
expect(dispatcher).toMatch(/`prototype`[^\n]*유지보수 가능성/);
|
|
80
|
-
});
|
|
81
|
-
it('사본이 SSOT 우선임을 명시한다 (충돌 시 판단 근거)', () => {
|
|
82
|
-
expect(dispatcher).toMatch(/SSOT 가 이긴다|SSOT가 이긴다/);
|
|
83
|
-
});
|
|
84
|
-
it('세 stakes 값의 판정 신호가 양쪽에 모두 존재한다', () => {
|
|
85
|
-
for (const level of ['`demo`', '`prototype`', '`production`']) {
|
|
86
|
-
expect(ssot, `SSOT 에 ${level} 누락`).toContain(level);
|
|
87
|
-
expect(dispatcher, `사본에 ${level} 누락`).toContain(level);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
describe('D3 — vibe.spec: 승인 게이트 stakes 편승 질문', () => {
|
|
92
|
-
const doc = read('skills/vibe.spec/SKILL.md');
|
|
93
|
-
it('Stakes 편승 질문 규칙이 승인 섹션에 존재한다', () => {
|
|
94
|
-
expect(doc).toContain('Stakes 편승 질문');
|
|
95
|
-
expect(doc).toMatch(/demo\/prototype\/production/);
|
|
96
|
-
});
|
|
97
|
-
it('별도 추가 왕복 금지가 명시된다', () => {
|
|
98
|
-
expect(doc).toMatch(/추가 확인 왕복을 만들지 않는다/);
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
describe('D4 — vibe.run: stakes 프로파일 + JUDGE 절제 참조', () => {
|
|
102
|
-
const doc = read('skills/vibe.run/SKILL.md');
|
|
103
|
-
it('Stakes 프로파일 섹션이 loop-contract 를 SSOT 로 참조한다', () => {
|
|
104
|
-
expect(doc).toContain('Stakes 프로파일');
|
|
105
|
-
expect(doc).toMatch(/SSOT[^\n]*loop-contract\.md/);
|
|
106
|
-
});
|
|
107
|
-
it('demo/prototype 에서 검증 스크립트 신규 생성 금지가 명시된다', () => {
|
|
108
|
-
expect(doc).toContain('검증 스크립트 신규 생성 금지');
|
|
109
|
-
});
|
|
110
|
-
it('JUDGE 검증 산출물 절제(P2, git diff --numstat, advisory)가 명시된다', () => {
|
|
111
|
-
expect(doc).toContain('git diff --numstat');
|
|
112
|
-
expect(doc).toMatch(/P2 경고/);
|
|
113
|
-
expect(doc).toMatch(/advisory/);
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
describe('D5 — vibe.review: 리뷰어 스케일링', () => {
|
|
117
|
-
const doc = read('skills/vibe.review/SKILL.md');
|
|
118
|
-
it('스케일링 표가 존재한다 (demo ≤5 → 2종)', () => {
|
|
119
|
-
expect(doc).toContain('리뷰어 스케일링');
|
|
120
|
-
expect(doc).toMatch(/demo[^\n]*≤5[^\n]*2종/);
|
|
121
|
-
});
|
|
122
|
-
it('production 행은 기존 Core Reviewers 전체를 유지한다', () => {
|
|
123
|
-
expect(doc).toMatch(/production[^\n]*Core Reviewers 전체/);
|
|
124
|
-
// 기존 기본 셋 불변 검증 — Core Reviewers 표의 focus 들이 그대로 존재
|
|
125
|
-
for (const focus of [
|
|
126
|
-
'security-reviewer',
|
|
127
|
-
'focus: correctness',
|
|
128
|
-
'focus: data-integrity',
|
|
129
|
-
'focus: performance',
|
|
130
|
-
'focus: architecture',
|
|
131
|
-
'focus: complexity',
|
|
132
|
-
'focus: git-history',
|
|
133
|
-
'focus: test-coverage',
|
|
134
|
-
]) {
|
|
135
|
-
expect(doc, `Core Reviewers 에서 ${focus} 가 사라짐 — production 불변 위반`).toContain(focus);
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
it('SSOT 로 loop-contract.md 를 참조한다', () => {
|
|
139
|
-
expect(doc).toMatch(/loop-contract\.md[^\n]*Stakes/);
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
describe('강제화 — stakes 분류를 건너뛸 수 없다 (재테스트 발견 1 회귀 방지)', () => {
|
|
143
|
-
it('vibe 디스패처: Stakes 줄 없는 실행 계획은 무효', () => {
|
|
144
|
-
const doc = read('skills/vibe/SKILL.md');
|
|
145
|
-
expect(doc).toContain('생략 불가');
|
|
146
|
-
expect(doc).toMatch(/`Stakes:` 줄이 없는 실행 계획은 무효/);
|
|
147
|
-
});
|
|
148
|
-
it('spec-template: 헤더에 Stakes 필드가 존재한다', () => {
|
|
149
|
-
const doc = read('vibe/templates/spec-template.md');
|
|
150
|
-
expect(doc).toMatch(/\*\*Stakes\*\*[^\n]*demo \| prototype \| production/);
|
|
151
|
-
});
|
|
152
|
-
it('vibe.spec: SPEC 헤더 Stakes 필수 + 경량 SPEC 규칙(분할 금지)', () => {
|
|
153
|
-
const doc = read('skills/vibe.spec/SKILL.md');
|
|
154
|
-
expect(doc).toContain('Stakes (헤더 필수 필드)');
|
|
155
|
-
expect(doc).toMatch(/분할 금지/);
|
|
156
|
-
});
|
|
157
|
-
it('vibe.spec: 승인 요약에 Stakes 줄이 포함된다', () => {
|
|
158
|
-
const doc = read('skills/vibe.spec/SKILL.md');
|
|
159
|
-
expect(doc).toMatch(/Stakes: \{demo\|prototype\|production\}/);
|
|
160
|
-
});
|
|
161
|
-
it('vibe.spec: 셀프 리뷰 체크리스트에 stakes 항목이 있다', () => {
|
|
162
|
-
const doc = read('skills/vibe.spec/SKILL.md');
|
|
163
|
-
expect(doc).toMatch(/헤더에 `Stakes:` 필드가 있고/);
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
//# sourceMappingURL=stakes-contract.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stakes-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/stakes-contract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stuck-semantics.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stuck-semantics.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
/**
|
|
5
|
-
* `stuck` 시맨틱 계약 — 4개 문서가 서로 모순됐던 회귀를 막는다.
|
|
6
|
-
*
|
|
7
|
-
* 발견 경위: Codex 하네스에 SKILL.md 를 읽혀 검증하던 중, 같은 규칙이 문서마다
|
|
8
|
-
* 다르게 적혀 있는 것이 드러났다.
|
|
9
|
-
*
|
|
10
|
-
* loop-contract.md:24 stuck = EXIT 조건
|
|
11
|
-
* loop-contract.md:44 autonomous = "기록 후 계속" ← 같은 파일 안에서 상충
|
|
12
|
-
* CLAUDE.md autonomous "continues"
|
|
13
|
-
* vibe/SKILL.md autonomous → "루프 종료" ← 정반대
|
|
14
|
-
*
|
|
15
|
-
* 확정된 시맨틱: **stuck 은 어느 automationLevel 에서도 루프를 종료한다.**
|
|
16
|
-
* 2회 연속 동일 발견은 정의상 재시도가 무의미하므로 루프 연장은 성립하지 않는다.
|
|
17
|
-
* automationLevel 이 결정하는 것은 "사람에게 묻는지" 와 "다음 단위로 넘어가는지" 뿐이며,
|
|
18
|
-
* 미달은 절대 완료로 기록하지 않는다.
|
|
19
|
-
*/
|
|
20
|
-
const ROOT = path.resolve(__dirname, '..', '..');
|
|
21
|
-
function read(rel) {
|
|
22
|
-
return fs.readFileSync(path.join(ROOT, rel), 'utf-8');
|
|
23
|
-
}
|
|
24
|
-
/** stuck 규칙을 진술하는 모든 문서 — 새 문서를 추가하면 여기에 등록한다 */
|
|
25
|
-
const DOCS_STATING_STUCK = [
|
|
26
|
-
'vibe/rules/loop-contract.md',
|
|
27
|
-
'CLAUDE.md',
|
|
28
|
-
'AGENTS.md',
|
|
29
|
-
'skills/vibe/SKILL.md',
|
|
30
|
-
'skills/vibe.run/references/automation-level.md',
|
|
31
|
-
'skills/vibe.run/references/coverage-loop.md',
|
|
32
|
-
];
|
|
33
|
-
describe('stuck 시맨틱 — SSOT', () => {
|
|
34
|
-
const ssot = read('vibe/rules/loop-contract.md');
|
|
35
|
-
it('stuck 이 루프를 종료한다고 명시한다', () => {
|
|
36
|
-
expect(ssot).toMatch(/그 루프는 종료한다/);
|
|
37
|
-
});
|
|
38
|
-
it('autonomous 의 "계속" 이 루프 연장이 아님을 명시한다', () => {
|
|
39
|
-
expect(ssot).toMatch(/stuck 난 루프를 더 돌린다는 뜻이 아니다/);
|
|
40
|
-
});
|
|
41
|
-
it('미달을 완료로 기록하지 않는다는 규칙이 있다', () => {
|
|
42
|
-
expect(ssot).toMatch(/완료로 기록하지 않는다/);
|
|
43
|
-
});
|
|
44
|
-
it('confirm/autonomous 모두 루프는 종료임을 표로 구분한다', () => {
|
|
45
|
-
// 질문 여부와 루프 종료를 섞지 말라는 지시가 있어야 한다
|
|
46
|
-
expect(ssot).toMatch(/이 둘을 섞지 말/);
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
describe('stuck 시맨틱 — 문서 간 정합', () => {
|
|
50
|
-
it.each(DOCS_STATING_STUCK)('%s 가 stuck 을 "계속 재시도" 로 기술하지 않는다', (rel) => {
|
|
51
|
-
const doc = read(rel);
|
|
52
|
-
// stuck 을 언급하지 않는 문서는 검사 대상이 아니다
|
|
53
|
-
if (!/stuck/i.test(doc))
|
|
54
|
-
return;
|
|
55
|
-
// "stuck → 계속" 류의 단정을 금지한다. 부정문("계속한다는 뜻이 아니다",
|
|
56
|
-
// "keep retrying" 를 부정하는 문장)은 허용해야 하므로, 금지 패턴은
|
|
57
|
-
// stuck 직후에 곧바로 연장을 지시하는 형태로 좁힌다.
|
|
58
|
-
expect(doc, `${rel}: stuck 을 루프 연장으로 기술함`)
|
|
59
|
-
.not.toMatch(/stuck[^\n.]{0,40}(?:이면|→|->)\s*(?:루프를? )?계속(?!한다는 뜻이 아니)/);
|
|
60
|
-
});
|
|
61
|
-
it.each(DOCS_STATING_STUCK)('%s 가 sub-100/미달을 완료로 기록하지 않는다고 유지한다', (rel) => {
|
|
62
|
-
const doc = read(rel);
|
|
63
|
-
if (!/stuck/i.test(doc))
|
|
64
|
-
return;
|
|
65
|
-
// 각 문서는 미달 처리를 어떤 형태로든 명시해야 한다 (완료 금지 / TODO / 인박스)
|
|
66
|
-
expect(doc, `${rel}: 미달 처리 규칙 없음`)
|
|
67
|
-
.toMatch(/완료로 기록하지 않는다|as complete|TODO|인박스/);
|
|
68
|
-
});
|
|
69
|
-
/**
|
|
70
|
-
* stuck 은 **발견 해시**로 판정한다. 커버리지 수치로 바꿔 적으면 판정이 달라진다 —
|
|
71
|
-
* 커버리지가 그대로여도 남은 항목이 바뀌었으면 진전이고, 반대로 커버리지가 올라도
|
|
72
|
-
* 같은 발견이 반복되면 막힌 것이다. coverage-loop.md 가 실제로 "연속 2회 동일
|
|
73
|
-
* 커버리지" 로 적혀 있었다.
|
|
74
|
-
*/
|
|
75
|
-
it('stuck 판정 기준을 커버리지 수치로 바꿔 적은 문서가 없다', () => {
|
|
76
|
-
for (const rel of DOCS_STATING_STUCK) {
|
|
77
|
-
expect(read(rel), `${rel}: stuck 을 커버리지 수치로 판정`)
|
|
78
|
-
.not.toMatch(/연속 2회 동일 커버리지/);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
/**
|
|
83
|
-
* Deprecated 별칭 환원은 loop-contract 의 표가 유일 SSOT 다.
|
|
84
|
-
* 요약을 여러 곳에 두었더니 `quick` 의 "최소 JUDGE" 가 빠지고 `ralplan` 이
|
|
85
|
-
* 누락되는 식으로 어긋났다 — 부분 요약은 전체 사본보다 드리프트를 알아채기 어렵다.
|
|
86
|
-
*/
|
|
87
|
-
describe('deprecated 별칭 매핑 정합', () => {
|
|
88
|
-
const ssot = read('vibe/rules/loop-contract.md');
|
|
89
|
-
it('SSOT 에 별칭 5종이 모두 정의돼 있다', () => {
|
|
90
|
-
for (const alias of ['`ralph`', '`verify`', '`quick`', '`ralplan`', '`ultrawork`']) {
|
|
91
|
-
expect(ssot, `SSOT 에 ${alias} 누락`).toContain(alias);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
it('SSOT 의 quick 은 --max-iter 1 + 최소 JUDGE 다', () => {
|
|
95
|
-
expect(ssot).toMatch(/`quick`[^\n]*--max-iter 1[^\n]*최소 JUDGE/);
|
|
96
|
-
});
|
|
97
|
-
it.each(['CLAUDE.md', 'AGENTS.md'])('%s 의 quick 요약이 최소 JUDGE 를 빠뜨리지 않는다', (rel) => {
|
|
98
|
-
const doc = read(rel);
|
|
99
|
-
if (!/`quick`/.test(doc))
|
|
100
|
-
return;
|
|
101
|
-
expect(doc, `${rel}: quick 에 최소 JUDGE 누락`)
|
|
102
|
-
.toMatch(/`quick`→`--max-iter 1`[^\n]*(?:min JUDGE|최소 JUDGE)/);
|
|
103
|
-
});
|
|
104
|
-
it('automation-level.md 는 별칭 요약을 두지 않고 SSOT 를 가리킨다', () => {
|
|
105
|
-
const doc = read('skills/vibe.run/references/automation-level.md');
|
|
106
|
-
expect(doc).toMatch(/요약도 두지 않는다/);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
//# sourceMappingURL=stuck-semantics.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stuck-semantics.test.js","sourceRoot":"","sources":["../../src/__tests__/stuck-semantics.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wiring-integrity.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/wiring-integrity.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { globSync } from 'glob';
|
|
5
|
-
import { GLOBAL_SKILLS, GLOBAL_SKILLS_OPTIONAL, STACK_TO_SKILLS, CAPABILITY_SKILLS, } from '../cli/postinstall/constants.js';
|
|
6
|
-
/**
|
|
7
|
-
* F1–F3 — 정적 무결성 테스트 (SPEC: system-lean-hardening Track 4).
|
|
8
|
-
*
|
|
9
|
-
* A1/B1–B3/B5–B6 처럼 "설치 목록에 없는 걸 체인 호출" / "아무도 참조 안 하는 자산"
|
|
10
|
-
* 결함이 재발하지 않도록, 배선(entry→body 스킬 / 훅 스크립트 / 에이전트)을
|
|
11
|
-
* 순수 fs+regex 로 검증한다. 빌드 산출물 불필요 — 소스만 읽는다.
|
|
12
|
-
*/
|
|
13
|
-
const ROOT = path.resolve(__dirname, '..', '..');
|
|
14
|
-
const SKILLS_DIR = path.join(ROOT, 'skills');
|
|
15
|
-
const HOOKS_DIR = path.join(ROOT, 'hooks');
|
|
16
|
-
const HOOK_SCRIPTS_DIR = path.join(HOOKS_DIR, 'scripts');
|
|
17
|
-
const AGENTS_DIR = path.join(ROOT, 'agents');
|
|
18
|
-
const SRC_DIR = path.join(ROOT, 'src');
|
|
19
|
-
const RULES_DIR = path.join(ROOT, 'vibe', 'rules');
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
// F1 — entry→body skill install integrity
|
|
22
|
-
// ---------------------------------------------------------------------------
|
|
23
|
-
/**
|
|
24
|
-
* SKILL.md 본문에서 체인 호출("Load skill `X`" 및 한국어 "`X` 스킬을 로드")로
|
|
25
|
-
* 참조된 body 스킬 이름을 추출한다. `figma:figma-use` 처럼 ':' 가 포함된
|
|
26
|
-
* plugin-qualified 참조(외부 플러그인 스킬)는 vibe 설치 목록 대상이 아니므로 제외한다.
|
|
27
|
-
*/
|
|
28
|
-
function extractChainedSkills(content) {
|
|
29
|
-
const names = new Set();
|
|
30
|
-
const patterns = [/load skill `([^`]+)`/gi, /`([^`]+)`\s*스킬을\s*로드/g];
|
|
31
|
-
for (const re of patterns) {
|
|
32
|
-
let match;
|
|
33
|
-
while ((match = re.exec(content)) !== null) {
|
|
34
|
-
const name = match[1].trim();
|
|
35
|
-
if (name && !name.includes(':'))
|
|
36
|
-
names.add(name);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return [...names];
|
|
40
|
-
}
|
|
41
|
-
function flattenMap(map) {
|
|
42
|
-
return Object.values(map).flat();
|
|
43
|
-
}
|
|
44
|
-
describe('F1 — entry→body skill install integrity', () => {
|
|
45
|
-
const installedSkillSet = new Set([...GLOBAL_SKILLS]);
|
|
46
|
-
const allowedBodySet = new Set([
|
|
47
|
-
...GLOBAL_SKILLS,
|
|
48
|
-
...flattenMap(STACK_TO_SKILLS),
|
|
49
|
-
...flattenMap(CAPABILITY_SKILLS),
|
|
50
|
-
...GLOBAL_SKILLS_OPTIONAL,
|
|
51
|
-
]);
|
|
52
|
-
for (const skillName of installedSkillSet) {
|
|
53
|
-
const skillFile = path.join(SKILLS_DIR, skillName, 'SKILL.md');
|
|
54
|
-
it(`${skillName}: SKILL.md exists`, () => {
|
|
55
|
-
expect(fs.existsSync(skillFile), `missing skills/${skillName}/SKILL.md`).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
if (!fs.existsSync(skillFile))
|
|
58
|
-
continue;
|
|
59
|
-
const content = fs.readFileSync(skillFile, 'utf-8');
|
|
60
|
-
const referenced = extractChainedSkills(content);
|
|
61
|
-
for (const body of referenced) {
|
|
62
|
-
it(`${skillName}: chain-called body skill \`${body}\` is installed`, () => {
|
|
63
|
-
expect(allowedBodySet.has(body), `skills/${skillName}/SKILL.md chain-calls \`${body}\`, but it is not a member of ` +
|
|
64
|
-
`GLOBAL_SKILLS ∪ STACK_TO_SKILLS ∪ CAPABILITY_SKILLS ∪ GLOBAL_SKILLS_OPTIONAL. ` +
|
|
65
|
-
`Fix: add "${body}" to the appropriate list in src/cli/postinstall/constants.ts.`).toBe(true);
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
// ---------------------------------------------------------------------------
|
|
71
|
-
// F2 — hook script reference integrity
|
|
72
|
-
// ---------------------------------------------------------------------------
|
|
73
|
-
function collectHookScriptNames() {
|
|
74
|
-
return fs
|
|
75
|
-
.readdirSync(HOOK_SCRIPTS_DIR, { withFileTypes: true })
|
|
76
|
-
.filter((entry) => entry.isFile() && entry.name.endsWith('.js'))
|
|
77
|
-
.map((entry) => entry.name);
|
|
78
|
-
}
|
|
79
|
-
function isReferencedInHookScripts(scriptName) {
|
|
80
|
-
const otherScripts = collectHookScriptNames().filter((name) => name !== scriptName);
|
|
81
|
-
return otherScripts.some((name) => {
|
|
82
|
-
const content = fs.readFileSync(path.join(HOOK_SCRIPTS_DIR, name), 'utf-8');
|
|
83
|
-
return content.includes(scriptName);
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
function isReferencedInFiles(scriptName, files) {
|
|
87
|
-
return files.some((file) => fs.readFileSync(file, 'utf-8').includes(scriptName));
|
|
88
|
-
}
|
|
89
|
-
describe('F2 — hook script reference integrity', () => {
|
|
90
|
-
const scriptNames = collectHookScriptNames();
|
|
91
|
-
const hooksJson = path.join(HOOKS_DIR, 'hooks.json');
|
|
92
|
-
const antigravityJson = path.join(HOOKS_DIR, 'antigravity-hooks.json');
|
|
93
|
-
const srcFiles = globSync('**/*.ts', { cwd: SRC_DIR, absolute: true });
|
|
94
|
-
const skillMdFiles = [
|
|
95
|
-
...globSync('*/SKILL.md', { cwd: SKILLS_DIR, absolute: true }),
|
|
96
|
-
...globSync('*/references/*.md', { cwd: SKILLS_DIR, absolute: true }),
|
|
97
|
-
];
|
|
98
|
-
it('discovers hook scripts', () => {
|
|
99
|
-
expect(scriptNames.length).toBeGreaterThan(0);
|
|
100
|
-
});
|
|
101
|
-
for (const scriptName of scriptNames) {
|
|
102
|
-
it(`${scriptName} is referenced by hooks.json, another script, src/, or a skill`, () => {
|
|
103
|
-
const referenced = isReferencedInFiles(scriptName, [hooksJson, antigravityJson]) ||
|
|
104
|
-
isReferencedInHookScripts(scriptName) ||
|
|
105
|
-
isReferencedInFiles(scriptName, srcFiles) ||
|
|
106
|
-
isReferencedInFiles(scriptName, skillMdFiles);
|
|
107
|
-
expect(referenced, `hooks/scripts/${scriptName} has no reference in hooks.json, antigravity-hooks.json, ` +
|
|
108
|
-
`another hooks/scripts/*.js, src/**/*.ts, or skills/**/SKILL.md(+references/*.md). ` +
|
|
109
|
-
`Fix: register it or delete it if genuinely dead.`).toBe(true);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
// ---------------------------------------------------------------------------
|
|
114
|
-
// F3 — agent reference integrity
|
|
115
|
-
// ---------------------------------------------------------------------------
|
|
116
|
-
/**
|
|
117
|
-
* 순수 uninstall-cleanup 목록 파일 — 여기서만 등장하는 건 "살아있다"로 치지 않는다
|
|
118
|
-
* (삭제 목록에 남아있어도 참조가 아니라 오히려 제거 대상이라는 뜻이기 때문).
|
|
119
|
-
* constants.ts 의 모델/툴 매핑 데이터 테이블도 동일한 이유로 단독으로는 불충분하다
|
|
120
|
-
* (실 디스패치/사용 근거가 아니라 설치 시 주입되는 메타데이터 테이블일 뿐).
|
|
121
|
-
*/
|
|
122
|
-
const NON_COUNTING_SRC_FILES = new Set(['remove.ts', 'constants.ts']);
|
|
123
|
-
/**
|
|
124
|
-
* 알려진 미배선 에이전트 — 발견되면 여기 이름을 추가하고 왜 아직 안 지웠는지 주석을 남긴다.
|
|
125
|
-
* (F3 는 이 목록에 있는 에이전트는 실패시키지 않되, 디버트로서 눈에 띄게 남긴다.)
|
|
126
|
-
* 현재는 13개 에이전트 전부 정상 배선되어 있어 비어 있다.
|
|
127
|
-
*/
|
|
128
|
-
const KNOWN_UNWIRED = [];
|
|
129
|
-
function collectAgentBasenames() {
|
|
130
|
-
return globSync('**/*.md', { cwd: AGENTS_DIR }).map((rel) => path.basename(rel, '.md'));
|
|
131
|
-
}
|
|
132
|
-
function isReferencedInMarkdown(agentName, dir) {
|
|
133
|
-
if (!fs.existsSync(dir))
|
|
134
|
-
return false;
|
|
135
|
-
const files = globSync('**/*.md', { cwd: dir, absolute: true });
|
|
136
|
-
return files.some((file) => new RegExp(`\\b${agentName}\\b`).test(fs.readFileSync(file, 'utf-8')));
|
|
137
|
-
}
|
|
138
|
-
function isReferencedInSrc(agentName) {
|
|
139
|
-
const files = globSync('**/*.ts', { cwd: SRC_DIR, absolute: true }).filter((file) => !NON_COUNTING_SRC_FILES.has(path.basename(file)));
|
|
140
|
-
return files.some((file) => new RegExp(`\\b${agentName}\\b`).test(fs.readFileSync(file, 'utf-8')));
|
|
141
|
-
}
|
|
142
|
-
describe('F3 — agent reference integrity', () => {
|
|
143
|
-
const agentNames = collectAgentBasenames();
|
|
144
|
-
it('discovers agent files', () => {
|
|
145
|
-
expect(agentNames.length).toBeGreaterThan(0);
|
|
146
|
-
});
|
|
147
|
-
for (const agentName of agentNames) {
|
|
148
|
-
it(`${agentName} is referenced in skills/, vibe/rules/, or src/ (excluding cleanup-only lists)`, () => {
|
|
149
|
-
if (KNOWN_UNWIRED.includes(agentName))
|
|
150
|
-
return;
|
|
151
|
-
const referenced = isReferencedInMarkdown(agentName, SKILLS_DIR) ||
|
|
152
|
-
isReferencedInMarkdown(agentName, RULES_DIR) ||
|
|
153
|
-
isReferencedInSrc(agentName);
|
|
154
|
-
expect(referenced, `agents/${agentName}.md has no dispatch/usage reference in skills/**/*.md, ` +
|
|
155
|
-
`vibe/rules/**/*.md, or src/ (excluding remove.ts / constants.ts alone). ` +
|
|
156
|
-
`This is a genuine orphan — add it to KNOWN_UNWIRED with a reason, or delete the agent.`).toBe(true);
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
//# sourceMappingURL=wiring-integrity.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wiring-integrity.test.js","sourceRoot":"","sources":["../../src/__tests__/wiring-integrity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"info.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import os from 'os';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
-
import { formatHookStatus, showHelp, showStatus } from './info.js';
|
|
6
|
-
const originalCwd = process.cwd();
|
|
7
|
-
function captureLog(run) {
|
|
8
|
-
const lines = [];
|
|
9
|
-
const spy = vi.spyOn(console, 'log').mockImplementation((message) => {
|
|
10
|
-
lines.push(String(message ?? ''));
|
|
11
|
-
});
|
|
12
|
-
try {
|
|
13
|
-
run();
|
|
14
|
-
}
|
|
15
|
-
finally {
|
|
16
|
-
spy.mockRestore();
|
|
17
|
-
}
|
|
18
|
-
return lines.join('\n');
|
|
19
|
-
}
|
|
20
|
-
describe('CLI info commands', () => {
|
|
21
|
-
afterEach(() => {
|
|
22
|
-
process.chdir(originalCwd);
|
|
23
|
-
});
|
|
24
|
-
it('describes all supported harnesses in help output', () => {
|
|
25
|
-
const output = captureLog(showHelp);
|
|
26
|
-
expect(output).toContain('Claude Code / Codex / Antigravity');
|
|
27
|
-
expect(output).toContain('vibe init --antigravity');
|
|
28
|
-
expect(output).not.toContain(['Claude Code', 'exclusive'].join(' '));
|
|
29
|
-
expect(output).not.toContain(['Gemini', 'CLI'].join(' '));
|
|
30
|
-
});
|
|
31
|
-
it('detects .vibe as the project status directory', () => {
|
|
32
|
-
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-status-'));
|
|
33
|
-
fs.mkdirSync(path.join(tempDir, '.vibe'), { recursive: true });
|
|
34
|
-
fs.writeFileSync(path.join(tempDir, '.vibe', 'config.json'), JSON.stringify({ language: 'ko', models: {} }));
|
|
35
|
-
process.chdir(tempDir);
|
|
36
|
-
const output = captureLog(showStatus);
|
|
37
|
-
expect(output).toContain(`Project: ✅ ${fs.realpathSync(tempDir)}`);
|
|
38
|
-
expect(output).not.toContain('Not a core project');
|
|
39
|
-
});
|
|
40
|
-
it('surfaces missing hooks in status output', () => {
|
|
41
|
-
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-status-hooks-'));
|
|
42
|
-
fs.mkdirSync(path.join(tempDir, '.vibe'), { recursive: true });
|
|
43
|
-
process.chdir(tempDir);
|
|
44
|
-
const output = captureLog(showStatus);
|
|
45
|
-
expect(output).toContain('Hooks (deterministic gates):');
|
|
46
|
-
expect(output).toContain('not installed');
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
/**
|
|
50
|
-
* 훅 부재는 결정론적 가드가 전부 죽었다는 뜻이므로 상태 화면에서 반드시 보여야 한다.
|
|
51
|
-
* `vibe upgrade` 만 쓰는 사용자가 이 상태에 도달할 수 있다 — repairProjectHooks 참조.
|
|
52
|
-
*/
|
|
53
|
-
describe('formatHookStatus', () => {
|
|
54
|
-
function tempProject() {
|
|
55
|
-
return fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-hookstatus-'));
|
|
56
|
-
}
|
|
57
|
-
it('reports Claude hooks as installed only when the hooks key exists', () => {
|
|
58
|
-
const root = tempProject();
|
|
59
|
-
fs.mkdirSync(path.join(root, '.claude'), { recursive: true });
|
|
60
|
-
fs.writeFileSync(path.join(root, '.claude', 'settings.local.json'), JSON.stringify({ permissions: {} }));
|
|
61
|
-
expect(formatHookStatus(root)).toContain('not installed');
|
|
62
|
-
fs.writeFileSync(path.join(root, '.claude', 'settings.local.json'), JSON.stringify({ hooks: { PreToolUse: [] } }));
|
|
63
|
-
expect(formatHookStatus(root)).toContain('✓ .claude/settings.local.json');
|
|
64
|
-
});
|
|
65
|
-
it('reports Codex hooks only for Codex-enabled projects', () => {
|
|
66
|
-
const plain = tempProject();
|
|
67
|
-
expect(formatHookStatus(plain)).not.toContain('Codex');
|
|
68
|
-
const codex = tempProject();
|
|
69
|
-
fs.writeFileSync(path.join(codex, 'AGENTS.md'), '# project\n');
|
|
70
|
-
expect(formatHookStatus(codex)).toContain('Codex');
|
|
71
|
-
expect(formatHookStatus(codex)).toContain('not installed');
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
//# sourceMappingURL=info.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"info.test.js","sourceRoot":"","sources":["../../../src/cli/commands/info.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/upgrade.test.ts"],"names":[],"mappings":""}
|