@devflow-tools/sdk 0.17.7 → 0.18.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.
Files changed (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -2
  3. package/dist/action-lease.d.ts +17 -0
  4. package/dist/action-lease.d.ts.map +1 -1
  5. package/dist/action-lease.js +27 -1
  6. package/dist/action-lease.js.map +1 -1
  7. package/dist/auth.d.ts +1 -1
  8. package/dist/auth.d.ts.map +1 -1
  9. package/dist/auth.js +8 -9
  10. package/dist/auth.js.map +1 -1
  11. package/dist/capability-rollout.d.ts +9 -0
  12. package/dist/capability-rollout.d.ts.map +1 -1
  13. package/dist/capability-rollout.js +43 -1
  14. package/dist/capability-rollout.js.map +1 -1
  15. package/dist/embedding-provider-contract.d.ts +21 -0
  16. package/dist/embedding-provider-contract.d.ts.map +1 -1
  17. package/dist/embedding-provider-contract.js +30 -0
  18. package/dist/embedding-provider-contract.js.map +1 -1
  19. package/dist/evidence-stable-ref.d.ts +11 -0
  20. package/dist/evidence-stable-ref.d.ts.map +1 -0
  21. package/dist/evidence-stable-ref.js +39 -0
  22. package/dist/evidence-stable-ref.js.map +1 -0
  23. package/dist/index.d.ts +3 -5
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -5
  26. package/dist/index.js.map +1 -1
  27. package/dist/interfaces/IKnowledgeEngine.d.ts +1 -1
  28. package/dist/interfaces/IKnowledgeEngine.d.ts.map +1 -1
  29. package/dist/interfaces/IMemoryEngine.d.ts +10 -9
  30. package/dist/interfaces/IMemoryEngine.d.ts.map +1 -1
  31. package/dist/mcp-health.d.ts.map +1 -1
  32. package/dist/mcp-health.js +2 -1
  33. package/dist/mcp-health.js.map +1 -1
  34. package/dist/paths.d.ts +10 -5
  35. package/dist/paths.d.ts.map +1 -1
  36. package/dist/paths.js +23 -12
  37. package/dist/paths.js.map +1 -1
  38. package/dist/plugin-runtime.d.ts.map +1 -1
  39. package/dist/plugin-runtime.js +2 -1
  40. package/dist/plugin-runtime.js.map +1 -1
  41. package/dist/project-identity.d.ts +7 -0
  42. package/dist/project-identity.d.ts.map +1 -0
  43. package/dist/project-identity.js +84 -0
  44. package/dist/project-identity.js.map +1 -0
  45. package/dist/retrieval-scope.d.ts +44 -0
  46. package/dist/retrieval-scope.d.ts.map +1 -0
  47. package/dist/retrieval-scope.js +55 -0
  48. package/dist/retrieval-scope.js.map +1 -0
  49. package/dist/runtime-endpoint.d.ts +11 -13
  50. package/dist/runtime-endpoint.d.ts.map +1 -1
  51. package/dist/runtime-endpoint.js +28 -33
  52. package/dist/runtime-endpoint.js.map +1 -1
  53. package/dist/semantic-resolution.d.ts +6 -72
  54. package/dist/semantic-resolution.d.ts.map +1 -1
  55. package/dist/semantic-resolution.js +33 -115
  56. package/dist/semantic-resolution.js.map +1 -1
  57. package/dist/task-runtime-reducer.js +1 -1
  58. package/dist/task-runtime-reducer.js.map +1 -1
  59. package/dist/task-runtime.d.ts +3 -2
  60. package/dist/task-runtime.d.ts.map +1 -1
  61. package/dist/task-runtime.js.map +1 -1
  62. package/dist/types/domain-action.d.ts +80 -0
  63. package/dist/types/domain-action.d.ts.map +1 -0
  64. package/dist/types/domain-action.js +2 -0
  65. package/dist/types/domain-action.js.map +1 -0
  66. package/dist/types/embedding-capability.d.ts +29 -0
  67. package/dist/types/embedding-capability.d.ts.map +1 -0
  68. package/dist/types/embedding-capability.js +2 -0
  69. package/dist/types/embedding-capability.js.map +1 -0
  70. package/dist/types/evaluation-bundle.d.ts +69 -0
  71. package/dist/types/evaluation-bundle.d.ts.map +1 -0
  72. package/dist/types/evaluation-bundle.js +130 -0
  73. package/dist/types/evaluation-bundle.js.map +1 -0
  74. package/dist/types/evidence.d.ts +133 -0
  75. package/dist/types/evidence.d.ts.map +1 -0
  76. package/dist/types/evidence.js +2 -0
  77. package/dist/types/evidence.js.map +1 -0
  78. package/dist/types/index.d.ts +13 -0
  79. package/dist/types/index.d.ts.map +1 -1
  80. package/dist/types/index.js +13 -0
  81. package/dist/types/index.js.map +1 -1
  82. package/dist/types/knowledge.d.ts +6 -5
  83. package/dist/types/knowledge.d.ts.map +1 -1
  84. package/dist/types/memory.d.ts +36 -20
  85. package/dist/types/memory.d.ts.map +1 -1
  86. package/dist/types/memory.js +1 -7
  87. package/dist/types/memory.js.map +1 -1
  88. package/dist/types/provider-execution.d.ts +20 -0
  89. package/dist/types/provider-execution.d.ts.map +1 -0
  90. package/dist/types/provider-execution.js +2 -0
  91. package/dist/types/provider-execution.js.map +1 -0
  92. package/dist/types/retrieval-coordinator.d.ts +103 -0
  93. package/dist/types/retrieval-coordinator.d.ts.map +1 -0
  94. package/dist/types/retrieval-coordinator.js +2 -0
  95. package/dist/types/retrieval-coordinator.js.map +1 -0
  96. package/dist/types/retrieval-query-proposal.d.ts +26 -0
  97. package/dist/types/retrieval-query-proposal.d.ts.map +1 -0
  98. package/dist/types/retrieval-query-proposal.js +2 -0
  99. package/dist/types/retrieval-query-proposal.js.map +1 -0
  100. package/dist/types/retrieval.d.ts +5 -3
  101. package/dist/types/retrieval.d.ts.map +1 -1
  102. package/dist/types/runtime-activation.d.ts +18 -0
  103. package/dist/types/runtime-activation.d.ts.map +1 -0
  104. package/dist/types/runtime-activation.js +20 -0
  105. package/dist/types/runtime-activation.js.map +1 -0
  106. package/dist/types/semantic-claims.d.ts +103 -0
  107. package/dist/types/semantic-claims.d.ts.map +1 -0
  108. package/dist/types/semantic-claims.js +2 -0
  109. package/dist/types/semantic-claims.js.map +1 -0
  110. package/dist/types/semantic-runtime.d.ts +48 -0
  111. package/dist/types/semantic-runtime.d.ts.map +1 -0
  112. package/dist/types/semantic-runtime.js +2 -0
  113. package/dist/types/semantic-runtime.js.map +1 -0
  114. package/dist/types/task-aggregate.d.ts +60 -0
  115. package/dist/types/task-aggregate.d.ts.map +1 -0
  116. package/dist/types/task-aggregate.js +2 -0
  117. package/dist/types/task-aggregate.js.map +1 -0
  118. package/dist/types/task-context-envelope.d.ts +58 -9
  119. package/dist/types/task-context-envelope.d.ts.map +1 -1
  120. package/dist/types/task-definition.d.ts +27 -0
  121. package/dist/types/task-definition.d.ts.map +1 -0
  122. package/dist/types/task-definition.js +2 -0
  123. package/dist/types/task-definition.js.map +1 -0
  124. package/dist/types/task-evidence.d.ts +11 -0
  125. package/dist/types/task-evidence.d.ts.map +1 -0
  126. package/dist/types/task-evidence.js +2 -0
  127. package/dist/types/task-evidence.js.map +1 -0
  128. package/dist/types/task-semantic-control.d.ts +34 -14
  129. package/dist/types/task-semantic-control.d.ts.map +1 -1
  130. package/dist/utils/config.d.ts +2 -0
  131. package/dist/utils/config.d.ts.map +1 -1
  132. package/dist/utils/config.js.map +1 -1
  133. package/dist/utils/paths.d.ts.map +1 -1
  134. package/dist/utils/paths.js +2 -2
  135. package/dist/utils/paths.js.map +1 -1
  136. package/package.json +10 -3
  137. package/dist/action-lease.test.d.ts +0 -2
  138. package/dist/action-lease.test.d.ts.map +0 -1
  139. package/dist/action-lease.test.js +0 -67
  140. package/dist/action-lease.test.js.map +0 -1
  141. package/dist/canonical-action-binding.test.d.ts +0 -2
  142. package/dist/canonical-action-binding.test.d.ts.map +0 -1
  143. package/dist/canonical-action-binding.test.js +0 -42
  144. package/dist/canonical-action-binding.test.js.map +0 -1
  145. package/dist/capability-rollout.test.d.ts +0 -2
  146. package/dist/capability-rollout.test.d.ts.map +0 -1
  147. package/dist/capability-rollout.test.js +0 -209
  148. package/dist/capability-rollout.test.js.map +0 -1
  149. package/dist/data/LocalDataProvider.d.ts +0 -68
  150. package/dist/data/LocalDataProvider.d.ts.map +0 -1
  151. package/dist/data/LocalDataProvider.js +0 -330
  152. package/dist/data/LocalDataProvider.js.map +0 -1
  153. package/dist/data/LocalDataProvider.test.d.ts +0 -2
  154. package/dist/data/LocalDataProvider.test.d.ts.map +0 -1
  155. package/dist/data/LocalDataProvider.test.js +0 -128
  156. package/dist/data/LocalDataProvider.test.js.map +0 -1
  157. package/dist/data/default-enforcer-rules.d.ts +0 -5
  158. package/dist/data/default-enforcer-rules.d.ts.map +0 -1
  159. package/dist/data/default-enforcer-rules.js +0 -167
  160. package/dist/data/default-enforcer-rules.js.map +0 -1
  161. package/dist/data/devflow-schema.d.ts +0 -3
  162. package/dist/data/devflow-schema.d.ts.map +0 -1
  163. package/dist/data/devflow-schema.js +0 -78
  164. package/dist/data/devflow-schema.js.map +0 -1
  165. package/dist/embedding-provider-contract.test.d.ts +0 -2
  166. package/dist/embedding-provider-contract.test.d.ts.map +0 -1
  167. package/dist/embedding-provider-contract.test.js +0 -11
  168. package/dist/embedding-provider-contract.test.js.map +0 -1
  169. package/dist/host-adapter.test.d.ts +0 -2
  170. package/dist/host-adapter.test.d.ts.map +0 -1
  171. package/dist/host-adapter.test.js +0 -367
  172. package/dist/host-adapter.test.js.map +0 -1
  173. package/dist/interfaces/IDataProvider.test.d.ts +0 -2
  174. package/dist/interfaces/IDataProvider.test.d.ts.map +0 -1
  175. package/dist/interfaces/IDataProvider.test.js +0 -20
  176. package/dist/interfaces/IDataProvider.test.js.map +0 -1
  177. package/dist/model-recommendation.test.d.ts +0 -2
  178. package/dist/model-recommendation.test.d.ts.map +0 -1
  179. package/dist/model-recommendation.test.js +0 -29
  180. package/dist/model-recommendation.test.js.map +0 -1
  181. package/dist/paths.test.d.ts +0 -2
  182. package/dist/paths.test.d.ts.map +0 -1
  183. package/dist/paths.test.js +0 -32
  184. package/dist/paths.test.js.map +0 -1
  185. package/dist/plugin-loader.test.d.ts +0 -2
  186. package/dist/plugin-loader.test.d.ts.map +0 -1
  187. package/dist/plugin-loader.test.js +0 -55
  188. package/dist/plugin-loader.test.js.map +0 -1
  189. package/dist/plugin-runtime.test.d.ts +0 -2
  190. package/dist/plugin-runtime.test.d.ts.map +0 -1
  191. package/dist/plugin-runtime.test.js +0 -47
  192. package/dist/plugin-runtime.test.js.map +0 -1
  193. package/dist/project-capability-profile.test.d.ts +0 -2
  194. package/dist/project-capability-profile.test.d.ts.map +0 -1
  195. package/dist/project-capability-profile.test.js +0 -80
  196. package/dist/project-capability-profile.test.js.map +0 -1
  197. package/dist/semantic-resolution.test.d.ts +0 -2
  198. package/dist/semantic-resolution.test.d.ts.map +0 -1
  199. package/dist/semantic-resolution.test.js +0 -106
  200. package/dist/semantic-resolution.test.js.map +0 -1
  201. package/dist/skill-overlay.d.ts +0 -41
  202. package/dist/skill-overlay.d.ts.map +0 -1
  203. package/dist/skill-overlay.js +0 -219
  204. package/dist/skill-overlay.js.map +0 -1
  205. package/dist/skill-overlay.test.d.ts +0 -2
  206. package/dist/skill-overlay.test.d.ts.map +0 -1
  207. package/dist/skill-overlay.test.js +0 -70
  208. package/dist/skill-overlay.test.js.map +0 -1
  209. package/dist/task-runtime-store.d.ts +0 -34
  210. package/dist/task-runtime-store.d.ts.map +0 -1
  211. package/dist/task-runtime-store.js +0 -126
  212. package/dist/task-runtime-store.js.map +0 -1
  213. package/dist/task-runtime.test.d.ts +0 -2
  214. package/dist/task-runtime.test.d.ts.map +0 -1
  215. package/dist/task-runtime.test.js +0 -60
  216. package/dist/task-runtime.test.js.map +0 -1
  217. package/dist/types/memory.test.d.ts +0 -2
  218. package/dist/types/memory.test.d.ts.map +0 -1
  219. package/dist/types/memory.test.js +0 -13
  220. package/dist/types/memory.test.js.map +0 -1
  221. package/dist/types/retrieval-session.test.d.ts +0 -2
  222. package/dist/types/retrieval-session.test.d.ts.map +0 -1
  223. package/dist/types/retrieval-session.test.js +0 -17
  224. package/dist/types/retrieval-session.test.js.map +0 -1
@@ -1,367 +0,0 @@
1
- import { existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
2
- import { tmpdir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { afterEach, describe, expect, it } from 'vitest';
5
- import { selectHostAdapter } from './host-adapters/index.js';
6
- import { readMcpInventory, redactMcpInventory } from './mcp-inventory.js';
7
- describe('host adapter registry', () => {
8
- const roots = [];
9
- afterEach(() => {
10
- for (const root of roots.splice(0))
11
- rmSync(root, { recursive: true, force: true });
12
- });
13
- it('projects bounded worker launch arguments for supported hosts', async () => {
14
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-worker-'));
15
- roots.push(root);
16
- const selection = await selectHostAdapter({ projectRoot: root, explicitHost: 'codex' });
17
- expect(selection.status).toBe('selected');
18
- if (selection.status !== 'selected')
19
- return;
20
- const launch = selection.adapter.workers?.project({
21
- workerId: 'worker', worktreePath: root, taskFile: join(root, 'task.json'),
22
- handoffFile: join(root, 'handoff.json'), statusFile: join(root, 'status.json'),
23
- sessionId: 'session', executionId: 'execution', contextReceipt: 'receipt', timeoutMs: 1_000,
24
- });
25
- expect(launch?.command).toBe('codex');
26
- expect(launch?.args).toContain('--cd');
27
- });
28
- it('selects hosts and resolves capabilities through async contracts', async () => {
29
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-adapter-'));
30
- roots.push(root);
31
- const pendingClaude = selectHostAdapter({ projectRoot: root, explicitHost: 'claude' });
32
- expect(pendingClaude).toBeInstanceOf(Promise);
33
- const claude = await pendingClaude;
34
- const codex = await selectHostAdapter({ projectRoot: root, explicitHost: 'codex' });
35
- expect(claude.status).toBe('selected');
36
- if (claude.status !== 'selected' || codex.status !== 'selected') {
37
- throw new Error('Expected explicit Claude and Codex selections to succeed.');
38
- }
39
- const claudeCapabilities = claude.adapter.capabilities({ projectRoot: root });
40
- expect(claudeCapabilities).toBeInstanceOf(Promise);
41
- expect(await claudeCapabilities).toContainEqual(expect.objectContaining({ capability: 'hooks.session_end', status: 'supported' }));
42
- expect(await codex.adapter.capabilities({ projectRoot: root })).toContainEqual(expect.objectContaining({
43
- capability: 'hooks.session_end',
44
- status: 'unavailable',
45
- fallback: expect.stringContaining('MCP'),
46
- }));
47
- });
48
- it('returns ambiguity instead of silently selecting equal host evidence', async () => {
49
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-ambiguous-'));
50
- const home = mkdtempSync(join(tmpdir(), 'devflow-host-home-'));
51
- roots.push(root, home);
52
- mkdirSync(join(home, '.claude'));
53
- mkdirSync(join(home, '.codex'));
54
- const selection = await selectHostAdapter({ projectRoot: root, homeDir: home, env: {} });
55
- expect(selection).toMatchObject({
56
- status: 'failed',
57
- code: 'ambiguous_detection',
58
- candidates: [{ id: 'claude-code', score: 30 }, { id: 'codex', score: 30 }],
59
- action: expect.stringContaining('--agent'),
60
- });
61
- });
62
- it('returns an actionable structured failure for an unknown explicit host', async () => {
63
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-unknown-'));
64
- roots.push(root);
65
- const selection = await selectHostAdapter({ projectRoot: root, explicitHost: 'codez' });
66
- expect(selection).toMatchObject({
67
- status: 'failed',
68
- code: 'unknown_explicit_host',
69
- availableHosts: ['claude-code', 'codex', 'generic-mcp'],
70
- reason: expect.stringContaining('codez'),
71
- action: expect.stringContaining('codex'),
72
- });
73
- });
74
- it('preserves unrelated JSON fields and MCP servers when projecting Claude MCP', async () => {
75
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-claude-project-'));
76
- const home = mkdtempSync(join(tmpdir(), 'devflow-host-claude-home-'));
77
- roots.push(root, home);
78
- const configPath = join(root, '.mcp.json');
79
- writeFileSync(configPath, JSON.stringify({
80
- projectSetting: { enabled: true },
81
- mcpServers: {
82
- existing: { command: 'existing-mcp', args: ['--keep'] },
83
- },
84
- }, null, 2));
85
- const legacyDir = join(root, '.claude');
86
- const legacyPath = join(legacyDir, 'mcp.json');
87
- mkdirSync(legacyDir);
88
- writeFileSync(legacyPath, JSON.stringify({
89
- mcpServers: {
90
- existingLegacy: { command: 'legacy-mcp' },
91
- devflow: { command: 'stale-devflow' },
92
- },
93
- }, null, 2));
94
- const selection = await selectHostAdapter({ projectRoot: root, homeDir: home, explicitHost: 'claude-code' });
95
- if (selection.status !== 'selected')
96
- throw new Error('Expected Claude selection to succeed.');
97
- const result = selection.adapter.mcp.project({ projectRoot: root, homeDir: home }, {
98
- command: 'devflow-mcp',
99
- args: ['--mode', 'stdio'],
100
- });
101
- const projected = JSON.parse(readFileSync(configPath, 'utf8'));
102
- const projectedLegacy = JSON.parse(readFileSync(legacyPath, 'utf8'));
103
- expect(result).toMatchObject({ status: 'written', changed: true, path: configPath });
104
- expect(projected.projectSetting).toEqual({ enabled: true });
105
- expect(projected.mcpServers.existing).toEqual({ command: 'existing-mcp', args: ['--keep'] });
106
- expect(projected.mcpServers.devflow).toEqual({ command: 'devflow-mcp', args: ['--mode', 'stdio'] });
107
- expect(projectedLegacy.mcpServers.existingLegacy).toEqual({ command: 'legacy-mcp' });
108
- expect(projectedLegacy.mcpServers.devflow).toEqual(projected.mcpServers.devflow);
109
- });
110
- it('preserves unrelated Codex TOML and is idempotent', async () => {
111
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-codex-project-'));
112
- const home = mkdtempSync(join(tmpdir(), 'devflow-host-codex-home-'));
113
- roots.push(root, home);
114
- const codexDir = join(home, '.codex');
115
- const configPath = join(codexDir, 'config.toml');
116
- mkdirSync(codexDir);
117
- writeFileSync(configPath, [
118
- 'model = "gpt-5"',
119
- '',
120
- '[mcp_servers."existing server"]',
121
- 'command = "existing-mcp"',
122
- 'args = ["--keep"]',
123
- '',
124
- '[mcp_servers.devflow]',
125
- 'command = "old-devflow"',
126
- '',
127
- '[[rules]]',
128
- 'name = "preserve-rule"',
129
- 'prompt = "keep this array table"',
130
- ].join('\n'));
131
- const selection = await selectHostAdapter({ projectRoot: root, homeDir: home, env: {}, explicitHost: 'codex' });
132
- if (selection.status !== 'selected')
133
- throw new Error('Expected Codex selection to succeed.');
134
- const context = { projectRoot: root, homeDir: home, env: {} };
135
- const server = { command: 'devflow-mcp', args: ['--mode', 'stdio'] };
136
- const first = selection.adapter.mcp.project(context, server);
137
- const firstContent = readFileSync(configPath, 'utf8');
138
- const second = selection.adapter.mcp.project(context, server);
139
- const secondContent = readFileSync(configPath, 'utf8');
140
- expect(first).toMatchObject({ status: 'written', changed: true });
141
- expect(second).toMatchObject({ status: 'unchanged', changed: false });
142
- expect(secondContent).toBe(firstContent);
143
- expect(secondContent).toContain('model = "gpt-5"');
144
- expect(secondContent).toContain('[mcp_servers."existing server"]');
145
- expect(secondContent).toContain('command = "existing-mcp"');
146
- expect(secondContent).toContain('[mcp_servers."devflow"]');
147
- expect(secondContent).toContain('[[rules]]');
148
- expect(secondContent).toContain('name = "preserve-rule"');
149
- expect(secondContent).toContain('prompt = "keep this array table"');
150
- expect(secondContent).not.toContain('old-devflow');
151
- });
152
- it('parses quoted Codex server names and nested env keys without exposing values', () => {
153
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-codex-mcp-'));
154
- const home = mkdtempSync(join(tmpdir(), 'devflow-host-codex-home-'));
155
- roots.push(root, home);
156
- mkdirSync(join(home, '.codex'));
157
- writeFileSync(join(home, '.codex', 'config.toml'), [
158
- '[mcp_servers."team server"]',
159
- 'command = "devflow-mcp"',
160
- 'args = ["--mode", "stdio"]',
161
- '',
162
- '[mcp_servers."team server".env]',
163
- 'DEVFLOW_TOKEN = "secret-value"',
164
- '"SECOND_TOKEN" = "another-secret"',
165
- ].join('\n'));
166
- const inventory = readMcpInventory(root, home, { host: 'codex' });
167
- expect(inventory.servers).toEqual([
168
- expect.objectContaining({
169
- name: 'team server',
170
- transport: 'stdio',
171
- command: 'devflow-mcp',
172
- args: ['--mode', 'stdio'],
173
- environmentKeys: ['DEVFLOW_TOKEN', 'SECOND_TOKEN'],
174
- }),
175
- ]);
176
- const serialized = JSON.stringify(inventory);
177
- expect(serialized).not.toContain('secret-value');
178
- expect(serialized).not.toContain('another-secret');
179
- });
180
- it('uses CODEX_HOME when inventory resolves Codex config paths', () => {
181
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-codex-project-'));
182
- const home = mkdtempSync(join(tmpdir(), 'devflow-host-default-home-'));
183
- const codexHome = mkdtempSync(join(tmpdir(), 'devflow-host-custom-codex-'));
184
- roots.push(root, home, codexHome);
185
- writeFileSync(join(codexHome, 'config.toml'), [
186
- '[mcp_servers."custom-home"]',
187
- 'command = "custom-codex-mcp"',
188
- ].join('\n'));
189
- const inventory = readMcpInventory(root, home, {
190
- host: 'codex',
191
- env: { CODEX_HOME: codexHome },
192
- });
193
- expect(inventory.servers).toEqual([
194
- expect.objectContaining({
195
- name: 'custom-home',
196
- command: 'custom-codex-mcp',
197
- sourcePaths: [join(codexHome, 'config.toml')],
198
- }),
199
- ]);
200
- });
201
- it('projects Codex Skills and an idempotent bounded AGENTS section without replacing user text', async () => {
202
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-codex-agents-'));
203
- const home = mkdtempSync(join(tmpdir(), 'devflow-host-codex-skills-home-'));
204
- const source = mkdtempSync(join(tmpdir(), 'devflow-host-skill-source-'));
205
- roots.push(root, home, source);
206
- const sourceSkill = join(source, 'devflow:doctor');
207
- mkdirSync(sourceSkill);
208
- writeFileSync(join(sourceSkill, 'SKILL.md'), [
209
- '---',
210
- 'name: devflow:doctor',
211
- 'description: Keep this metadata',
212
- '---',
213
- '# DevFlow Doctor',
214
- '',
215
- 'Use canonical MCP receipts.',
216
- '',
217
- ].join('\n'));
218
- const agentsPath = join(root, 'AGENTS.md');
219
- writeFileSync(agentsPath, '# Project instructions\n\nKeep this user-authored text.\n');
220
- const selection = await selectHostAdapter({ projectRoot: root, homeDir: home, env: {}, explicitHost: 'codex' });
221
- if (selection.status !== 'selected')
222
- throw new Error('Expected Codex selection to succeed.');
223
- const context = { projectRoot: root, homeDir: home, env: {} };
224
- const first = selection.adapter.skills.project(context, { skillsDirectory: source });
225
- const firstAgents = readFileSync(agentsPath, 'utf8');
226
- const second = selection.adapter.skills.project(context, { skillsDirectory: source });
227
- const secondAgents = readFileSync(agentsPath, 'utf8');
228
- expect(first).toEqual([
229
- expect.objectContaining({ artifact: 'skills', status: 'written' }),
230
- expect.objectContaining({ artifact: 'instructions', status: 'written', changed: true }),
231
- ]);
232
- expect(second[1]).toMatchObject({ artifact: 'instructions', status: 'unchanged', changed: false });
233
- expect(secondAgents).toBe(firstAgents);
234
- expect(secondAgents).toContain('# Project instructions');
235
- expect(secondAgents).toContain('Keep this user-authored text.');
236
- expect(secondAgents).toContain('<!-- devflow:instructions:start -->');
237
- expect(secondAgents).toContain('Lifecycle Hooks are unavailable on this host.');
238
- const projectedSkillPath = join(home, '.codex', 'skills', 'devflow-doctor', 'SKILL.md');
239
- const projectedSkill = readFileSync(projectedSkillPath, 'utf8');
240
- expect(existsSync(join(home, '.codex', 'skills', 'devflow:doctor'))).toBe(false);
241
- expect(projectedSkill).toContain('name: devflow-doctor');
242
- expect(projectedSkill).toContain('description: Keep this metadata');
243
- expect(projectedSkill).toContain('# DevFlow Doctor\n\nUse canonical MCP receipts.');
244
- });
245
- it('rejects Codex Skill name collisions before writing Skill directories', async () => {
246
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-codex-collision-project-'));
247
- const home = mkdtempSync(join(tmpdir(), 'devflow-host-codex-collision-home-'));
248
- const source = mkdtempSync(join(tmpdir(), 'devflow-host-collision-source-'));
249
- roots.push(root, home, source);
250
- for (const name of ['devflow:doctor', 'devflow-doctor']) {
251
- mkdirSync(join(source, name));
252
- writeFileSync(join(source, name, 'SKILL.md'), `---\nname: ${name}\n---\n# ${name}\n`);
253
- }
254
- const selection = await selectHostAdapter({ projectRoot: root, homeDir: home, env: {}, explicitHost: 'codex' });
255
- if (selection.status !== 'selected')
256
- throw new Error('Expected Codex selection to succeed.');
257
- const results = selection.adapter.skills.project({ projectRoot: root, homeDir: home, env: {} }, { skillsDirectory: source });
258
- expect(results[0]).toMatchObject({
259
- artifact: 'skills',
260
- status: 'failed',
261
- changed: false,
262
- message: expect.stringContaining('collision'),
263
- });
264
- expect(existsSync(join(home, '.codex', 'skills'))).toBe(false);
265
- });
266
- it('projects a complete idempotent Claude plugin registration while preserving unrelated data', async () => {
267
- const root = mkdtempSync(join(tmpdir(), 'devflow-host-claude-registration-project-'));
268
- const home = mkdtempSync(join(tmpdir(), 'devflow-host-claude-registration-home-'));
269
- const pluginRoot = mkdtempSync(join(tmpdir(), 'devflow-host-claude-plugin-'));
270
- roots.push(root, home, pluginRoot);
271
- mkdirSync(join(pluginRoot, '.claude-plugin'));
272
- writeFileSync(join(pluginRoot, '.claude-plugin', 'plugin.json'), JSON.stringify({ name: 'devflow', version: '1.2.3' }));
273
- writeFileSync(join(pluginRoot, 'package.json'), JSON.stringify({ name: '@devflow-tools/claude-code-plugin', version: '1.2.3' }));
274
- const pluginsDir = join(home, '.claude', 'plugins');
275
- mkdirSync(pluginsDir, { recursive: true });
276
- writeFileSync(join(pluginsDir, 'known_marketplaces.json'), JSON.stringify({
277
- existing: { source: { source: 'directory', path: '/existing-marketplace' } },
278
- }));
279
- writeFileSync(join(pluginsDir, 'installed_plugins.json'), JSON.stringify({
280
- version: 2,
281
- metadata: { keep: true },
282
- plugins: {
283
- 'other@market': [{ scope: 'user', installPath: '/other' }],
284
- 'devflow@devflow-local': [{ scope: 'project', installPath: '/project-devflow', version: '1.0.0' }],
285
- },
286
- }));
287
- writeFileSync(join(home, '.claude', 'settings.json'), JSON.stringify({
288
- theme: 'dark',
289
- enabledPlugins: { 'other@market': true },
290
- }));
291
- const selection = await selectHostAdapter({ projectRoot: root, homeDir: home, explicitHost: 'claude-code' });
292
- if (selection.status !== 'selected')
293
- throw new Error('Expected Claude selection to succeed.');
294
- const context = { projectRoot: root, homeDir: home };
295
- const first = selection.adapter.skills.project(context, { pluginRoot });
296
- const paths = {
297
- marketplace: join(pluginsDir, 'marketplaces', 'devflow-local', '.claude-plugin', 'marketplace.json'),
298
- known: join(pluginsDir, 'known_marketplaces.json'),
299
- installed: join(pluginsDir, 'installed_plugins.json'),
300
- settings: join(home, '.claude', 'settings.json'),
301
- };
302
- const firstFiles = Object.fromEntries(Object.entries(paths).map(([key, value]) => [key, readFileSync(value, 'utf8')]));
303
- const second = selection.adapter.skills.project(context, { pluginRoot });
304
- const secondFiles = Object.fromEntries(Object.entries(paths).map(([key, value]) => [key, readFileSync(value, 'utf8')]));
305
- const marketplace = JSON.parse(secondFiles.marketplace);
306
- const known = JSON.parse(secondFiles.known);
307
- const installed = JSON.parse(secondFiles.installed);
308
- const settings = JSON.parse(secondFiles.settings);
309
- expect(first[0]).toMatchObject({ artifact: 'plugin', status: 'written', changed: true });
310
- expect(second[0]).toMatchObject({ artifact: 'plugin', status: 'unchanged', changed: false });
311
- expect(secondFiles).toEqual(firstFiles);
312
- expect(marketplace).toMatchObject({
313
- name: 'devflow-local',
314
- plugins: [{ name: 'devflow', source: expect.any(String) }],
315
- });
316
- expect(known.existing.source.path).toBe('/existing-marketplace');
317
- expect(known['devflow-local'].source).toEqual({
318
- source: 'directory',
319
- path: join(pluginsDir, 'marketplaces', 'devflow-local'),
320
- });
321
- expect(installed.version).toBe(2);
322
- expect(installed.metadata).toEqual({ keep: true });
323
- expect(installed.plugins['other@market']).toHaveLength(1);
324
- expect(installed.plugins['devflow@devflow-local']).toEqual(expect.arrayContaining([
325
- expect.objectContaining({ scope: 'project', installPath: '/project-devflow' }),
326
- expect.objectContaining({ scope: 'user', installPath: pluginRoot, version: '1.2.3' }),
327
- ]));
328
- expect(settings.theme).toBe('dark');
329
- expect(settings.enabledPlugins).toMatchObject({
330
- 'other@market': true,
331
- 'devflow@devflow-local': true,
332
- });
333
- });
334
- it('redacts MCP argument and URL values without mutating the inventory report', () => {
335
- const report = {
336
- generatedAt: '2026-07-24T00:00:00.000Z',
337
- servers: [{
338
- name: 'remote',
339
- transport: 'http',
340
- command: 'remote-mcp',
341
- args: ['--mode', 'secret-mode', '--token=argument-secret', 'plain-secret', '-x', 'another-secret'],
342
- url: 'https://user-secret:password-secret@example.com/private/path?token=query-secret&mode=full#fragment-secret',
343
- sourcePaths: ['/config/path'],
344
- enabled: true,
345
- environmentKeys: ['TOKEN'],
346
- fingerprint: 'fingerprint',
347
- drift: ['configuration differs'],
348
- }],
349
- duplicates: [{ name: 'remote', sourcePaths: ['/config/path'], fingerprints: ['fingerprint'] }],
350
- unreadable: [{ path: '/bad/config', reason: 'parse error' }],
351
- };
352
- const before = JSON.stringify(report);
353
- const redacted = redactMcpInventory(report);
354
- expect(JSON.stringify(report)).toBe(before);
355
- expect(redacted).not.toBe(report);
356
- expect(redacted.servers[0]).not.toBe(report.servers[0]);
357
- expect(redacted.servers[0]?.args).toEqual([
358
- '--mode', '<redacted>', '--token=<redacted>', '<redacted>', '-x', '<redacted>',
359
- ]);
360
- expect(redacted.servers[0]?.url).toBe('https://example.com/<redacted>?token=<redacted>&mode=<redacted>#<redacted>');
361
- const serialized = JSON.stringify(redacted);
362
- for (const secret of ['secret-mode', 'argument-secret', 'plain-secret', 'another-secret', 'user-secret', 'password-secret', 'private/path', 'query-secret', 'fragment-secret']) {
363
- expect(serialized).not.toContain(secret);
364
- }
365
- });
366
- });
367
- //# sourceMappingURL=host-adapter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"host-adapter.test.js","sourceRoot":"","sources":["../src/host-adapter.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=IDataProvider.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"IDataProvider.test.d.ts","sourceRoot":"","sources":["../../src/interfaces/IDataProvider.test.ts"],"names":[],"mappings":""}
@@ -1,20 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- describe("IDataProvider interface (type-level conformance)", () => {
3
- it("VectorResult has required fields", () => {
4
- const r = {
5
- id: "test",
6
- score: 0.9,
7
- };
8
- expect(r.id).toBe("test");
9
- expect(r.score).toBe(0.9);
10
- });
11
- it("VectorPoint has required fields", () => {
12
- const p = {
13
- id: "test",
14
- vector: [0.1, 0.2],
15
- };
16
- expect(p.id).toBe("test");
17
- expect(p.vector).toHaveLength(2);
18
- });
19
- });
20
- //# sourceMappingURL=IDataProvider.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"IDataProvider.test.js","sourceRoot":"","sources":["../../src/interfaces/IDataProvider.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,GAA8C;YACnD,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,GAAG;SACX,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,GAA6C;YAClD,EAAE,EAAE,MAAM;YACV,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;SACnB,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=model-recommendation.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-recommendation.test.d.ts","sourceRoot":"","sources":["../src/model-recommendation.test.ts"],"names":[],"mappings":""}
@@ -1,29 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { recommendModelTier } from "./model-recommendation.js";
3
- describe("provider-neutral model recommendation", () => {
4
- it("uses the mechanical tier for bounded generated edits", () => {
5
- expect(recommendModelTier({ query: "format generated file", targetCount: 1 }))
6
- .toMatchObject({ tier: "mechanical", costClass: "low", actualModelObserved: false });
7
- });
8
- it("uses the default tier for a normal React fix", () => {
9
- expect(recommendModelTier({ query: "fix VideoPlayer state update", intent: "debug", targetCount: 2 }))
10
- .toMatchObject({ tier: "default", costClass: "balanced", actualModelObserved: false });
11
- });
12
- it("uses the architecture tier for ambiguous, cross-module, or high-risk work", () => {
13
- const recommendation = recommendModelTier({
14
- query: "design the migration architecture",
15
- targetCount: 7,
16
- crossModuleScope: true,
17
- ambiguity: true,
18
- riskHints: [{ level: "high", message: "breaking schema migration" }],
19
- });
20
- expect(recommendation).toMatchObject({ tier: "architecture", costClass: "high", actualModelObserved: false });
21
- expect(recommendation.rationale).toContain("cross-module scope");
22
- });
23
- it("is deterministic and never claims an observed host model", () => {
24
- const input = { query: "unknown task", targetCount: 0 };
25
- expect(recommendModelTier(input)).toEqual(recommendModelTier(input));
26
- expect(recommendModelTier(input).actualModelObserved).toBe(false);
27
- });
28
- });
29
- //# sourceMappingURL=model-recommendation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-recommendation.test.js","sourceRoot":"","sources":["../src/model-recommendation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;aAC3E,aAAa,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;aACnG,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,cAAc,GAAG,kBAAkB,CAAC;YACxC,KAAK,EAAE,mCAAmC;YAC1C,WAAW,EAAE,CAAC;YACd,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;SACrE,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9G,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=paths.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.test.d.ts","sourceRoot":"","sources":["../src/paths.test.ts"],"names":[],"mappings":""}
@@ -1,32 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { homedir } from "node:os";
3
- import { getProjectHash, getDaemonSocketPath, getDaemonPidPath, getProjectStateDir, getDaemonRegistryPath, getBackupDir, } from "./paths.js";
4
- describe("paths", () => {
5
- const root = "/Users/alice/Desktop/rsbuild-react";
6
- const hash = "d535bced6a262437";
7
- it("getProjectHash returns 16-char sha256 prefix", () => {
8
- expect(getProjectHash(root)).toBe(hash);
9
- expect(getProjectHash(root)).toMatch(/^[a-f0-9]{16}$/);
10
- expect(getProjectHash("/tmp/other")).not.toBe(hash);
11
- });
12
- it("daemon socket path is per-project", () => {
13
- const p = getDaemonSocketPath(root);
14
- expect(p).toBe(`${homedir()}/.devflow/daemons/${hash}.sock`);
15
- });
16
- it("daemon pid path is per-project", () => {
17
- const p = getDaemonPidPath(root);
18
- expect(p).toBe(`${homedir()}/.devflow/daemons/${hash}.pid`);
19
- });
20
- it("state dir has trailing slash-friendly join", () => {
21
- const p = getProjectStateDir(root);
22
- expect(p.endsWith(`/state/${hash}`)).toBe(true);
23
- });
24
- it("registry path is global", () => {
25
- expect(getDaemonRegistryPath()).toBe(`${homedir()}/.devflow/daemons.json`);
26
- });
27
- it("backup dir includes date", () => {
28
- const p = getBackupDir(root, new Date("2026-07-17T00:00:00Z").getTime());
29
- expect(p).toBe(`${homedir()}/.devflow/backup/2026-07-17/${hash}`);
30
- });
31
- });
32
- //# sourceMappingURL=paths.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../src/paths.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,MAAM,IAAI,GAAG,oCAAoC,CAAC;IAClD,MAAM,IAAI,GAAG,kBAAkB,CAAC;IAEhC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,qBAAqB,IAAI,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,qBAAqB,IAAI,MAAM,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,+BAA+B,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=plugin-loader.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-loader.test.d.ts","sourceRoot":"","sources":["../src/plugin-loader.test.ts"],"names":[],"mappings":""}
@@ -1,55 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
- import { mkdirSync, rmSync, writeFileSync } from "node:fs";
3
- import { join } from "node:path";
4
- import { tmpdir } from "node:os";
5
- import { loadPluginsWithDiagnostics } from "./plugin-loader.js";
6
- import { resolveProjectCapabilityProfile } from "./project-capability-profile.js";
7
- describe("profile-aware plugin loading", () => {
8
- let root;
9
- let registryPath;
10
- beforeEach(() => {
11
- root = join(tmpdir(), `devflow-plugin-loader-${process.pid}-${Date.now()}-${Math.random()}`);
12
- mkdirSync(root, { recursive: true });
13
- registryPath = join(root, "registry.json");
14
- writeFileSync(registryPath, JSON.stringify({
15
- version: "1.0.0",
16
- plugins: [
17
- { name: "@devflow-tools/plugin-react", compatibleStacks: ["react"] },
18
- { name: "@devflow-tools/plugin-vue", compatibleStacks: ["vue"] },
19
- ],
20
- }));
21
- writeFileSync(join(root, "package.json"), JSON.stringify({ dependencies: { react: "19" } }));
22
- writeFixturePlugin("react");
23
- writeFixturePlugin("vue");
24
- });
25
- afterEach(() => rmSync(root, { recursive: true, force: true }));
26
- it("loads the full set in shadow and the applicable set in on", async () => {
27
- const profile = resolveProjectCapabilityProfile(root, { registryPath });
28
- const shadow = await loadPluginsWithDiagnostics({ projectRoot: root, registryPath, capabilityProfile: profile, rolloutMode: "shadow" });
29
- expect([...shadow.plugins.keys()].sort()).toEqual(["react", "vue"]);
30
- const active = await loadPluginsWithDiagnostics({ projectRoot: root, registryPath, capabilityProfile: profile, rolloutMode: "on" });
31
- expect([...active.plugins.keys()]).toEqual(["react"]);
32
- expect(active.diagnostics).toContainEqual(expect.objectContaining({
33
- packageName: "@devflow-tools/plugin-vue",
34
- status: "skipped",
35
- reason: "not_applicable_to_project",
36
- }));
37
- });
38
- function writeFixturePlugin(name) {
39
- const packageRoot = join(root, "node_modules", "@devflow-tools", `plugin-${name}`);
40
- mkdirSync(join(packageRoot, "dist"), { recursive: true });
41
- writeFileSync(join(packageRoot, "package.json"), JSON.stringify({
42
- name: `@devflow-tools/plugin-${name}`,
43
- version: "1.0.0",
44
- type: "module",
45
- main: "dist/index.js",
46
- }));
47
- writeFileSync(join(packageRoot, "dist", "index.js"), [
48
- `export const ${name}Plugin = {`,
49
- ` meta: { name: ${JSON.stringify(name)}, version: "1.0.0", description: "", tags: [] },`,
50
- " knowledge: { sources: [] },",
51
- "};",
52
- ].join("\n"));
53
- }
54
- });
55
- //# sourceMappingURL=plugin-loader.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-loader.test.js","sourceRoot":"","sources":["../src/plugin-loader.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=plugin-runtime.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-runtime.test.d.ts","sourceRoot":"","sources":["../src/plugin-runtime.test.ts"],"names":[],"mappings":""}