opensquid 0.5.441 → 0.5.449
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/functions/arm_scope.d.ts +27 -0
- package/dist/functions/arm_scope.d.ts.map +1 -0
- package/dist/functions/arm_scope.js +52 -0
- package/dist/functions/arm_scope.js.map +1 -0
- package/dist/functions/index.d.ts +1 -0
- package/dist/functions/index.d.ts.map +1 -1
- package/dist/functions/index.js +1 -0
- package/dist/functions/index.js.map +1 -1
- package/dist/functions/recall_pre_inject.d.ts.map +1 -1
- package/dist/functions/recall_pre_inject.js +12 -0
- package/dist/functions/recall_pre_inject.js.map +1 -1
- package/dist/rag/store_git.d.ts +23 -0
- package/dist/rag/store_git.d.ts.map +1 -0
- package/dist/rag/store_git.js +57 -0
- package/dist/rag/store_git.js.map +1 -0
- package/dist/runtime/bootstrap.d.ts.map +1 -1
- package/dist/runtime/bootstrap.js +2 -0
- package/dist/runtime/bootstrap.js.map +1 -1
- package/dist/runtime/handoff/render.d.ts +5 -4
- package/dist/runtime/handoff/render.d.ts.map +1 -1
- package/dist/runtime/handoff/render.js +7 -7
- package/dist/runtime/handoff/render.js.map +1 -1
- package/dist/runtime/hooks/active_task_mirror.js +0 -0
- package/dist/runtime/hooks/apply_patch.js +0 -0
- package/dist/runtime/hooks/dispatch.js +0 -0
- package/dist/runtime/hooks/hook_output.js +0 -0
- package/dist/runtime/hooks/memory_reconcile.js +0 -0
- package/dist/runtime/hooks/new_project_detect.js +0 -0
- package/dist/runtime/hooks/profession_resolver.js +0 -0
- package/dist/runtime/hooks/scope_intent.js +0 -0
- package/dist/runtime/hooks/session-end.js +11 -0
- package/dist/runtime/hooks/session-end.js.map +1 -1
- package/dist/runtime/hooks/session_id.js +0 -0
- package/dist/runtime/hooks/session_liveness.js +0 -0
- package/dist/runtime/hooks/stop_drive.js +0 -0
- package/dist/runtime/hooks/stop_stream.js +0 -0
- package/dist/runtime/hooks/subagent_guard.js +0 -0
- package/dist/runtime/hooks/transcript.js +0 -0
- package/dist/runtime/hooks/transcript_tasks.js +0 -0
- package/dist/runtime/ralph/orchestrator.d.ts.map +1 -1
- package/dist/runtime/ralph/orchestrator.js +2 -1
- package/dist/runtime/ralph/orchestrator.js.map +1 -1
- package/dist/setup/cli/limits_state.d.ts.map +1 -1
- package/dist/setup/cli/limits_state.js +6 -40
- package/dist/setup/cli/limits_state.js.map +1 -1
- package/dist/setup/cli/pack_walk.d.ts +32 -0
- package/dist/setup/cli/pack_walk.d.ts.map +1 -0
- package/dist/setup/cli/pack_walk.js +76 -0
- package/dist/setup/cli/pack_walk.js.map +1 -0
- package/dist/setup/cli/permissions_state.d.ts.map +1 -1
- package/dist/setup/cli/permissions_state.js +6 -37
- package/dist/setup/cli/permissions_state.js.map +1 -1
- package/dist/setup/cli/triggers_state.d.ts.map +1 -1
- package/dist/setup/cli/triggers_state.js +3 -29
- package/dist/setup/cli/triggers_state.js.map +1 -1
- package/dist/workgraph/events.d.ts.map +1 -1
- package/dist/workgraph/events.js +10 -0
- package/dist/workgraph/events.js.map +1 -1
- package/dist/workgraph/store.d.ts.map +1 -1
- package/dist/workgraph/store.js +5 -0
- package/dist/workgraph/store.js.map +1 -1
- package/dist/workgraph/types.d.ts +2 -1
- package/dist/workgraph/types.d.ts.map +1 -1
- package/docs/ARCHITECTURE.md +268 -0
- package/docs/pack-runtime.md +15 -12
- package/docs/skill-grammar-guide.md +4 -4
- package/package.json +5 -3
- package/packs/builtin/coding-flow/skills/entry-and-handoffs/skill.yaml +13 -17
- package/dist/anti-drift/evaluator.d.ts +0 -88
- package/dist/anti-drift/evaluator.d.ts.map +0 -1
- package/dist/anti-drift/evaluator.js +0 -417
- package/dist/anti-drift/evaluator.js.map +0 -1
- package/dist/anti-drift/evaluator.test.js +0 -78
- package/dist/anti-drift/rules.d.ts +0 -80
- package/dist/anti-drift/rules.d.ts.map +0 -1
- package/dist/anti-drift/rules.js +0 -368
- package/dist/anti-drift/rules.js.map +0 -1
- package/dist/anti-drift/rules.test.js +0 -213
- package/dist/anti-drift/state.d.ts +0 -107
- package/dist/anti-drift/state.d.ts.map +0 -1
- package/dist/anti-drift/state.js +0 -177
- package/dist/anti-drift/state.js.map +0 -1
- package/dist/anti-drift/state.test.js +0 -120
- package/dist/chat/adapters/discord.d.ts +0 -41
- package/dist/chat/adapters/discord.d.ts.map +0 -1
- package/dist/chat/adapters/discord.js +0 -176
- package/dist/chat/adapters/discord.js.map +0 -1
- package/dist/chat/adapters/discord.test.js +0 -25
- package/dist/chat/adapters/slack.d.ts +0 -43
- package/dist/chat/adapters/slack.d.ts.map +0 -1
- package/dist/chat/adapters/slack.js +0 -172
- package/dist/chat/adapters/slack.js.map +0 -1
- package/dist/chat/adapters/slack.test.js +0 -30
- package/dist/chat/adapters/telegram.d.ts +0 -148
- package/dist/chat/adapters/telegram.d.ts.map +0 -1
- package/dist/chat/adapters/telegram.js +0 -498
- package/dist/chat/adapters/telegram.js.map +0 -1
- package/dist/chat/adapters/telegram.test.js +0 -94
- package/dist/chat/config.d.ts +0 -98
- package/dist/chat/config.d.ts.map +0 -1
- package/dist/chat/config.js +0 -185
- package/dist/chat/config.js.map +0 -1
- package/dist/chat/daemon/active-project.d.ts +0 -17
- package/dist/chat/daemon/active-project.d.ts.map +0 -1
- package/dist/chat/daemon/active-project.js +0 -23
- package/dist/chat/daemon/active-project.js.map +0 -1
- package/dist/chat/daemon/autospawn.d.ts +0 -40
- package/dist/chat/daemon/autospawn.d.ts.map +0 -1
- package/dist/chat/daemon/autospawn.js +0 -129
- package/dist/chat/daemon/autospawn.js.map +0 -1
- package/dist/chat/daemon/autospawn.test.js +0 -112
- package/dist/chat/daemon/cli.d.ts +0 -18
- package/dist/chat/daemon/cli.d.ts.map +0 -1
- package/dist/chat/daemon/cli.js +0 -71
- package/dist/chat/daemon/cli.js.map +0 -1
- package/dist/chat/daemon/collisions.js +0 -384
- package/dist/chat/daemon/health-check.d.ts +0 -69
- package/dist/chat/daemon/health-check.d.ts.map +0 -1
- package/dist/chat/daemon/health-check.js +0 -112
- package/dist/chat/daemon/health-check.js.map +0 -1
- package/dist/chat/daemon/inbox-read.d.ts +0 -35
- package/dist/chat/daemon/inbox-read.d.ts.map +0 -1
- package/dist/chat/daemon/inbox-read.js +0 -75
- package/dist/chat/daemon/inbox-read.js.map +0 -1
- package/dist/chat/daemon/inbox-read.test.js +0 -97
- package/dist/chat/daemon/inbox.d.ts +0 -63
- package/dist/chat/daemon/inbox.d.ts.map +0 -1
- package/dist/chat/daemon/inbox.js +0 -56
- package/dist/chat/daemon/inbox.js.map +0 -1
- package/dist/chat/daemon/inbox.test.js +0 -110
- package/dist/chat/daemon/lifecycle.d.ts +0 -71
- package/dist/chat/daemon/lifecycle.d.ts.map +0 -1
- package/dist/chat/daemon/lifecycle.js +0 -221
- package/dist/chat/daemon/lifecycle.js.map +0 -1
- package/dist/chat/daemon/lifecycle.test.js +0 -163
- package/dist/chat/daemon/protocol.d.ts +0 -107
- package/dist/chat/daemon/protocol.d.ts.map +0 -1
- package/dist/chat/daemon/protocol.js +0 -54
- package/dist/chat/daemon/protocol.js.map +0 -1
- package/dist/chat/daemon/routing.d.ts +0 -140
- package/dist/chat/daemon/routing.d.ts.map +0 -1
- package/dist/chat/daemon/routing.js +0 -198
- package/dist/chat/daemon/routing.js.map +0 -1
- package/dist/chat/daemon/routing.test.js +0 -259
- package/dist/chat/daemon/rpc-client.d.ts +0 -45
- package/dist/chat/daemon/rpc-client.d.ts.map +0 -1
- package/dist/chat/daemon/rpc-client.js +0 -133
- package/dist/chat/daemon/rpc-client.js.map +0 -1
- package/dist/chat/daemon/rpc-server.d.ts +0 -39
- package/dist/chat/daemon/rpc-server.d.ts.map +0 -1
- package/dist/chat/daemon/rpc-server.js +0 -385
- package/dist/chat/daemon/rpc-server.js.map +0 -1
- package/dist/chat/daemon/rpc.test.js +0 -177
- package/dist/chat/daemon/subscribers.js +0 -257
- package/dist/chat/daemon/worker.d.ts +0 -27
- package/dist/chat/daemon/worker.d.ts.map +0 -1
- package/dist/chat/daemon/worker.js +0 -313
- package/dist/chat/daemon/worker.js.map +0 -1
- package/dist/chat/daemon/workspace-topic.js +0 -324
- package/dist/chat/env-token.d.ts +0 -60
- package/dist/chat/env-token.d.ts.map +0 -1
- package/dist/chat/env-token.js +0 -137
- package/dist/chat/env-token.js.map +0 -1
- package/dist/chat/env-token.test.js +0 -160
- package/dist/chat/factory.d.ts +0 -30
- package/dist/chat/factory.d.ts.map +0 -1
- package/dist/chat/factory.js +0 -50
- package/dist/chat/factory.js.map +0 -1
- package/dist/chat/factory.test.js +0 -55
- package/dist/chat/gateway.d.ts +0 -176
- package/dist/chat/gateway.d.ts.map +0 -1
- package/dist/chat/gateway.js +0 -146
- package/dist/chat/gateway.js.map +0 -1
- package/dist/chat/gateway.test.js +0 -192
- package/dist/claude-md.d.ts +0 -39
- package/dist/claude-md.d.ts.map +0 -1
- package/dist/claude-md.js +0 -113
- package/dist/claude-md.js.map +0 -1
- package/dist/claude-md.test.js +0 -91
- package/dist/codex/activate.d.ts +0 -66
- package/dist/codex/activate.d.ts.map +0 -1
- package/dist/codex/activate.js +0 -329
- package/dist/codex/activate.js.map +0 -1
- package/dist/codex/activate.test.js +0 -229
- package/dist/codex/bundled-default/bundled-default.test.js +0 -161
- package/dist/codex/cli-publish.test.js +0 -133
- package/dist/codex/cli.d.ts +0 -35
- package/dist/codex/cli.d.ts.map +0 -1
- package/dist/codex/cli.js +0 -554
- package/dist/codex/cli.js.map +0 -1
- package/dist/codex/cli.test.js +0 -277
- package/dist/codex/import-skill-md.d.ts +0 -53
- package/dist/codex/import-skill-md.d.ts.map +0 -1
- package/dist/codex/import-skill-md.js +0 -236
- package/dist/codex/import-skill-md.js.map +0 -1
- package/dist/codex/import-skill-md.test.js +0 -225
- package/dist/codex/loader.d.ts +0 -27
- package/dist/codex/loader.d.ts.map +0 -1
- package/dist/codex/loader.js +0 -86
- package/dist/codex/loader.js.map +0 -1
- package/dist/codex/loader.test.js +0 -75
- package/dist/codex/parse.d.ts +0 -28
- package/dist/codex/parse.d.ts.map +0 -1
- package/dist/codex/parse.js +0 -309
- package/dist/codex/parse.js.map +0 -1
- package/dist/codex/parse.test.js +0 -241
- package/dist/codex/store.d.ts +0 -87
- package/dist/codex/store.d.ts.map +0 -1
- package/dist/codex/store.js +0 -205
- package/dist/codex/store.js.map +0 -1
- package/dist/codex/store.test.js +0 -242
- package/dist/codex/types.d.ts +0 -398
- package/dist/codex/types.d.ts.map +0 -1
- package/dist/codex/types.js +0 -21
- package/dist/codex/types.js.map +0 -1
- package/dist/config.d.ts +0 -53
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -202
- package/dist/config.js.map +0 -1
- package/dist/config.test.js +0 -117
- package/dist/engine/cli.d.ts +0 -14
- package/dist/engine/cli.d.ts.map +0 -1
- package/dist/engine/cli.js +0 -171
- package/dist/engine/cli.js.map +0 -1
- package/dist/engine/client.d.ts +0 -219
- package/dist/engine/client.d.ts.map +0 -1
- package/dist/engine/client.js +0 -312
- package/dist/engine/client.js.map +0 -1
- package/dist/engine/config.d.ts +0 -62
- package/dist/engine/config.d.ts.map +0 -1
- package/dist/engine/config.js +0 -223
- package/dist/engine/config.js.map +0 -1
- package/dist/engine/index.d.ts +0 -17
- package/dist/engine/index.d.ts.map +0 -1
- package/dist/engine/index.js +0 -16
- package/dist/engine/index.js.map +0 -1
- package/dist/engine/resolver.d.ts +0 -62
- package/dist/engine/resolver.d.ts.map +0 -1
- package/dist/engine/resolver.js +0 -103
- package/dist/engine/resolver.js.map +0 -1
- package/dist/engine/singleton.d.ts +0 -95
- package/dist/engine/singleton.d.ts.map +0 -1
- package/dist/engine/singleton.js +0 -325
- package/dist/engine/singleton.js.map +0 -1
- package/dist/engine/types.d.ts +0 -402
- package/dist/engine/types.d.ts.map +0 -1
- package/dist/engine/types.js +0 -22
- package/dist/engine/types.js.map +0 -1
- package/dist/engine-binary-resolver.js +0 -110
- package/dist/engine-binary-resolver.test.js +0 -61
- package/dist/engine-cli.js +0 -60
- package/dist/engine-client.js +0 -301
- package/dist/engine-client.test.js +0 -118
- package/dist/functions/chain_state.d.ts +0 -51
- package/dist/functions/chain_state.d.ts.map +0 -1
- package/dist/functions/chain_state.js +0 -59
- package/dist/functions/chain_state.js.map +0 -1
- package/dist/hooks/drift-catalog.d.ts +0 -68
- package/dist/hooks/drift-catalog.d.ts.map +0 -1
- package/dist/hooks/drift-catalog.js +0 -184
- package/dist/hooks/drift-catalog.js.map +0 -1
- package/dist/hooks/drift-catalog.test.js +0 -154
- package/dist/hooks/drift-patterns.d.ts +0 -110
- package/dist/hooks/drift-patterns.d.ts.map +0 -1
- package/dist/hooks/drift-patterns.js +0 -289
- package/dist/hooks/drift-patterns.js.map +0 -1
- package/dist/hooks/drift-patterns.test.js +0 -325
- package/dist/hooks/engine-vocab-gate.d.ts +0 -108
- package/dist/hooks/engine-vocab-gate.d.ts.map +0 -1
- package/dist/hooks/engine-vocab-gate.js +0 -225
- package/dist/hooks/engine-vocab-gate.js.map +0 -1
- package/dist/hooks/engine-vocab-gate.test.js +0 -170
- package/dist/hooks/heartbeat.d.ts +0 -107
- package/dist/hooks/heartbeat.d.ts.map +0 -1
- package/dist/hooks/heartbeat.js +0 -316
- package/dist/hooks/heartbeat.js.map +0 -1
- package/dist/hooks/heartbeat.test.js +0 -393
- package/dist/hooks/honesty-ledger-session-scope.test.js +0 -100
- package/dist/hooks/honesty-ledger.d.ts +0 -123
- package/dist/hooks/honesty-ledger.d.ts.map +0 -1
- package/dist/hooks/honesty-ledger.js +0 -226
- package/dist/hooks/honesty-ledger.js.map +0 -1
- package/dist/hooks/honesty-ledger.test.js +0 -466
- package/dist/hooks/inline-report-check.d.ts +0 -63
- package/dist/hooks/inline-report-check.d.ts.map +0 -1
- package/dist/hooks/inline-report-check.js +0 -88
- package/dist/hooks/inline-report-check.js.map +0 -1
- package/dist/hooks/inline-report-check.test.js +0 -96
- package/dist/hooks/pre-tool-use.d.ts +0 -62
- package/dist/hooks/pre-tool-use.d.ts.map +0 -1
- package/dist/hooks/pre-tool-use.js +0 -342
- package/dist/hooks/pre-tool-use.js.map +0 -1
- package/dist/hooks/pre-tool-use.test.js +0 -134
- package/dist/hooks/session-end.d.ts +0 -15
- package/dist/hooks/session-end.d.ts.map +0 -1
- package/dist/hooks/session-end.js +0 -60
- package/dist/hooks/session-end.js.map +0 -1
- package/dist/hooks/session-end.test.js +0 -52
- package/dist/hooks/stop.d.ts +0 -35
- package/dist/hooks/stop.d.ts.map +0 -1
- package/dist/hooks/stop.js +0 -136
- package/dist/hooks/stop.js.map +0 -1
- package/dist/hooks/transcript-active-task.test.js +0 -342
- package/dist/hooks/transcript.d.ts +0 -26
- package/dist/hooks/transcript.d.ts.map +0 -1
- package/dist/hooks/transcript.js +0 -266
- package/dist/hooks/transcript.js.map +0 -1
- package/dist/hooks/transcript.test.js +0 -103
- package/dist/hooks/user-prompt-submit.d.ts +0 -74
- package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
- package/dist/hooks/user-prompt-submit.js +0 -256
- package/dist/hooks/user-prompt-submit.js.map +0 -1
- package/dist/hooks/user-prompt-submit.test.js +0 -118
- package/dist/hooks/versioning-gate.d.ts +0 -101
- package/dist/hooks/versioning-gate.d.ts.map +0 -1
- package/dist/hooks/versioning-gate.js +0 -245
- package/dist/hooks/versioning-gate.js.map +0 -1
- package/dist/hooks/versioning-gate.test.js +0 -368
- package/dist/hooks/workflow-gate.d.ts +0 -64
- package/dist/hooks/workflow-gate.d.ts.map +0 -1
- package/dist/hooks/workflow-gate.js +0 -152
- package/dist/hooks/workflow-gate.js.map +0 -1
- package/dist/hooks/workflow-gate.test.js +0 -197
- package/dist/hooks-cli.d.ts +0 -25
- package/dist/hooks-cli.d.ts.map +0 -1
- package/dist/hooks-cli.js +0 -286
- package/dist/hooks-cli.js.map +0 -1
- package/dist/hooks-cli.test.js +0 -148
- package/dist/origin.d.ts +0 -16
- package/dist/origin.d.ts.map +0 -1
- package/dist/origin.js +0 -92
- package/dist/origin.js.map +0 -1
- package/dist/packs/seed_lessons_ingest.d.ts +0 -30
- package/dist/packs/seed_lessons_ingest.d.ts.map +0 -1
- package/dist/packs/seed_lessons_ingest.js +0 -107
- package/dist/packs/seed_lessons_ingest.js.map +0 -1
- package/dist/project-cli.d.ts +0 -7
- package/dist/project-cli.d.ts.map +0 -1
- package/dist/project-cli.js +0 -145
- package/dist/project-cli.js.map +0 -1
- package/dist/project.d.ts +0 -127
- package/dist/project.d.ts.map +0 -1
- package/dist/project.js +0 -281
- package/dist/project.js.map +0 -1
- package/dist/project.test.js +0 -287
- package/dist/rag/backends/loop_engine.d.ts +0 -61
- package/dist/rag/backends/loop_engine.d.ts.map +0 -1
- package/dist/rag/backends/loop_engine.js +0 -160
- package/dist/rag/backends/loop_engine.js.map +0 -1
- package/dist/recall.d.ts +0 -82
- package/dist/recall.d.ts.map +0 -1
- package/dist/recall.js +0 -81
- package/dist/recall.js.map +0 -1
- package/dist/runtime/agent_bridge/autospawn.d.ts +0 -131
- package/dist/runtime/agent_bridge/autospawn.d.ts.map +0 -1
- package/dist/runtime/agent_bridge/autospawn.js +0 -251
- package/dist/runtime/agent_bridge/autospawn.js.map +0 -1
- package/dist/runtime/chain_state.d.ts +0 -124
- package/dist/runtime/chain_state.d.ts.map +0 -1
- package/dist/runtime/chain_state.js +0 -189
- package/dist/runtime/chain_state.js.map +0 -1
- package/dist/runtime/hooks/permission_decision.d.ts +0 -34
- package/dist/runtime/hooks/permission_decision.d.ts.map +0 -1
- package/dist/runtime/hooks/permission_decision.js +0 -39
- package/dist/runtime/hooks/permission_decision.js.map +0 -1
- package/dist/runtime/workflow_fsm.d.ts +0 -21
- package/dist/runtime/workflow_fsm.d.ts.map +0 -1
- package/dist/runtime/workflow_fsm.js +0 -25
- package/dist/runtime/workflow_fsm.js.map +0 -1
- package/dist/runtime/workflow_map.d.ts +0 -26
- package/dist/runtime/workflow_map.d.ts.map +0 -1
- package/dist/runtime/workflow_map.js +0 -38
- package/dist/runtime/workflow_map.js.map +0 -1
- package/dist/scope.d.ts +0 -48
- package/dist/scope.d.ts.map +0 -1
- package/dist/scope.js +0 -111
- package/dist/scope.js.map +0 -1
- package/dist/setup/cli/topic_create_step.d.ts +0 -84
- package/dist/setup/cli/topic_create_step.d.ts.map +0 -1
- package/dist/setup/cli/topic_create_step.js +0 -213
- package/dist/setup/cli/topic_create_step.js.map +0 -1
- package/dist/system-export.d.ts +0 -65
- package/dist/system-export.d.ts.map +0 -1
- package/dist/system-export.js +0 -194
- package/dist/system-export.js.map +0 -1
- package/dist/utterance/classifier.d.ts +0 -53
- package/dist/utterance/classifier.d.ts.map +0 -1
- package/dist/utterance/classifier.js +0 -184
- package/dist/utterance/classifier.js.map +0 -1
- package/dist/utterance/classifier.test.js +0 -147
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { SkillMdImportError, convertSkillMdToCodex, detectVariant, parseSkillMd, slugify, } from "./import-skill-md.js";
|
|
6
|
-
import { isFocusedCodex } from "./types.js";
|
|
7
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
const FIXTURES = path.resolve(__dirname, "../../test/fixtures/skill-md");
|
|
9
|
-
async function loadFixture(name) {
|
|
10
|
-
return fs.readFile(path.join(FIXTURES, name), "utf8");
|
|
11
|
-
}
|
|
12
|
-
// ---------------------------------------------------------------------
|
|
13
|
-
// slugify
|
|
14
|
-
// ---------------------------------------------------------------------
|
|
15
|
-
describe("slugify", () => {
|
|
16
|
-
it("lowercases ASCII", () => {
|
|
17
|
-
expect(slugify("HelloWorld")).toBe("helloworld");
|
|
18
|
-
});
|
|
19
|
-
it("replaces underscores with dashes", () => {
|
|
20
|
-
expect(slugify("google_meet")).toBe("google-meet");
|
|
21
|
-
});
|
|
22
|
-
it("collapses runs of non-alphanumerics", () => {
|
|
23
|
-
expect(slugify("foo bar___baz")).toBe("foo-bar-baz");
|
|
24
|
-
});
|
|
25
|
-
it("trims leading/trailing dashes", () => {
|
|
26
|
-
expect(slugify("---foo---")).toBe("foo");
|
|
27
|
-
});
|
|
28
|
-
it("caps at 64 chars", () => {
|
|
29
|
-
const long = "a".repeat(200);
|
|
30
|
-
expect(slugify(long).length).toBe(64);
|
|
31
|
-
});
|
|
32
|
-
it("throws on empty after stripping", () => {
|
|
33
|
-
expect(() => slugify("!!!")).toThrow(SkillMdImportError);
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
// ---------------------------------------------------------------------
|
|
37
|
-
// parseSkillMd
|
|
38
|
-
// ---------------------------------------------------------------------
|
|
39
|
-
describe("parseSkillMd", () => {
|
|
40
|
-
it("rejects empty input", () => {
|
|
41
|
-
expect(() => parseSkillMd("")).toThrow(/empty/);
|
|
42
|
-
});
|
|
43
|
-
it("rejects missing frontmatter", () => {
|
|
44
|
-
expect(() => parseSkillMd("just a body, no fences")).toThrow(/frontmatter/);
|
|
45
|
-
});
|
|
46
|
-
it("rejects missing name", () => {
|
|
47
|
-
expect(() => parseSkillMd("---\ndescription: x\n---\nbody")).toThrow(/name/);
|
|
48
|
-
});
|
|
49
|
-
it("rejects missing description", () => {
|
|
50
|
-
expect(() => parseSkillMd("---\nname: foo\n---\nbody")).toThrow(/description/);
|
|
51
|
-
});
|
|
52
|
-
it("parses minimal valid SKILL.md", () => {
|
|
53
|
-
const { frontmatter, body } = parseSkillMd("---\nname: foo\ndescription: bar\n---\nhello");
|
|
54
|
-
expect(frontmatter.name).toBe("foo");
|
|
55
|
-
expect(frontmatter.description).toBe("bar");
|
|
56
|
-
expect(body).toBe("hello");
|
|
57
|
-
});
|
|
58
|
-
it("handles CRLF line endings", () => {
|
|
59
|
-
const { frontmatter } = parseSkillMd("---\r\nname: foo\r\ndescription: bar\r\n---\r\nbody\r\n");
|
|
60
|
-
expect(frontmatter.name).toBe("foo");
|
|
61
|
-
});
|
|
62
|
-
it("strips UTF-8 BOM at start of file (v0.6d audit L1)", () => {
|
|
63
|
-
const bom = "";
|
|
64
|
-
const { frontmatter, body } = parseSkillMd(`${bom}---\nname: bom-test\ndescription: leading BOM\n---\nbody\n`);
|
|
65
|
-
expect(frontmatter.name).toBe("bom-test");
|
|
66
|
-
expect(body).toBe("body");
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
// ---------------------------------------------------------------------
|
|
70
|
-
// detectVariant
|
|
71
|
-
// ---------------------------------------------------------------------
|
|
72
|
-
describe("detectVariant", () => {
|
|
73
|
-
it("detects ECC by origin", () => {
|
|
74
|
-
expect(detectVariant({ name: "x", description: "y", origin: "ECC" })).toBe("ecc");
|
|
75
|
-
});
|
|
76
|
-
it("detects Hermes by platforms array", () => {
|
|
77
|
-
expect(detectVariant({ name: "x", description: "y", platforms: ["claude-code"] })).toBe("hermes");
|
|
78
|
-
});
|
|
79
|
-
it("detects Hermes by metadata.hermes block", () => {
|
|
80
|
-
expect(detectVariant({ name: "x", description: "y", metadata: { hermes: { tags: [] } } })).toBe("hermes");
|
|
81
|
-
});
|
|
82
|
-
it("detects superpowers by path", () => {
|
|
83
|
-
expect(detectVariant({ name: "x", description: "y" }, "/repo/superpowers/skills/foo/SKILL.md")).toBe("superpowers");
|
|
84
|
-
});
|
|
85
|
-
it("does NOT detect superpowers from CSO description alone (Anthropic skills use it too)", () => {
|
|
86
|
-
expect(detectVariant({ name: "x", description: "Use when writing tests" })).toBe("anthropic");
|
|
87
|
-
});
|
|
88
|
-
it("detects pure Anthropic (only known fields)", () => {
|
|
89
|
-
expect(detectVariant({ name: "x", description: "extracts text", license: "MIT" })).toBe("anthropic");
|
|
90
|
-
});
|
|
91
|
-
it("falls back to unknown for unrecognized non-standard fields", () => {
|
|
92
|
-
expect(detectVariant({ name: "x", description: "extracts text", randomField: 1 })).toBe("unknown");
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
// ---------------------------------------------------------------------
|
|
96
|
-
// convertSkillMdToCodex — fixture round-trip
|
|
97
|
-
// ---------------------------------------------------------------------
|
|
98
|
-
describe("convertSkillMdToCodex — fixtures", () => {
|
|
99
|
-
it("converts Anthropic skill-creator (minimal)", async () => {
|
|
100
|
-
const raw = await loadFixture("anthropic-skill-creator.md");
|
|
101
|
-
const { codex, lessons, variant } = convertSkillMdToCodex(raw, {
|
|
102
|
-
originalPath: "/fake/skill-creator/SKILL.md",
|
|
103
|
-
now: "2026-05-16T00:00:00.000Z",
|
|
104
|
-
});
|
|
105
|
-
expect(variant).toBe("anthropic");
|
|
106
|
-
expect(codex.id).toBe("skill-creator");
|
|
107
|
-
expect(codex.version).toBe("1.0.0");
|
|
108
|
-
expect(isFocusedCodex(codex)).toBe(true);
|
|
109
|
-
if (!isFocusedCodex(codex))
|
|
110
|
-
throw new Error("unreachable");
|
|
111
|
-
expect(codex.evolves).toBe(true);
|
|
112
|
-
expect(codex.source?.kind).toBe("skill_md");
|
|
113
|
-
expect(codex.source?.original_variant).toBe("anthropic");
|
|
114
|
-
expect(codex.source?.original_name).toBe("skill-creator");
|
|
115
|
-
expect(codex.source?.imported_at).toBe("2026-05-16T00:00:00.000Z");
|
|
116
|
-
expect(codex.metadata?.imported_from).toBe("skill_md");
|
|
117
|
-
expect(codex.metadata?.imported).toEqual({ synthesized_version: true });
|
|
118
|
-
expect(codex.seed_lessons).toHaveLength(1);
|
|
119
|
-
expect(codex.seed_lessons?.[0]?.id).toBe("skill-creator");
|
|
120
|
-
expect(codex.seed_lessons?.[0]?.body_path).toBe("lessons/skill-creator/lesson.md");
|
|
121
|
-
expect(lessons).toHaveLength(1);
|
|
122
|
-
expect(lessons[0].body).toContain("# Skill Creator");
|
|
123
|
-
});
|
|
124
|
-
it("converts Anthropic pdf — preserves license", async () => {
|
|
125
|
-
const raw = await loadFixture("anthropic-pdf.md");
|
|
126
|
-
const { codex } = convertSkillMdToCodex(raw, { originalPath: "/fake/pdf/SKILL.md" });
|
|
127
|
-
expect(codex.id).toBe("pdf");
|
|
128
|
-
expect(codex.license).toBe("Apache-2.0");
|
|
129
|
-
});
|
|
130
|
-
it("converts superpowers TDD — path-based detection", async () => {
|
|
131
|
-
const raw = await loadFixture("superpowers-tdd.md");
|
|
132
|
-
const { codex, variant } = convertSkillMdToCodex(raw, {
|
|
133
|
-
originalPath: "/home/u/repos/superpowers/skills/test-driven-development/SKILL.md",
|
|
134
|
-
});
|
|
135
|
-
expect(variant).toBe("superpowers");
|
|
136
|
-
expect(codex.id).toBe("test-driven-development");
|
|
137
|
-
});
|
|
138
|
-
it("converts ECC tdd-workflow — preserves origin in metadata", async () => {
|
|
139
|
-
const raw = await loadFixture("ecc-tdd-workflow.md");
|
|
140
|
-
const { codex, variant } = convertSkillMdToCodex(raw, {
|
|
141
|
-
originalPath: "/fake/ecc/SKILL.md",
|
|
142
|
-
});
|
|
143
|
-
expect(variant).toBe("ecc");
|
|
144
|
-
expect(codex.metadata?.origin).toBe("ECC");
|
|
145
|
-
});
|
|
146
|
-
it("converts Hermes dogfood — preserves version + author + extensions", async () => {
|
|
147
|
-
const raw = await loadFixture("hermes-dogfood.md");
|
|
148
|
-
const { codex, variant } = convertSkillMdToCodex(raw, {
|
|
149
|
-
originalPath: "/fake/hermes/dogfood/SKILL.md",
|
|
150
|
-
});
|
|
151
|
-
expect(variant).toBe("hermes");
|
|
152
|
-
if (!isFocusedCodex(codex))
|
|
153
|
-
throw new Error("unreachable");
|
|
154
|
-
expect(codex.version).toBe("0.3.1");
|
|
155
|
-
expect(codex.author?.name).toBe("Hermes Team");
|
|
156
|
-
expect(codex.metadata?.platforms).toEqual(["claude-code", "cursor", "hermes"]);
|
|
157
|
-
const hermesMeta = codex.metadata?.hermes;
|
|
158
|
-
expect(hermesMeta?.tags).toContain("testing");
|
|
159
|
-
expect(hermesMeta?.related_skills).toContain("publish-skill");
|
|
160
|
-
// synthesized_version marker MUST NOT be set when Hermes supplied a version
|
|
161
|
-
expect(codex.metadata?.imported).toBeUndefined();
|
|
162
|
-
});
|
|
163
|
-
it("converts Hermes google_meet — underscore rewrites to hyphen", async () => {
|
|
164
|
-
const raw = await loadFixture("hermes-google-meet.md");
|
|
165
|
-
const { codex } = convertSkillMdToCodex(raw, {
|
|
166
|
-
originalPath: "/fake/hermes/google_meet/SKILL.md",
|
|
167
|
-
});
|
|
168
|
-
expect(codex.id).toBe("google-meet");
|
|
169
|
-
if (!isFocusedCodex(codex))
|
|
170
|
-
throw new Error("unreachable");
|
|
171
|
-
expect(codex.source?.original_name).toBe("google_meet");
|
|
172
|
-
expect(codex.seed_lessons?.[0]?.body_path).toBe("lessons/google-meet/lesson.md");
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
// ---------------------------------------------------------------------
|
|
176
|
-
// allowed-tools mapping (Anthropic experimental field)
|
|
177
|
-
// ---------------------------------------------------------------------
|
|
178
|
-
describe("convertSkillMdToCodex — allowed-tools", () => {
|
|
179
|
-
it("maps `allowed-tools` array to foundation.tools[]", () => {
|
|
180
|
-
const src = `---
|
|
181
|
-
name: tooled
|
|
182
|
-
description: uses specific tools
|
|
183
|
-
allowed-tools:
|
|
184
|
-
- Read
|
|
185
|
-
- Bash
|
|
186
|
-
- Edit
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
body`;
|
|
190
|
-
const { codex } = convertSkillMdToCodex(src);
|
|
191
|
-
if (!isFocusedCodex(codex))
|
|
192
|
-
throw new Error("unreachable");
|
|
193
|
-
expect(codex.foundation?.tools?.map((t) => t.name)).toEqual(["Read", "Bash", "Edit"]);
|
|
194
|
-
});
|
|
195
|
-
it("omits foundation when allowed-tools is empty", () => {
|
|
196
|
-
const src = `---
|
|
197
|
-
name: untooled
|
|
198
|
-
description: no tool restrictions
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
body`;
|
|
202
|
-
const { codex } = convertSkillMdToCodex(src);
|
|
203
|
-
if (!isFocusedCodex(codex))
|
|
204
|
-
throw new Error("unreachable");
|
|
205
|
-
expect(codex.foundation).toBeUndefined();
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
// ---------------------------------------------------------------------
|
|
209
|
-
// Unknown frontmatter keys → metadata catch-all
|
|
210
|
-
// ---------------------------------------------------------------------
|
|
211
|
-
describe("convertSkillMdToCodex — extensibility bucket", () => {
|
|
212
|
-
it("preserves unknown top-level keys under metadata", () => {
|
|
213
|
-
const src = `---
|
|
214
|
-
name: custom
|
|
215
|
-
description: has random fields
|
|
216
|
-
custom_field: hello
|
|
217
|
-
another: 42
|
|
218
|
-
---
|
|
219
|
-
|
|
220
|
-
body`;
|
|
221
|
-
const { codex } = convertSkillMdToCodex(src);
|
|
222
|
-
expect(codex.metadata?.custom_field).toBe("hello");
|
|
223
|
-
expect(codex.metadata?.another).toBe(42);
|
|
224
|
-
});
|
|
225
|
-
});
|
package/dist/codex/loader.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bundled-default codex loader (drift-as-codex chunk 2).
|
|
3
|
-
*
|
|
4
|
-
* Reads `bundled-default/codex.yaml` once per process and returns the
|
|
5
|
-
* parsed FocusedCodex. Downstream hooks (workflow-gate, honesty-ledger,
|
|
6
|
-
* versioning-gate — see chunks 3a/3b) call this to source their rules
|
|
7
|
-
* from the codex instead of having them hard-coded in TypeScript.
|
|
8
|
-
*
|
|
9
|
-
* Singleton cache: the YAML is small and unchanging across a process
|
|
10
|
-
* lifetime; computing the path + parsing once is cheap and avoids
|
|
11
|
-
* surprising the test suite with stale state.
|
|
12
|
-
*/
|
|
13
|
-
import { FocusedCodex } from "./types.js";
|
|
14
|
-
/**
|
|
15
|
-
* Load the bundled-default codex once per process and return it.
|
|
16
|
-
*
|
|
17
|
-
* Throws if the file is missing, malformed, or parses to a
|
|
18
|
-
* CompositeCodex (the bundled-default is always focused — composite
|
|
19
|
-
* codexes are a separate consumer pattern).
|
|
20
|
-
*/
|
|
21
|
-
export declare function loadBundledDefaultCodex(): FocusedCodex;
|
|
22
|
-
/**
|
|
23
|
-
* Clear the loader cache. Test-only — production code should never
|
|
24
|
-
* need to invalidate the bundled-default codex within a process.
|
|
25
|
-
*/
|
|
26
|
-
export declare function __resetCachedCodexForTesting(): void;
|
|
27
|
-
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src.legacy/codex/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,YAAY,EAAkB,MAAM,YAAY,CAAC;AAgD1D;;;;;;GAMG;AACH,wBAAgB,uBAAuB,IAAI,YAAY,CAqBtD;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD"}
|
package/dist/codex/loader.js
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bundled-default codex loader (drift-as-codex chunk 2).
|
|
3
|
-
*
|
|
4
|
-
* Reads `bundled-default/codex.yaml` once per process and returns the
|
|
5
|
-
* parsed FocusedCodex. Downstream hooks (workflow-gate, honesty-ledger,
|
|
6
|
-
* versioning-gate — see chunks 3a/3b) call this to source their rules
|
|
7
|
-
* from the codex instead of having them hard-coded in TypeScript.
|
|
8
|
-
*
|
|
9
|
-
* Singleton cache: the YAML is small and unchanging across a process
|
|
10
|
-
* lifetime; computing the path + parsing once is cheap and avoids
|
|
11
|
-
* surprising the test suite with stale state.
|
|
12
|
-
*/
|
|
13
|
-
import { readFileSync } from "node:fs";
|
|
14
|
-
import * as path from "node:path";
|
|
15
|
-
import { fileURLToPath } from "node:url";
|
|
16
|
-
import { parseCodexYaml } from "./parse.js";
|
|
17
|
-
import { isFocusedCodex } from "./types.js";
|
|
18
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
-
const __dirname = path.dirname(__filename);
|
|
20
|
-
/**
|
|
21
|
-
* Path to the bundled-default codex YAML. Resolved relative to this
|
|
22
|
-
* file's location, so it works in both `src/` (vitest direct execution)
|
|
23
|
-
* and `dist/` (built + published npm package, since
|
|
24
|
-
* `src/codex/bundled-default/codex.yaml` is listed in `package.json`
|
|
25
|
-
* `files[]`).
|
|
26
|
-
*
|
|
27
|
-
* The relative layout is identical in both worlds:
|
|
28
|
-
* src/codex/loader.ts + src/codex/bundled-default/codex.yaml
|
|
29
|
-
* dist/codex/loader.js + src/codex/bundled-default/codex.yaml
|
|
30
|
-
*
|
|
31
|
-
* Wait — the `dist/` build only includes the loader.js. The YAML
|
|
32
|
-
* stays at its `src/codex/bundled-default/codex.yaml` location because
|
|
33
|
-
* that's what package.json `files[]` ships. We resolve from
|
|
34
|
-
* `loader.{ts,js}` up to the package root then back down to the YAML.
|
|
35
|
-
*/
|
|
36
|
-
function resolveBundledCodexPath() {
|
|
37
|
-
// From `dist/codex/loader.js` or `src/codex/loader.ts`, the YAML is
|
|
38
|
-
// at `../../src/codex/bundled-default/codex.yaml` relative to the
|
|
39
|
-
// dist build, or `./bundled-default/codex.yaml` in the src tree.
|
|
40
|
-
// Try the src-tree path first (works in test runs); fall back to
|
|
41
|
-
// the dist-relative path (works in published npm package).
|
|
42
|
-
const srcRelative = path.resolve(__dirname, "bundled-default", "codex.yaml");
|
|
43
|
-
// Distinguish dist vs src by checking whether __dirname ends with
|
|
44
|
-
// .../dist/codex. In `dist/`, the bundled YAML is one level higher.
|
|
45
|
-
const distRelative = path.resolve(__dirname, "..", "..", "src", "codex", "bundled-default", "codex.yaml");
|
|
46
|
-
// When running from src/, srcRelative resolves correctly; when
|
|
47
|
-
// running from dist/, only distRelative does (the YAML stays in
|
|
48
|
-
// src/codex/bundled-default/ per package.json files[]). Branch on
|
|
49
|
-
// whether __dirname is inside /dist/.
|
|
50
|
-
return srcRelative.includes(`${path.sep}dist${path.sep}`) ? distRelative : srcRelative;
|
|
51
|
-
}
|
|
52
|
-
let cachedCodex = null;
|
|
53
|
-
/**
|
|
54
|
-
* Load the bundled-default codex once per process and return it.
|
|
55
|
-
*
|
|
56
|
-
* Throws if the file is missing, malformed, or parses to a
|
|
57
|
-
* CompositeCodex (the bundled-default is always focused — composite
|
|
58
|
-
* codexes are a separate consumer pattern).
|
|
59
|
-
*/
|
|
60
|
-
export function loadBundledDefaultCodex() {
|
|
61
|
-
if (cachedCodex !== null) {
|
|
62
|
-
return cachedCodex;
|
|
63
|
-
}
|
|
64
|
-
const yamlPath = resolveBundledCodexPath();
|
|
65
|
-
let yaml;
|
|
66
|
-
try {
|
|
67
|
-
yaml = readFileSync(yamlPath, "utf-8");
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
throw new Error(`[opensquid loader] bundled-default codex not found at ${yamlPath}: ${err instanceof Error ? err.message : err}`);
|
|
71
|
-
}
|
|
72
|
-
const parsed = parseCodexYaml(yaml);
|
|
73
|
-
if (!isFocusedCodex(parsed)) {
|
|
74
|
-
throw new Error(`[opensquid loader] bundled-default codex must be focused, got composite (id=${parsed.id})`);
|
|
75
|
-
}
|
|
76
|
-
cachedCodex = parsed;
|
|
77
|
-
return cachedCodex;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Clear the loader cache. Test-only — production code should never
|
|
81
|
-
* need to invalidate the bundled-default codex within a process.
|
|
82
|
-
*/
|
|
83
|
-
export function __resetCachedCodexForTesting() {
|
|
84
|
-
cachedCodex = null;
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=loader.js.map
|
package/dist/codex/loader.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src.legacy/codex/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAgB,cAAc,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;;;;;;;;;;;;;GAeG;AACH,SAAS,uBAAuB;IAC9B,oEAAoE;IACpE,kEAAkE;IAClE,iEAAiE;IACjE,iEAAiE;IACjE,2DAA2D;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;IAC7E,kEAAkE;IAClE,oEAAoE;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAC/B,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAO,EACP,iBAAiB,EACjB,YAAY,CACb,CAAC;IACF,+DAA+D;IAC/D,gEAAgE;IAChE,kEAAkE;IAClE,sCAAsC;IACtC,OAAO,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;AACzF,CAAC;AAED,IAAI,WAAW,GAAwB,IAAI,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB;IACrC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAC;IAC3C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,yDAAyD,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CACjH,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,+EAA+E,MAAM,CAAC,EAAE,GAAG,CAC5F,CAAC;IACJ,CAAC;IACD,WAAW,GAAG,MAAM,CAAC;IACrB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B;IAC1C,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, beforeEach } from "vitest";
|
|
2
|
-
import { __resetCachedCodexForTesting, loadBundledDefaultCodex } from "./loader.js";
|
|
3
|
-
import { isFocusedCodex } from "./types.js";
|
|
4
|
-
describe("loadBundledDefaultCodex", () => {
|
|
5
|
-
beforeEach(() => {
|
|
6
|
-
__resetCachedCodexForTesting();
|
|
7
|
-
});
|
|
8
|
-
it("loads the bundled-default codex and returns a focused codex", () => {
|
|
9
|
-
const codex = loadBundledDefaultCodex();
|
|
10
|
-
expect(codex.id).toBe("opensquid-default");
|
|
11
|
-
expect(isFocusedCodex(codex)).toBe(true);
|
|
12
|
-
});
|
|
13
|
-
it("exposes the drift, workflow, claim, and policy sections (chunk 1 content)", () => {
|
|
14
|
-
const codex = loadBundledDefaultCodex();
|
|
15
|
-
expect(codex.drifts).toBeDefined();
|
|
16
|
-
expect((codex.drifts ?? []).length).toBeGreaterThanOrEqual(4);
|
|
17
|
-
expect(codex.workflows).toBeDefined();
|
|
18
|
-
expect((codex.workflows ?? []).length).toBeGreaterThanOrEqual(1);
|
|
19
|
-
expect(codex.default_workflow_id).toBe("standard-7-phase");
|
|
20
|
-
expect(codex.claims).toBeDefined();
|
|
21
|
-
expect((codex.claims ?? []).length).toBeGreaterThanOrEqual(5);
|
|
22
|
-
expect(codex.policies).toBeDefined();
|
|
23
|
-
expect((codex.policies ?? []).length).toBeGreaterThanOrEqual(2);
|
|
24
|
-
});
|
|
25
|
-
it("caches across calls (returns the same object instance on repeated calls)", () => {
|
|
26
|
-
const first = loadBundledDefaultCodex();
|
|
27
|
-
const second = loadBundledDefaultCodex();
|
|
28
|
-
expect(first).toBe(second);
|
|
29
|
-
});
|
|
30
|
-
it("re-parses after __resetCachedCodexForTesting (fresh object instance)", () => {
|
|
31
|
-
const first = loadBundledDefaultCodex();
|
|
32
|
-
__resetCachedCodexForTesting();
|
|
33
|
-
const second = loadBundledDefaultCodex();
|
|
34
|
-
// Same content, different reference because cache was cleared.
|
|
35
|
-
expect(first).not.toBe(second);
|
|
36
|
-
expect(first.id).toBe(second.id);
|
|
37
|
-
});
|
|
38
|
-
it("exposes the standard-7-phase workflow with all 7 phases", () => {
|
|
39
|
-
const codex = loadBundledDefaultCodex();
|
|
40
|
-
const workflow = (codex.workflows ?? []).find((w) => w.id === "standard-7-phase");
|
|
41
|
-
expect(workflow).toBeDefined();
|
|
42
|
-
const phaseNames = (workflow?.phases ?? []).map((p) => p.name);
|
|
43
|
-
expect(phaseNames).toEqual([
|
|
44
|
-
"pre_research",
|
|
45
|
-
"learn",
|
|
46
|
-
"code",
|
|
47
|
-
"test",
|
|
48
|
-
"audit",
|
|
49
|
-
"post_research",
|
|
50
|
-
"fix",
|
|
51
|
-
]);
|
|
52
|
-
// `fix` is the only soft phase (required: false). The other 6 are required.
|
|
53
|
-
const requiredPhases = (workflow?.phases ?? []).filter((p) => p.required).map((p) => p.name);
|
|
54
|
-
expect(requiredPhases).toEqual([
|
|
55
|
-
"pre_research",
|
|
56
|
-
"learn",
|
|
57
|
-
"code",
|
|
58
|
-
"test",
|
|
59
|
-
"audit",
|
|
60
|
-
"post_research",
|
|
61
|
-
]);
|
|
62
|
-
});
|
|
63
|
-
it("exposes versioning-pre1-patch-only policy with allowed_slots = [patch]", () => {
|
|
64
|
-
const codex = loadBundledDefaultCodex();
|
|
65
|
-
const policy = (codex.policies ?? []).find((p) => p.id === "versioning-pre1-patch-only");
|
|
66
|
-
expect(policy).toBeDefined();
|
|
67
|
-
if (policy?.kind === "versioning") {
|
|
68
|
-
expect(policy.params.per_commit_required).toBe(true);
|
|
69
|
-
expect(policy.params.allowed_slots).toEqual(["patch"]);
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
throw new Error("versioning-pre1-patch-only policy is not of kind=versioning");
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
});
|
package/dist/codex/parse.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Codex YAML parsing + runtime validation.
|
|
3
|
-
*
|
|
4
|
-
* Authoritative parse for codex.yaml files. Used by `opensquid codex
|
|
5
|
-
* install <path>` to validate before storing locally. Foreign-format
|
|
6
|
-
* imports (superpowers SKILL.md, ECC, etc.) come pre-converted to
|
|
7
|
-
* native codex YAML via LLM at install time — this parser sees the
|
|
8
|
-
* native shape only.
|
|
9
|
-
*/
|
|
10
|
-
import { z } from "zod";
|
|
11
|
-
import type { Codex } from "./types.js";
|
|
12
|
-
export declare class CodexParseError extends Error {
|
|
13
|
-
readonly issues?: z.ZodIssue[] | undefined;
|
|
14
|
-
constructor(message: string, issues?: z.ZodIssue[] | undefined);
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Parse + validate a codex from a raw object (already-parsed YAML/JSON).
|
|
18
|
-
*
|
|
19
|
-
* Throws `CodexParseError` on schema violations with detailed issues.
|
|
20
|
-
*/
|
|
21
|
-
export declare function parseCodex(raw: unknown): Codex;
|
|
22
|
-
/**
|
|
23
|
-
* Parse a codex from a YAML string.
|
|
24
|
-
*
|
|
25
|
-
* Throws `CodexParseError` on YAML syntax error or schema violation.
|
|
26
|
-
*/
|
|
27
|
-
export declare function parseCodexYaml(source: string): Codex;
|
|
28
|
-
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src.legacy/codex/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EACV,KAAK,EAeN,MAAM,YAAY,CAAC;AAiSpB,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;gBADrC,OAAO,EAAE,MAAM,EACC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,YAAA;CAKxC;AAMD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAgB9C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAepD"}
|