cognitive-core 0.2.1 → 0.2.2
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/dist/atlas.d.ts +10 -0
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +65 -0
- package/dist/atlas.js.map +1 -1
- package/dist/learning/pipeline.d.ts +4 -31
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +12 -64
- package/dist/learning/pipeline.js.map +1 -1
- package/dist/memory/curated-loader.d.ts +21 -4
- package/dist/memory/curated-loader.d.ts.map +1 -1
- package/dist/memory/curated-loader.js +53 -16
- package/dist/memory/curated-loader.js.map +1 -1
- package/dist/memory/index.d.ts +2 -1
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +3 -1
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/playbook.d.ts +6 -0
- package/dist/memory/playbook.d.ts.map +1 -1
- package/dist/memory/playbook.js +15 -0
- package/dist/memory/playbook.js.map +1 -1
- package/dist/memory/source-resolver.d.ts +120 -0
- package/dist/memory/source-resolver.d.ts.map +1 -0
- package/dist/memory/source-resolver.js +300 -0
- package/dist/memory/source-resolver.js.map +1 -0
- package/dist/types/config.d.ts +141 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +40 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/workspace/types.d.ts +12 -54
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js.map +1 -1
- package/package.json +2 -2
- package/playbooks/compound-engineering/adversarial-review.json +51 -0
- package/playbooks/compound-engineering/agent-native-architecture.json +59 -0
- package/playbooks/compound-engineering/agent-native-review.json +54 -0
- package/playbooks/compound-engineering/api-contract-review.json +52 -0
- package/playbooks/compound-engineering/brainstorm-requirements.json +55 -0
- package/playbooks/compound-engineering/bug-reproduction.json +62 -0
- package/playbooks/compound-engineering/confidence-calibration.json +49 -0
- package/playbooks/compound-engineering/correctness-review.json +49 -0
- package/playbooks/compound-engineering/data-migration-safety.json +59 -0
- package/playbooks/compound-engineering/deployment-verification.json +63 -0
- package/playbooks/compound-engineering/error-recovery-patterns.json +53 -0
- package/playbooks/compound-engineering/implementation-planning.json +64 -0
- package/playbooks/compound-engineering/issue-pattern-analysis.json +53 -0
- package/playbooks/compound-engineering/knowledge-compounding.json +63 -0
- package/playbooks/compound-engineering/learnings-research.json +54 -0
- package/playbooks/compound-engineering/maintainability-review.json +49 -0
- package/playbooks/compound-engineering/performance-review.json +54 -0
- package/playbooks/compound-engineering/plan-adversarial-review.json +56 -0
- package/playbooks/compound-engineering/plan-feasibility-review.json +56 -0
- package/playbooks/compound-engineering/project-standards-review.json +52 -0
- package/playbooks/compound-engineering/reliability-review.json +53 -0
- package/playbooks/compound-engineering/review-orchestration.json +64 -0
- package/playbooks/compound-engineering/security-review.json +54 -0
- package/playbooks/compound-engineering/systematic-execution.json +64 -0
- package/playbooks/compound-engineering/testing-review.json +50 -0
- package/src/atlas.ts +96 -0
- package/src/memory/curated-loader.ts +69 -16
- package/src/memory/index.ts +16 -0
- package/src/memory/playbook.ts +19 -0
- package/src/memory/source-resolver.ts +422 -0
- package/src/types/config.ts +46 -0
- package/src/types/index.ts +4 -0
- package/src/workspace/types.ts +22 -78
- package/tests/integration/curated-sources-e2e.test.ts +502 -0
- package/tests/memory/compound-engineering-seed.test.ts +338 -0
- package/tests/memory/curated-loader-extended.test.ts +225 -0
- package/tests/memory/playbook-quality-validation.test.ts +430 -0
- package/tests/memory/source-resolver.test.ts +700 -0
- package/.claude/settings.local.json +0 -11
- package/dist/learning/llm-extractor.d.ts +0 -88
- package/dist/learning/llm-extractor.d.ts.map +0 -1
- package/dist/learning/llm-extractor.js +0 -372
- package/dist/learning/llm-extractor.js.map +0 -1
- package/dist/learning/loop-coordinator.d.ts +0 -61
- package/dist/learning/loop-coordinator.d.ts.map +0 -1
- package/dist/learning/loop-coordinator.js +0 -96
- package/dist/learning/loop-coordinator.js.map +0 -1
- package/references/agent-workspace/CLAUDE.md +0 -74
- package/references/agent-workspace/README.md +0 -587
- package/references/agent-workspace/media/banner.png +0 -0
- package/references/agent-workspace/package-lock.json +0 -2061
- package/references/agent-workspace/package.json +0 -54
- package/references/agent-workspace/src/handle.ts +0 -122
- package/references/agent-workspace/src/index.ts +0 -32
- package/references/agent-workspace/src/manager.ts +0 -102
- package/references/agent-workspace/src/readers/json.ts +0 -71
- package/references/agent-workspace/src/readers/markdown.ts +0 -37
- package/references/agent-workspace/src/readers/raw.ts +0 -27
- package/references/agent-workspace/src/types.ts +0 -68
- package/references/agent-workspace/src/validation.ts +0 -93
- package/references/agent-workspace/src/writers/json.ts +0 -17
- package/references/agent-workspace/src/writers/markdown.ts +0 -27
- package/references/agent-workspace/src/writers/raw.ts +0 -22
- package/references/agent-workspace/tests/errors.test.ts +0 -652
- package/references/agent-workspace/tests/handle.test.ts +0 -144
- package/references/agent-workspace/tests/manager.test.ts +0 -124
- package/references/agent-workspace/tests/readers.test.ts +0 -205
- package/references/agent-workspace/tests/validation.test.ts +0 -196
- package/references/agent-workspace/tests/writers.test.ts +0 -108
- package/references/agent-workspace/tsconfig.json +0 -20
- package/references/agent-workspace/tsup.config.ts +0 -9
- package/references/minimem/.claude/settings.json +0 -7
- package/references/minimem/.sudocode/issues.jsonl +0 -18
- package/references/minimem/.sudocode/specs.jsonl +0 -1
- package/references/minimem/CLAUDE.md +0 -310
- package/references/minimem/README.md +0 -556
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
- package/references/minimem/claude-plugin/.mcp.json +0 -7
- package/references/minimem/claude-plugin/README.md +0 -158
- package/references/minimem/claude-plugin/commands/recall.md +0 -47
- package/references/minimem/claude-plugin/commands/remember.md +0 -41
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
- package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
- package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
- package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
- package/references/minimem/package-lock.json +0 -5373
- package/references/minimem/package.json +0 -60
- package/references/minimem/scripts/postbuild.js +0 -35
- package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
- package/references/minimem/src/__tests__/errors.test.ts +0 -265
- package/references/minimem/src/__tests__/helpers.ts +0 -199
- package/references/minimem/src/__tests__/internal.test.ts +0 -407
- package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
- package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
- package/references/minimem/src/__tests__/session.test.ts +0 -190
- package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
- package/references/minimem/src/cli/commands/append.ts +0 -76
- package/references/minimem/src/cli/commands/config.ts +0 -262
- package/references/minimem/src/cli/commands/conflicts.ts +0 -413
- package/references/minimem/src/cli/commands/daemon.ts +0 -169
- package/references/minimem/src/cli/commands/index.ts +0 -12
- package/references/minimem/src/cli/commands/init.ts +0 -88
- package/references/minimem/src/cli/commands/mcp.ts +0 -177
- package/references/minimem/src/cli/commands/push-pull.ts +0 -213
- package/references/minimem/src/cli/commands/search.ts +0 -158
- package/references/minimem/src/cli/commands/status.ts +0 -84
- package/references/minimem/src/cli/commands/sync-init.ts +0 -290
- package/references/minimem/src/cli/commands/sync.ts +0 -70
- package/references/minimem/src/cli/commands/upsert.ts +0 -197
- package/references/minimem/src/cli/config.ts +0 -584
- package/references/minimem/src/cli/index.ts +0 -264
- package/references/minimem/src/cli/shared.ts +0 -161
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
- package/references/minimem/src/cli/sync/central.ts +0 -292
- package/references/minimem/src/cli/sync/conflicts.ts +0 -204
- package/references/minimem/src/cli/sync/daemon.ts +0 -407
- package/references/minimem/src/cli/sync/detection.ts +0 -138
- package/references/minimem/src/cli/sync/index.ts +0 -107
- package/references/minimem/src/cli/sync/operations.ts +0 -373
- package/references/minimem/src/cli/sync/registry.ts +0 -279
- package/references/minimem/src/cli/sync/state.ts +0 -355
- package/references/minimem/src/cli/sync/validation.ts +0 -206
- package/references/minimem/src/cli/sync/watcher.ts +0 -234
- package/references/minimem/src/cli/version.ts +0 -34
- package/references/minimem/src/core/index.ts +0 -9
- package/references/minimem/src/core/indexer.ts +0 -628
- package/references/minimem/src/core/searcher.ts +0 -221
- package/references/minimem/src/db/schema.ts +0 -183
- package/references/minimem/src/db/sqlite-vec.ts +0 -24
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
- package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
- package/references/minimem/src/embeddings/batch-openai.ts +0 -409
- package/references/minimem/src/embeddings/embeddings.ts +0 -434
- package/references/minimem/src/index.ts +0 -109
- package/references/minimem/src/internal.ts +0 -299
- package/references/minimem/src/minimem.ts +0 -1276
- package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
- package/references/minimem/src/search/graph.ts +0 -234
- package/references/minimem/src/search/hybrid.ts +0 -151
- package/references/minimem/src/search/search.ts +0 -256
- package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
- package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
- package/references/minimem/src/server/mcp.ts +0 -326
- package/references/minimem/src/server/tools.ts +0 -720
- package/references/minimem/src/session.ts +0 -460
- package/references/minimem/tsconfig.json +0 -19
- package/references/minimem/tsup.config.ts +0 -26
- package/references/minimem/vitest.config.ts +0 -24
- package/references/sessionlog/.husky/pre-commit +0 -1
- package/references/sessionlog/.lintstagedrc.json +0 -4
- package/references/sessionlog/.prettierignore +0 -4
- package/references/sessionlog/.prettierrc.json +0 -11
- package/references/sessionlog/LICENSE +0 -21
- package/references/sessionlog/README.md +0 -453
- package/references/sessionlog/eslint.config.js +0 -58
- package/references/sessionlog/package-lock.json +0 -3672
- package/references/sessionlog/package.json +0 -65
- package/references/sessionlog/src/__tests__/agent-hooks.test.ts +0 -570
- package/references/sessionlog/src/__tests__/agent-registry.test.ts +0 -127
- package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +0 -225
- package/references/sessionlog/src/__tests__/claude-generator.test.ts +0 -46
- package/references/sessionlog/src/__tests__/commit-msg.test.ts +0 -86
- package/references/sessionlog/src/__tests__/cursor-agent.test.ts +0 -224
- package/references/sessionlog/src/__tests__/e2e-live.test.ts +0 -890
- package/references/sessionlog/src/__tests__/event-log.test.ts +0 -183
- package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +0 -105
- package/references/sessionlog/src/__tests__/gemini-agent.test.ts +0 -375
- package/references/sessionlog/src/__tests__/git-hooks.test.ts +0 -78
- package/references/sessionlog/src/__tests__/hook-managers.test.ts +0 -121
- package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +0 -759
- package/references/sessionlog/src/__tests__/opencode-agent.test.ts +0 -338
- package/references/sessionlog/src/__tests__/redaction.test.ts +0 -136
- package/references/sessionlog/src/__tests__/session-repo.test.ts +0 -353
- package/references/sessionlog/src/__tests__/session-store.test.ts +0 -166
- package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +0 -466
- package/references/sessionlog/src/__tests__/skill-live.test.ts +0 -461
- package/references/sessionlog/src/__tests__/summarize.test.ts +0 -348
- package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +0 -610
- package/references/sessionlog/src/__tests__/task-plan-live.test.ts +0 -632
- package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +0 -121
- package/references/sessionlog/src/__tests__/types.test.ts +0 -166
- package/references/sessionlog/src/__tests__/utils.test.ts +0 -333
- package/references/sessionlog/src/__tests__/validation.test.ts +0 -103
- package/references/sessionlog/src/__tests__/worktree.test.ts +0 -57
- package/references/sessionlog/src/agent/agents/claude-code.ts +0 -1089
- package/references/sessionlog/src/agent/agents/cursor.ts +0 -361
- package/references/sessionlog/src/agent/agents/gemini-cli.ts +0 -632
- package/references/sessionlog/src/agent/agents/opencode.ts +0 -540
- package/references/sessionlog/src/agent/registry.ts +0 -143
- package/references/sessionlog/src/agent/session-types.ts +0 -113
- package/references/sessionlog/src/agent/types.ts +0 -220
- package/references/sessionlog/src/cli.ts +0 -597
- package/references/sessionlog/src/commands/clean.ts +0 -133
- package/references/sessionlog/src/commands/disable.ts +0 -84
- package/references/sessionlog/src/commands/doctor.ts +0 -145
- package/references/sessionlog/src/commands/enable.ts +0 -202
- package/references/sessionlog/src/commands/explain.ts +0 -261
- package/references/sessionlog/src/commands/reset.ts +0 -105
- package/references/sessionlog/src/commands/resume.ts +0 -180
- package/references/sessionlog/src/commands/rewind.ts +0 -195
- package/references/sessionlog/src/commands/setup-ccweb.ts +0 -275
- package/references/sessionlog/src/commands/status.ts +0 -172
- package/references/sessionlog/src/config.ts +0 -165
- package/references/sessionlog/src/events/event-log.ts +0 -126
- package/references/sessionlog/src/git-operations.ts +0 -558
- package/references/sessionlog/src/hooks/git-hooks.ts +0 -165
- package/references/sessionlog/src/hooks/lifecycle.ts +0 -391
- package/references/sessionlog/src/index.ts +0 -650
- package/references/sessionlog/src/security/redaction.ts +0 -283
- package/references/sessionlog/src/session/state-machine.ts +0 -452
- package/references/sessionlog/src/store/checkpoint-store.ts +0 -509
- package/references/sessionlog/src/store/native-store.ts +0 -173
- package/references/sessionlog/src/store/provider-types.ts +0 -99
- package/references/sessionlog/src/store/session-store.ts +0 -266
- package/references/sessionlog/src/strategy/attribution.ts +0 -296
- package/references/sessionlog/src/strategy/common.ts +0 -207
- package/references/sessionlog/src/strategy/content-overlap.ts +0 -228
- package/references/sessionlog/src/strategy/manual-commit.ts +0 -988
- package/references/sessionlog/src/strategy/types.ts +0 -279
- package/references/sessionlog/src/summarize/claude-generator.ts +0 -115
- package/references/sessionlog/src/summarize/summarize.ts +0 -432
- package/references/sessionlog/src/types.ts +0 -508
- package/references/sessionlog/src/utils/chunk-files.ts +0 -49
- package/references/sessionlog/src/utils/commit-message.ts +0 -65
- package/references/sessionlog/src/utils/detect-agent.ts +0 -36
- package/references/sessionlog/src/utils/hook-managers.ts +0 -125
- package/references/sessionlog/src/utils/ide-tags.ts +0 -32
- package/references/sessionlog/src/utils/paths.ts +0 -79
- package/references/sessionlog/src/utils/preview-rewind.ts +0 -80
- package/references/sessionlog/src/utils/rewind-conflict.ts +0 -121
- package/references/sessionlog/src/utils/shadow-branch.ts +0 -109
- package/references/sessionlog/src/utils/string-utils.ts +0 -46
- package/references/sessionlog/src/utils/todo-extract.ts +0 -188
- package/references/sessionlog/src/utils/trailers.ts +0 -187
- package/references/sessionlog/src/utils/transcript-parse.ts +0 -177
- package/references/sessionlog/src/utils/transcript-timestamp.ts +0 -59
- package/references/sessionlog/src/utils/tree-ops.ts +0 -219
- package/references/sessionlog/src/utils/tty.ts +0 -72
- package/references/sessionlog/src/utils/validation.ts +0 -65
- package/references/sessionlog/src/utils/worktree.ts +0 -58
- package/references/sessionlog/src/wire-types.ts +0 -59
- package/references/sessionlog/templates/setup-env.sh +0 -153
- package/references/sessionlog/tsconfig.json +0 -18
- package/references/sessionlog/vitest.config.ts +0 -12
- package/references/skill-tree/.claude/settings.json +0 -6
- package/references/skill-tree/.sudocode/issues.jsonl +0 -19
- package/references/skill-tree/.sudocode/specs.jsonl +0 -3
- package/references/skill-tree/CLAUDE.md +0 -126
- package/references/skill-tree/README.md +0 -372
- package/references/skill-tree/docs/GAPS_v1.md +0 -221
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
- package/references/skill-tree/docs/TODOS.md +0 -91
- package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
- package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
- package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
- package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
- package/references/skill-tree/docs/scraper/README.md +0 -170
- package/references/skill-tree/examples/basic-usage.ts +0 -164
- package/references/skill-tree/package-lock.json +0 -1852
- package/references/skill-tree/package.json +0 -66
- package/references/skill-tree/scraper/README.md +0 -123
- package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
- package/references/skill-tree/scraper/docs/PLAN.md +0 -336
- package/references/skill-tree/scraper/drizzle.config.ts +0 -10
- package/references/skill-tree/scraper/package-lock.json +0 -6329
- package/references/skill-tree/scraper/package.json +0 -68
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
- package/references/skill-tree/scraper/tsup.config.ts +0 -14
- package/references/skill-tree/scraper/vitest.config.ts +0 -17
- package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
- package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
- package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
- package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
- package/references/skill-tree/test/run-all.ts +0 -106
- package/references/skill-tree/test/utils.ts +0 -128
- package/references/skill-tree/vitest.config.ts +0 -16
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playbook Quality Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates that the compound-engineering seed pack playbooks are:
|
|
5
|
+
* 1. Structurally complete (all fields populated with meaningful content)
|
|
6
|
+
* 2. Internally consistent (cross-references resolve, domains cover expected areas)
|
|
7
|
+
* 3. Retrieval-effective (right playbooks surface for expected queries)
|
|
8
|
+
* 4. Non-redundant (no two playbooks are effectively duplicates)
|
|
9
|
+
*
|
|
10
|
+
* Modeled after CEP's "structural contract testing" approach — we test
|
|
11
|
+
* the shape and quality of the encoded knowledge, not prompt effectiveness.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
15
|
+
import { PlaybookLibrary, createPlaybookLibrary } from '../../src/memory/playbook.js';
|
|
16
|
+
import { loadCuratedPlaybooks, BUNDLED_SEED_PACK_DIR } from '../../src/memory/curated-loader.js';
|
|
17
|
+
import { createSqlitePersistence } from '../../src/persistence/index.js';
|
|
18
|
+
import { textSimilarity } from '../../src/utils/similarity.js';
|
|
19
|
+
import type { Playbook } from '../../src/types/playbook.js';
|
|
20
|
+
import { mkdtemp, rm, readdir, readFile } from 'node:fs/promises';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { tmpdir } from 'node:os';
|
|
23
|
+
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Setup: load all playbooks once
|
|
26
|
+
// ============================================================================
|
|
27
|
+
|
|
28
|
+
let tempDir: string;
|
|
29
|
+
let library: PlaybookLibrary;
|
|
30
|
+
let persistence: ReturnType<typeof createSqlitePersistence>;
|
|
31
|
+
let allPlaybooks: Playbook[];
|
|
32
|
+
|
|
33
|
+
beforeAll(async () => {
|
|
34
|
+
tempDir = await mkdtemp(join(tmpdir(), 'pb-quality-'));
|
|
35
|
+
persistence = createSqlitePersistence({ baseDir: tempDir });
|
|
36
|
+
await persistence.init();
|
|
37
|
+
library = createPlaybookLibrary(persistence);
|
|
38
|
+
await library.init();
|
|
39
|
+
await loadCuratedPlaybooks(BUNDLED_SEED_PACK_DIR, library);
|
|
40
|
+
allPlaybooks = await library.getAll();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
afterAll(async () => {
|
|
44
|
+
await library.close();
|
|
45
|
+
persistence.close();
|
|
46
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// 1. Structural completeness
|
|
51
|
+
// ============================================================================
|
|
52
|
+
|
|
53
|
+
describe('Structural completeness', () => {
|
|
54
|
+
it('should have exactly 25 playbooks', () => {
|
|
55
|
+
expect(allPlaybooks.length).toBe(25);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('every playbook should have a unique name', () => {
|
|
59
|
+
const names = allPlaybooks.map(p => p.name);
|
|
60
|
+
expect(new Set(names).size).toBe(names.length);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('every playbook should have all required structural fields', () => {
|
|
64
|
+
for (const p of allPlaybooks) {
|
|
65
|
+
// Applicability
|
|
66
|
+
expect(p.applicability.situations.length, `${p.name}: needs situations`).toBeGreaterThanOrEqual(1);
|
|
67
|
+
expect(p.applicability.domains.length, `${p.name}: needs domains`).toBeGreaterThanOrEqual(1);
|
|
68
|
+
expect(p.applicability.triggers.length, `${p.name}: needs triggers`).toBeGreaterThanOrEqual(1);
|
|
69
|
+
|
|
70
|
+
// Guidance
|
|
71
|
+
expect(p.guidance.strategy.length, `${p.name}: strategy too short`).toBeGreaterThan(20);
|
|
72
|
+
expect(p.guidance.tactics.length, `${p.name}: needs ≥2 tactics`).toBeGreaterThanOrEqual(2);
|
|
73
|
+
|
|
74
|
+
// Verification
|
|
75
|
+
expect(p.verification.successIndicators.length, `${p.name}: needs success indicators`).toBeGreaterThanOrEqual(1);
|
|
76
|
+
expect(p.verification.failureIndicators.length, `${p.name}: needs failure indicators`).toBeGreaterThanOrEqual(1);
|
|
77
|
+
|
|
78
|
+
// Provenance
|
|
79
|
+
expect(p.provenance?.origin, `${p.name}: origin should be curated`).toBe('curated');
|
|
80
|
+
expect(p.provenance?.curatedBy, `${p.name}: curatedBy mismatch`).toBe('compound-engineering');
|
|
81
|
+
|
|
82
|
+
// Confidence
|
|
83
|
+
expect(p.confidence, `${p.name}: confidence too low`).toBeGreaterThanOrEqual(0.7);
|
|
84
|
+
expect(p.confidence, `${p.name}: confidence too high`).toBeLessThanOrEqual(0.95);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('every situation should be a meaningful description (>10 chars)', () => {
|
|
89
|
+
for (const p of allPlaybooks) {
|
|
90
|
+
for (const situation of p.applicability.situations) {
|
|
91
|
+
expect(situation.length).toBeGreaterThan(10);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('every tactic should be actionable (>15 chars)', () => {
|
|
97
|
+
for (const p of allPlaybooks) {
|
|
98
|
+
for (const tactic of p.guidance.tactics) {
|
|
99
|
+
expect(tactic.length).toBeGreaterThan(15);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('every success/failure indicator should be specific (>10 chars)', () => {
|
|
105
|
+
for (const p of allPlaybooks) {
|
|
106
|
+
for (const indicator of p.verification.successIndicators) {
|
|
107
|
+
expect(indicator.length).toBeGreaterThan(10);
|
|
108
|
+
}
|
|
109
|
+
for (const indicator of p.verification.failureIndicators) {
|
|
110
|
+
expect(indicator.length).toBeGreaterThan(10);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// ============================================================================
|
|
117
|
+
// 2. Content quality
|
|
118
|
+
// ============================================================================
|
|
119
|
+
|
|
120
|
+
describe('Content quality', () => {
|
|
121
|
+
it('strategies should not be generic boilerplate', () => {
|
|
122
|
+
// Phrases that indicate a strategy is too vague to be useful.
|
|
123
|
+
// Note: a strategy *critiquing* these phrases (e.g., "transform 'be careful'
|
|
124
|
+
// into concrete checklists") is fine — we check that the strategy isn't ONLY this.
|
|
125
|
+
for (const p of allPlaybooks) {
|
|
126
|
+
const strategy = p.guidance.strategy;
|
|
127
|
+
// Strategy should be substantial, not a single vague sentence
|
|
128
|
+
expect(strategy.length, `${p.name}: strategy too short to be actionable`).toBeGreaterThan(50);
|
|
129
|
+
// Should contain at least one concrete noun (not just adjectives/adverbs)
|
|
130
|
+
expect(strategy).toMatch(/[a-z]/i);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('antiPatterns should exist for playbooks with complexity >= moderate', () => {
|
|
135
|
+
const complexPlaybooks = allPlaybooks.filter(
|
|
136
|
+
p => p.complexity === 'moderate' || p.complexity === 'complex',
|
|
137
|
+
);
|
|
138
|
+
// At least 80% should have anti-patterns
|
|
139
|
+
const withAntiPatterns = complexPlaybooks.filter(
|
|
140
|
+
p => p.applicability.antiPatterns.length > 0,
|
|
141
|
+
);
|
|
142
|
+
const ratio = withAntiPatterns.length / complexPlaybooks.length;
|
|
143
|
+
expect(ratio).toBeGreaterThanOrEqual(0.8);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('review-orchestration should reference sub-reviewers', () => {
|
|
147
|
+
const orch = allPlaybooks.find(p => p.name === 'review-orchestration')!;
|
|
148
|
+
const allText = [orch.guidance.strategy, ...orch.guidance.tactics].join(' ').toLowerCase();
|
|
149
|
+
|
|
150
|
+
// Should mention key sub-reviewer domains
|
|
151
|
+
expect(allText).toContain('correctness');
|
|
152
|
+
expect(allText).toContain('testing');
|
|
153
|
+
expect(allText).toContain('security');
|
|
154
|
+
expect(allText).toContain('performance');
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('systematic-execution should reference plan-based workflow', () => {
|
|
158
|
+
const exec = allPlaybooks.find(p => p.name === 'systematic-execution')!;
|
|
159
|
+
const allText = [exec.guidance.strategy, ...exec.guidance.tactics].join(' ').toLowerCase();
|
|
160
|
+
|
|
161
|
+
expect(allText).toContain('plan');
|
|
162
|
+
expect(allText).toContain('test');
|
|
163
|
+
expect(allText).toContain('commit');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('confidence-calibration should address uncertainty', () => {
|
|
167
|
+
const cal = allPlaybooks.find(p => p.name === 'confidence-calibration')!;
|
|
168
|
+
const allText = [
|
|
169
|
+
cal.guidance.strategy,
|
|
170
|
+
...cal.guidance.tactics,
|
|
171
|
+
...cal.applicability.situations,
|
|
172
|
+
].join(' ').toLowerCase();
|
|
173
|
+
|
|
174
|
+
expect(allText).toMatch(/confiden|uncertain|calibrat/);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// ============================================================================
|
|
179
|
+
// 3. Domain coverage
|
|
180
|
+
// ============================================================================
|
|
181
|
+
|
|
182
|
+
describe('Domain coverage', () => {
|
|
183
|
+
it('should cover the core CEP workflow phases', () => {
|
|
184
|
+
const allDomains = new Set(allPlaybooks.flatMap(p => p.applicability.domains));
|
|
185
|
+
|
|
186
|
+
// CEP's core loop: brainstorm → plan → execute → review → compound
|
|
187
|
+
expect(allDomains.has('brainstorming') || allDomains.has('requirements')).toBe(true);
|
|
188
|
+
expect(allDomains.has('planning') || allDomains.has('implementation-planning')).toBe(true);
|
|
189
|
+
expect(allDomains.has('execution') || allDomains.has('implementation')).toBe(true);
|
|
190
|
+
expect(allDomains.has('code-review') || allDomains.has('quality-assurance')).toBe(true);
|
|
191
|
+
expect(allDomains.has('knowledge-management') || allDomains.has('learning')).toBe(true);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('should have review playbooks covering all specialized dimensions', () => {
|
|
195
|
+
const reviewPlaybooks = allPlaybooks.filter(
|
|
196
|
+
p => p.name.includes('review') || p.applicability.domains.includes('code-review'),
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
const reviewNames = reviewPlaybooks.map(p => p.name);
|
|
200
|
+
|
|
201
|
+
// CEP's review dimensions
|
|
202
|
+
expect(reviewNames).toContain('correctness-review');
|
|
203
|
+
expect(reviewNames).toContain('testing-review');
|
|
204
|
+
expect(reviewNames).toContain('maintainability-review');
|
|
205
|
+
expect(reviewNames).toContain('security-review');
|
|
206
|
+
expect(reviewNames).toContain('performance-review');
|
|
207
|
+
expect(reviewNames).toContain('review-orchestration');
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('should have planning playbooks covering analysis and feasibility', () => {
|
|
211
|
+
const planPlaybooks = allPlaybooks.filter(
|
|
212
|
+
p => p.name.includes('plan') || p.applicability.domains.includes('planning'),
|
|
213
|
+
);
|
|
214
|
+
expect(planPlaybooks.length).toBeGreaterThanOrEqual(2);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('should have execution and debugging playbooks', () => {
|
|
218
|
+
const execNames = allPlaybooks.map(p => p.name);
|
|
219
|
+
expect(execNames).toContain('systematic-execution');
|
|
220
|
+
expect(execNames).toContain('bug-reproduction');
|
|
221
|
+
expect(execNames).toContain('error-recovery-patterns');
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
// ============================================================================
|
|
226
|
+
// 4. Non-redundancy
|
|
227
|
+
// ============================================================================
|
|
228
|
+
|
|
229
|
+
describe('Non-redundancy', () => {
|
|
230
|
+
it('no two playbooks should have strategy similarity > 0.85', () => {
|
|
231
|
+
const redundantPairs: Array<{ a: string; b: string; sim: number }> = [];
|
|
232
|
+
|
|
233
|
+
for (let i = 0; i < allPlaybooks.length; i++) {
|
|
234
|
+
for (let j = i + 1; j < allPlaybooks.length; j++) {
|
|
235
|
+
const sim = textSimilarity(
|
|
236
|
+
allPlaybooks[i].guidance.strategy,
|
|
237
|
+
allPlaybooks[j].guidance.strategy,
|
|
238
|
+
);
|
|
239
|
+
if (sim > 0.85) {
|
|
240
|
+
redundantPairs.push({
|
|
241
|
+
a: allPlaybooks[i].name,
|
|
242
|
+
b: allPlaybooks[j].name,
|
|
243
|
+
sim,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
expect(redundantPairs).toEqual([]);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it('no two playbooks should have identical situations', () => {
|
|
253
|
+
for (let i = 0; i < allPlaybooks.length; i++) {
|
|
254
|
+
for (let j = i + 1; j < allPlaybooks.length; j++) {
|
|
255
|
+
const sitsA = new Set(allPlaybooks[i].applicability.situations);
|
|
256
|
+
const sitsB = new Set(allPlaybooks[j].applicability.situations);
|
|
257
|
+
const overlap = [...sitsA].filter(s => sitsB.has(s));
|
|
258
|
+
expect(overlap).toEqual([]);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// ============================================================================
|
|
265
|
+
// 5. Retrieval effectiveness
|
|
266
|
+
// ============================================================================
|
|
267
|
+
|
|
268
|
+
describe('Retrieval effectiveness', () => {
|
|
269
|
+
// For each expected query, the top result should contain the expected playbook
|
|
270
|
+
const retrievalTests: Array<{ query: string; expectedTop: string; desc: string }> = [
|
|
271
|
+
{
|
|
272
|
+
query: 'code review before PR',
|
|
273
|
+
expectedTop: 'review-orchestration',
|
|
274
|
+
desc: 'code review → review-orchestration',
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
query: 'check for security vulnerabilities in code',
|
|
278
|
+
expectedTop: 'security-review',
|
|
279
|
+
desc: 'security check → security-review',
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
query: 'optimize slow database queries',
|
|
283
|
+
expectedTop: 'performance-review',
|
|
284
|
+
desc: 'perf optimization → performance-review',
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
query: 'create implementation plan for feature',
|
|
288
|
+
expectedTop: 'implementation-planning',
|
|
289
|
+
desc: 'feature planning → implementation-planning',
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
query: 'reproduce a bug from issue report',
|
|
293
|
+
expectedTop: 'bug-reproduction',
|
|
294
|
+
desc: 'bug repro → bug-reproduction',
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
query: 'deploy and verify production release',
|
|
298
|
+
expectedTop: 'deployment-verification',
|
|
299
|
+
desc: 'deploy verify → deployment-verification',
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
query: 'gather requirements and brainstorm approach',
|
|
303
|
+
expectedTop: 'brainstorm-requirements',
|
|
304
|
+
desc: 'requirements → brainstorm-requirements',
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
query: 'document lessons learned from solved problem',
|
|
308
|
+
expectedTop: 'knowledge-compounding',
|
|
309
|
+
desc: 'learnings → knowledge-compounding',
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
query: 'handle errors and recover gracefully',
|
|
313
|
+
expectedTop: 'error-recovery-patterns',
|
|
314
|
+
desc: 'error recovery → error-recovery-patterns',
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
query: 'data migration safety and rollback',
|
|
318
|
+
expectedTop: 'data-migration-safety',
|
|
319
|
+
desc: 'data migration → data-migration-safety',
|
|
320
|
+
},
|
|
321
|
+
];
|
|
322
|
+
|
|
323
|
+
it.each(retrievalTests)(
|
|
324
|
+
'should retrieve $desc',
|
|
325
|
+
async ({ query, expectedTop }) => {
|
|
326
|
+
const matches = await library.findMatching(query, { k: 5 });
|
|
327
|
+
|
|
328
|
+
expect(matches.length).toBeGreaterThan(0);
|
|
329
|
+
|
|
330
|
+
// Expected playbook should be in top 3 results
|
|
331
|
+
const top3Names = matches.slice(0, 3).map(m => m.playbook.name);
|
|
332
|
+
expect(top3Names).toContain(expectedTop);
|
|
333
|
+
},
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
it('review sub-types should rank higher than orchestrator for specific queries', async () => {
|
|
337
|
+
// When asking about "testing coverage gaps", testing-review should outrank review-orchestration
|
|
338
|
+
const matches = await library.findMatching('testing coverage gaps and missing tests', { k: 5 });
|
|
339
|
+
const names = matches.map(m => m.playbook.name);
|
|
340
|
+
const testingIdx = names.indexOf('testing-review');
|
|
341
|
+
const orchIdx = names.indexOf('review-orchestration');
|
|
342
|
+
|
|
343
|
+
if (testingIdx !== -1 && orchIdx !== -1) {
|
|
344
|
+
expect(testingIdx).toBeLessThan(orchIdx);
|
|
345
|
+
} else {
|
|
346
|
+
// At minimum, testing-review should be in results
|
|
347
|
+
expect(names).toContain('testing-review');
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
it('anti-patterns should exclude inappropriate playbooks', async () => {
|
|
352
|
+
// review-orchestration has anti-pattern: "Reviewing trivial formatting-only changes"
|
|
353
|
+
// Use an exact-enough query to trigger the 0.7 similarity threshold
|
|
354
|
+
const matches = await library.findMatching(
|
|
355
|
+
'Reviewing trivial formatting-only changes',
|
|
356
|
+
{ k: 5, excludeAntiPatterns: true },
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
const names = matches.map(m => m.playbook.name);
|
|
360
|
+
// review-orchestration should NOT appear (anti-pattern match at ≥0.7 similarity)
|
|
361
|
+
expect(names).not.toContain('review-orchestration');
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
// ============================================================================
|
|
366
|
+
// 6. JSON file integrity
|
|
367
|
+
// ============================================================================
|
|
368
|
+
|
|
369
|
+
describe('JSON file integrity', () => {
|
|
370
|
+
it('every .json file in seed pack should parse without error', async () => {
|
|
371
|
+
const files = await readdir(BUNDLED_SEED_PACK_DIR);
|
|
372
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
373
|
+
|
|
374
|
+
expect(jsonFiles.length).toBe(25);
|
|
375
|
+
|
|
376
|
+
for (const file of jsonFiles) {
|
|
377
|
+
const content = await readFile(join(BUNDLED_SEED_PACK_DIR, file), 'utf-8');
|
|
378
|
+
expect(() => JSON.parse(content)).not.toThrow();
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
it('file names should match playbook names', async () => {
|
|
383
|
+
const files = await readdir(BUNDLED_SEED_PACK_DIR);
|
|
384
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
385
|
+
|
|
386
|
+
for (const file of jsonFiles) {
|
|
387
|
+
const content = await readFile(join(BUNDLED_SEED_PACK_DIR, file), 'utf-8');
|
|
388
|
+
const parsed = JSON.parse(content);
|
|
389
|
+
const expectedName = file.replace('.json', '');
|
|
390
|
+
expect(parsed.name).toBe(expectedName);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
it('all playbooks should have consistent curatedBy field', async () => {
|
|
395
|
+
const files = await readdir(BUNDLED_SEED_PACK_DIR);
|
|
396
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
397
|
+
|
|
398
|
+
for (const file of jsonFiles) {
|
|
399
|
+
const content = await readFile(join(BUNDLED_SEED_PACK_DIR, file), 'utf-8');
|
|
400
|
+
const parsed = JSON.parse(content);
|
|
401
|
+
expect(parsed.curatedBy).toBe('compound-engineering');
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
it('confidence values should be within expected range', async () => {
|
|
406
|
+
const files = await readdir(BUNDLED_SEED_PACK_DIR);
|
|
407
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
408
|
+
|
|
409
|
+
for (const file of jsonFiles) {
|
|
410
|
+
const content = await readFile(join(BUNDLED_SEED_PACK_DIR, file), 'utf-8');
|
|
411
|
+
const parsed = JSON.parse(content);
|
|
412
|
+
expect(parsed.confidence).toBeGreaterThanOrEqual(0.75);
|
|
413
|
+
expect(parsed.confidence).toBeLessThanOrEqual(0.90);
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
it('complexity values should be valid enum values', async () => {
|
|
418
|
+
const validComplexities = ['simple', 'moderate', 'complex'];
|
|
419
|
+
const files = await readdir(BUNDLED_SEED_PACK_DIR);
|
|
420
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
421
|
+
|
|
422
|
+
for (const file of jsonFiles) {
|
|
423
|
+
const content = await readFile(join(BUNDLED_SEED_PACK_DIR, file), 'utf-8');
|
|
424
|
+
const parsed = JSON.parse(content);
|
|
425
|
+
if (parsed.complexity) {
|
|
426
|
+
expect(validComplexities).toContain(parsed.complexity);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
});
|