@compilr-dev/cli 0.5.1 → 0.5.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.
- package/LICENSE +108 -0
- package/README.md +2 -2
- package/dist/.tsbuildinfo.app +1 -1
- package/dist/.tsbuildinfo.data +1 -1
- package/dist/.tsbuildinfo.domain +1 -1
- package/dist/.tsbuildinfo.foundation +1 -1
- package/dist/commands-v2/handlers/context.js +20 -0
- package/dist/commands-v2/handlers/project.js +52 -9
- package/dist/compilr-diff-companion.vsix +0 -0
- package/dist/db/repositories/document-repository.js +1 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/repl-helpers.js +2 -0
- package/dist/repl-v2.js +16 -5
- package/dist/tool-names.d.ts +5 -0
- package/dist/tool-names.js +12 -0
- package/dist/tools/db-tools.d.ts +6 -1
- package/dist/tools/db-tools.js +6 -2
- package/dist/tools/meta-tools.d.ts +1 -1
- package/dist/tools/platform-adapter.d.ts +6 -0
- package/dist/tools/platform-adapter.js +10 -0
- package/dist/tools.js +3 -1
- package/dist/ui/constants/labels.js +1 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +1 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +5 -3
- package/dist/ui/tool-formatters.js +190 -6
- package/package.json +5 -4
- package/dist/tools/anchor-tools.d.ts +0 -31
- package/dist/tools/anchor-tools.js +0 -255
- package/dist/tools/artifact-tools.d.ts +0 -42
- package/dist/tools/artifact-tools.js +0 -328
- package/dist/tools/backlog-wrappers.d.ts +0 -56
- package/dist/tools/backlog-wrappers.js +0 -353
- package/dist/tools/document-db.d.ts +0 -43
- package/dist/tools/document-db.js +0 -220
- package/dist/tools/plan-tools.d.ts +0 -54
- package/dist/tools/plan-tools.js +0 -338
- package/dist/tools/recall-work-tool.d.ts +0 -18
- package/dist/tools/recall-work-tool.js +0 -82
- package/dist/tools/workitem-db.d.ts +0 -135
- package/dist/tools/workitem-db.js +0 -730
|
@@ -1,328 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Artifact Tools
|
|
3
|
-
*
|
|
4
|
-
* Tools for managing team artifacts - named pieces of work that agents
|
|
5
|
-
* can publish and reference across the team.
|
|
6
|
-
*
|
|
7
|
-
* Artifact types:
|
|
8
|
-
* - design: Architecture, API specs, data models
|
|
9
|
-
* - plan: Sprint plans, task breakdowns, timelines
|
|
10
|
-
* - review: Code reviews, security audits, feedback
|
|
11
|
-
* - decision: Architectural decisions, trade-off analysis
|
|
12
|
-
* - note: General notes, meeting summaries
|
|
13
|
-
*/
|
|
14
|
-
import { defineTool, createSuccessResult, createErrorResult } from '@compilr-dev/sdk';
|
|
15
|
-
import { getTeamCheckpointer, recordTeamActivity } from '../multi-agent/index.js';
|
|
16
|
-
import { getCurrentProject } from './project-db.js';
|
|
17
|
-
// =============================================================================
|
|
18
|
-
// Helper Functions
|
|
19
|
-
// =============================================================================
|
|
20
|
-
/**
|
|
21
|
-
* Get the artifact store for the current project
|
|
22
|
-
*/
|
|
23
|
-
function getArtifactStore() {
|
|
24
|
-
const currentProject = getCurrentProject();
|
|
25
|
-
const projectId = currentProject?.id ?? null;
|
|
26
|
-
const checkpointer = getTeamCheckpointer();
|
|
27
|
-
return checkpointer.getArtifactStore(projectId);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Get the current agent ID (for artifact authorship)
|
|
31
|
-
* Falls back to 'default' if not available
|
|
32
|
-
*/
|
|
33
|
-
function getCurrentAgentId() {
|
|
34
|
-
// Note: In a future enhancement, we could pass the agent ID through context
|
|
35
|
-
// For now, we'll use 'default' and the caller can override
|
|
36
|
-
return 'default';
|
|
37
|
-
}
|
|
38
|
-
// =============================================================================
|
|
39
|
-
// artifact_save - Save or update an artifact
|
|
40
|
-
// =============================================================================
|
|
41
|
-
export const artifactSaveTool = defineTool({
|
|
42
|
-
name: 'artifact_save',
|
|
43
|
-
description: 'Save a new artifact or update an existing one. Artifacts are named pieces of work that can be referenced by other agents. ' +
|
|
44
|
-
'Types: design (architecture/API specs), plan (task breakdowns), review (code reviews), decision (architectural decisions), note (general notes).',
|
|
45
|
-
inputSchema: {
|
|
46
|
-
type: 'object',
|
|
47
|
-
properties: {
|
|
48
|
-
name: {
|
|
49
|
-
type: 'string',
|
|
50
|
-
description: 'Artifact name (human-readable, unique within team). Example: "API Design v2", "Sprint 5 Plan", "Auth Module Review"',
|
|
51
|
-
},
|
|
52
|
-
type: {
|
|
53
|
-
type: 'string',
|
|
54
|
-
enum: ['design', 'plan', 'review', 'decision', 'note'],
|
|
55
|
-
description: 'Artifact type: design (architecture), plan (task breakdown), review (feedback), decision (trade-off analysis), note (general)',
|
|
56
|
-
},
|
|
57
|
-
content: {
|
|
58
|
-
type: 'string',
|
|
59
|
-
description: 'Full artifact content in markdown format. Should be complete and self-contained.',
|
|
60
|
-
},
|
|
61
|
-
summary: {
|
|
62
|
-
type: 'string',
|
|
63
|
-
description: 'Optional one-line summary (auto-generated if not provided). Max 200 characters.',
|
|
64
|
-
},
|
|
65
|
-
agent: {
|
|
66
|
-
type: 'string',
|
|
67
|
-
description: 'Optional agent ID who created this artifact. Defaults to current agent.',
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
required: ['name', 'type', 'content'],
|
|
71
|
-
},
|
|
72
|
-
execute: async (input) => {
|
|
73
|
-
await Promise.resolve();
|
|
74
|
-
try {
|
|
75
|
-
const store = getArtifactStore();
|
|
76
|
-
const agentId = input.agent ?? getCurrentAgentId();
|
|
77
|
-
const artifactType = input.type;
|
|
78
|
-
// Check if artifact exists
|
|
79
|
-
const existing = store.getByName(input.name);
|
|
80
|
-
if (existing) {
|
|
81
|
-
// Update existing artifact
|
|
82
|
-
const updated = store.update(existing.id, {
|
|
83
|
-
content: input.content,
|
|
84
|
-
summary: input.summary,
|
|
85
|
-
type: artifactType,
|
|
86
|
-
});
|
|
87
|
-
if (!updated) {
|
|
88
|
-
return createErrorResult(`Failed to update artifact "${input.name}"`);
|
|
89
|
-
}
|
|
90
|
-
// Save to disk
|
|
91
|
-
store.save();
|
|
92
|
-
// Record activity for team awareness
|
|
93
|
-
recordTeamActivity(agentId, 'artifact_updated', `updated artifact "${updated.name}"`);
|
|
94
|
-
const output = [
|
|
95
|
-
`Updated artifact "${updated.name}" (v${String(updated.version)})`,
|
|
96
|
-
``,
|
|
97
|
-
`Type: ${updated.type}`,
|
|
98
|
-
`Agent: ${updated.agent}`,
|
|
99
|
-
`Summary: ${updated.summary}`,
|
|
100
|
-
`Updated: ${updated.updatedAt.toISOString()}`,
|
|
101
|
-
].join('\n');
|
|
102
|
-
return createSuccessResult(output);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
// Create new artifact
|
|
106
|
-
const artifact = store.create({
|
|
107
|
-
name: input.name,
|
|
108
|
-
agent: agentId,
|
|
109
|
-
type: artifactType,
|
|
110
|
-
content: input.content,
|
|
111
|
-
summary: input.summary,
|
|
112
|
-
});
|
|
113
|
-
// Save to disk
|
|
114
|
-
store.save();
|
|
115
|
-
// Record activity for team awareness
|
|
116
|
-
recordTeamActivity(agentId, 'artifact_created', `created artifact "${artifact.name}"`);
|
|
117
|
-
const output = [
|
|
118
|
-
`Created artifact "${artifact.name}"`,
|
|
119
|
-
``,
|
|
120
|
-
`Type: ${artifact.type}`,
|
|
121
|
-
`Agent: ${artifact.agent}`,
|
|
122
|
-
`Summary: ${artifact.summary}`,
|
|
123
|
-
`Created: ${artifact.createdAt.toISOString()}`,
|
|
124
|
-
].join('\n');
|
|
125
|
-
return createSuccessResult(output);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
return createErrorResult(`Failed to save artifact: ${error instanceof Error ? error.message : String(error)}`);
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
});
|
|
133
|
-
// =============================================================================
|
|
134
|
-
// artifact_get - Retrieve an artifact by name
|
|
135
|
-
// =============================================================================
|
|
136
|
-
export const artifactGetTool = defineTool({
|
|
137
|
-
name: 'artifact_get',
|
|
138
|
-
description: 'Retrieve an artifact by name. Returns the full content and metadata. ' +
|
|
139
|
-
'Use artifact_list first to see available artifacts.',
|
|
140
|
-
inputSchema: {
|
|
141
|
-
type: 'object',
|
|
142
|
-
properties: {
|
|
143
|
-
name: {
|
|
144
|
-
type: 'string',
|
|
145
|
-
description: 'Name of the artifact to retrieve (case-insensitive)',
|
|
146
|
-
},
|
|
147
|
-
},
|
|
148
|
-
required: ['name'],
|
|
149
|
-
},
|
|
150
|
-
execute: async (input) => {
|
|
151
|
-
await Promise.resolve();
|
|
152
|
-
try {
|
|
153
|
-
const store = getArtifactStore();
|
|
154
|
-
const artifact = store.getByName(input.name);
|
|
155
|
-
if (!artifact) {
|
|
156
|
-
// Suggest similar artifacts
|
|
157
|
-
const all = store.list();
|
|
158
|
-
const searchLower = input.name.toLowerCase();
|
|
159
|
-
const suggestions = all
|
|
160
|
-
.filter(a => a.name.toLowerCase().includes(searchLower) ||
|
|
161
|
-
searchLower.includes(a.name.toLowerCase()))
|
|
162
|
-
.slice(0, 3)
|
|
163
|
-
.map(a => `"${a.name}"`);
|
|
164
|
-
let message = `Artifact "${input.name}" not found.`;
|
|
165
|
-
if (suggestions.length > 0) {
|
|
166
|
-
message += ` Did you mean: ${suggestions.join(', ')}?`;
|
|
167
|
-
}
|
|
168
|
-
else if (all.length > 0) {
|
|
169
|
-
message += ` Available artifacts: ${all.slice(0, 5).map(a => `"${a.name}"`).join(', ')}`;
|
|
170
|
-
if (all.length > 5) {
|
|
171
|
-
message += ` (+${String(all.length - 5)} more)`;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
message += ' No artifacts exist yet. Use artifact_save to create one.';
|
|
176
|
-
}
|
|
177
|
-
return createErrorResult(message);
|
|
178
|
-
}
|
|
179
|
-
const output = [
|
|
180
|
-
`Artifact: ${artifact.name}`,
|
|
181
|
-
``,
|
|
182
|
-
`Type: ${artifact.type}`,
|
|
183
|
-
`Agent: ${artifact.agent}`,
|
|
184
|
-
`Version: ${String(artifact.version)}`,
|
|
185
|
-
`Summary: ${artifact.summary}`,
|
|
186
|
-
`Created: ${artifact.createdAt.toISOString()}`,
|
|
187
|
-
`Updated: ${artifact.updatedAt.toISOString()}`,
|
|
188
|
-
``,
|
|
189
|
-
`--- Content ---`,
|
|
190
|
-
artifact.content,
|
|
191
|
-
].join('\n');
|
|
192
|
-
return createSuccessResult(output);
|
|
193
|
-
}
|
|
194
|
-
catch (error) {
|
|
195
|
-
return createErrorResult(`Failed to get artifact: ${error instanceof Error ? error.message : String(error)}`);
|
|
196
|
-
}
|
|
197
|
-
},
|
|
198
|
-
});
|
|
199
|
-
// =============================================================================
|
|
200
|
-
// artifact_list - List all artifacts
|
|
201
|
-
// =============================================================================
|
|
202
|
-
export const artifactListTool = defineTool({
|
|
203
|
-
name: 'artifact_list',
|
|
204
|
-
description: 'List all artifacts in the team. Can filter by type or agent. ' +
|
|
205
|
-
'Returns summaries only - use artifact_get for full content.',
|
|
206
|
-
inputSchema: {
|
|
207
|
-
type: 'object',
|
|
208
|
-
properties: {
|
|
209
|
-
type: {
|
|
210
|
-
type: 'string',
|
|
211
|
-
enum: ['design', 'plan', 'review', 'decision', 'note'],
|
|
212
|
-
description: 'Optional: filter by artifact type',
|
|
213
|
-
},
|
|
214
|
-
agent: {
|
|
215
|
-
type: 'string',
|
|
216
|
-
description: 'Optional: filter by agent ID',
|
|
217
|
-
},
|
|
218
|
-
search: {
|
|
219
|
-
type: 'string',
|
|
220
|
-
description: 'Optional: search by name or content',
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
required: [],
|
|
224
|
-
},
|
|
225
|
-
execute: async (input) => {
|
|
226
|
-
await Promise.resolve();
|
|
227
|
-
try {
|
|
228
|
-
const store = getArtifactStore();
|
|
229
|
-
let artifacts = store.list();
|
|
230
|
-
// Apply filters
|
|
231
|
-
if (input.type) {
|
|
232
|
-
artifacts = artifacts.filter(a => a.type === input.type);
|
|
233
|
-
}
|
|
234
|
-
if (input.agent) {
|
|
235
|
-
artifacts = artifacts.filter(a => a.agent === input.agent);
|
|
236
|
-
}
|
|
237
|
-
if (input.search) {
|
|
238
|
-
artifacts = store.search(input.search);
|
|
239
|
-
// Re-apply type/agent filters after search
|
|
240
|
-
if (input.type) {
|
|
241
|
-
artifacts = artifacts.filter(a => a.type === input.type);
|
|
242
|
-
}
|
|
243
|
-
if (input.agent) {
|
|
244
|
-
artifacts = artifacts.filter(a => a.agent === input.agent);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
// Sort by most recently updated
|
|
248
|
-
artifacts.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
|
|
249
|
-
if (artifacts.length === 0) {
|
|
250
|
-
let message = 'No artifacts found';
|
|
251
|
-
if (input.type || input.agent || input.search) {
|
|
252
|
-
message += ' matching the filter criteria';
|
|
253
|
-
}
|
|
254
|
-
message += '. Use artifact_save to create one.';
|
|
255
|
-
return createSuccessResult(message);
|
|
256
|
-
}
|
|
257
|
-
const lines = [
|
|
258
|
-
`Found ${String(artifacts.length)} artifact${artifacts.length === 1 ? '' : 's'}:`,
|
|
259
|
-
``,
|
|
260
|
-
];
|
|
261
|
-
for (const a of artifacts) {
|
|
262
|
-
lines.push(`* ${a.name} [${a.type}]`);
|
|
263
|
-
lines.push(` Agent: ${a.agent} | v${String(a.version)} | Updated: ${a.updatedAt.toISOString().split('T')[0]}`);
|
|
264
|
-
if (a.summary) {
|
|
265
|
-
lines.push(` ${a.summary}`);
|
|
266
|
-
}
|
|
267
|
-
lines.push(``);
|
|
268
|
-
}
|
|
269
|
-
lines.push(`Use artifact_get(name) to view full content.`);
|
|
270
|
-
return createSuccessResult(lines.join('\n'));
|
|
271
|
-
}
|
|
272
|
-
catch (error) {
|
|
273
|
-
return createErrorResult(`Failed to list artifacts: ${error instanceof Error ? error.message : String(error)}`);
|
|
274
|
-
}
|
|
275
|
-
},
|
|
276
|
-
});
|
|
277
|
-
// =============================================================================
|
|
278
|
-
// artifact_delete - Delete an artifact
|
|
279
|
-
// =============================================================================
|
|
280
|
-
export const artifactDeleteTool = defineTool({
|
|
281
|
-
name: 'artifact_delete',
|
|
282
|
-
description: 'Delete an artifact by name. This action cannot be undone.',
|
|
283
|
-
inputSchema: {
|
|
284
|
-
type: 'object',
|
|
285
|
-
properties: {
|
|
286
|
-
name: {
|
|
287
|
-
type: 'string',
|
|
288
|
-
description: 'Name of the artifact to delete (case-insensitive)',
|
|
289
|
-
},
|
|
290
|
-
},
|
|
291
|
-
required: ['name'],
|
|
292
|
-
},
|
|
293
|
-
execute: async (input) => {
|
|
294
|
-
await Promise.resolve();
|
|
295
|
-
try {
|
|
296
|
-
const store = getArtifactStore();
|
|
297
|
-
const artifact = store.getByName(input.name);
|
|
298
|
-
if (!artifact) {
|
|
299
|
-
return createErrorResult(`Artifact "${input.name}" not found.`);
|
|
300
|
-
}
|
|
301
|
-
const deleted = store.delete(artifact.id);
|
|
302
|
-
if (!deleted) {
|
|
303
|
-
return createErrorResult(`Failed to delete artifact "${input.name}"`);
|
|
304
|
-
}
|
|
305
|
-
// Save changes to disk
|
|
306
|
-
store.save();
|
|
307
|
-
const output = [
|
|
308
|
-
`Deleted artifact "${artifact.name}"`,
|
|
309
|
-
``,
|
|
310
|
-
`Type: ${artifact.type}`,
|
|
311
|
-
`Agent: ${artifact.agent}`,
|
|
312
|
-
].join('\n');
|
|
313
|
-
return createSuccessResult(output);
|
|
314
|
-
}
|
|
315
|
-
catch (error) {
|
|
316
|
-
return createErrorResult(`Failed to delete artifact: ${error instanceof Error ? error.message : String(error)}`);
|
|
317
|
-
}
|
|
318
|
-
},
|
|
319
|
-
});
|
|
320
|
-
// =============================================================================
|
|
321
|
-
// Export all artifact tools
|
|
322
|
-
// =============================================================================
|
|
323
|
-
export const allArtifactTools = [
|
|
324
|
-
artifactSaveTool,
|
|
325
|
-
artifactGetTool,
|
|
326
|
-
artifactListTool,
|
|
327
|
-
artifactDeleteTool,
|
|
328
|
-
];
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Backlog Tool Wrappers
|
|
3
|
-
*
|
|
4
|
-
* These wrappers provide `backlog_read` and `backlog_write` tools that skills expect,
|
|
5
|
-
* but internally delegate to the `workitem_*` database tools.
|
|
6
|
-
*
|
|
7
|
-
* This allows library skills (which reference backlog_*) to work seamlessly
|
|
8
|
-
* with the CLI's database-backed workitem system.
|
|
9
|
-
*/
|
|
10
|
-
interface BacklogReadInput {
|
|
11
|
-
/** Get a specific item by ID */
|
|
12
|
-
id?: string;
|
|
13
|
-
/** Filter by status */
|
|
14
|
-
status?: 'backlog' | 'in-progress' | 'done' | 'blocked';
|
|
15
|
-
/** Filter by type */
|
|
16
|
-
type?: 'feature' | 'bug' | 'chore' | 'spike';
|
|
17
|
-
/** Filter by priority */
|
|
18
|
-
priority?: 'critical' | 'high' | 'medium' | 'low';
|
|
19
|
-
/** Search in title and description */
|
|
20
|
-
search?: string;
|
|
21
|
-
/** Maximum items to return (default: 20) */
|
|
22
|
-
limit?: number;
|
|
23
|
-
}
|
|
24
|
-
export declare const backlogReadTool: import("@compilr-dev/sdk").Tool<BacklogReadInput>;
|
|
25
|
-
interface BacklogWriteInput {
|
|
26
|
-
/** Action to perform */
|
|
27
|
-
action: 'add' | 'update' | 'delete' | 'replace';
|
|
28
|
-
/** Item to add or update (required for add/update) */
|
|
29
|
-
item?: {
|
|
30
|
-
id?: string;
|
|
31
|
-
type?: 'feature' | 'bug' | 'chore' | 'spike';
|
|
32
|
-
title?: string;
|
|
33
|
-
description?: string;
|
|
34
|
-
status?: 'backlog' | 'in-progress' | 'done' | 'blocked';
|
|
35
|
-
priority?: 'critical' | 'high' | 'medium' | 'low';
|
|
36
|
-
owner?: string;
|
|
37
|
-
commit_hash?: string;
|
|
38
|
-
};
|
|
39
|
-
/** Item ID to delete (required for delete) */
|
|
40
|
-
deleteId?: string;
|
|
41
|
-
/** Full list of items (required for replace action) */
|
|
42
|
-
items?: Array<{
|
|
43
|
-
id?: string;
|
|
44
|
-
type: 'feature' | 'bug' | 'chore' | 'spike';
|
|
45
|
-
title: string;
|
|
46
|
-
description?: string;
|
|
47
|
-
status?: 'backlog' | 'in-progress' | 'done' | 'blocked';
|
|
48
|
-
priority?: 'critical' | 'high' | 'medium' | 'low';
|
|
49
|
-
}>;
|
|
50
|
-
}
|
|
51
|
-
export declare const backlogWriteTool: import("@compilr-dev/sdk").Tool<BacklogWriteInput>;
|
|
52
|
-
/**
|
|
53
|
-
* All backlog wrapper tools
|
|
54
|
-
*/
|
|
55
|
-
export declare const backlogWrapperTools: (import("@compilr-dev/sdk").Tool<BacklogReadInput> | import("@compilr-dev/sdk").Tool<BacklogWriteInput>)[];
|
|
56
|
-
export {};
|