@codemcp/ade 0.2.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/.ade/skills/adr-nygard/SKILL.md +45 -0
- package/.ade/skills/conventional-commits/SKILL.md +36 -0
- package/.ade/skills/tanstack-architecture/SKILL.md +25 -0
- package/.ade/skills/tanstack-code/SKILL.md +25 -0
- package/.ade/skills/tanstack-design/SKILL.md +24 -0
- package/.ade/skills/tanstack-testing/SKILL.md +24 -0
- package/.agentskills/skills/adr-nygard/SKILL.md +45 -0
- package/.agentskills/skills/commit/SKILL.md +20 -0
- package/.agentskills/skills/tdd/SKILL.md +10 -0
- package/.beads/README.md +85 -0
- package/.beads/config.yaml +63 -0
- package/.beads/interactions.jsonl +0 -0
- package/.beads/issues.jsonl +46 -0
- package/.beads/last-touched +1 -0
- package/.beads/metadata.json +4 -0
- package/.claude/settings.json +16 -0
- package/.claude/skills/extending-catalog/SKILL.md +41 -0
- package/.cursor/mcp.json +16 -0
- package/.cursor/rules/ade.mdc +10 -0
- package/.github/agents/ade.agent.md +28 -0
- package/.github/copilot-instructions.md +11 -0
- package/.github/workflows/pr.yml +38 -0
- package/.github/workflows/release.yml +124 -0
- package/.husky/post-checkout +2 -0
- package/.husky/post-merge +2 -0
- package/.husky/pre-commit +2 -0
- package/.husky/pre-push +8 -0
- package/.kiro/agents/ade.json +20 -0
- package/.kiro/settings/mcp.json +14 -0
- package/.knowledge/.prettierignore +1 -0
- package/.knowledge/config.yaml +9 -0
- package/.lintstagedrc.js +4 -0
- package/.mcp.json +20 -0
- package/.opencode/agents/ade.md +118 -0
- package/.prettierignore +2 -0
- package/.prettierrc.yaml +3 -0
- package/.vibe/beads-state-ade-autonomy-facet-46zodk.json +29 -0
- package/.vibe/beads-state-ade-fix-no-arch-selected-hvfiio.json +34 -0
- package/.vibe/development-plan-autonomy-facet.md +214 -0
- package/.vibe/development-plan-fix-no-arch-selected.md +103 -0
- package/.vscode/mcp.json +24 -0
- package/LICENSE +21 -0
- package/README.md +293 -0
- package/config.lock.yaml +118 -0
- package/config.yaml +10 -0
- package/docs/CLI-PRD.md +251 -0
- package/docs/CLI-design.md +646 -0
- package/docs/adrs/0001-tui-framework-selection.md +77 -0
- package/eslint.config.mjs +38 -0
- package/opencode.json +17 -0
- package/package.json +79 -0
- package/packages/cli/.prettierignore +1 -0
- package/packages/cli/dist/commands/install.js +39 -0
- package/packages/cli/dist/commands/setup.js +177 -0
- package/packages/cli/dist/index.js +43 -0
- package/packages/cli/dist/knowledge-installer.js +38 -0
- package/packages/cli/dist/version.js +1 -0
- package/packages/cli/eslint.config.mjs +40 -0
- package/packages/cli/nodemon.json +7 -0
- package/packages/cli/package.json +40 -0
- package/packages/cli/src/commands/conventions.integration.spec.ts +267 -0
- package/packages/cli/src/commands/install.integration.spec.ts +123 -0
- package/packages/cli/src/commands/install.spec.ts +169 -0
- package/packages/cli/src/commands/install.ts +63 -0
- package/packages/cli/src/commands/knowledge.integration.spec.ts +129 -0
- package/packages/cli/src/commands/setup.integration.spec.ts +148 -0
- package/packages/cli/src/commands/setup.spec.ts +442 -0
- package/packages/cli/src/commands/setup.ts +252 -0
- package/packages/cli/src/index.ts +52 -0
- package/packages/cli/src/knowledge-installer.spec.ts +111 -0
- package/packages/cli/src/knowledge-installer.ts +54 -0
- package/packages/cli/src/version.ts +1 -0
- package/packages/cli/tsconfig.build.json +8 -0
- package/packages/cli/tsconfig.json +10 -0
- package/packages/cli/tsconfig.vitest.json +7 -0
- package/packages/cli/vitest.config.ts +5 -0
- package/packages/core/.prettierignore +1 -0
- package/packages/core/eslint.config.mjs +40 -0
- package/packages/core/nodemon.json +7 -0
- package/packages/core/package.json +34 -0
- package/packages/core/src/catalog/catalog.spec.ts +570 -0
- package/packages/core/src/catalog/facets/architecture.ts +438 -0
- package/packages/core/src/catalog/facets/autonomy.ts +106 -0
- package/packages/core/src/catalog/facets/backpressure.ts +143 -0
- package/packages/core/src/catalog/facets/practices.ts +173 -0
- package/packages/core/src/catalog/facets/process.ts +50 -0
- package/packages/core/src/catalog/index.ts +93 -0
- package/packages/core/src/config.spec.ts +165 -0
- package/packages/core/src/config.ts +39 -0
- package/packages/core/src/index.ts +55 -0
- package/packages/core/src/registry.spec.ts +145 -0
- package/packages/core/src/registry.ts +70 -0
- package/packages/core/src/resolver.spec.ts +626 -0
- package/packages/core/src/resolver.ts +214 -0
- package/packages/core/src/types.ts +179 -0
- package/packages/core/src/writers/git-hooks.ts +9 -0
- package/packages/core/src/writers/instruction.spec.ts +42 -0
- package/packages/core/src/writers/instruction.ts +8 -0
- package/packages/core/src/writers/knowledge.spec.ts +26 -0
- package/packages/core/src/writers/knowledge.ts +15 -0
- package/packages/core/src/writers/permission-policy.ts +8 -0
- package/packages/core/src/writers/setup-note.ts +9 -0
- package/packages/core/src/writers/skills.spec.ts +109 -0
- package/packages/core/src/writers/skills.ts +9 -0
- package/packages/core/src/writers/workflows.spec.ts +72 -0
- package/packages/core/src/writers/workflows.ts +26 -0
- package/packages/core/tsconfig.build.json +8 -0
- package/packages/core/tsconfig.json +7 -0
- package/packages/core/tsconfig.vitest.json +7 -0
- package/packages/core/vitest.config.ts +5 -0
- package/packages/harnesses/.prettierignore +1 -0
- package/packages/harnesses/eslint.config.mjs +40 -0
- package/packages/harnesses/package.json +35 -0
- package/packages/harnesses/src/index.spec.ts +45 -0
- package/packages/harnesses/src/index.ts +47 -0
- package/packages/harnesses/src/permission-policy.ts +173 -0
- package/packages/harnesses/src/skills-installer.ts +54 -0
- package/packages/harnesses/src/types.ts +12 -0
- package/packages/harnesses/src/util.ts +221 -0
- package/packages/harnesses/src/writers/claude-code.spec.ts +320 -0
- package/packages/harnesses/src/writers/claude-code.ts +107 -0
- package/packages/harnesses/src/writers/cline.spec.ts +212 -0
- package/packages/harnesses/src/writers/cline.ts +24 -0
- package/packages/harnesses/src/writers/copilot.spec.ts +258 -0
- package/packages/harnesses/src/writers/copilot.ts +105 -0
- package/packages/harnesses/src/writers/cursor.spec.ts +219 -0
- package/packages/harnesses/src/writers/cursor.ts +95 -0
- package/packages/harnesses/src/writers/kiro.spec.ts +228 -0
- package/packages/harnesses/src/writers/kiro.ts +89 -0
- package/packages/harnesses/src/writers/opencode.spec.ts +258 -0
- package/packages/harnesses/src/writers/opencode.ts +67 -0
- package/packages/harnesses/src/writers/roo-code.spec.ts +197 -0
- package/packages/harnesses/src/writers/roo-code.ts +71 -0
- package/packages/harnesses/src/writers/universal.spec.ts +134 -0
- package/packages/harnesses/src/writers/universal.ts +84 -0
- package/packages/harnesses/src/writers/windsurf.spec.ts +178 -0
- package/packages/harnesses/src/writers/windsurf.ts +89 -0
- package/packages/harnesses/tsconfig.build.json +8 -0
- package/packages/harnesses/tsconfig.json +7 -0
- package/packages/harnesses/tsconfig.vitest.json +7 -0
- package/packages/harnesses/vitest.config.ts +5 -0
- package/pnpm-workspace.yaml +2 -0
- package/scripts/rename-packages.sh +23 -0
- package/skills-lock.json +20 -0
- package/tsconfig.base.json +25 -0
- package/tsconfig.build.json +7 -0
- package/tsconfig.json +13 -0
- package/turbo.json +47 -0
- package/vitest.config.ts +22 -0
- package/vitest.setup.ts +0 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
createRegistry,
|
|
4
|
+
registerProvisionWriter,
|
|
5
|
+
registerAgentWriter,
|
|
6
|
+
getProvisionWriter,
|
|
7
|
+
getAgentWriter,
|
|
8
|
+
createDefaultRegistry
|
|
9
|
+
} from "./registry.js";
|
|
10
|
+
import type {
|
|
11
|
+
ProvisionWriterDef,
|
|
12
|
+
AgentWriterDef,
|
|
13
|
+
LogicalConfig,
|
|
14
|
+
ResolutionContext
|
|
15
|
+
} from "./types.js";
|
|
16
|
+
|
|
17
|
+
describe("registry", () => {
|
|
18
|
+
describe("createRegistry", () => {
|
|
19
|
+
it("returns a registry with empty provisions and agents maps", () => {
|
|
20
|
+
const registry = createRegistry();
|
|
21
|
+
expect(registry.provisions.size).toBe(0);
|
|
22
|
+
expect(registry.agents.size).toBe(0);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("registerProvisionWriter / getProvisionWriter", () => {
|
|
27
|
+
it("registers a provision writer and retrieves it by id", async () => {
|
|
28
|
+
const registry = createRegistry();
|
|
29
|
+
|
|
30
|
+
const mockFragment: Partial<LogicalConfig> = {
|
|
31
|
+
instructions: ["use typescript strict mode"]
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const writer: ProvisionWriterDef = {
|
|
35
|
+
id: "skills",
|
|
36
|
+
write: vi.fn().mockResolvedValue(mockFragment)
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
registerProvisionWriter(registry, writer);
|
|
40
|
+
|
|
41
|
+
const found = getProvisionWriter(registry, "skills");
|
|
42
|
+
expect(found).toBeDefined();
|
|
43
|
+
expect(found!.id).toBe("skills");
|
|
44
|
+
|
|
45
|
+
// Behavioral: actually call write() and verify the result
|
|
46
|
+
const context: ResolutionContext = { resolved: {} };
|
|
47
|
+
const result = await found!.write({ lang: "ts" }, context);
|
|
48
|
+
expect(result).toEqual(mockFragment);
|
|
49
|
+
expect(writer.write).toHaveBeenCalledWith({ lang: "ts" }, context);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("overwrites a writer when registering with the same id", async () => {
|
|
53
|
+
const registry = createRegistry();
|
|
54
|
+
|
|
55
|
+
const first: ProvisionWriterDef = {
|
|
56
|
+
id: "workflows",
|
|
57
|
+
write: vi.fn().mockResolvedValue({ instructions: ["first"] })
|
|
58
|
+
};
|
|
59
|
+
const second: ProvisionWriterDef = {
|
|
60
|
+
id: "workflows",
|
|
61
|
+
write: vi.fn().mockResolvedValue({ instructions: ["second"] })
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
registerProvisionWriter(registry, first);
|
|
65
|
+
registerProvisionWriter(registry, second);
|
|
66
|
+
|
|
67
|
+
const found = getProvisionWriter(registry, "workflows");
|
|
68
|
+
const result = await found!.write({}, { resolved: {} });
|
|
69
|
+
expect(result).toEqual({ instructions: ["second"] });
|
|
70
|
+
expect(first.write).not.toHaveBeenCalled();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("returns undefined for a non-existent provision writer", () => {
|
|
74
|
+
const registry = createRegistry();
|
|
75
|
+
const found = getProvisionWriter(registry, "does-not-exist");
|
|
76
|
+
expect(found).toBeUndefined();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe("registerAgentWriter / getAgentWriter", () => {
|
|
81
|
+
it("registers an agent writer and can call install()", async () => {
|
|
82
|
+
const registry = createRegistry();
|
|
83
|
+
|
|
84
|
+
const mockInstall = vi.fn().mockResolvedValue(undefined);
|
|
85
|
+
const agent: AgentWriterDef = {
|
|
86
|
+
id: "opencode",
|
|
87
|
+
install: mockInstall
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
registerAgentWriter(registry, agent);
|
|
91
|
+
|
|
92
|
+
const found = getAgentWriter(registry, "opencode");
|
|
93
|
+
expect(found).toBeDefined();
|
|
94
|
+
expect(found!.id).toBe("opencode");
|
|
95
|
+
|
|
96
|
+
// Behavioral: call install() and verify it was invoked correctly
|
|
97
|
+
const config: LogicalConfig = {
|
|
98
|
+
mcp_servers: [],
|
|
99
|
+
instructions: ["be helpful"],
|
|
100
|
+
cli_actions: [],
|
|
101
|
+
knowledge_sources: [],
|
|
102
|
+
skills: [],
|
|
103
|
+
git_hooks: [],
|
|
104
|
+
setup_notes: []
|
|
105
|
+
};
|
|
106
|
+
await found!.install(config, "/tmp/my-project");
|
|
107
|
+
expect(mockInstall).toHaveBeenCalledWith(config, "/tmp/my-project");
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("returns undefined for a non-existent agent writer", () => {
|
|
111
|
+
const registry = createRegistry();
|
|
112
|
+
const found = getAgentWriter(registry, "nope");
|
|
113
|
+
expect(found).toBeUndefined();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe("createDefaultRegistry", () => {
|
|
118
|
+
it("has all built-in provision writer IDs registered", () => {
|
|
119
|
+
const registry = createDefaultRegistry();
|
|
120
|
+
const expectedIds = [
|
|
121
|
+
"workflows",
|
|
122
|
+
"skills",
|
|
123
|
+
"knowledge",
|
|
124
|
+
"mcp-server",
|
|
125
|
+
"instruction",
|
|
126
|
+
"installable",
|
|
127
|
+
"git-hooks",
|
|
128
|
+
"setup-note",
|
|
129
|
+
"permission-policy"
|
|
130
|
+
];
|
|
131
|
+
for (const id of expectedIds) {
|
|
132
|
+
expect(
|
|
133
|
+
getProvisionWriter(registry, id),
|
|
134
|
+
`expected provision writer "${id}" to be registered`
|
|
135
|
+
).toBeDefined();
|
|
136
|
+
}
|
|
137
|
+
expect(registry.provisions.size).toBe(expectedIds.length);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("has no agent writers by default (moved to @ade/harnesses)", () => {
|
|
141
|
+
const registry = createDefaultRegistry();
|
|
142
|
+
expect(registry.agents.size).toBe(0);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
WriterRegistry,
|
|
3
|
+
ProvisionWriterDef,
|
|
4
|
+
AgentWriterDef
|
|
5
|
+
} from "./types.js";
|
|
6
|
+
import { instructionWriter } from "./writers/instruction.js";
|
|
7
|
+
import { workflowsWriter } from "./writers/workflows.js";
|
|
8
|
+
import { skillsWriter } from "./writers/skills.js";
|
|
9
|
+
import { knowledgeWriter } from "./writers/knowledge.js";
|
|
10
|
+
import { gitHooksWriter } from "./writers/git-hooks.js";
|
|
11
|
+
import { setupNoteWriter } from "./writers/setup-note.js";
|
|
12
|
+
import { permissionPolicyWriter } from "./writers/permission-policy.js";
|
|
13
|
+
|
|
14
|
+
export function createRegistry(): WriterRegistry {
|
|
15
|
+
return {
|
|
16
|
+
provisions: new Map(),
|
|
17
|
+
agents: new Map()
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function registerProvisionWriter(
|
|
22
|
+
registry: WriterRegistry,
|
|
23
|
+
writer: ProvisionWriterDef
|
|
24
|
+
): void {
|
|
25
|
+
registry.provisions.set(writer.id, writer);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function getProvisionWriter(
|
|
29
|
+
registry: WriterRegistry,
|
|
30
|
+
id: string
|
|
31
|
+
): ProvisionWriterDef | undefined {
|
|
32
|
+
return registry.provisions.get(id);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function registerAgentWriter(
|
|
36
|
+
registry: WriterRegistry,
|
|
37
|
+
agent: AgentWriterDef
|
|
38
|
+
): void {
|
|
39
|
+
registry.agents.set(agent.id, agent);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function getAgentWriter(
|
|
43
|
+
registry: WriterRegistry,
|
|
44
|
+
id: string
|
|
45
|
+
): AgentWriterDef | undefined {
|
|
46
|
+
return registry.agents.get(id);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function createDefaultRegistry(): WriterRegistry {
|
|
50
|
+
const registry = createRegistry();
|
|
51
|
+
|
|
52
|
+
registerProvisionWriter(registry, instructionWriter);
|
|
53
|
+
registerProvisionWriter(registry, workflowsWriter);
|
|
54
|
+
registerProvisionWriter(registry, skillsWriter);
|
|
55
|
+
|
|
56
|
+
registerProvisionWriter(registry, knowledgeWriter);
|
|
57
|
+
registerProvisionWriter(registry, gitHooksWriter);
|
|
58
|
+
registerProvisionWriter(registry, setupNoteWriter);
|
|
59
|
+
registerProvisionWriter(registry, permissionPolicyWriter);
|
|
60
|
+
|
|
61
|
+
// Stub writers for types not yet implemented
|
|
62
|
+
for (const id of ["mcp-server", "installable"]) {
|
|
63
|
+
registerProvisionWriter(registry, {
|
|
64
|
+
id,
|
|
65
|
+
write: async () => ({})
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return registry;
|
|
70
|
+
}
|