@codemcp/ade-core 0.0.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.
Files changed (71) hide show
  1. package/.prettierignore +1 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/.turbo/turbo-format.log +6 -0
  4. package/.turbo/turbo-lint.log +4 -0
  5. package/.turbo/turbo-test.log +21 -0
  6. package/.turbo/turbo-typecheck.log +4 -0
  7. package/LICENSE +21 -0
  8. package/dist/catalog/facets/architecture.d.ts +2 -0
  9. package/dist/catalog/facets/architecture.js +424 -0
  10. package/dist/catalog/facets/backpressure.d.ts +2 -0
  11. package/dist/catalog/facets/backpressure.js +123 -0
  12. package/dist/catalog/facets/practices.d.ts +2 -0
  13. package/dist/catalog/facets/practices.js +163 -0
  14. package/dist/catalog/facets/process.d.ts +2 -0
  15. package/dist/catalog/facets/process.js +47 -0
  16. package/dist/catalog/index.d.ts +14 -0
  17. package/dist/catalog/index.js +71 -0
  18. package/dist/config.d.ts +5 -0
  19. package/dist/config.js +29 -0
  20. package/dist/index.d.ts +12 -0
  21. package/dist/index.js +6 -0
  22. package/dist/registry.d.ts +7 -0
  23. package/dist/registry.js +41 -0
  24. package/dist/resolver.d.ts +7 -0
  25. package/dist/resolver.js +142 -0
  26. package/dist/types.d.ts +110 -0
  27. package/dist/types.js +2 -0
  28. package/dist/writers/git-hooks.d.ts +2 -0
  29. package/dist/writers/git-hooks.js +7 -0
  30. package/dist/writers/instruction.d.ts +2 -0
  31. package/dist/writers/instruction.js +6 -0
  32. package/dist/writers/knowledge.d.ts +2 -0
  33. package/dist/writers/knowledge.js +9 -0
  34. package/dist/writers/setup-note.d.ts +2 -0
  35. package/dist/writers/setup-note.js +7 -0
  36. package/dist/writers/skills.d.ts +2 -0
  37. package/dist/writers/skills.js +7 -0
  38. package/dist/writers/workflows.d.ts +2 -0
  39. package/dist/writers/workflows.js +16 -0
  40. package/eslint.config.mjs +40 -0
  41. package/nodemon.json +7 -0
  42. package/package.json +34 -0
  43. package/src/catalog/catalog.spec.ts +531 -0
  44. package/src/catalog/facets/architecture.ts +438 -0
  45. package/src/catalog/facets/backpressure.ts +143 -0
  46. package/src/catalog/facets/practices.ts +173 -0
  47. package/src/catalog/facets/process.ts +50 -0
  48. package/src/catalog/index.ts +86 -0
  49. package/src/config.spec.ts +165 -0
  50. package/src/config.ts +39 -0
  51. package/src/index.ts +49 -0
  52. package/src/registry.spec.ts +144 -0
  53. package/src/registry.ts +68 -0
  54. package/src/resolver.spec.ts +581 -0
  55. package/src/resolver.ts +170 -0
  56. package/src/types.ts +151 -0
  57. package/src/writers/git-hooks.ts +9 -0
  58. package/src/writers/instruction.spec.ts +42 -0
  59. package/src/writers/instruction.ts +8 -0
  60. package/src/writers/knowledge.spec.ts +26 -0
  61. package/src/writers/knowledge.ts +15 -0
  62. package/src/writers/setup-note.ts +9 -0
  63. package/src/writers/skills.spec.ts +109 -0
  64. package/src/writers/skills.ts +9 -0
  65. package/src/writers/workflows.spec.ts +72 -0
  66. package/src/writers/workflows.ts +26 -0
  67. package/tsconfig.build.json +8 -0
  68. package/tsconfig.json +7 -0
  69. package/tsconfig.tsbuildinfo +1 -0
  70. package/tsconfig.vitest.json +7 -0
  71. package/vitest.config.ts +5 -0
@@ -0,0 +1,144 @@
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 8 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
+ ];
130
+ for (const id of expectedIds) {
131
+ expect(
132
+ getProvisionWriter(registry, id),
133
+ `expected provision writer "${id}" to be registered`
134
+ ).toBeDefined();
135
+ }
136
+ expect(registry.provisions.size).toBe(8);
137
+ });
138
+
139
+ it("has no agent writers by default (moved to @ade/harnesses)", () => {
140
+ const registry = createDefaultRegistry();
141
+ expect(registry.agents.size).toBe(0);
142
+ });
143
+ });
144
+ });
@@ -0,0 +1,68 @@
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
+
13
+ export function createRegistry(): WriterRegistry {
14
+ return {
15
+ provisions: new Map(),
16
+ agents: new Map()
17
+ };
18
+ }
19
+
20
+ export function registerProvisionWriter(
21
+ registry: WriterRegistry,
22
+ writer: ProvisionWriterDef
23
+ ): void {
24
+ registry.provisions.set(writer.id, writer);
25
+ }
26
+
27
+ export function getProvisionWriter(
28
+ registry: WriterRegistry,
29
+ id: string
30
+ ): ProvisionWriterDef | undefined {
31
+ return registry.provisions.get(id);
32
+ }
33
+
34
+ export function registerAgentWriter(
35
+ registry: WriterRegistry,
36
+ agent: AgentWriterDef
37
+ ): void {
38
+ registry.agents.set(agent.id, agent);
39
+ }
40
+
41
+ export function getAgentWriter(
42
+ registry: WriterRegistry,
43
+ id: string
44
+ ): AgentWriterDef | undefined {
45
+ return registry.agents.get(id);
46
+ }
47
+
48
+ export function createDefaultRegistry(): WriterRegistry {
49
+ const registry = createRegistry();
50
+
51
+ registerProvisionWriter(registry, instructionWriter);
52
+ registerProvisionWriter(registry, workflowsWriter);
53
+ registerProvisionWriter(registry, skillsWriter);
54
+
55
+ registerProvisionWriter(registry, knowledgeWriter);
56
+ registerProvisionWriter(registry, gitHooksWriter);
57
+ registerProvisionWriter(registry, setupNoteWriter);
58
+
59
+ // Stub writers for types not yet implemented
60
+ for (const id of ["mcp-server", "installable"]) {
61
+ registerProvisionWriter(registry, {
62
+ id,
63
+ write: async () => ({})
64
+ });
65
+ }
66
+
67
+ return registry;
68
+ }