@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.
Files changed (40) hide show
  1. package/LICENSE +108 -0
  2. package/README.md +2 -2
  3. package/dist/.tsbuildinfo.app +1 -1
  4. package/dist/.tsbuildinfo.data +1 -1
  5. package/dist/.tsbuildinfo.domain +1 -1
  6. package/dist/.tsbuildinfo.foundation +1 -1
  7. package/dist/commands-v2/handlers/context.js +20 -0
  8. package/dist/commands-v2/handlers/project.js +52 -9
  9. package/dist/compilr-diff-companion.vsix +0 -0
  10. package/dist/db/repositories/document-repository.js +1 -0
  11. package/dist/db/schema.d.ts +1 -1
  12. package/dist/repl-helpers.js +2 -0
  13. package/dist/repl-v2.js +16 -5
  14. package/dist/tool-names.d.ts +5 -0
  15. package/dist/tool-names.js +12 -0
  16. package/dist/tools/db-tools.d.ts +6 -1
  17. package/dist/tools/db-tools.js +6 -2
  18. package/dist/tools/meta-tools.d.ts +1 -1
  19. package/dist/tools/platform-adapter.d.ts +6 -0
  20. package/dist/tools/platform-adapter.js +10 -0
  21. package/dist/tools.js +3 -1
  22. package/dist/ui/constants/labels.js +1 -0
  23. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +1 -0
  24. package/dist/ui/overlay/impl/workflow-overlay-v2.js +5 -3
  25. package/dist/ui/tool-formatters.js +190 -6
  26. package/package.json +5 -4
  27. package/dist/tools/anchor-tools.d.ts +0 -31
  28. package/dist/tools/anchor-tools.js +0 -255
  29. package/dist/tools/artifact-tools.d.ts +0 -42
  30. package/dist/tools/artifact-tools.js +0 -328
  31. package/dist/tools/backlog-wrappers.d.ts +0 -56
  32. package/dist/tools/backlog-wrappers.js +0 -353
  33. package/dist/tools/document-db.d.ts +0 -43
  34. package/dist/tools/document-db.js +0 -220
  35. package/dist/tools/plan-tools.d.ts +0 -54
  36. package/dist/tools/plan-tools.js +0 -338
  37. package/dist/tools/recall-work-tool.d.ts +0 -18
  38. package/dist/tools/recall-work-tool.js +0 -82
  39. package/dist/tools/workitem-db.d.ts +0 -135
  40. 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 {};