@ai-dossier/mcp-server 1.0.1 → 1.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 (95) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +76 -27
  3. package/dist/index.js.map +1 -1
  4. package/dist/orchestration/__tests__/graph.test.d.ts +2 -0
  5. package/dist/orchestration/__tests__/graph.test.d.ts.map +1 -0
  6. package/dist/orchestration/__tests__/graph.test.js +348 -0
  7. package/dist/orchestration/__tests__/graph.test.js.map +1 -0
  8. package/dist/orchestration/__tests__/resolver.test.d.ts +2 -0
  9. package/dist/orchestration/__tests__/resolver.test.d.ts.map +1 -0
  10. package/dist/orchestration/__tests__/resolver.test.js +181 -0
  11. package/dist/orchestration/__tests__/resolver.test.js.map +1 -0
  12. package/dist/orchestration/graph.d.ts +33 -0
  13. package/dist/orchestration/graph.d.ts.map +1 -0
  14. package/dist/orchestration/graph.js +240 -0
  15. package/dist/orchestration/graph.js.map +1 -0
  16. package/dist/orchestration/resolver.d.ts +40 -0
  17. package/dist/orchestration/resolver.d.ts.map +1 -0
  18. package/dist/orchestration/resolver.js +208 -0
  19. package/dist/orchestration/resolver.js.map +1 -0
  20. package/dist/orchestration/types.d.ts +76 -0
  21. package/dist/orchestration/types.d.ts.map +1 -0
  22. package/dist/orchestration/types.js +6 -0
  23. package/dist/orchestration/types.js.map +1 -0
  24. package/dist/tools/__tests__/listDossiers.test.d.ts +2 -0
  25. package/dist/tools/__tests__/listDossiers.test.d.ts.map +1 -0
  26. package/dist/tools/__tests__/listDossiers.test.js +67 -0
  27. package/dist/tools/__tests__/listDossiers.test.js.map +1 -0
  28. package/dist/tools/__tests__/readDossier.test.d.ts +2 -0
  29. package/dist/tools/__tests__/readDossier.test.d.ts.map +1 -0
  30. package/dist/tools/__tests__/readDossier.test.js +88 -0
  31. package/dist/tools/__tests__/readDossier.test.js.map +1 -0
  32. package/dist/tools/__tests__/resolveGraph.test.d.ts +2 -0
  33. package/dist/tools/__tests__/resolveGraph.test.d.ts.map +1 -0
  34. package/dist/tools/__tests__/resolveGraph.test.js +170 -0
  35. package/dist/tools/__tests__/resolveGraph.test.js.map +1 -0
  36. package/dist/tools/__tests__/searchDossiers.test.d.ts +2 -0
  37. package/dist/tools/__tests__/searchDossiers.test.d.ts.map +1 -0
  38. package/dist/tools/__tests__/searchDossiers.test.js +52 -0
  39. package/dist/tools/__tests__/searchDossiers.test.js.map +1 -0
  40. package/dist/tools/__tests__/verifyDossier.test.d.ts +2 -0
  41. package/dist/tools/__tests__/verifyDossier.test.d.ts.map +1 -0
  42. package/dist/tools/__tests__/verifyDossier.test.js +59 -0
  43. package/dist/tools/__tests__/verifyDossier.test.js.map +1 -0
  44. package/dist/tools/__tests__/verifyGraph.test.d.ts +2 -0
  45. package/dist/tools/__tests__/verifyGraph.test.d.ts.map +1 -0
  46. package/dist/tools/__tests__/verifyGraph.test.js +278 -0
  47. package/dist/tools/__tests__/verifyGraph.test.js.map +1 -0
  48. package/dist/tools/listDossiers.d.ts +13 -4
  49. package/dist/tools/listDossiers.d.ts.map +1 -1
  50. package/dist/tools/listDossiers.js +28 -89
  51. package/dist/tools/listDossiers.js.map +1 -1
  52. package/dist/tools/readDossier.d.ts +4 -15
  53. package/dist/tools/readDossier.d.ts.map +1 -1
  54. package/dist/tools/readDossier.js +32 -33
  55. package/dist/tools/readDossier.js.map +1 -1
  56. package/dist/tools/resolveGraph.d.ts +25 -0
  57. package/dist/tools/resolveGraph.d.ts.map +1 -0
  58. package/dist/tools/resolveGraph.js +67 -0
  59. package/dist/tools/resolveGraph.js.map +1 -0
  60. package/dist/tools/searchDossiers.d.ts +28 -0
  61. package/dist/tools/searchDossiers.d.ts.map +1 -0
  62. package/dist/tools/searchDossiers.js +38 -0
  63. package/dist/tools/searchDossiers.js.map +1 -0
  64. package/dist/tools/verifyDossier.d.ts +14 -6
  65. package/dist/tools/verifyDossier.d.ts.map +1 -1
  66. package/dist/tools/verifyDossier.js +16 -89
  67. package/dist/tools/verifyDossier.js.map +1 -1
  68. package/dist/tools/verifyGraph.d.ts +33 -0
  69. package/dist/tools/verifyGraph.d.ts.map +1 -0
  70. package/dist/tools/verifyGraph.js +175 -0
  71. package/dist/tools/verifyGraph.js.map +1 -0
  72. package/dist/utils/__tests__/cli-wrapper.test.d.ts +2 -0
  73. package/dist/utils/__tests__/cli-wrapper.test.d.ts.map +1 -0
  74. package/dist/utils/__tests__/cli-wrapper.test.js +29 -0
  75. package/dist/utils/__tests__/cli-wrapper.test.js.map +1 -0
  76. package/dist/utils/__tests__/paths.test.d.ts +2 -0
  77. package/dist/utils/__tests__/paths.test.d.ts.map +1 -0
  78. package/dist/utils/__tests__/paths.test.js +26 -0
  79. package/dist/utils/__tests__/paths.test.js.map +1 -0
  80. package/dist/utils/cli-wrapper.d.ts +25 -0
  81. package/dist/utils/cli-wrapper.d.ts.map +1 -0
  82. package/dist/utils/cli-wrapper.js +83 -0
  83. package/dist/utils/cli-wrapper.js.map +1 -0
  84. package/dist/utils/graphStore.d.ts +9 -0
  85. package/dist/utils/graphStore.d.ts.map +1 -0
  86. package/dist/utils/graphStore.js +21 -0
  87. package/dist/utils/graphStore.js.map +1 -0
  88. package/dist/utils/paths.d.ts +8 -0
  89. package/dist/utils/paths.d.ts.map +1 -0
  90. package/dist/utils/paths.js +19 -0
  91. package/dist/utils/paths.js.map +1 -0
  92. package/dist/utils/resourceLoader.d.ts.map +1 -1
  93. package/dist/utils/resourceLoader.js +2 -3
  94. package/dist/utils/resourceLoader.js.map +1 -1
  95. package/package.json +18 -7
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ /**
3
+ * Dossier reference resolver.
4
+ * Resolves dossier names to their metadata by:
5
+ * 1. Local file lookup (*.ds.md in project)
6
+ * 2. Registry lookup via `ai-dossier get --json <name>`
7
+ * Caches resolved dossiers for the lifetime of a resolution run.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.DossierResolver = exports.ResolveError = void 0;
11
+ const node_path_1 = require("node:path");
12
+ const cli_wrapper_1 = require("../utils/cli-wrapper");
13
+ const logger_1 = require("../utils/logger");
14
+ class ResolveError extends Error {
15
+ dossierName;
16
+ constructor(dossierName, message) {
17
+ super(`Failed to resolve "${dossierName}": ${message}`);
18
+ this.dossierName = dossierName;
19
+ this.name = 'ResolveError';
20
+ }
21
+ }
22
+ exports.ResolveError = ResolveError;
23
+ class DossierResolver {
24
+ basePath;
25
+ cache = new Map();
26
+ localIndex = null;
27
+ constructor(basePath = process.cwd()) {
28
+ this.basePath = basePath;
29
+ }
30
+ /**
31
+ * Resolve a dossier reference by name.
32
+ * Tries local files first, then falls back to the registry.
33
+ */
34
+ async resolve(name) {
35
+ const cached = this.cache.get(name);
36
+ if (cached)
37
+ return cached;
38
+ // Try local resolution first
39
+ const local = await this.resolveLocal(name);
40
+ if (local) {
41
+ this.cache.set(name, local);
42
+ return local;
43
+ }
44
+ // Fall back to registry
45
+ const registry = await this.resolveFromRegistry(name);
46
+ if (registry) {
47
+ this.cache.set(name, registry);
48
+ return registry;
49
+ }
50
+ throw new ResolveError(name, 'Not found locally or in registry');
51
+ }
52
+ /**
53
+ * Resolve a dossier from a local file path (for the entry dossier).
54
+ */
55
+ async resolveFromPath(filePath) {
56
+ const resolvedPath = (0, node_path_1.resolve)(filePath);
57
+ logger_1.logger.info('Resolving dossier from path', { path: resolvedPath });
58
+ try {
59
+ const metadata = await (0, cli_wrapper_1.execCli)('info', [resolvedPath, '--json']);
60
+ const name = metadata.name || resolvedPath.split('/').pop()?.replace('.ds.md', '') || filePath;
61
+ const resolved = {
62
+ name,
63
+ source: 'local',
64
+ path: resolvedPath,
65
+ metadata: metadata,
66
+ relationships: metadata.relationships,
67
+ };
68
+ this.cache.set(name, resolved);
69
+ return resolved;
70
+ }
71
+ catch (error) {
72
+ if (error instanceof cli_wrapper_1.CliNotFoundError) {
73
+ throw new Error(error.message);
74
+ }
75
+ throw new ResolveError(filePath, error instanceof Error ? error.message : String(error));
76
+ }
77
+ }
78
+ /**
79
+ * Recursively resolve all dossiers in the dependency graph
80
+ * starting from an entry dossier.
81
+ */
82
+ async resolveGraph(entryDossier) {
83
+ const nodes = new Map();
84
+ const queue = [entryDossier];
85
+ const visited = new Set();
86
+ while (queue.length > 0) {
87
+ const current = queue.shift();
88
+ if (visited.has(current.name))
89
+ continue;
90
+ visited.add(current.name);
91
+ nodes.set(current.name, {
92
+ name: current.name,
93
+ source: current.source,
94
+ path: current.path,
95
+ riskLevel: current.metadata.risk_level ?? current.metadata.riskLevel,
96
+ status: current.metadata.status,
97
+ relationships: current.relationships,
98
+ });
99
+ // Queue all referenced dossiers for resolution
100
+ const refs = this.collectReferences(current.relationships);
101
+ for (const ref of refs) {
102
+ if (visited.has(ref))
103
+ continue;
104
+ try {
105
+ const resolved = await this.resolve(ref);
106
+ queue.push(resolved);
107
+ }
108
+ catch (error) {
109
+ logger_1.logger.warn('Could not resolve referenced dossier', {
110
+ dossier: ref,
111
+ from: current.name,
112
+ error: error instanceof Error ? error.message : String(error),
113
+ });
114
+ }
115
+ }
116
+ }
117
+ return nodes;
118
+ }
119
+ collectReferences(relationships) {
120
+ if (!relationships)
121
+ return [];
122
+ const refs = new Set();
123
+ for (const dep of relationships.preceded_by ?? []) {
124
+ refs.add(dep.dossier);
125
+ }
126
+ for (const dep of relationships.followed_by ?? []) {
127
+ refs.add(dep.dossier);
128
+ }
129
+ for (const dep of relationships.conflicts_with ?? []) {
130
+ refs.add(dep.dossier);
131
+ }
132
+ for (const name of relationships.can_run_parallel_with ?? []) {
133
+ refs.add(name);
134
+ }
135
+ return [...refs];
136
+ }
137
+ /**
138
+ * Build a local index of dossiers by scanning the base path.
139
+ */
140
+ async buildLocalIndex() {
141
+ if (this.localIndex)
142
+ return this.localIndex;
143
+ try {
144
+ const result = await (0, cli_wrapper_1.execCli)('list', [
145
+ this.basePath,
146
+ '--format',
147
+ 'json',
148
+ '--recursive',
149
+ ]);
150
+ this.localIndex = new Map();
151
+ for (const item of result) {
152
+ // Index by name field if available, otherwise by filename
153
+ const name = item.name || item.path.split('/').pop()?.replace('.ds.md', '') || item.path;
154
+ this.localIndex.set(name, item);
155
+ }
156
+ return this.localIndex;
157
+ }
158
+ catch {
159
+ this.localIndex = new Map();
160
+ return this.localIndex;
161
+ }
162
+ }
163
+ async resolveLocal(name) {
164
+ const index = await this.buildLocalIndex();
165
+ const item = index.get(name);
166
+ if (!item)
167
+ return null;
168
+ logger_1.logger.info('Resolved dossier locally', { name, path: item.path });
169
+ // Get full metadata including relationships
170
+ try {
171
+ const metadata = await (0, cli_wrapper_1.execCli)('info', [item.path, '--json']);
172
+ return {
173
+ name,
174
+ source: 'local',
175
+ path: item.path,
176
+ metadata: metadata,
177
+ relationships: metadata.relationships,
178
+ };
179
+ }
180
+ catch {
181
+ // Fallback to list item data
182
+ return {
183
+ name,
184
+ source: 'local',
185
+ path: item.path,
186
+ metadata: item,
187
+ relationships: item.relationships,
188
+ };
189
+ }
190
+ }
191
+ async resolveFromRegistry(name) {
192
+ logger_1.logger.info('Attempting registry resolution', { name });
193
+ try {
194
+ const metadata = await (0, cli_wrapper_1.execCli)('get', [name, '--json']);
195
+ return {
196
+ name,
197
+ source: 'registry',
198
+ metadata: metadata,
199
+ relationships: metadata.relationships,
200
+ };
201
+ }
202
+ catch {
203
+ return null;
204
+ }
205
+ }
206
+ }
207
+ exports.DossierResolver = DossierResolver;
208
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/orchestration/resolver.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,yCAAoC;AACpC,sDAAiE;AACjE,4CAAyC;AA0BzC,MAAa,YAAa,SAAQ,KAAK;IAEnB;IADlB,YACkB,WAAmB,EACnC,OAAe;QAEf,KAAK,CAAC,sBAAsB,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC;QAHxC,gBAAW,GAAX,WAAW,CAAQ;QAInC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AARD,oCAQC;AAED,MAAa,eAAe;IAIG;IAHrB,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC3C,UAAU,GAAiC,IAAI,CAAC;IAExD,YAA6B,WAAmB,OAAO,CAAC,GAAG,EAAE;QAAhC,aAAQ,GAAR,QAAQ,CAAwB;IAAG,CAAC;IAEjE;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,6BAA6B;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wBAAwB;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,YAAY,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,YAAY,GAAG,IAAA,mBAAO,EAAC,QAAQ,CAAC,CAAC;QAEvC,eAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAO,EAAa,MAAM,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC7E,MAAM,IAAI,GACR,QAAQ,CAAC,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC;YAEpF,MAAM,QAAQ,GAAoB;gBAChC,IAAI;gBACJ,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,QAAmC;gBAC7C,aAAa,EAAE,QAAQ,CAAC,aAAa;aACtC,CAAC;YAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,8BAAgB,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YACD,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,YAA6B;QAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC7C,MAAM,KAAK,GAAsB,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;YAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,SAAS;YACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAE1B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,SAAS,EACN,OAAO,CAAC,QAAQ,CAAC,UAAqB,IAAK,OAAO,CAAC,QAAQ,CAAC,SAAoB;gBACnF,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAgB;gBACzC,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAC;YAEH,+CAA+C;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC/B,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACzC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,eAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;wBAClD,OAAO,EAAE,GAAG;wBACZ,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,iBAAiB,CAAC,aAAoC;QAC5D,IAAI,CAAC,aAAa;YAAE,OAAO,EAAE,CAAC;QAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,qBAAqB,IAAI,EAAE,EAAE,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAO,EAAa,MAAM,EAAE;gBAC/C,IAAI,CAAC,QAAQ;gBACb,UAAU;gBACV,MAAM;gBACN,aAAa;aACd,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,0DAA0D;gBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;gBACzF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;YAED,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAY;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,eAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEnE,4CAA4C;QAC5C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAO,EAAa,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YAE1E,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,QAAmC;gBAC7C,aAAa,EAAE,QAAQ,CAAC,aAAa;aACtC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;YAC7B,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAA+B;gBACzC,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,IAAY;QAC5C,eAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAO,EAAa,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEpE,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,QAAmC;gBAC7C,aAAa,EAAE,QAAQ,CAAC,aAAa;aACtC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAzMD,0CAyMC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Types for the dependency graph resolver and execution planner.
3
+ */
4
+ export interface PrecededByRelation {
5
+ dossier: string;
6
+ condition?: 'required' | 'optional' | 'suggested';
7
+ reason?: string;
8
+ }
9
+ export interface FollowedByRelation {
10
+ dossier: string;
11
+ condition?: 'required' | 'suggested';
12
+ purpose?: string;
13
+ }
14
+ export interface ConflictsWithRelation {
15
+ dossier: string;
16
+ reason: string;
17
+ }
18
+ export interface DossierRelationships {
19
+ preceded_by?: PrecededByRelation[];
20
+ followed_by?: FollowedByRelation[];
21
+ conflicts_with?: ConflictsWithRelation[];
22
+ can_run_parallel_with?: string[];
23
+ alternatives?: Array<{
24
+ dossier: string;
25
+ when_to_use?: string;
26
+ }>;
27
+ }
28
+ export interface DossierNode {
29
+ name: string;
30
+ source: 'local' | 'registry';
31
+ path?: string;
32
+ riskLevel?: string;
33
+ status?: string;
34
+ relationships?: DossierRelationships;
35
+ }
36
+ export interface GraphEdge {
37
+ from: string;
38
+ to: string;
39
+ condition: 'required' | 'optional' | 'suggested';
40
+ reason?: string;
41
+ }
42
+ export interface DependencyGraph {
43
+ nodes: Map<string, DossierNode>;
44
+ edges: GraphEdge[];
45
+ }
46
+ export interface PhaseEntry {
47
+ name: string;
48
+ source: 'local' | 'registry';
49
+ path?: string;
50
+ condition: 'required' | 'optional' | 'suggested';
51
+ riskLevel?: string;
52
+ }
53
+ export interface ExecutionPhase {
54
+ phase: number;
55
+ dossiers: PhaseEntry[];
56
+ }
57
+ export interface ConflictWarning {
58
+ dossierA: string;
59
+ dossierB: string;
60
+ reason: string;
61
+ }
62
+ export interface ExecutionPlan {
63
+ entryDossier: string;
64
+ totalDossiers: number;
65
+ phases: ExecutionPhase[];
66
+ conflicts: ConflictWarning[];
67
+ warnings: string[];
68
+ }
69
+ export interface ResolvedDossier {
70
+ name: string;
71
+ source: 'local' | 'registry';
72
+ path?: string;
73
+ metadata: Record<string, unknown>;
74
+ relationships?: DossierRelationships;
75
+ }
76
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/orchestration/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACnC,cAAc,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACzC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChC,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAID,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Types for the dependency graph resolver and execution planner.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/orchestration/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=listDossiers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listDossiers.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/listDossiers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ vitest_1.vi.mock('../../utils/cli-wrapper', () => ({
5
+ execCli: vitest_1.vi.fn(),
6
+ CliNotFoundError: class CliNotFoundError extends Error {
7
+ constructor() {
8
+ super('ai-dossier CLI not found');
9
+ this.name = 'CliNotFoundError';
10
+ }
11
+ },
12
+ }));
13
+ vitest_1.vi.mock('../../utils/logger', () => ({
14
+ logger: { info: vitest_1.vi.fn(), warn: vitest_1.vi.fn(), error: vitest_1.vi.fn(), debug: vitest_1.vi.fn() },
15
+ }));
16
+ const cli_wrapper_1 = require("../../utils/cli-wrapper");
17
+ const listDossiers_1 = require("../listDossiers");
18
+ (0, vitest_1.describe)('listDossiers tool', () => {
19
+ const originalCwd = process.cwd();
20
+ (0, vitest_1.beforeEach)(() => {
21
+ vitest_1.vi.clearAllMocks();
22
+ });
23
+ (0, vitest_1.afterEach)(() => {
24
+ vitest_1.vi.restoreAllMocks();
25
+ });
26
+ (0, vitest_1.it)('should list dossiers from CLI output', async () => {
27
+ const mockDossiers = [
28
+ { path: '/cwd/test.ds.md', filename: 'test.ds.md', title: 'Test', version: '1.0.0' },
29
+ ];
30
+ vitest_1.vi.mocked(cli_wrapper_1.execCli).mockResolvedValue(mockDossiers);
31
+ const result = await (0, listDossiers_1.listDossiers)({ path: originalCwd });
32
+ (0, vitest_1.expect)(result.dossiers).toEqual(mockDossiers);
33
+ (0, vitest_1.expect)(result.count).toBe(1);
34
+ (0, vitest_1.expect)(result.scannedPath).toBe(originalCwd);
35
+ });
36
+ (0, vitest_1.it)('should use cwd when no path is provided', async () => {
37
+ vitest_1.vi.mocked(cli_wrapper_1.execCli).mockResolvedValue([]);
38
+ const result = await (0, listDossiers_1.listDossiers)({});
39
+ (0, vitest_1.expect)(result.scannedPath).toBe(originalCwd);
40
+ (0, vitest_1.expect)(result.count).toBe(0);
41
+ });
42
+ (0, vitest_1.it)('should pass recursive flag', async () => {
43
+ vitest_1.vi.mocked(cli_wrapper_1.execCli).mockResolvedValue([]);
44
+ await (0, listDossiers_1.listDossiers)({ path: originalCwd, recursive: true });
45
+ (0, vitest_1.expect)(cli_wrapper_1.execCli).toHaveBeenCalledWith('list', vitest_1.expect.arrayContaining(['--recursive']));
46
+ });
47
+ (0, vitest_1.it)('should not pass recursive flag when false', async () => {
48
+ vitest_1.vi.mocked(cli_wrapper_1.execCli).mockResolvedValue([]);
49
+ await (0, listDossiers_1.listDossiers)({ path: originalCwd, recursive: false });
50
+ const args = vitest_1.vi.mocked(cli_wrapper_1.execCli).mock.calls[0][1];
51
+ (0, vitest_1.expect)(args).not.toContain('--recursive');
52
+ });
53
+ (0, vitest_1.it)('should reject paths outside working directory', async () => {
54
+ await (0, vitest_1.expect)((0, listDossiers_1.listDossiers)({ path: '/etc/passwd' })).rejects.toThrow('Access denied');
55
+ });
56
+ (0, vitest_1.it)('should handle empty result gracefully', async () => {
57
+ vitest_1.vi.mocked(cli_wrapper_1.execCli).mockResolvedValue(null);
58
+ const result = await (0, listDossiers_1.listDossiers)({ path: originalCwd });
59
+ (0, vitest_1.expect)(result.dossiers).toEqual([]);
60
+ (0, vitest_1.expect)(result.count).toBe(0);
61
+ });
62
+ (0, vitest_1.it)('should throw when CLI is not found', async () => {
63
+ vitest_1.vi.mocked(cli_wrapper_1.execCli).mockRejectedValue(new cli_wrapper_1.CliNotFoundError());
64
+ await (0, vitest_1.expect)((0, listDossiers_1.listDossiers)({ path: originalCwd })).rejects.toThrow('ai-dossier CLI not found');
65
+ });
66
+ });
67
+ //# sourceMappingURL=listDossiers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listDossiers.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/listDossiers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=readDossier.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readDossier.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/readDossier.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_fs_1 = require("node:fs");
4
+ const node_os_1 = require("node:os");
5
+ const node_path_1 = require("node:path");
6
+ const vitest_1 = require("vitest");
7
+ vitest_1.vi.mock('../../utils/cli-wrapper', () => ({
8
+ execCli: vitest_1.vi.fn(),
9
+ CliNotFoundError: class CliNotFoundError extends Error {
10
+ constructor() {
11
+ super('ai-dossier CLI not found');
12
+ this.name = 'CliNotFoundError';
13
+ }
14
+ },
15
+ }));
16
+ vitest_1.vi.mock('../../utils/logger', () => ({
17
+ logger: { info: vitest_1.vi.fn(), warn: vitest_1.vi.fn(), error: vitest_1.vi.fn(), debug: vitest_1.vi.fn() },
18
+ }));
19
+ const cli_wrapper_1 = require("../../utils/cli-wrapper");
20
+ const readDossier_1 = require("../readDossier");
21
+ (0, vitest_1.describe)('readDossier tool', () => {
22
+ let tempDir;
23
+ let originalCwd;
24
+ (0, vitest_1.beforeEach)(() => {
25
+ vitest_1.vi.clearAllMocks();
26
+ originalCwd = process.cwd();
27
+ tempDir = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `dossier-read-test-${Date.now()}`);
28
+ (0, node_fs_1.mkdirSync)(tempDir, { recursive: true });
29
+ process.chdir(tempDir);
30
+ });
31
+ (0, vitest_1.afterEach)(() => {
32
+ process.chdir(originalCwd);
33
+ (0, node_fs_1.rmSync)(tempDir, { recursive: true, force: true });
34
+ vitest_1.vi.restoreAllMocks();
35
+ });
36
+ (0, vitest_1.it)('should read dossier metadata and body', async () => {
37
+ const dossierContent = `---dossier
38
+ {
39
+ "name": "test",
40
+ "title": "Test Dossier",
41
+ "version": "1.0.0"
42
+ }
43
+ ---
44
+
45
+ # Test Dossier
46
+
47
+ This is the body.`;
48
+ const filePath = (0, node_path_1.join)(tempDir, 'test.ds.md');
49
+ (0, node_fs_1.writeFileSync)(filePath, dossierContent);
50
+ vitest_1.vi.mocked(cli_wrapper_1.execCli).mockResolvedValue({
51
+ name: 'test',
52
+ title: 'Test Dossier',
53
+ version: '1.0.0',
54
+ });
55
+ const result = await (0, readDossier_1.readDossier)({ path: filePath });
56
+ (0, vitest_1.expect)(result.metadata).toEqual({
57
+ name: 'test',
58
+ title: 'Test Dossier',
59
+ version: '1.0.0',
60
+ });
61
+ (0, vitest_1.expect)(result.body).toContain('# Test Dossier');
62
+ (0, vitest_1.expect)(result.body).toContain('This is the body.');
63
+ (0, vitest_1.expect)(cli_wrapper_1.execCli).toHaveBeenCalledWith('info', [filePath, '--json']);
64
+ });
65
+ (0, vitest_1.it)('should extract body from YAML frontmatter', async () => {
66
+ const dossierContent = `---
67
+ name: test
68
+ title: Test
69
+ ---
70
+
71
+ # Body Content`;
72
+ const filePath = (0, node_path_1.join)(tempDir, 'yaml.ds.md');
73
+ (0, node_fs_1.writeFileSync)(filePath, dossierContent);
74
+ vitest_1.vi.mocked(cli_wrapper_1.execCli).mockResolvedValue({ name: 'test', title: 'Test' });
75
+ const result = await (0, readDossier_1.readDossier)({ path: filePath });
76
+ (0, vitest_1.expect)(result.body).toContain('# Body Content');
77
+ });
78
+ (0, vitest_1.it)('should reject paths outside working directory', async () => {
79
+ await (0, vitest_1.expect)((0, readDossier_1.readDossier)({ path: '/etc/passwd' })).rejects.toThrow('Access denied');
80
+ });
81
+ (0, vitest_1.it)('should throw when CLI is not found', async () => {
82
+ const filePath = (0, node_path_1.join)(tempDir, 'notfound.ds.md');
83
+ (0, node_fs_1.writeFileSync)(filePath, '---dossier\n{}\n---\n# Body');
84
+ vitest_1.vi.mocked(cli_wrapper_1.execCli).mockRejectedValue(new cli_wrapper_1.CliNotFoundError());
85
+ await (0, vitest_1.expect)((0, readDossier_1.readDossier)({ path: filePath })).rejects.toThrow('ai-dossier CLI not found');
86
+ });
87
+ });
88
+ //# sourceMappingURL=readDossier.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readDossier.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/readDossier.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolveGraph.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveGraph.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/resolveGraph.test.ts"],"names":[],"mappings":""}