beth-copilot 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -1
- package/README.md +51 -62
- package/assets/beth-questioning.png +0 -0
- package/assets/yellowstone-beth.png +0 -0
- package/bin/cli.js +19 -410
- package/dist/__tests__/inject-skills.test.d.ts +9 -0
- package/dist/__tests__/inject-skills.test.d.ts.map +1 -0
- package/dist/__tests__/inject-skills.test.js +143 -0
- package/dist/__tests__/inject-skills.test.js.map +1 -0
- package/dist/__tests__/skills/disambiguation.test.d.ts +10 -0
- package/dist/__tests__/skills/disambiguation.test.d.ts.map +1 -0
- package/dist/__tests__/skills/disambiguation.test.js +192 -0
- package/dist/__tests__/skills/disambiguation.test.js.map +1 -0
- package/dist/__tests__/skills/hook-injection.test.d.ts +11 -0
- package/dist/__tests__/skills/hook-injection.test.d.ts.map +1 -0
- package/dist/__tests__/skills/hook-injection.test.js +173 -0
- package/dist/__tests__/skills/hook-injection.test.js.map +1 -0
- package/dist/__tests__/skills/mapping-completeness.test.d.ts +17 -0
- package/dist/__tests__/skills/mapping-completeness.test.d.ts.map +1 -0
- package/dist/__tests__/skills/mapping-completeness.test.js +281 -0
- package/dist/__tests__/skills/mapping-completeness.test.js.map +1 -0
- package/dist/__tests__/skills/pipeline-integration.test.d.ts +18 -0
- package/dist/__tests__/skills/pipeline-integration.test.d.ts.map +1 -0
- package/dist/__tests__/skills/pipeline-integration.test.js +234 -0
- package/dist/__tests__/skills/pipeline-integration.test.js.map +1 -0
- package/dist/__tests__/skills/skill-routing.test.d.ts +15 -0
- package/dist/__tests__/skills/skill-routing.test.d.ts.map +1 -0
- package/dist/__tests__/skills/skill-routing.test.js +723 -0
- package/dist/__tests__/skills/skill-routing.test.js.map +1 -0
- package/dist/__tests__/skills/trigger-coverage.test.d.ts +24 -0
- package/dist/__tests__/skills/trigger-coverage.test.d.ts.map +1 -0
- package/dist/__tests__/skills/trigger-coverage.test.js +746 -0
- package/dist/__tests__/skills/trigger-coverage.test.js.map +1 -0
- package/dist/__tests__/smoke.test.js +13 -0
- package/dist/__tests__/smoke.test.js.map +1 -1
- package/dist/__tests__/verify-skills.test.d.ts +9 -0
- package/dist/__tests__/verify-skills.test.d.ts.map +1 -0
- package/dist/__tests__/verify-skills.test.js +78 -0
- package/dist/__tests__/verify-skills.test.js.map +1 -0
- package/dist/cli/commands/beads.e2e.test.d.ts +4 -2
- package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -1
- package/dist/cli/commands/beads.e2e.test.js +97 -38
- package/dist/cli/commands/beads.e2e.test.js.map +1 -1
- package/dist/cli/commands/cli-edge-cases.e2e.test.js +1 -1
- package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -1
- package/dist/cli/commands/close.d.ts +11 -46
- package/dist/cli/commands/close.d.ts.map +1 -1
- package/dist/cli/commands/close.e2e.test.d.ts +4 -20
- package/dist/cli/commands/close.e2e.test.d.ts.map +1 -1
- package/dist/cli/commands/close.e2e.test.js +23 -204
- package/dist/cli/commands/close.e2e.test.js.map +1 -1
- package/dist/cli/commands/close.js +26 -240
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/close.test.d.ts +7 -9
- package/dist/cli/commands/close.test.d.ts.map +1 -1
- package/dist/cli/commands/close.test.js +44 -424
- package/dist/cli/commands/close.test.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +5 -22
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.e2e.test.js +3 -59
- package/dist/cli/commands/doctor.e2e.test.js.map +1 -1
- package/dist/cli/commands/doctor.js +38 -111
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/doctor.test.js +32 -234
- package/dist/cli/commands/doctor.test.js.map +1 -1
- package/dist/cli/commands/framework-isolation.test.d.ts +1 -1
- package/dist/cli/commands/framework-isolation.test.js +2 -3
- package/dist/cli/commands/framework-isolation.test.js.map +1 -1
- package/dist/cli/commands/help.e2e.test.js +1 -5
- package/dist/cli/commands/help.e2e.test.js.map +1 -1
- package/dist/cli/commands/init-logic.e2e.test.js +12 -2
- package/dist/cli/commands/init-logic.e2e.test.js.map +1 -1
- package/dist/cli/commands/init.test.js +4 -21
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/commands/land.d.ts +3 -15
- package/dist/cli/commands/land.d.ts.map +1 -1
- package/dist/cli/commands/land.js +13 -68
- package/dist/cli/commands/land.js.map +1 -1
- package/dist/cli/commands/land.test.d.ts +0 -1
- package/dist/cli/commands/land.test.d.ts.map +1 -1
- package/dist/cli/commands/land.test.js +2 -57
- package/dist/cli/commands/land.test.js.map +1 -1
- package/dist/cli/commands/mcp.e2e.test.js +3 -3
- package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
- package/dist/cli/commands/pipeline.e2e.test.js +23 -26
- package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.d.ts +2 -12
- package/dist/cli/commands/pre-push-guard.d.ts.map +1 -1
- package/dist/cli/commands/pre-push-guard.e2e.test.js +1 -1
- package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.js +2 -47
- package/dist/cli/commands/pre-push-guard.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.test.d.ts +0 -1
- package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -1
- package/dist/cli/commands/pre-push-guard.test.js +15 -98
- package/dist/cli/commands/pre-push-guard.test.js.map +1 -1
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +1 -1
- package/dist/cli/commands/quickstart-expanded.e2e.test.js +3 -30
- package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -1
- package/dist/cli/commands/quickstart.d.ts +0 -1
- package/dist/cli/commands/quickstart.d.ts.map +1 -1
- package/dist/cli/commands/quickstart.js +2 -60
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/quickstart.test.js +10 -104
- package/dist/cli/commands/quickstart.test.js.map +1 -1
- package/dist/cli/commands/update.d.ts +35 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.e2e.test.d.ts +24 -0
- package/dist/cli/commands/update.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/update.e2e.test.js +240 -0
- package/dist/cli/commands/update.e2e.test.js.map +1 -0
- package/dist/cli/commands/update.js +255 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/core/agents/frontmatter.test.js +1 -1
- package/dist/core/agents/frontmatter.test.js.map +1 -1
- package/dist/core/agents/handoffs.test.js +1 -1
- package/dist/core/agents/handoffs.test.js.map +1 -1
- package/dist/core/agents/loader.d.ts +4 -2
- package/dist/core/agents/loader.d.ts.map +1 -1
- package/dist/core/agents/loader.js +5 -3
- package/dist/core/agents/loader.js.map +1 -1
- package/dist/core/agents/loader.test.js +42 -4
- package/dist/core/agents/loader.test.js.map +1 -1
- package/dist/core/agents/suite.test.js +8 -7
- package/dist/core/agents/suite.test.js.map +1 -1
- package/dist/core/agents/tools.test.js +10 -8
- package/dist/core/agents/tools.test.js.map +1 -1
- package/dist/core/agents/types.test.js +1 -1
- package/dist/core/agents/types.test.js.map +1 -1
- package/dist/core/skills/loader.test.js +1 -1
- package/dist/core/skills/loader.test.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/pathValidation.d.ts +0 -5
- package/dist/lib/pathValidation.d.ts.map +1 -1
- package/dist/lib/pathValidation.js +0 -11
- package/dist/lib/pathValidation.js.map +1 -1
- package/dist/lib/pathValidation.test.js +2 -14
- package/dist/lib/pathValidation.test.js.map +1 -1
- package/package.json +3 -6
- package/sbom.json +259 -371
- package/templates/.github/agents/beth.agent.md +194 -122
- package/templates/.github/agents/developer.agent.md +30 -22
- package/templates/.github/agents/product-manager.agent.md +15 -6
- package/templates/.github/agents/researcher.agent.md +10 -7
- package/templates/.github/agents/security-reviewer.agent.md +16 -7
- package/templates/.github/agents/tester.agent.md +16 -8
- package/templates/.github/agents/ux-designer.agent.md +12 -9
- package/templates/.github/copilot-instructions.md +33 -4
- package/templates/.github/copilot-mcp-config.json +12 -0
- package/templates/.github/dependabot.yml +68 -0
- package/templates/.github/hooks/scripts/inject-skills.mjs +139 -0
- package/templates/.github/hooks/scripts/verify-skills.mjs +47 -0
- package/templates/.github/hooks/skill-enforcement.json +18 -0
- package/templates/.github/pull_request_template.md +48 -0
- package/templates/.github/skills/framer-components/SKILL.md +0 -0
- package/templates/.github/skills/prd/SKILL.md +0 -0
- package/templates/.github/skills/security-analysis/SKILL.md +798 -798
- package/templates/.github/skills/shadcn-ui/SKILL.md +561 -561
- package/templates/.github/skills/vercel-react-best-practices/AGENTS.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/SKILL.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-parallel.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-serialization.md +0 -0
- package/templates/.github/skills/web-design-guidelines/SKILL.md +0 -0
- package/templates/.vscode/settings.json +16 -16
- package/templates/AGENTS.md +59 -98
- package/templates/Backlog.md +80 -80
- package/assets/beth-portrait-small.txt +0 -13
- package/assets/beth-portrait.txt +0 -60
- package/bin/beth-animation.sh +0 -155
- package/bin/lib/animation.js +0 -189
- package/bin/lib/pathValidation.js +0 -233
- package/bin/lib/pathValidation.test.js +0 -280
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject-skills.test.js","sourceRoot":"","sources":["../../src/__tests__/inject-skills.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disambiguation Tests — Known Challenge Pairs
|
|
3
|
+
*
|
|
4
|
+
* These skill pairs share semantic space and can be confused by LLM inference.
|
|
5
|
+
* Tests verify structural differences that SHOULD enable correct disambiguation.
|
|
6
|
+
*
|
|
7
|
+
* Test plan reference: docs/E2E-SKILL-TESTS.md — Known Disambiguation Challenges
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=disambiguation.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disambiguation.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/skills/disambiguation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disambiguation Tests — Known Challenge Pairs
|
|
3
|
+
*
|
|
4
|
+
* These skill pairs share semantic space and can be confused by LLM inference.
|
|
5
|
+
* Tests verify structural differences that SHOULD enable correct disambiguation.
|
|
6
|
+
*
|
|
7
|
+
* Test plan reference: docs/E2E-SKILL-TESTS.md — Known Disambiguation Challenges
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from 'vitest';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
12
|
+
const PROJECT_ROOT = process.cwd();
|
|
13
|
+
const SKILLS_DIR = join(PROJECT_ROOT, '.github/skills');
|
|
14
|
+
/** Read a skill's SKILL.md content */
|
|
15
|
+
function readSkill(skillName) {
|
|
16
|
+
const path = join(SKILLS_DIR, skillName, 'SKILL.md');
|
|
17
|
+
return readFileSync(path, 'utf8');
|
|
18
|
+
}
|
|
19
|
+
/** Check if a skill directory exists */
|
|
20
|
+
function skillDirExists(skillName) {
|
|
21
|
+
return existsSync(join(SKILLS_DIR, skillName));
|
|
22
|
+
}
|
|
23
|
+
// ─── Pair 1: brainstorming vs ce:brainstorm ────────────────────────────────
|
|
24
|
+
describe('Disambiguation: brainstorming vs ce:brainstorm', () => {
|
|
25
|
+
it('both skills exist', () => {
|
|
26
|
+
expect(skillDirExists('brainstorming')).toBe(true);
|
|
27
|
+
expect(skillDirExists('ce:brainstorm')).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
it('brainstorming is freeform — triggers on natural language', () => {
|
|
30
|
+
const content = readSkill('brainstorming');
|
|
31
|
+
// Should trigger on conversational phrases, not slash commands
|
|
32
|
+
expect(content).toMatch(/brainstorm|think through|explore/i);
|
|
33
|
+
});
|
|
34
|
+
it('ce:brainstorm is a slash command workflow', () => {
|
|
35
|
+
const content = readSkill('ce:brainstorm');
|
|
36
|
+
// Should reference the /ce: prefix or pipeline structure
|
|
37
|
+
expect(content).toMatch(/ce:brainstorm|slash|workflow|pipeline/i);
|
|
38
|
+
});
|
|
39
|
+
it('they are distinct files with different content', () => {
|
|
40
|
+
const freeform = readSkill('brainstorming');
|
|
41
|
+
const slashCmd = readSkill('ce:brainstorm');
|
|
42
|
+
expect(freeform).not.toBe(slashCmd);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
// ─── Pair 2: compound-docs vs ce:compound ──────────────────────────────────
|
|
46
|
+
describe('Disambiguation: compound-docs vs ce:compound', () => {
|
|
47
|
+
it('both skills exist', () => {
|
|
48
|
+
expect(skillDirExists('compound-docs')).toBe(true);
|
|
49
|
+
expect(skillDirExists('ce:compound')).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it('compound-docs auto-detects from success phrases', () => {
|
|
52
|
+
const content = readSkill('compound-docs');
|
|
53
|
+
// Should trigger on natural completion phrases
|
|
54
|
+
expect(content).toMatch(/document|solution|worked|knowledge/i);
|
|
55
|
+
});
|
|
56
|
+
it('ce:compound is a slash command workflow', () => {
|
|
57
|
+
const content = readSkill('ce:compound');
|
|
58
|
+
expect(content).toMatch(/ce:compound|slash|workflow|compound/i);
|
|
59
|
+
});
|
|
60
|
+
it('they are distinct files with different content', () => {
|
|
61
|
+
const autoDocs = readSkill('compound-docs');
|
|
62
|
+
const slashCmd = readSkill('ce:compound');
|
|
63
|
+
expect(autoDocs).not.toBe(slashCmd);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
// ─── Pair 3: ce:plan vs deepen-plan ────────────────────────────────────────
|
|
67
|
+
describe('Disambiguation: ce:plan vs deepen-plan', () => {
|
|
68
|
+
it('both skills exist', () => {
|
|
69
|
+
expect(skillDirExists('ce:plan')).toBe(true);
|
|
70
|
+
expect(skillDirExists('deepen-plan')).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
it('ce:plan creates plans from scratch', () => {
|
|
73
|
+
const content = readSkill('ce:plan');
|
|
74
|
+
// Should focus on creation/transformation
|
|
75
|
+
expect(content).toMatch(/plan|transform|create|structure/i);
|
|
76
|
+
});
|
|
77
|
+
it('deepen-plan enriches existing plans', () => {
|
|
78
|
+
const content = readSkill('deepen-plan');
|
|
79
|
+
// Should focus on enhancement/enrichment
|
|
80
|
+
expect(content).toMatch(/enhance|deepen|research|depth|enrich/i);
|
|
81
|
+
});
|
|
82
|
+
it('they are distinct files with different content', () => {
|
|
83
|
+
const create = readSkill('ce:plan');
|
|
84
|
+
const deepen = readSkill('deepen-plan');
|
|
85
|
+
expect(create).not.toBe(deepen);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
// ─── Pair 4: ce:review vs document-review ──────────────────────────────────
|
|
89
|
+
describe('Disambiguation: ce:review vs document-review', () => {
|
|
90
|
+
it('both skills exist', () => {
|
|
91
|
+
expect(skillDirExists('ce:review')).toBe(true);
|
|
92
|
+
expect(skillDirExists('document-review')).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it('ce:review focuses on code review', () => {
|
|
95
|
+
const content = readSkill('ce:review');
|
|
96
|
+
expect(content).toMatch(/code|review|multi-agent|analysis/i);
|
|
97
|
+
});
|
|
98
|
+
it('document-review focuses on markdown/document review', () => {
|
|
99
|
+
const content = readSkill('document-review');
|
|
100
|
+
expect(content).toMatch(/document|brainstorm|plan|refine/i);
|
|
101
|
+
});
|
|
102
|
+
it('they are distinct files with different content', () => {
|
|
103
|
+
const codeReview = readSkill('ce:review');
|
|
104
|
+
const docReview = readSkill('document-review');
|
|
105
|
+
expect(codeReview).not.toBe(docReview);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
// ─── Pair 5: resolve_parallel vs resolve_todo_parallel vs resolve-pr-parallel
|
|
109
|
+
describe('Disambiguation: resolve_parallel vs resolve_todo_parallel vs resolve-pr-parallel', () => {
|
|
110
|
+
it('all three skills exist', () => {
|
|
111
|
+
expect(skillDirExists('resolve_parallel')).toBe(true);
|
|
112
|
+
expect(skillDirExists('resolve_todo_parallel')).toBe(true);
|
|
113
|
+
expect(skillDirExists('resolve-pr-parallel')).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
it('resolve_parallel targets code TODOs', () => {
|
|
116
|
+
const content = readSkill('resolve_parallel');
|
|
117
|
+
expect(content).toMatch(/TODO|FIXME|code|codebase/i);
|
|
118
|
+
});
|
|
119
|
+
it('resolve_todo_parallel targets CLI todos', () => {
|
|
120
|
+
const content = readSkill('resolve_todo_parallel');
|
|
121
|
+
expect(content).toMatch(/todo|pending|CLI|list/i);
|
|
122
|
+
});
|
|
123
|
+
it('resolve-pr-parallel targets PR review comments', () => {
|
|
124
|
+
const content = readSkill('resolve-pr-parallel');
|
|
125
|
+
expect(content).toMatch(/PR|pull request|review|comment/i);
|
|
126
|
+
});
|
|
127
|
+
it('all three are distinct files', () => {
|
|
128
|
+
const code = readSkill('resolve_parallel');
|
|
129
|
+
const todo = readSkill('resolve_todo_parallel');
|
|
130
|
+
const pr = readSkill('resolve-pr-parallel');
|
|
131
|
+
expect(code).not.toBe(todo);
|
|
132
|
+
expect(code).not.toBe(pr);
|
|
133
|
+
expect(todo).not.toBe(pr);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
// ─── Pair 6: lfg vs slfg ──────────────────────────────────────────────────
|
|
137
|
+
describe('Disambiguation: lfg vs slfg', () => {
|
|
138
|
+
it('both skills exist', () => {
|
|
139
|
+
expect(skillDirExists('lfg')).toBe(true);
|
|
140
|
+
expect(skillDirExists('slfg')).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
it('lfg is sequential execution', () => {
|
|
143
|
+
const content = readSkill('lfg');
|
|
144
|
+
expect(content).toMatch(/sequential|execute|work plan|step/i);
|
|
145
|
+
});
|
|
146
|
+
it('slfg is swarm/parallel execution', () => {
|
|
147
|
+
const content = readSkill('slfg');
|
|
148
|
+
expect(content).toMatch(/swarm|parallel|concurrent/i);
|
|
149
|
+
});
|
|
150
|
+
it('they are distinct files with different content', () => {
|
|
151
|
+
const sequential = readSkill('lfg');
|
|
152
|
+
const parallel = readSkill('slfg');
|
|
153
|
+
expect(sequential).not.toBe(parallel);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
// ─── Cross-pair integrity ──────────────────────────────────────────────────
|
|
157
|
+
describe('Disambiguation: cross-pair structural integrity', () => {
|
|
158
|
+
const ALL_DISAMBIGUATION_SKILLS = [
|
|
159
|
+
'brainstorming', 'ce:brainstorm',
|
|
160
|
+
'compound-docs', 'ce:compound',
|
|
161
|
+
'ce:plan', 'deepen-plan',
|
|
162
|
+
'ce:review', 'document-review',
|
|
163
|
+
'resolve_parallel', 'resolve_todo_parallel', 'resolve-pr-parallel',
|
|
164
|
+
'lfg', 'slfg',
|
|
165
|
+
];
|
|
166
|
+
it('none of the disambiguation skills are missing', () => {
|
|
167
|
+
for (const skill of ALL_DISAMBIGUATION_SKILLS) {
|
|
168
|
+
expect(skillDirExists(skill)).toBe(true);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
it('all disambiguation skill files are non-empty', () => {
|
|
172
|
+
for (const skill of ALL_DISAMBIGUATION_SKILLS) {
|
|
173
|
+
const content = readSkill(skill);
|
|
174
|
+
expect(content.length).toBeGreaterThan(0);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
it('no two skills in any pair have identical content', () => {
|
|
178
|
+
const pairs = [
|
|
179
|
+
['brainstorming', 'ce:brainstorm'],
|
|
180
|
+
['compound-docs', 'ce:compound'],
|
|
181
|
+
['ce:plan', 'deepen-plan'],
|
|
182
|
+
['ce:review', 'document-review'],
|
|
183
|
+
['lfg', 'slfg'],
|
|
184
|
+
];
|
|
185
|
+
for (const [a, b] of pairs) {
|
|
186
|
+
const contentA = readSkill(a);
|
|
187
|
+
const contentB = readSkill(b);
|
|
188
|
+
expect(contentA).not.toBe(contentB);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=disambiguation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disambiguation.test.js","sourceRoot":"","sources":["../../../src/__tests__/skills/disambiguation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category 1: Hook-Enforced Mandatory Skills (deterministic injection tests)
|
|
3
|
+
*
|
|
4
|
+
* These skills are deterministically injected by inject-skills.mjs.
|
|
5
|
+
* No prompt inference needed — the hook fires on agent_type alone.
|
|
6
|
+
* Tests verify hook output, not LLM behavior.
|
|
7
|
+
*
|
|
8
|
+
* Test plan reference: docs/E2E-SKILL-TESTS.md — Category 1 (tests 1–9)
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=hook-injection.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-injection.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/skills/hook-injection.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category 1: Hook-Enforced Mandatory Skills (deterministic injection tests)
|
|
3
|
+
*
|
|
4
|
+
* These skills are deterministically injected by inject-skills.mjs.
|
|
5
|
+
* No prompt inference needed — the hook fires on agent_type alone.
|
|
6
|
+
* Tests verify hook output, not LLM behavior.
|
|
7
|
+
*
|
|
8
|
+
* Test plan reference: docs/E2E-SKILL-TESTS.md — Category 1 (tests 1–9)
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect } from 'vitest';
|
|
11
|
+
import { execFileSync } from 'node:child_process';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { existsSync } from 'node:fs';
|
|
14
|
+
const SCRIPT_PATH = join(process.cwd(), '.github/hooks/scripts/inject-skills.mjs');
|
|
15
|
+
const PROJECT_ROOT = process.cwd();
|
|
16
|
+
/** Helper: pipe JSON input to inject-skills.mjs and parse the JSON output */
|
|
17
|
+
function runHook(input) {
|
|
18
|
+
const result = execFileSync('node', [SCRIPT_PATH], {
|
|
19
|
+
input: JSON.stringify(input),
|
|
20
|
+
encoding: 'utf8',
|
|
21
|
+
cwd: PROJECT_ROOT,
|
|
22
|
+
timeout: 10000,
|
|
23
|
+
});
|
|
24
|
+
return JSON.parse(result);
|
|
25
|
+
}
|
|
26
|
+
/** Helper: extract additionalContext string from hook output */
|
|
27
|
+
function getContext(agentType) {
|
|
28
|
+
const output = runHook({ agent_type: agentType, cwd: PROJECT_ROOT });
|
|
29
|
+
return output.hookSpecificOutput?.additionalContext ?? '';
|
|
30
|
+
}
|
|
31
|
+
const HOOK_TEST_MATRIX = [
|
|
32
|
+
{
|
|
33
|
+
id: 1,
|
|
34
|
+
skill: 'web-design-guidelines',
|
|
35
|
+
skillPath: '.github/skills/web-design-guidelines/SKILL.md',
|
|
36
|
+
agent: 'ux-designer',
|
|
37
|
+
enforcement: 'inject',
|
|
38
|
+
testPrompt: 'Review the login page for accessibility compliance',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 2,
|
|
42
|
+
skill: 'framer-components',
|
|
43
|
+
skillPath: '.github/skills/framer-components/SKILL.md',
|
|
44
|
+
agent: 'ux-designer',
|
|
45
|
+
enforcement: 'readFile',
|
|
46
|
+
testPrompt: 'Create a Framer component with property controls for a card',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 3,
|
|
50
|
+
skill: 'ui-ux-pro-max',
|
|
51
|
+
skillPath: '.github/prompts/ui-ux-pro-max/PROMPT.md',
|
|
52
|
+
agent: 'ux-designer',
|
|
53
|
+
enforcement: 'readFile',
|
|
54
|
+
testPrompt: 'Design a color palette and style guide for the dashboard',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 4,
|
|
58
|
+
skill: 'vercel-react-best-practices',
|
|
59
|
+
skillPath: '.github/skills/vercel-react-best-practices/SKILL.md',
|
|
60
|
+
agent: 'developer',
|
|
61
|
+
enforcement: 'inject',
|
|
62
|
+
testPrompt: 'Optimize the data fetching in our Next.js product page',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: 5,
|
|
66
|
+
skill: 'shadcn-ui',
|
|
67
|
+
skillPath: '.github/skills/shadcn-ui/SKILL.md',
|
|
68
|
+
agent: 'developer',
|
|
69
|
+
enforcement: 'readFile',
|
|
70
|
+
testPrompt: 'Add a shadcn dialog component for the settings modal',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 6,
|
|
74
|
+
skill: 'vercel-react-best-practices/AGENTS.md',
|
|
75
|
+
skillPath: '.github/skills/vercel-react-best-practices/AGENTS.md',
|
|
76
|
+
agent: 'developer',
|
|
77
|
+
enforcement: 'readFile',
|
|
78
|
+
testPrompt: 'Refactor the server components to eliminate waterfalls',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: 7,
|
|
82
|
+
skill: 'prd',
|
|
83
|
+
skillPath: '.github/skills/prd/SKILL.md',
|
|
84
|
+
agent: 'product-manager',
|
|
85
|
+
enforcement: 'readFile',
|
|
86
|
+
testPrompt: 'Create a PRD for the user notifications feature',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 8,
|
|
90
|
+
skill: 'security-analysis',
|
|
91
|
+
skillPath: '.github/skills/security-analysis/SKILL.md',
|
|
92
|
+
agent: 'security-reviewer',
|
|
93
|
+
enforcement: 'readFile',
|
|
94
|
+
testPrompt: 'Run an OWASP security review on the auth module',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: 9,
|
|
98
|
+
skill: 'web-design-guidelines',
|
|
99
|
+
skillPath: '.github/skills/web-design-guidelines/SKILL.md',
|
|
100
|
+
agent: 'tester',
|
|
101
|
+
enforcement: 'inject',
|
|
102
|
+
testPrompt: 'Audit the checkout flow for WCAG 2.1 AA compliance',
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
// ─── Parameterized tests ───────────────────────────────────────────────────
|
|
106
|
+
describe('Category 1: Hook-Enforced Mandatory Skills', () => {
|
|
107
|
+
describe.each(HOOK_TEST_MATRIX)('Test #$id: $skill → $agent ($enforcement)', ({ skillPath, agent, enforcement }) => {
|
|
108
|
+
it('skill file exists on disk', () => {
|
|
109
|
+
const fullPath = join(PROJECT_ROOT, skillPath);
|
|
110
|
+
expect(existsSync(fullPath)).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
it('hook includes skill path in context', () => {
|
|
113
|
+
const ctx = getContext(agent);
|
|
114
|
+
expect(ctx).toContain(skillPath);
|
|
115
|
+
});
|
|
116
|
+
if (enforcement === 'inject') {
|
|
117
|
+
it('skill content is injected directly (not just referenced)', () => {
|
|
118
|
+
const ctx = getContext(agent);
|
|
119
|
+
expect(ctx).toContain('Skills loaded into context');
|
|
120
|
+
expect(ctx).toContain(skillPath);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (enforcement === 'readFile') {
|
|
124
|
+
it('skill is listed under readFile mandate', () => {
|
|
125
|
+
const ctx = getContext(agent);
|
|
126
|
+
expect(ctx).toContain('Skills to load via readFile');
|
|
127
|
+
expect(ctx).toContain(skillPath);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
it('context includes NON-NEGOTIABLE enforcement header', () => {
|
|
131
|
+
const ctx = getContext(agent);
|
|
132
|
+
expect(ctx).toContain('SKILL ENFORCEMENT');
|
|
133
|
+
expect(ctx).toContain('NON-NEGOTIABLE');
|
|
134
|
+
});
|
|
135
|
+
it('context identifies the correct agent type', () => {
|
|
136
|
+
const ctx = getContext(agent);
|
|
137
|
+
expect(ctx).toContain(`You are \`${agent}\``);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
// ─── Researcher (special case — capability, not domain knowledge) ──────
|
|
141
|
+
describe('Researcher: web-search injection', () => {
|
|
142
|
+
it('injects web-search skill into researcher context', () => {
|
|
143
|
+
const ctx = getContext('researcher');
|
|
144
|
+
expect(ctx).toContain('.github/skills/web-search/SKILL.md');
|
|
145
|
+
});
|
|
146
|
+
it('researcher has no readFile mandates', () => {
|
|
147
|
+
const ctx = getContext('researcher');
|
|
148
|
+
expect(ctx).not.toContain('Skills to load via readFile');
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
// ─── Cross-agent verification ──────────────────────────────────────────
|
|
152
|
+
describe('Cross-agent isolation', () => {
|
|
153
|
+
it('developer does NOT get ux-designer skills', () => {
|
|
154
|
+
const ctx = getContext('developer');
|
|
155
|
+
expect(ctx).not.toContain('framer-components');
|
|
156
|
+
expect(ctx).not.toContain('ui-ux-pro-max');
|
|
157
|
+
});
|
|
158
|
+
it('ux-designer does NOT get developer skills', () => {
|
|
159
|
+
const ctx = getContext('ux-designer');
|
|
160
|
+
expect(ctx).not.toContain('shadcn-ui');
|
|
161
|
+
expect(ctx).not.toContain('vercel-react-best-practices/AGENTS.md');
|
|
162
|
+
});
|
|
163
|
+
it('tester does NOT get readFile mandates', () => {
|
|
164
|
+
const ctx = getContext('tester');
|
|
165
|
+
expect(ctx).not.toContain('Skills to load via readFile');
|
|
166
|
+
});
|
|
167
|
+
it('product-manager does NOT get inject skills', () => {
|
|
168
|
+
const ctx = getContext('product-manager');
|
|
169
|
+
expect(ctx).not.toContain('Skills loaded into context');
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=hook-injection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-injection.test.js","sourceRoot":"","sources":["../../../src/__tests__/skills/hook-injection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-Skill Mapping Completeness Tests
|
|
3
|
+
*
|
|
4
|
+
* Verifies that the skill enforcement system is complete — no orphan skills,
|
|
5
|
+
* no missing mappings, no drift between what's on disk and what's in the hooks.
|
|
6
|
+
*
|
|
7
|
+
* What these tests catch:
|
|
8
|
+
* - New skills added to .github/skills/ but not added to the test matrix
|
|
9
|
+
* - Skills removed from disk but still referenced in inject-skills.mjs
|
|
10
|
+
* - inject-skills.mjs agent map drifting from copilot-instructions.md docs
|
|
11
|
+
* - Agent definitions (.agent.md) missing from .github/agents/
|
|
12
|
+
* - Skills with no SKILL.md file inside their directory
|
|
13
|
+
*
|
|
14
|
+
* Test plan reference: docs/E2E-SKILL-TESTS.md — "Implementation Notes"
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=mapping-completeness.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping-completeness.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/skills/mapping-completeness.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|