@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,259 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import { createHash } from 'node:crypto';
|
|
6
|
-
import { applyCodexSkillInvocationPolicies, cleanupOptionalSkills, cleanupRenamedSkills, copySkillsFiltered, pruneExtraneousSkillFiles, } from './fs-utils.js';
|
|
7
|
-
function writeSkill(root, name, frontmatter) {
|
|
8
|
-
const skillDir = path.join(root, name);
|
|
9
|
-
fs.mkdirSync(skillDir, { recursive: true });
|
|
10
|
-
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), `---\nname: ${name}\ndescription: ${name}\n${frontmatter}---\n\nBody\n`);
|
|
11
|
-
return skillDir;
|
|
12
|
-
}
|
|
13
|
-
function skillContent(name) {
|
|
14
|
-
return `---\nname: ${name}\ndescription: ${name}\n---\n\nBody\n`;
|
|
15
|
-
}
|
|
16
|
-
describe('postinstall fs-utils', () => {
|
|
17
|
-
it('disables implicit Codex invocation for internal skills only', () => {
|
|
18
|
-
const skillsDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-skills-'));
|
|
19
|
-
const internalDir = writeSkill(skillsDir, 'interview', 'user-invocable: false\n');
|
|
20
|
-
const entryDir = writeSkill(skillsDir, 'vibe.spec', 'user-invocable: true\n');
|
|
21
|
-
applyCodexSkillInvocationPolicies(skillsDir);
|
|
22
|
-
const internalPolicy = fs.readFileSync(path.join(internalDir, 'agents', 'openai.yaml'), 'utf-8');
|
|
23
|
-
expect(internalPolicy).toContain('allow_implicit_invocation: false');
|
|
24
|
-
expect(fs.existsSync(path.join(entryDir, 'agents', 'openai.yaml'))).toBe(false);
|
|
25
|
-
});
|
|
26
|
-
it('removes stale managed Codex policy when a skill becomes user-invocable', () => {
|
|
27
|
-
const skillsDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-skills-'));
|
|
28
|
-
const skillDir = writeSkill(skillsDir, 'vibe.run', 'user-invocable: false\n');
|
|
29
|
-
applyCodexSkillInvocationPolicies(skillsDir);
|
|
30
|
-
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), '---\nname: vibe.run\ndescription: run\nuser-invocable: true\n---\n\nBody\n');
|
|
31
|
-
applyCodexSkillInvocationPolicies(skillsDir);
|
|
32
|
-
expect(fs.existsSync(path.join(skillDir, 'agents', 'openai.yaml'))).toBe(false);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
describe('cleanupOptionalSkills', () => {
|
|
36
|
-
const OPTIONAL = ['vibe.commit-push-pr', 'vibe.git-worktree', 'vibe.tool-fallback', 'vibe.context7-usage'];
|
|
37
|
-
function setupDirs() {
|
|
38
|
-
const base = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-optional-'));
|
|
39
|
-
return {
|
|
40
|
-
globalSkillsDir: path.join(base, 'global'),
|
|
41
|
-
shippedSkillsDir: path.join(base, 'shipped'),
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
it('removes vibe-owned optional skill when content matches shipped version', () => {
|
|
45
|
-
const { globalSkillsDir, shippedSkillsDir } = setupDirs();
|
|
46
|
-
const skillName = 'vibe.commit-push-pr';
|
|
47
|
-
const content = skillContent(skillName);
|
|
48
|
-
// 설치된 스킬 (shipped와 동일)
|
|
49
|
-
const installDir = path.join(globalSkillsDir, skillName);
|
|
50
|
-
fs.mkdirSync(installDir, { recursive: true });
|
|
51
|
-
fs.writeFileSync(path.join(installDir, 'SKILL.md'), content);
|
|
52
|
-
// shipped 스킬
|
|
53
|
-
const shippedDir = path.join(shippedSkillsDir, skillName);
|
|
54
|
-
fs.mkdirSync(shippedDir, { recursive: true });
|
|
55
|
-
fs.writeFileSync(path.join(shippedDir, 'SKILL.md'), content);
|
|
56
|
-
const results = cleanupOptionalSkills(globalSkillsDir, OPTIONAL, shippedSkillsDir);
|
|
57
|
-
expect(results[0].action).toBe('removed');
|
|
58
|
-
expect(fs.existsSync(installDir)).toBe(false);
|
|
59
|
-
});
|
|
60
|
-
it('preserves user-modified optional skill and returns skipped-user-modified', () => {
|
|
61
|
-
const { globalSkillsDir, shippedSkillsDir } = setupDirs();
|
|
62
|
-
const skillName = 'vibe.git-worktree';
|
|
63
|
-
const installDir = path.join(globalSkillsDir, skillName);
|
|
64
|
-
fs.mkdirSync(installDir, { recursive: true });
|
|
65
|
-
fs.writeFileSync(path.join(installDir, 'SKILL.md'), skillContent(skillName) + '\n## User Added Section\n');
|
|
66
|
-
const shippedDir = path.join(shippedSkillsDir, skillName);
|
|
67
|
-
fs.mkdirSync(shippedDir, { recursive: true });
|
|
68
|
-
fs.writeFileSync(path.join(shippedDir, 'SKILL.md'), skillContent(skillName));
|
|
69
|
-
const results = cleanupOptionalSkills(globalSkillsDir, OPTIONAL, shippedSkillsDir);
|
|
70
|
-
const result = results.find(r => r.name === skillName);
|
|
71
|
-
expect(result?.action).toBe('skipped-user-modified');
|
|
72
|
-
expect(fs.existsSync(installDir)).toBe(true);
|
|
73
|
-
});
|
|
74
|
-
it('skips skill whose SKILL.md name does not match directory name', () => {
|
|
75
|
-
const { globalSkillsDir, shippedSkillsDir } = setupDirs();
|
|
76
|
-
const skillName = 'vibe.tool-fallback';
|
|
77
|
-
// name이 디렉토리명과 다름 → not vibe-owned
|
|
78
|
-
const installDir = path.join(globalSkillsDir, skillName);
|
|
79
|
-
fs.mkdirSync(installDir, { recursive: true });
|
|
80
|
-
fs.writeFileSync(path.join(installDir, 'SKILL.md'), '---\nname: something-else\ndescription: custom\n---\n\nBody\n');
|
|
81
|
-
const results = cleanupOptionalSkills(globalSkillsDir, OPTIONAL, shippedSkillsDir);
|
|
82
|
-
const result = results.find(r => r.name === skillName);
|
|
83
|
-
expect(result?.action).toBe('skipped-not-vibe');
|
|
84
|
-
expect(fs.existsSync(installDir)).toBe(true);
|
|
85
|
-
});
|
|
86
|
-
it('dryRun=true returns removed action without deleting directory', () => {
|
|
87
|
-
const { globalSkillsDir, shippedSkillsDir } = setupDirs();
|
|
88
|
-
const skillName = 'vibe.context7-usage';
|
|
89
|
-
const content = skillContent(skillName);
|
|
90
|
-
const installDir = path.join(globalSkillsDir, skillName);
|
|
91
|
-
fs.mkdirSync(installDir, { recursive: true });
|
|
92
|
-
fs.writeFileSync(path.join(installDir, 'SKILL.md'), content);
|
|
93
|
-
const shippedDir = path.join(shippedSkillsDir, skillName);
|
|
94
|
-
fs.mkdirSync(shippedDir, { recursive: true });
|
|
95
|
-
fs.writeFileSync(path.join(shippedDir, 'SKILL.md'), content);
|
|
96
|
-
const results = cleanupOptionalSkills(globalSkillsDir, OPTIONAL, shippedSkillsDir, true);
|
|
97
|
-
const result = results.find(r => r.name === skillName);
|
|
98
|
-
expect(result?.action).toBe('removed');
|
|
99
|
-
expect(fs.existsSync(installDir)).toBe(true); // dryRun이므로 실제 삭제 없음
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe('cleanupRenamedSkills', () => {
|
|
103
|
-
const RENAMES = { spec: 'vibe.spec' };
|
|
104
|
-
function setupRename(contentSuffix = '') {
|
|
105
|
-
const base = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-renamed-'));
|
|
106
|
-
const globalSkillsDir = path.join(base, 'global');
|
|
107
|
-
const installedDir = path.join(globalSkillsDir, 'spec');
|
|
108
|
-
fs.mkdirSync(installedDir, { recursive: true });
|
|
109
|
-
const original = skillContent('spec');
|
|
110
|
-
fs.writeFileSync(path.join(installedDir, 'SKILL.md'), original + contentSuffix);
|
|
111
|
-
const hash = createHash('sha256').update(original).digest('hex');
|
|
112
|
-
return { globalSkillsDir, hashes: { spec: hash } };
|
|
113
|
-
}
|
|
114
|
-
it('REQ-skill-namespace-004 removes an unchanged legacy Vibe skill', () => {
|
|
115
|
-
const { globalSkillsDir, hashes } = setupRename();
|
|
116
|
-
const results = cleanupRenamedSkills(globalSkillsDir, RENAMES, hashes);
|
|
117
|
-
expect(results).toContainEqual(expect.objectContaining({ name: 'spec', action: 'removed' }));
|
|
118
|
-
expect(fs.existsSync(path.join(globalSkillsDir, 'spec'))).toBe(false);
|
|
119
|
-
});
|
|
120
|
-
it('preserves a user-modified legacy skill', () => {
|
|
121
|
-
const { globalSkillsDir, hashes } = setupRename('\n## User content\n');
|
|
122
|
-
const results = cleanupRenamedSkills(globalSkillsDir, RENAMES, hashes);
|
|
123
|
-
expect(results).toContainEqual(expect.objectContaining({ name: 'spec', action: 'skipped-user-modified' }));
|
|
124
|
-
expect(fs.existsSync(path.join(globalSkillsDir, 'spec'))).toBe(true);
|
|
125
|
-
});
|
|
126
|
-
it('preserves a directory whose frontmatter name does not match', () => {
|
|
127
|
-
const { globalSkillsDir, hashes } = setupRename();
|
|
128
|
-
fs.writeFileSync(path.join(globalSkillsDir, 'spec', 'SKILL.md'), skillContent('custom-spec'));
|
|
129
|
-
const results = cleanupRenamedSkills(globalSkillsDir, RENAMES, hashes);
|
|
130
|
-
expect(results).toContainEqual(expect.objectContaining({ name: 'spec', action: 'skipped-not-vibe' }));
|
|
131
|
-
expect(fs.existsSync(path.join(globalSkillsDir, 'spec'))).toBe(true);
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
/**
|
|
135
|
-
* 배송본에서 삭제·개명된 스킬 파일이 설치본에 영구 잔존하던 회귀를 막는다.
|
|
136
|
-
*
|
|
137
|
-
* 실제 사례(v3.2.10 배포 후 도그푸딩에서 발견): `references/ralph-loop.md` 와
|
|
138
|
-
* `references/ultrawork-mode.md` 를 내용 모순 때문에 삭제하고 새 파일로 교체했는데,
|
|
139
|
-
* `vibe upgrade` 후에도 두 구 파일이 `~/.claude/skills/` 와 `~/.codex/skills/` 에
|
|
140
|
-
* 남아 있었다. 스킬 문서는 모델이 읽는 계약이므로 철회한 계약이 살아있는 셈이었다.
|
|
141
|
-
*/
|
|
142
|
-
describe('pruneExtraneousSkillFiles', () => {
|
|
143
|
-
function makePair() {
|
|
144
|
-
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-prune-'));
|
|
145
|
-
const src = path.join(root, 'src');
|
|
146
|
-
const dest = path.join(root, 'dest');
|
|
147
|
-
fs.mkdirSync(path.join(src, 'references'), { recursive: true });
|
|
148
|
-
fs.mkdirSync(path.join(dest, 'references'), { recursive: true });
|
|
149
|
-
return { src, dest };
|
|
150
|
-
}
|
|
151
|
-
it('removes a file that no longer ships', () => {
|
|
152
|
-
const { src, dest } = makePair();
|
|
153
|
-
fs.writeFileSync(path.join(src, 'SKILL.md'), 'new');
|
|
154
|
-
fs.writeFileSync(path.join(dest, 'SKILL.md'), 'old');
|
|
155
|
-
fs.writeFileSync(path.join(dest, 'references', 'ralph-loop.md'), 'retracted');
|
|
156
|
-
const removed = pruneExtraneousSkillFiles(src, dest);
|
|
157
|
-
expect(removed).toContain(path.join('references', 'ralph-loop.md'));
|
|
158
|
-
expect(fs.existsSync(path.join(dest, 'references', 'ralph-loop.md'))).toBe(false);
|
|
159
|
-
// 배송본에 있는 파일은 건드리지 않는다
|
|
160
|
-
expect(fs.existsSync(path.join(dest, 'SKILL.md'))).toBe(true);
|
|
161
|
-
});
|
|
162
|
-
it('removes a whole directory that no longer ships', () => {
|
|
163
|
-
const { src, dest } = makePair();
|
|
164
|
-
fs.mkdirSync(path.join(dest, 'agents'), { recursive: true });
|
|
165
|
-
fs.writeFileSync(path.join(dest, 'agents', 'gone.md'), 'x');
|
|
166
|
-
const removed = pruneExtraneousSkillFiles(src, dest);
|
|
167
|
-
expect(removed).toContain('agents');
|
|
168
|
-
expect(fs.existsSync(path.join(dest, 'agents'))).toBe(false);
|
|
169
|
-
});
|
|
170
|
-
it('is a no-op when dest mirrors src', () => {
|
|
171
|
-
const { src, dest } = makePair();
|
|
172
|
-
fs.writeFileSync(path.join(src, 'SKILL.md'), 'a');
|
|
173
|
-
fs.writeFileSync(path.join(dest, 'SKILL.md'), 'a');
|
|
174
|
-
expect(pruneExtraneousSkillFiles(src, dest)).toEqual([]);
|
|
175
|
-
});
|
|
176
|
-
it('tolerates a missing dest', () => {
|
|
177
|
-
const { src } = makePair();
|
|
178
|
-
expect(pruneExtraneousSkillFiles(src, path.join(src, '..', 'nope'))).toEqual([]);
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
describe('copySkillsFiltered prunes stale files', () => {
|
|
182
|
-
it('replaces a renamed reference instead of leaving both', () => {
|
|
183
|
-
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-copyprune-'));
|
|
184
|
-
const src = path.join(root, 'pkg-skills');
|
|
185
|
-
const dest = path.join(root, 'installed-skills');
|
|
186
|
-
// 배송본: 새 이름만 존재
|
|
187
|
-
fs.mkdirSync(path.join(src, 'vibe.run', 'references'), { recursive: true });
|
|
188
|
-
fs.writeFileSync(path.join(src, 'vibe.run', 'SKILL.md'), 'skill');
|
|
189
|
-
fs.writeFileSync(path.join(src, 'vibe.run', 'references', 'automation-level.md'), 'new');
|
|
190
|
-
// 설치본: 구 이름이 남아 있는 상태
|
|
191
|
-
fs.mkdirSync(path.join(dest, 'vibe.run', 'references'), { recursive: true });
|
|
192
|
-
fs.writeFileSync(path.join(dest, 'vibe.run', 'SKILL.md'), 'stale');
|
|
193
|
-
fs.writeFileSync(path.join(dest, 'vibe.run', 'references', 'ultrawork-mode.md'), 'retracted');
|
|
194
|
-
const pruned = copySkillsFiltered(src, dest, ['vibe.run']);
|
|
195
|
-
expect(pruned).toContain(path.join('vibe.run', 'references', 'ultrawork-mode.md'));
|
|
196
|
-
const refs = fs.readdirSync(path.join(dest, 'vibe.run', 'references'));
|
|
197
|
-
expect(refs).toEqual(['automation-level.md']);
|
|
198
|
-
});
|
|
199
|
-
it('does not touch skills outside the allowed list', () => {
|
|
200
|
-
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-copyprune-scope-'));
|
|
201
|
-
const src = path.join(root, 'pkg-skills');
|
|
202
|
-
const dest = path.join(root, 'installed-skills');
|
|
203
|
-
fs.mkdirSync(path.join(src, 'vibe.run'), { recursive: true });
|
|
204
|
-
fs.writeFileSync(path.join(src, 'vibe.run', 'SKILL.md'), 'skill');
|
|
205
|
-
fs.mkdirSync(path.join(dest, 'user-own-skill'), { recursive: true });
|
|
206
|
-
fs.writeFileSync(path.join(dest, 'user-own-skill', 'SKILL.md'), 'mine');
|
|
207
|
-
copySkillsFiltered(src, dest, ['vibe.run']);
|
|
208
|
-
expect(fs.existsSync(path.join(dest, 'user-own-skill', 'SKILL.md'))).toBe(true);
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
/**
|
|
212
|
-
* vibe 가 설치 후 생성하는 산출물(`agents/openai.yaml`)은 배송본에 없다.
|
|
213
|
-
* prune 이 이를 지우면 매 upgrade 마다 삭제→재생성이 반복되고, "정리했다" 보고가
|
|
214
|
-
* 철회된 문서가 아니라 vibe 자신의 생성물을 가리켜 노이즈가 된다.
|
|
215
|
-
*/
|
|
216
|
-
describe('pruneExtraneousSkillFiles — vibe 생성물 보존', () => {
|
|
217
|
-
const MANAGED = '# VIBE managed Codex skill policy\npolicy:\n allow_implicit_invocation: false\n';
|
|
218
|
-
function makePair() {
|
|
219
|
-
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-prune-gen-'));
|
|
220
|
-
const src = path.join(root, 'src');
|
|
221
|
-
const dest = path.join(root, 'dest');
|
|
222
|
-
fs.mkdirSync(src, { recursive: true });
|
|
223
|
-
fs.mkdirSync(dest, { recursive: true });
|
|
224
|
-
return { src, dest };
|
|
225
|
-
}
|
|
226
|
-
it('keeps a managed codex policy file that the package does not ship', () => {
|
|
227
|
-
const { src, dest } = makePair();
|
|
228
|
-
fs.mkdirSync(path.join(dest, 'agents'), { recursive: true });
|
|
229
|
-
fs.writeFileSync(path.join(dest, 'agents', 'openai.yaml'), MANAGED);
|
|
230
|
-
const removed = pruneExtraneousSkillFiles(src, dest);
|
|
231
|
-
expect(removed).toEqual([]);
|
|
232
|
-
expect(fs.existsSync(path.join(dest, 'agents', 'openai.yaml'))).toBe(true);
|
|
233
|
-
});
|
|
234
|
-
it('still removes an unmanaged file sitting next to a managed one', () => {
|
|
235
|
-
const { src, dest } = makePair();
|
|
236
|
-
fs.mkdirSync(path.join(dest, 'agents'), { recursive: true });
|
|
237
|
-
fs.writeFileSync(path.join(dest, 'agents', 'openai.yaml'), MANAGED);
|
|
238
|
-
fs.writeFileSync(path.join(dest, 'references-stale.md'), 'retracted');
|
|
239
|
-
const removed = pruneExtraneousSkillFiles(src, dest);
|
|
240
|
-
expect(removed).toEqual(['references-stale.md']);
|
|
241
|
-
expect(fs.existsSync(path.join(dest, 'agents', 'openai.yaml'))).toBe(true);
|
|
242
|
-
});
|
|
243
|
-
it('removes a directory whose contents are not vibe-generated', () => {
|
|
244
|
-
const { src, dest } = makePair();
|
|
245
|
-
fs.mkdirSync(path.join(dest, 'agents'), { recursive: true });
|
|
246
|
-
fs.writeFileSync(path.join(dest, 'agents', 'openai.yaml'), MANAGED);
|
|
247
|
-
fs.writeFileSync(path.join(dest, 'agents', 'handwritten.yaml'), 'not managed');
|
|
248
|
-
const removed = pruneExtraneousSkillFiles(src, dest);
|
|
249
|
-
// 섞여 있으면 디렉토리를 통째로 지우지 않는다 — 내부만 정리한다
|
|
250
|
-
expect(removed).toEqual([path.join('agents', 'handwritten.yaml')]);
|
|
251
|
-
expect(fs.existsSync(path.join(dest, 'agents', 'openai.yaml'))).toBe(true);
|
|
252
|
-
});
|
|
253
|
-
it('removes an empty extraneous directory', () => {
|
|
254
|
-
const { src, dest } = makePair();
|
|
255
|
-
fs.mkdirSync(path.join(dest, 'empty'), { recursive: true });
|
|
256
|
-
expect(pruneExtraneousSkillFiles(src, dest)).toEqual(['empty']);
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
//# sourceMappingURL=fs-utils.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fs-utils.test.js","sourceRoot":"","sources":["../../../src/cli/postinstall/fs-utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CodexHooks.test.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
|
-
import { buildCodexHooksConfig, installProjectCodexHooks } from './CodexHooks.js';
|
|
7
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
-
// src/cli/setup/ → 3 levels up → repo root
|
|
9
|
-
const REPO_ROOT = path.resolve(path.dirname(__filename), '..', '..', '..');
|
|
10
|
-
describe('CodexHooks', () => {
|
|
11
|
-
it('builds native Codex hooks that route through the vibe adapter', () => {
|
|
12
|
-
const config = buildCodexHooksConfig('/opt/vibe');
|
|
13
|
-
expect(config.hooks.UserPromptSubmit[0].hooks[0].command).toContain('codex-hook-adapter.js');
|
|
14
|
-
expect(config.hooks.UserPromptSubmit[0].hooks[0].command).toContain('UserPromptSubmit');
|
|
15
|
-
expect(config.hooks.PreToolUse[0].hooks[0].command).toContain('PreToolUse');
|
|
16
|
-
expect(config.hooks.PostToolUse[0].hooks[0].command).toContain('PostToolUse');
|
|
17
|
-
expect(config.hooks.Stop[0].hooks[0].command).toContain('Stop');
|
|
18
|
-
});
|
|
19
|
-
it('writes project .codex/hooks.json for Codex native hook loading', () => {
|
|
20
|
-
const projectRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-codex-hooks-'));
|
|
21
|
-
installProjectCodexHooks(projectRoot, '/opt/vibe');
|
|
22
|
-
const hooksPath = path.join(projectRoot, '.codex', 'hooks.json');
|
|
23
|
-
const config = JSON.parse(fs.readFileSync(hooksPath, 'utf-8'));
|
|
24
|
-
expect(config.hooks.PreToolUse[0].hooks[0].command).toContain('/opt/vibe/hooks/scripts/codex-hook-adapter.js');
|
|
25
|
-
});
|
|
26
|
-
// .codex/hooks.json은 머신별 절대 경로를 담는 로컬 설치 아티팩트
|
|
27
|
-
// (.claude/settings.local.json과 동급, gitignored). 도그푸딩된 로컬 파일이
|
|
28
|
-
// 있을 때만 인스톨러 출력과의 정합을 검증한다 — CI에는 파일이 없으므로 skip.
|
|
29
|
-
const localHooksPath = path.join(REPO_ROOT, '.codex', 'hooks.json');
|
|
30
|
-
it.skipIf(!fs.existsSync(localHooksPath))('local .codex/hooks.json is in sync with what installProjectCodexHooks would generate', () => {
|
|
31
|
-
const committed = JSON.parse(fs.readFileSync(localHooksPath, 'utf-8'));
|
|
32
|
-
// Verify structure: every registered event present with adapter command
|
|
33
|
-
const events = [
|
|
34
|
-
'SessionStart', 'UserPromptSubmit', 'PreToolUse', 'PostToolUse', 'Stop', 'PreCompact',
|
|
35
|
-
];
|
|
36
|
-
for (const event of events) {
|
|
37
|
-
const cmd = committed.hooks[event][0].hooks[0].command;
|
|
38
|
-
expect(cmd).toContain('codex-hook-adapter.js');
|
|
39
|
-
expect(cmd).toContain(event);
|
|
40
|
-
}
|
|
41
|
-
// Verify all script paths in the committed file point to existing files
|
|
42
|
-
for (const event of events) {
|
|
43
|
-
const cmd = committed.hooks[event][0].hooks[0].command;
|
|
44
|
-
// extract quoted path: node "..." EventName
|
|
45
|
-
const match = cmd.match(/node\s+"([^"]+)"/);
|
|
46
|
-
if (match) {
|
|
47
|
-
expect(fs.existsSync(match[1]), `Script path missing: ${match[1]} (from ${event} hook)`).toBe(true);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
//# sourceMappingURL=CodexHooks.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CodexHooks.test.js","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAElF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,2CAA2C;AAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE3E,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAElD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACxF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAEhF,wBAAwB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAA6C,CAAC;QAC3G,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,+CAA+C,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,8DAA8D;IAC9D,iDAAiD;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEpE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CACvC,sFAAsF,EACtF,GAAG,EAAE;QACL,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAA6C,CAAC;QAEnH,wEAAwE;QACxE,MAAM,MAAM,GAAG;YACb,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY;SAC7E,CAAC;QACX,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,wEAAwE;QACxE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,4CAA4C;YAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAC5C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CACJ,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACvB,wBAAwB,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CACxD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalInstaller.test.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/GlobalInstaller.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import os from 'os';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { describe, expect, it } from 'vitest';
|
|
5
|
-
import { writeHookPackageJson } from './GlobalInstaller.js';
|
|
6
|
-
describe('GlobalInstaller', () => {
|
|
7
|
-
it('writes an ESM marker package.json next to copied hooks', () => {
|
|
8
|
-
const globalCoreDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-global-core-'));
|
|
9
|
-
fs.writeFileSync(path.join(globalCoreDir, 'package.json'), JSON.stringify({ dependencies: { puppeteer: '^25.2.1' } }, null, 2));
|
|
10
|
-
writeHookPackageJson(globalCoreDir);
|
|
11
|
-
const packageJson = JSON.parse(fs.readFileSync(path.join(globalCoreDir, 'package.json'), 'utf-8'));
|
|
12
|
-
expect(packageJson.dependencies?.puppeteer).toBe('^25.2.1');
|
|
13
|
-
expect(packageJson.type).toBe('module');
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
//# sourceMappingURL=GlobalInstaller.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalInstaller.test.js","sourceRoot":"","sources":["../../../src/cli/setup/GlobalInstaller.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,wDAAwD,EAAE,GAAS,EAAE;QACtE,MAAM,aAAa,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAClF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,EACxC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACpE,CAAC;QAEF,oBAAoB,CAAC,aAAa,CAAC,CAAC;QAEpC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CACL,CAAC;QAEhE,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-detector.test.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/cli-detector.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach, vi } from 'vitest';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import { detectAntigravityCli, detectCodexCli } from './cli-detector.js';
|
|
6
|
-
describe('detectCodexCli', () => {
|
|
7
|
-
const originalCodexHome = process.env.CODEX_HOME;
|
|
8
|
-
const originalAntigravityApiKey = process.env.ANTIGRAVITY_API_KEY;
|
|
9
|
-
const originalPath = process.env.PATH;
|
|
10
|
-
const tempDirs = [];
|
|
11
|
-
afterEach(() => {
|
|
12
|
-
if (originalCodexHome === undefined) {
|
|
13
|
-
delete process.env.CODEX_HOME;
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
process.env.CODEX_HOME = originalCodexHome;
|
|
17
|
-
}
|
|
18
|
-
if (originalAntigravityApiKey === undefined) {
|
|
19
|
-
delete process.env.ANTIGRAVITY_API_KEY;
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
process.env.ANTIGRAVITY_API_KEY = originalAntigravityApiKey;
|
|
23
|
-
}
|
|
24
|
-
process.env.PATH = originalPath;
|
|
25
|
-
vi.restoreAllMocks();
|
|
26
|
-
for (const dir of tempDirs.splice(0)) {
|
|
27
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
it('uses CODEX_HOME when locating Codex config and plugins', () => {
|
|
31
|
-
const codexHome = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-codex-home-'));
|
|
32
|
-
tempDirs.push(codexHome);
|
|
33
|
-
process.env.CODEX_HOME = codexHome;
|
|
34
|
-
const status = detectCodexCli();
|
|
35
|
-
expect(status.configDir).toBe(codexHome);
|
|
36
|
-
expect(status.pluginDir).toBe(path.join(codexHome, 'plugins', 'vibe'));
|
|
37
|
-
});
|
|
38
|
-
it('detects Antigravity CLI as an installed orchestration CLI', () => {
|
|
39
|
-
const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-home-'));
|
|
40
|
-
const binDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-bin-'));
|
|
41
|
-
tempDirs.push(homeDir, binDir);
|
|
42
|
-
vi.spyOn(os, 'homedir').mockReturnValue(homeDir);
|
|
43
|
-
const exeName = process.platform === 'win32' ? 'agy.cmd' : 'agy';
|
|
44
|
-
fs.writeFileSync(path.join(binDir, exeName), '#!/bin/sh\nexit 0\n', { mode: 0o755 });
|
|
45
|
-
process.env.PATH = binDir;
|
|
46
|
-
process.env.ANTIGRAVITY_API_KEY = 'test-key';
|
|
47
|
-
const status = detectAntigravityCli();
|
|
48
|
-
expect(status.installed).toBe(true);
|
|
49
|
-
expect(status.authenticated).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
//# sourceMappingURL=cli-detector.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-detector.test.js","sourceRoot":"","sources":["../../../src/cli/utils/cli-detector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SkillFrontmatter.test.d.ts","sourceRoot":"","sources":["../../../src/infra/lib/SkillFrontmatter.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join, relative } from 'node:path';
|
|
3
|
-
import { describe, expect, it } from 'vitest';
|
|
4
|
-
import { createSkillFile, parseSkillFrontmatter } from './SkillFrontmatter.js';
|
|
5
|
-
const ROOT = process.cwd();
|
|
6
|
-
const SKILLS_DIR = join(ROOT, 'skills');
|
|
7
|
-
function listSkillFiles(dir) {
|
|
8
|
-
const files = [];
|
|
9
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
10
|
-
const fullPath = join(dir, entry.name);
|
|
11
|
-
if (entry.isDirectory()) {
|
|
12
|
-
files.push(...listSkillFiles(fullPath));
|
|
13
|
-
continue;
|
|
14
|
-
}
|
|
15
|
-
if (entry.name === 'SKILL.md') {
|
|
16
|
-
files.push(fullPath);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return files;
|
|
20
|
-
}
|
|
21
|
-
function extractFrontmatter(content) {
|
|
22
|
-
if (!content.startsWith('---\n'))
|
|
23
|
-
return null;
|
|
24
|
-
const endIndex = content.indexOf('\n---', 4);
|
|
25
|
-
if (endIndex === -1)
|
|
26
|
-
return null;
|
|
27
|
-
return content.slice(4, endIndex);
|
|
28
|
-
}
|
|
29
|
-
function findSplitQuotedScalars() {
|
|
30
|
-
const issues = [];
|
|
31
|
-
const splitQuotedScalar = /^[A-Za-z0-9_-]+:\s*"[^"]*"\s+\S/;
|
|
32
|
-
for (const filePath of listSkillFiles(SKILLS_DIR)) {
|
|
33
|
-
const frontmatter = extractFrontmatter(readFileSync(filePath, 'utf8'));
|
|
34
|
-
if (!frontmatter)
|
|
35
|
-
continue;
|
|
36
|
-
frontmatter.split('\n').forEach((line, index) => {
|
|
37
|
-
if (splitQuotedScalar.test(line)) {
|
|
38
|
-
issues.push(`${relative(ROOT, filePath)}:${index + 2}:${line}`);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
return issues;
|
|
43
|
-
}
|
|
44
|
-
describe('SkillFrontmatter', () => {
|
|
45
|
-
it('escapes quotes in generated scalar values', () => {
|
|
46
|
-
const content = createSkillFile({
|
|
47
|
-
name: 'demo-skill',
|
|
48
|
-
description: 'Say "hello"',
|
|
49
|
-
argumentHint: '"feature name" or --phase N',
|
|
50
|
-
}, '# Demo');
|
|
51
|
-
expect(content).toContain('description: "Say \\"hello\\""');
|
|
52
|
-
expect(content).toContain('argument-hint: "\\"feature name\\" or --phase N"');
|
|
53
|
-
expect(parseSkillFrontmatter(content)?.metadata.description).toBe('Say "hello"');
|
|
54
|
-
expect(parseSkillFrontmatter(content)?.metadata.argumentHint).toBe('"feature name" or --phase N');
|
|
55
|
-
});
|
|
56
|
-
it('keeps bundled SKILL.md frontmatter valid for quoted hints', () => {
|
|
57
|
-
expect(findSplitQuotedScalars()).toEqual([]);
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
//# sourceMappingURL=SkillFrontmatter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SkillFrontmatter.test.js","sourceRoot":"","sources":["../../../src/infra/lib/SkillFrontmatter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AutomationLevel.test.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/__tests__/AutomationLevel.test.ts"],"names":[],"mappings":""}
|