@compilr-dev/cli 0.4.0 → 0.5.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.
- package/README.md +30 -12
- package/dist/agent.d.ts +74 -1
- package/dist/agent.js +259 -76
- package/dist/anchors/index.d.ts +9 -0
- package/dist/anchors/index.js +9 -0
- package/dist/anchors/project-anchors.d.ts +79 -0
- package/dist/anchors/project-anchors.js +202 -0
- package/dist/commands/handler-types.d.ts +68 -0
- package/dist/commands/handler-types.js +8 -0
- package/dist/commands/handlers/agent-commands.d.ts +13 -0
- package/dist/commands/handlers/agent-commands.js +305 -0
- package/dist/commands/handlers/design-commands.d.ts +15 -0
- package/dist/commands/handlers/design-commands.js +334 -0
- package/dist/commands/handlers/index.d.ts +20 -0
- package/dist/commands/handlers/index.js +43 -0
- package/dist/commands/handlers/overlay-commands.d.ts +21 -0
- package/dist/commands/handlers/overlay-commands.js +287 -0
- package/dist/commands/handlers/project-commands.d.ts +11 -0
- package/dist/commands/handlers/project-commands.js +167 -0
- package/dist/commands/handlers/simple-commands.d.ts +19 -0
- package/dist/commands/handlers/simple-commands.js +144 -0
- package/dist/commands/index.d.ts +2 -1
- package/dist/commands/registry.d.ts +50 -0
- package/dist/commands/registry.js +75 -0
- package/dist/commands-v2/handlers/context.d.ts +13 -0
- package/dist/commands-v2/handlers/context.js +348 -0
- package/dist/commands-v2/handlers/core.d.ts +13 -0
- package/dist/commands-v2/handlers/core.js +165 -0
- package/dist/commands-v2/handlers/debug.d.ts +11 -0
- package/dist/commands-v2/handlers/debug.js +159 -0
- package/dist/commands-v2/handlers/index.d.ts +12 -0
- package/dist/commands-v2/handlers/index.js +24 -0
- package/dist/commands-v2/handlers/project.d.ts +22 -0
- package/dist/commands-v2/handlers/project.js +814 -0
- package/dist/commands-v2/handlers/settings.d.ts +15 -0
- package/dist/commands-v2/handlers/settings.js +235 -0
- package/dist/commands-v2/index.d.ts +13 -0
- package/dist/commands-v2/index.js +15 -0
- package/dist/commands-v2/registry.d.ts +37 -0
- package/dist/commands-v2/registry.js +80 -0
- package/dist/commands-v2/types.d.ts +75 -0
- package/dist/commands-v2/types.js +7 -0
- package/dist/commands.js +110 -7
- package/dist/index.js +288 -29
- package/dist/input-handlers/index.d.ts +7 -0
- package/dist/input-handlers/index.js +7 -0
- package/dist/input-handlers/memory-handler.d.ts +26 -0
- package/dist/input-handlers/memory-handler.js +68 -0
- package/dist/repl-helpers.d.ts +63 -0
- package/dist/repl-helpers.js +318 -0
- package/dist/repl-v2.d.ts +155 -0
- package/dist/repl-v2.js +774 -0
- package/dist/repl.d.ts +32 -4
- package/dist/repl.js +250 -977
- package/dist/settings/index.d.ts +23 -0
- package/dist/settings/index.js +48 -0
- package/dist/settings/paths.d.ts +110 -0
- package/dist/settings/paths.js +264 -0
- package/dist/templates/compilr-md.js +7 -4
- package/dist/templates/index.js +3 -4
- package/dist/themes/colors.js +3 -1
- package/dist/themes/registry.d.ts +5 -36
- package/dist/themes/registry.js +11 -95
- package/dist/themes/types.d.ts +3 -38
- package/dist/themes/types.js +2 -2
- package/dist/tools/anchor-tools.d.ts +31 -0
- package/dist/tools/anchor-tools.js +255 -0
- package/dist/tools/backlog-wrappers.d.ts +54 -0
- package/dist/tools/backlog-wrappers.js +338 -0
- package/dist/tools/backlog.js +1 -1
- package/dist/tools/db-tools.d.ts +65 -0
- package/dist/tools/db-tools.js +19 -0
- package/dist/tools/document-db.d.ts +43 -0
- package/dist/tools/document-db.js +220 -0
- package/dist/tools/project-db.d.ts +102 -0
- package/dist/tools/project-db.js +370 -0
- package/dist/tools/workitem-db.d.ts +103 -0
- package/dist/tools/workitem-db.js +549 -0
- package/dist/tools.js +13 -3
- package/dist/ui/agents-overlay-v2.d.ts +43 -0
- package/dist/ui/agents-overlay-v2.js +809 -0
- package/dist/ui/agents-overlay.d.ts +5 -5
- package/dist/ui/agents-overlay.js +782 -420
- package/dist/ui/anchors-overlay.d.ts +12 -0
- package/dist/ui/anchors-overlay.js +775 -0
- package/dist/ui/arch-type-overlay.d.ts +1 -6
- package/dist/ui/arch-type-overlay.js +175 -203
- package/dist/ui/ask-user-overlay-v2.d.ts +26 -0
- package/dist/ui/ask-user-overlay-v2.js +555 -0
- package/dist/ui/ask-user-overlay.d.ts +2 -2
- package/dist/ui/ask-user-overlay.js +443 -535
- package/dist/ui/ask-user-simple-overlay-v2.d.ts +25 -0
- package/dist/ui/ask-user-simple-overlay-v2.js +215 -0
- package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
- package/dist/ui/ask-user-simple-overlay.js +182 -209
- package/dist/ui/backlog-overlay.d.ts +16 -1
- package/dist/ui/backlog-overlay.js +525 -659
- package/dist/ui/base/index.d.ts +26 -0
- package/dist/ui/base/index.js +33 -0
- package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
- package/dist/ui/base/inline-overlay-utils.js +320 -0
- package/dist/ui/base/inline-overlay.d.ts +159 -0
- package/dist/ui/base/inline-overlay.js +257 -0
- package/dist/ui/base/key-utils.d.ts +15 -0
- package/dist/ui/base/key-utils.js +30 -0
- package/dist/ui/base/overlay-base-v2.d.ts +193 -0
- package/dist/ui/base/overlay-base-v2.js +246 -0
- package/dist/ui/base/overlay-base.d.ts +156 -0
- package/dist/ui/base/overlay-base.js +238 -0
- package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
- package/dist/ui/base/overlay-lifecycle.js +159 -0
- package/dist/ui/base/overlay-types.d.ts +185 -0
- package/dist/ui/base/overlay-types.js +7 -0
- package/dist/ui/base/render-utils.d.ts +8 -0
- package/dist/ui/base/render-utils.js +11 -0
- package/dist/ui/base/screen-stack.d.ts +148 -0
- package/dist/ui/base/screen-stack.js +184 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +103 -0
- package/dist/ui/base/tabbed-list-overlay-v2.js +317 -0
- package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
- package/dist/ui/base/tabbed-list-overlay.js +369 -0
- package/dist/ui/commands-overlay-v2.d.ts +33 -0
- package/dist/ui/commands-overlay-v2.js +441 -0
- package/dist/ui/commands-overlay.d.ts +7 -2
- package/dist/ui/commands-overlay.js +384 -355
- package/dist/ui/config-overlay.d.ts +5 -4
- package/dist/ui/config-overlay.js +243 -513
- package/dist/ui/conversation.d.ts +75 -4
- package/dist/ui/conversation.js +374 -161
- package/dist/ui/docs-overlay.d.ts +17 -0
- package/dist/ui/docs-overlay.js +303 -0
- package/dist/ui/ephemeral.d.ts +1 -1
- package/dist/ui/ephemeral.js +1 -1
- package/dist/ui/features/index.d.ts +34 -0
- package/dist/ui/features/index.js +34 -0
- package/dist/ui/features/input-feature.d.ts +85 -0
- package/dist/ui/features/input-feature.js +238 -0
- package/dist/ui/features/list-feature.d.ts +155 -0
- package/dist/ui/features/list-feature.js +244 -0
- package/dist/ui/features/pagination-feature.d.ts +154 -0
- package/dist/ui/features/pagination-feature.js +238 -0
- package/dist/ui/features/search-feature.d.ts +148 -0
- package/dist/ui/features/search-feature.js +185 -0
- package/dist/ui/features/tab-feature.d.ts +194 -0
- package/dist/ui/features/tab-feature.js +307 -0
- package/dist/ui/footer-v2.d.ts +222 -0
- package/dist/ui/footer-v2.js +1349 -0
- package/dist/ui/footer.d.ts +107 -0
- package/dist/ui/footer.js +359 -67
- package/dist/ui/guardrail-overlay.d.ts +29 -0
- package/dist/ui/guardrail-overlay.js +145 -0
- package/dist/ui/help-overlay-v2.d.ts +34 -0
- package/dist/ui/help-overlay-v2.js +309 -0
- package/dist/ui/help-overlay.d.ts +16 -0
- package/dist/ui/help-overlay.js +316 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -3
- package/dist/ui/init-overlay-v2.d.ts +34 -0
- package/dist/ui/init-overlay-v2.js +600 -0
- package/dist/ui/init-overlay.d.ts +12 -2
- package/dist/ui/init-overlay.js +349 -270
- package/dist/ui/input-prompt-v2.d.ts +1 -0
- package/dist/ui/input-prompt-v2.js +14 -6
- package/dist/ui/input-prompt.d.ts +116 -33
- package/dist/ui/input-prompt.js +536 -337
- package/dist/ui/iteration-limit-overlay-v2.d.ts +21 -0
- package/dist/ui/iteration-limit-overlay-v2.js +114 -0
- package/dist/ui/iteration-limit-overlay.d.ts +2 -2
- package/dist/ui/iteration-limit-overlay.js +92 -128
- package/dist/ui/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/keys-overlay-v2.js +248 -0
- package/dist/ui/keys-overlay.d.ts +1 -0
- package/dist/ui/keys-overlay.js +203 -141
- package/dist/ui/line-utils.d.ts +88 -0
- package/dist/ui/line-utils.js +150 -0
- package/dist/ui/live-region.d.ts +161 -0
- package/dist/ui/live-region.js +387 -0
- package/dist/ui/mascot/expressions.d.ts +32 -0
- package/dist/ui/mascot/expressions.js +213 -0
- package/dist/ui/mascot/index.d.ts +8 -0
- package/dist/ui/mascot/index.js +8 -0
- package/dist/ui/mascot/renderer.d.ts +19 -0
- package/dist/ui/mascot/renderer.js +97 -0
- package/dist/ui/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/mascot-overlay-v2.js +138 -0
- package/dist/ui/mascot-overlay.d.ts +21 -0
- package/dist/ui/mascot-overlay.js +146 -0
- package/dist/ui/model-overlay-v2.d.ts +49 -0
- package/dist/ui/model-overlay-v2.js +118 -0
- package/dist/ui/model-overlay.d.ts +27 -0
- package/dist/ui/model-overlay.js +221 -0
- package/dist/ui/model-warning-overlay.js +3 -5
- package/dist/ui/new-overlay.d.ts +34 -0
- package/dist/ui/new-overlay.js +604 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.js +825 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +783 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.js +584 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +642 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.js +441 -0
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +100 -0
- package/dist/ui/overlay/impl/config-overlay-v2.js +654 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +55 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +359 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +77 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1071 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/help-overlay-v2.d.ts +34 -0
- package/dist/ui/overlay/impl/help-overlay-v2.js +309 -0
- package/dist/ui/overlay/impl/init-overlay-v2.d.ts +77 -0
- package/dist/ui/overlay/impl/init-overlay-v2.js +593 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
- package/dist/ui/overlay/impl/model-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/model-overlay-v2.js +118 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +77 -0
- package/dist/ui/overlay/impl/new-overlay-v2.js +593 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +499 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.js +218 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +31 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +1035 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +637 -0
- package/dist/ui/overlay/index.d.ts +33 -0
- package/dist/ui/overlay/index.js +35 -0
- package/dist/ui/overlay/key-utils.d.ts +6 -0
- package/dist/ui/overlay/key-utils.js +6 -0
- package/dist/ui/overlay/overlay-types.d.ts +128 -0
- package/dist/ui/overlay/overlay-types.js +22 -0
- package/dist/ui/overlay/types.d.ts +135 -0
- package/dist/ui/overlay/types.js +22 -0
- package/dist/ui/overlays/help-overlay-v2.d.ts +28 -0
- package/dist/ui/overlays/help-overlay-v2.js +198 -0
- package/dist/ui/overlays/index.d.ts +11 -0
- package/dist/ui/overlays/index.js +11 -0
- package/dist/ui/overlays.d.ts +0 -4
- package/dist/ui/overlays.js +0 -444
- package/dist/ui/permission-overlay-v2.d.ts +36 -0
- package/dist/ui/permission-overlay-v2.js +380 -0
- package/dist/ui/permission-overlay.d.ts +1 -1
- package/dist/ui/permission-overlay.js +186 -298
- package/dist/ui/projects-overlay.d.ts +19 -0
- package/dist/ui/projects-overlay.js +484 -0
- package/dist/ui/providers/types.d.ts +178 -0
- package/dist/ui/providers/types.js +9 -0
- package/dist/ui/render-modes.d.ts +36 -0
- package/dist/ui/render-modes.js +44 -0
- package/dist/ui/startup-menu.d.ts +36 -0
- package/dist/ui/startup-menu.js +236 -0
- package/dist/ui/subagent-renderer.d.ts +117 -0
- package/dist/ui/subagent-renderer.js +334 -0
- package/dist/ui/terminal-codes.d.ts +94 -0
- package/dist/ui/terminal-codes.js +124 -0
- package/dist/ui/terminal-renderer.d.ts +221 -0
- package/dist/ui/terminal-renderer.js +751 -0
- package/dist/ui/terminal-ui.d.ts +463 -0
- package/dist/ui/terminal-ui.js +2296 -0
- package/dist/ui/terminal.d.ts +20 -0
- package/dist/ui/terminal.js +72 -0
- package/dist/ui/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/theme-overlay-v2.js +135 -0
- package/dist/ui/theme-overlay.d.ts +24 -0
- package/dist/ui/theme-overlay.js +127 -0
- package/dist/ui/todo-zone.js +53 -25
- package/dist/ui/tool-formatters.d.ts +16 -0
- package/dist/ui/tool-formatters.js +516 -0
- package/dist/ui/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/tools-overlay-v2.js +218 -0
- package/dist/ui/tools-overlay.d.ts +10 -2
- package/dist/ui/tools-overlay.js +172 -220
- package/dist/ui/tutorial-overlay-v2.d.ts +31 -0
- package/dist/ui/tutorial-overlay-v2.js +1035 -0
- package/dist/ui/tutorial-overlay.d.ts +1 -0
- package/dist/ui/tutorial-overlay.js +400 -302
- package/dist/ui/workflow-overlay.d.ts +22 -0
- package/dist/ui/workflow-overlay.js +636 -0
- package/dist/utils/debug-log.d.ts +28 -0
- package/dist/utils/debug-log.js +57 -0
- package/dist/utils/model-tiers.js +1 -1
- package/dist/utils/path-safety.d.ts +56 -0
- package/dist/utils/path-safety.js +239 -0
- package/dist/workflow/guided-mode-injector.d.ts +42 -0
- package/dist/workflow/guided-mode-injector.js +191 -0
- package/dist/workflow/index.d.ts +8 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/step-criteria.d.ts +62 -0
- package/dist/workflow/step-criteria.js +150 -0
- package/dist/workflow/step-tracker.d.ts +92 -0
- package/dist/workflow/step-tracker.js +141 -0
- package/package.json +12 -5
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document Database Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools for managing project documents (PRD, architecture, design notes) in the database.
|
|
5
|
+
*/
|
|
6
|
+
import { defineTool, createSuccessResult, createErrorResult } from '@compilr-dev/agents';
|
|
7
|
+
import { documentRepository } from '../db/repositories/index.js';
|
|
8
|
+
import { getActiveProject } from './project-db.js';
|
|
9
|
+
/**
|
|
10
|
+
* project_document_add - Add or update a project document
|
|
11
|
+
*/
|
|
12
|
+
export const projectDocumentAddTool = defineTool({
|
|
13
|
+
name: 'project_document_add',
|
|
14
|
+
description: 'Add or update a project document (PRD, architecture, design, notes). If a document of the same type exists, it will be updated.',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
project_id: {
|
|
19
|
+
type: 'number',
|
|
20
|
+
description: 'Project ID (uses active project if not provided)',
|
|
21
|
+
},
|
|
22
|
+
doc_type: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
enum: ['prd', 'architecture', 'design', 'notes'],
|
|
25
|
+
description: 'Document type',
|
|
26
|
+
},
|
|
27
|
+
title: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'Document title',
|
|
30
|
+
},
|
|
31
|
+
content: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Document content (markdown)',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
required: ['doc_type', 'title', 'content'],
|
|
37
|
+
},
|
|
38
|
+
execute: async (input) => {
|
|
39
|
+
await Promise.resolve(); // Required for async type signature
|
|
40
|
+
try {
|
|
41
|
+
const projectId = input.project_id || getActiveProject()?.id;
|
|
42
|
+
if (!projectId) {
|
|
43
|
+
return createErrorResult('No project specified and no active project. Use project_get or /projects to select a project first.');
|
|
44
|
+
}
|
|
45
|
+
const createInput = {
|
|
46
|
+
project_id: projectId,
|
|
47
|
+
doc_type: input.doc_type,
|
|
48
|
+
title: input.title,
|
|
49
|
+
content: input.content,
|
|
50
|
+
};
|
|
51
|
+
const doc = documentRepository.upsert(createInput);
|
|
52
|
+
return createSuccessResult({
|
|
53
|
+
success: true,
|
|
54
|
+
message: `Document "${doc.title}" saved`,
|
|
55
|
+
document: {
|
|
56
|
+
id: doc.id,
|
|
57
|
+
docType: doc.docType,
|
|
58
|
+
title: doc.title,
|
|
59
|
+
contentLength: doc.content.length,
|
|
60
|
+
updatedAt: doc.updatedAt.toISOString(),
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
return createErrorResult(`Failed to save document: ${error instanceof Error ? error.message : String(error)}`);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
/**
|
|
70
|
+
* project_document_get - Get a project document
|
|
71
|
+
*/
|
|
72
|
+
export const projectDocumentGetTool = defineTool({
|
|
73
|
+
name: 'project_document_get',
|
|
74
|
+
description: 'Get a project document by type. Returns the document content.',
|
|
75
|
+
inputSchema: {
|
|
76
|
+
type: 'object',
|
|
77
|
+
properties: {
|
|
78
|
+
project_id: {
|
|
79
|
+
type: 'number',
|
|
80
|
+
description: 'Project ID (uses active project if not provided)',
|
|
81
|
+
},
|
|
82
|
+
doc_type: {
|
|
83
|
+
type: 'string',
|
|
84
|
+
enum: ['prd', 'architecture', 'design', 'notes'],
|
|
85
|
+
description: 'Document type to retrieve',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
required: ['doc_type'],
|
|
89
|
+
},
|
|
90
|
+
execute: async (input) => {
|
|
91
|
+
await Promise.resolve(); // Required for async type signature
|
|
92
|
+
try {
|
|
93
|
+
const projectId = input.project_id || getActiveProject()?.id;
|
|
94
|
+
if (!projectId) {
|
|
95
|
+
return createErrorResult('No project specified and no active project. Use project_get or /projects to select a project first.');
|
|
96
|
+
}
|
|
97
|
+
const doc = documentRepository.getByType(projectId, input.doc_type);
|
|
98
|
+
if (!doc) {
|
|
99
|
+
return createSuccessResult({
|
|
100
|
+
success: true,
|
|
101
|
+
document: null,
|
|
102
|
+
message: `No ${input.doc_type} document found for this project`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return createSuccessResult({
|
|
106
|
+
success: true,
|
|
107
|
+
document: {
|
|
108
|
+
id: doc.id,
|
|
109
|
+
docType: doc.docType,
|
|
110
|
+
title: doc.title,
|
|
111
|
+
content: doc.content,
|
|
112
|
+
createdAt: doc.createdAt.toISOString(),
|
|
113
|
+
updatedAt: doc.updatedAt.toISOString(),
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return createErrorResult(`Failed to get document: ${error instanceof Error ? error.message : String(error)}`);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
/**
|
|
123
|
+
* project_document_list - List all documents for a project
|
|
124
|
+
*/
|
|
125
|
+
export const projectDocumentListTool = defineTool({
|
|
126
|
+
name: 'project_document_list',
|
|
127
|
+
description: 'List all documents for a project. Returns document metadata without full content.',
|
|
128
|
+
inputSchema: {
|
|
129
|
+
type: 'object',
|
|
130
|
+
properties: {
|
|
131
|
+
project_id: {
|
|
132
|
+
type: 'number',
|
|
133
|
+
description: 'Project ID (uses active project if not provided)',
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
required: [],
|
|
137
|
+
},
|
|
138
|
+
execute: async (input) => {
|
|
139
|
+
await Promise.resolve(); // Required for async type signature
|
|
140
|
+
try {
|
|
141
|
+
const projectId = input.project_id || getActiveProject()?.id;
|
|
142
|
+
if (!projectId) {
|
|
143
|
+
return createErrorResult('No project specified and no active project. Use project_get or /projects to select a project first.');
|
|
144
|
+
}
|
|
145
|
+
const docs = documentRepository.listByProject(projectId);
|
|
146
|
+
const documents = docs.map((doc) => ({
|
|
147
|
+
id: doc.id,
|
|
148
|
+
docType: doc.docType,
|
|
149
|
+
title: doc.title,
|
|
150
|
+
contentLength: doc.content.length,
|
|
151
|
+
createdAt: doc.createdAt.toISOString(),
|
|
152
|
+
updatedAt: doc.updatedAt.toISOString(),
|
|
153
|
+
}));
|
|
154
|
+
return createSuccessResult({
|
|
155
|
+
success: true,
|
|
156
|
+
documents,
|
|
157
|
+
count: documents.length,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
return createErrorResult(`Failed to list documents: ${error instanceof Error ? error.message : String(error)}`);
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
/**
|
|
166
|
+
* project_document_delete - Delete a project document
|
|
167
|
+
*/
|
|
168
|
+
export const projectDocumentDeleteTool = defineTool({
|
|
169
|
+
name: 'project_document_delete',
|
|
170
|
+
description: 'Delete a project document by type.',
|
|
171
|
+
inputSchema: {
|
|
172
|
+
type: 'object',
|
|
173
|
+
properties: {
|
|
174
|
+
project_id: {
|
|
175
|
+
type: 'number',
|
|
176
|
+
description: 'Project ID (uses active project if not provided)',
|
|
177
|
+
},
|
|
178
|
+
doc_type: {
|
|
179
|
+
type: 'string',
|
|
180
|
+
enum: ['prd', 'architecture', 'design', 'notes'],
|
|
181
|
+
description: 'Document type to delete',
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
required: ['doc_type'],
|
|
185
|
+
},
|
|
186
|
+
execute: async (input) => {
|
|
187
|
+
await Promise.resolve(); // Required for async type signature
|
|
188
|
+
try {
|
|
189
|
+
const projectId = input.project_id || getActiveProject()?.id;
|
|
190
|
+
if (!projectId) {
|
|
191
|
+
return createErrorResult('No project specified and no active project. Use project_get or /projects to select a project first.');
|
|
192
|
+
}
|
|
193
|
+
// Find the document first
|
|
194
|
+
const doc = documentRepository.getByType(projectId, input.doc_type);
|
|
195
|
+
if (!doc) {
|
|
196
|
+
return createErrorResult(`No ${input.doc_type} document found for this project`);
|
|
197
|
+
}
|
|
198
|
+
const deleted = documentRepository.delete(doc.id);
|
|
199
|
+
if (!deleted) {
|
|
200
|
+
return createErrorResult(`Failed to delete ${input.doc_type} document`);
|
|
201
|
+
}
|
|
202
|
+
return createSuccessResult({
|
|
203
|
+
success: true,
|
|
204
|
+
message: `Document "${doc.title}" deleted`,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return createErrorResult(`Failed to delete document: ${error instanceof Error ? error.message : String(error)}`);
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
/**
|
|
213
|
+
* All document tools
|
|
214
|
+
*/
|
|
215
|
+
export const documentDbTools = [
|
|
216
|
+
projectDocumentAddTool,
|
|
217
|
+
projectDocumentGetTool,
|
|
218
|
+
projectDocumentListTool,
|
|
219
|
+
projectDocumentDeleteTool,
|
|
220
|
+
];
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Database Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools for managing projects in the database.
|
|
5
|
+
* These tools allow the agent to create, query, and update projects.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get the current working project
|
|
9
|
+
*/
|
|
10
|
+
export declare function getCurrentProject(): {
|
|
11
|
+
id: number;
|
|
12
|
+
name: string;
|
|
13
|
+
displayName: string;
|
|
14
|
+
path: string;
|
|
15
|
+
} | null;
|
|
16
|
+
/**
|
|
17
|
+
* Set the current working project
|
|
18
|
+
* Also remembers it as lastProjectId for "last opened" startup mode
|
|
19
|
+
*/
|
|
20
|
+
export declare function setCurrentProject(project: {
|
|
21
|
+
id: number;
|
|
22
|
+
name: string;
|
|
23
|
+
displayName: string;
|
|
24
|
+
path: string;
|
|
25
|
+
} | null): void;
|
|
26
|
+
/**
|
|
27
|
+
* Clear the current working project
|
|
28
|
+
*/
|
|
29
|
+
export declare function clearCurrentProject(): void;
|
|
30
|
+
export declare const getActiveProject: typeof getCurrentProject;
|
|
31
|
+
export declare const setActiveProject: typeof setCurrentProject;
|
|
32
|
+
export declare const clearActiveProject: typeof clearCurrentProject;
|
|
33
|
+
/**
|
|
34
|
+
* project_get - Get project for current directory or by ID
|
|
35
|
+
*/
|
|
36
|
+
export declare const projectGetTool: import("@compilr-dev/agents").Tool<{
|
|
37
|
+
project_id?: number;
|
|
38
|
+
name?: string;
|
|
39
|
+
path?: string;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* project_create - Create a new project
|
|
43
|
+
*/
|
|
44
|
+
export declare const projectCreateTool: import("@compilr-dev/agents").Tool<{
|
|
45
|
+
name: string;
|
|
46
|
+
display_name: string;
|
|
47
|
+
description?: string;
|
|
48
|
+
path?: string;
|
|
49
|
+
type?: string;
|
|
50
|
+
workflow_mode?: string;
|
|
51
|
+
language?: string;
|
|
52
|
+
framework?: string;
|
|
53
|
+
package_manager?: string;
|
|
54
|
+
}>;
|
|
55
|
+
/**
|
|
56
|
+
* project_update - Update an existing project
|
|
57
|
+
*/
|
|
58
|
+
export declare const projectUpdateTool: import("@compilr-dev/agents").Tool<{
|
|
59
|
+
project_id?: number;
|
|
60
|
+
status?: string;
|
|
61
|
+
description?: string;
|
|
62
|
+
workflow_mode?: string;
|
|
63
|
+
lifecycle_state?: string;
|
|
64
|
+
current_item_id?: string;
|
|
65
|
+
last_context?: Record<string, unknown>;
|
|
66
|
+
}>;
|
|
67
|
+
/**
|
|
68
|
+
* project_list - List projects
|
|
69
|
+
*/
|
|
70
|
+
export declare const projectListTool: import("@compilr-dev/agents").Tool<{
|
|
71
|
+
status?: string;
|
|
72
|
+
limit?: number;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* All project tools
|
|
76
|
+
*/
|
|
77
|
+
export declare const projectDbTools: (import("@compilr-dev/agents").Tool<{
|
|
78
|
+
project_id?: number;
|
|
79
|
+
name?: string;
|
|
80
|
+
path?: string;
|
|
81
|
+
}> | import("@compilr-dev/agents").Tool<{
|
|
82
|
+
name: string;
|
|
83
|
+
display_name: string;
|
|
84
|
+
description?: string;
|
|
85
|
+
path?: string;
|
|
86
|
+
type?: string;
|
|
87
|
+
workflow_mode?: string;
|
|
88
|
+
language?: string;
|
|
89
|
+
framework?: string;
|
|
90
|
+
package_manager?: string;
|
|
91
|
+
}> | import("@compilr-dev/agents").Tool<{
|
|
92
|
+
project_id?: number;
|
|
93
|
+
status?: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
workflow_mode?: string;
|
|
96
|
+
lifecycle_state?: string;
|
|
97
|
+
current_item_id?: string;
|
|
98
|
+
last_context?: Record<string, unknown>;
|
|
99
|
+
}> | import("@compilr-dev/agents").Tool<{
|
|
100
|
+
status?: string;
|
|
101
|
+
limit?: number;
|
|
102
|
+
}>)[];
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Database Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools for managing projects in the database.
|
|
5
|
+
* These tools allow the agent to create, query, and update projects.
|
|
6
|
+
*/
|
|
7
|
+
import { defineTool, createSuccessResult, createErrorResult } from '@compilr-dev/agents';
|
|
8
|
+
import { projectRepository } from '../db/repositories/index.js';
|
|
9
|
+
import { setLastProjectId } from '../settings/index.js';
|
|
10
|
+
// Current project state (runtime, not persisted)
|
|
11
|
+
// This is the project the user is currently working on
|
|
12
|
+
let currentProject = null;
|
|
13
|
+
/**
|
|
14
|
+
* Get the current working project
|
|
15
|
+
*/
|
|
16
|
+
export function getCurrentProject() {
|
|
17
|
+
return currentProject;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Set the current working project
|
|
21
|
+
* Also remembers it as lastProjectId for "last opened" startup mode
|
|
22
|
+
*/
|
|
23
|
+
export function setCurrentProject(project) {
|
|
24
|
+
currentProject = project;
|
|
25
|
+
// Remember for "last opened" startup mode
|
|
26
|
+
if (project) {
|
|
27
|
+
setLastProjectId(project.id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Clear the current working project
|
|
32
|
+
*/
|
|
33
|
+
export function clearCurrentProject() {
|
|
34
|
+
currentProject = null;
|
|
35
|
+
}
|
|
36
|
+
// Legacy aliases (for backward compatibility during transition)
|
|
37
|
+
export const getActiveProject = getCurrentProject;
|
|
38
|
+
export const setActiveProject = setCurrentProject;
|
|
39
|
+
export const clearActiveProject = clearCurrentProject;
|
|
40
|
+
/**
|
|
41
|
+
* project_get - Get project for current directory or by ID
|
|
42
|
+
*/
|
|
43
|
+
export const projectGetTool = defineTool({
|
|
44
|
+
name: 'project_get',
|
|
45
|
+
description: 'Get the active project for the current directory, or get a project by ID/name. Returns project details including metadata, workflow state, and last context.',
|
|
46
|
+
inputSchema: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
project_id: {
|
|
50
|
+
type: 'number',
|
|
51
|
+
description: 'Project ID to look up (optional - uses active project or cwd detection if not provided)',
|
|
52
|
+
},
|
|
53
|
+
name: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'Project name to look up (optional)',
|
|
56
|
+
},
|
|
57
|
+
path: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
description: 'Path to check for project (optional - defaults to cwd)',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
required: [],
|
|
63
|
+
},
|
|
64
|
+
execute: async (input) => {
|
|
65
|
+
await Promise.resolve(); // Required for async type signature
|
|
66
|
+
try {
|
|
67
|
+
let project = null;
|
|
68
|
+
// Priority: ID > name > active > path detection
|
|
69
|
+
if (input.project_id) {
|
|
70
|
+
project = projectRepository.getById(input.project_id);
|
|
71
|
+
}
|
|
72
|
+
else if (input.name) {
|
|
73
|
+
project = projectRepository.getByName(input.name);
|
|
74
|
+
}
|
|
75
|
+
else if (currentProject) {
|
|
76
|
+
project = projectRepository.getById(currentProject.id);
|
|
77
|
+
}
|
|
78
|
+
else if (input.path) {
|
|
79
|
+
project = projectRepository.findByPath(input.path);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Try to find project by cwd
|
|
83
|
+
const cwd = process.cwd();
|
|
84
|
+
project = projectRepository.findByPath(cwd);
|
|
85
|
+
}
|
|
86
|
+
if (!project) {
|
|
87
|
+
return createSuccessResult({
|
|
88
|
+
success: true,
|
|
89
|
+
project: null,
|
|
90
|
+
message: 'No project found. Use project_create to create a new project, or /projects to select one.',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// Update current project
|
|
94
|
+
setCurrentProject({ id: project.id, name: project.name, displayName: project.displayName, path: project.path });
|
|
95
|
+
return createSuccessResult({
|
|
96
|
+
success: true,
|
|
97
|
+
project: {
|
|
98
|
+
id: project.id,
|
|
99
|
+
name: project.name,
|
|
100
|
+
displayName: project.displayName,
|
|
101
|
+
description: project.description,
|
|
102
|
+
type: project.type,
|
|
103
|
+
status: project.status,
|
|
104
|
+
path: project.path,
|
|
105
|
+
docsPath: project.docsPath,
|
|
106
|
+
repoPattern: project.repoPattern,
|
|
107
|
+
language: project.language,
|
|
108
|
+
framework: project.framework,
|
|
109
|
+
packageManager: project.packageManager,
|
|
110
|
+
runtimeVersion: project.runtimeVersion,
|
|
111
|
+
commands: project.commands,
|
|
112
|
+
gitRemote: project.gitRemote,
|
|
113
|
+
gitBranch: project.gitBranch,
|
|
114
|
+
workflowMode: project.workflowMode,
|
|
115
|
+
lifecycleState: project.lifecycleState,
|
|
116
|
+
currentItemId: project.currentItemId,
|
|
117
|
+
lastContext: project.lastContext,
|
|
118
|
+
createdAt: project.createdAt.toISOString(),
|
|
119
|
+
updatedAt: project.updatedAt.toISOString(),
|
|
120
|
+
lastActivityAt: project.lastActivityAt?.toISOString(),
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
return createErrorResult(`Failed to get project: ${error instanceof Error ? error.message : String(error)}`);
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
/**
|
|
130
|
+
* project_create - Create a new project
|
|
131
|
+
*/
|
|
132
|
+
export const projectCreateTool = defineTool({
|
|
133
|
+
name: 'project_create',
|
|
134
|
+
description: 'Create a new tracked project. This promotes a directory to a tracked project with workflow support.',
|
|
135
|
+
inputSchema: {
|
|
136
|
+
type: 'object',
|
|
137
|
+
properties: {
|
|
138
|
+
name: {
|
|
139
|
+
type: 'string',
|
|
140
|
+
description: 'Filesystem-safe project name (e.g., "my-api-project")',
|
|
141
|
+
},
|
|
142
|
+
display_name: {
|
|
143
|
+
type: 'string',
|
|
144
|
+
description: 'Human-friendly display name (e.g., "My API Project")',
|
|
145
|
+
},
|
|
146
|
+
description: {
|
|
147
|
+
type: 'string',
|
|
148
|
+
description: 'Project description',
|
|
149
|
+
},
|
|
150
|
+
path: {
|
|
151
|
+
type: 'string',
|
|
152
|
+
description: 'Project path (defaults to cwd)',
|
|
153
|
+
},
|
|
154
|
+
type: {
|
|
155
|
+
type: 'string',
|
|
156
|
+
enum: ['general', 'web', 'cli', 'library', 'api'],
|
|
157
|
+
description: 'Project type',
|
|
158
|
+
},
|
|
159
|
+
workflow_mode: {
|
|
160
|
+
type: 'string',
|
|
161
|
+
enum: ['flexible', 'guided'],
|
|
162
|
+
description: 'Workflow mode: flexible (default) or guided',
|
|
163
|
+
},
|
|
164
|
+
language: {
|
|
165
|
+
type: 'string',
|
|
166
|
+
description: 'Programming language (e.g., "typescript", "python")',
|
|
167
|
+
},
|
|
168
|
+
framework: {
|
|
169
|
+
type: 'string',
|
|
170
|
+
description: 'Framework (e.g., "react", "express")',
|
|
171
|
+
},
|
|
172
|
+
package_manager: {
|
|
173
|
+
type: 'string',
|
|
174
|
+
description: 'Package manager (e.g., "npm", "yarn", "pnpm")',
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
required: ['name', 'display_name'],
|
|
178
|
+
},
|
|
179
|
+
execute: async (input) => {
|
|
180
|
+
await Promise.resolve(); // Required for async type signature
|
|
181
|
+
try {
|
|
182
|
+
// Check if project with this name already exists
|
|
183
|
+
const existing = projectRepository.getByName(input.name);
|
|
184
|
+
if (existing) {
|
|
185
|
+
return createErrorResult(`Project with name "${input.name}" already exists`);
|
|
186
|
+
}
|
|
187
|
+
// Check if a project exists at this path
|
|
188
|
+
const projectPath = input.path || process.cwd();
|
|
189
|
+
const existingByPath = projectRepository.findByPath(projectPath);
|
|
190
|
+
if (existingByPath) {
|
|
191
|
+
return createErrorResult(`A project already exists at path "${projectPath}": ${existingByPath.name}`);
|
|
192
|
+
}
|
|
193
|
+
const createInput = {
|
|
194
|
+
name: input.name,
|
|
195
|
+
display_name: input.display_name,
|
|
196
|
+
description: input.description,
|
|
197
|
+
path: projectPath,
|
|
198
|
+
type: input.type ? input.type : 'general',
|
|
199
|
+
workflow_mode: input.workflow_mode ? input.workflow_mode : 'flexible',
|
|
200
|
+
language: input.language,
|
|
201
|
+
framework: input.framework,
|
|
202
|
+
package_manager: input.package_manager,
|
|
203
|
+
};
|
|
204
|
+
const project = projectRepository.create(createInput);
|
|
205
|
+
// Set as current project
|
|
206
|
+
setCurrentProject({ id: project.id, name: project.name, displayName: project.displayName, path: project.path });
|
|
207
|
+
return createSuccessResult({
|
|
208
|
+
success: true,
|
|
209
|
+
message: `Project "${project.displayName}" created successfully`,
|
|
210
|
+
project: {
|
|
211
|
+
id: project.id,
|
|
212
|
+
name: project.name,
|
|
213
|
+
displayName: project.displayName,
|
|
214
|
+
type: project.type,
|
|
215
|
+
workflowMode: project.workflowMode,
|
|
216
|
+
path: project.path,
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
return createErrorResult(`Failed to create project: ${error instanceof Error ? error.message : String(error)}`);
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
/**
|
|
226
|
+
* project_update - Update an existing project
|
|
227
|
+
*/
|
|
228
|
+
export const projectUpdateTool = defineTool({
|
|
229
|
+
name: 'project_update',
|
|
230
|
+
description: 'Update an existing project. Can update status, description, workflow mode, lifecycle state, and other fields.',
|
|
231
|
+
inputSchema: {
|
|
232
|
+
type: 'object',
|
|
233
|
+
properties: {
|
|
234
|
+
project_id: {
|
|
235
|
+
type: 'number',
|
|
236
|
+
description: 'Project ID to update (uses active project if not provided)',
|
|
237
|
+
},
|
|
238
|
+
status: {
|
|
239
|
+
type: 'string',
|
|
240
|
+
enum: ['active', 'paused', 'completed', 'archived'],
|
|
241
|
+
description: 'Project status',
|
|
242
|
+
},
|
|
243
|
+
description: {
|
|
244
|
+
type: 'string',
|
|
245
|
+
description: 'Project description',
|
|
246
|
+
},
|
|
247
|
+
workflow_mode: {
|
|
248
|
+
type: 'string',
|
|
249
|
+
enum: ['flexible', 'guided'],
|
|
250
|
+
description: 'Workflow mode',
|
|
251
|
+
},
|
|
252
|
+
lifecycle_state: {
|
|
253
|
+
type: 'string',
|
|
254
|
+
enum: ['setup', 'active', 'maintenance', 'complete'],
|
|
255
|
+
description: 'Project lifecycle state',
|
|
256
|
+
},
|
|
257
|
+
current_item_id: {
|
|
258
|
+
type: 'string',
|
|
259
|
+
description: 'Currently focused work item ID (e.g., "REQ-003")',
|
|
260
|
+
},
|
|
261
|
+
last_context: {
|
|
262
|
+
type: 'object',
|
|
263
|
+
description: 'Context for session resumption',
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
required: [],
|
|
267
|
+
},
|
|
268
|
+
execute: async (input) => {
|
|
269
|
+
await Promise.resolve(); // Required for async type signature
|
|
270
|
+
try {
|
|
271
|
+
const projectId = input.project_id || currentProject?.id;
|
|
272
|
+
if (!projectId) {
|
|
273
|
+
return createErrorResult('No project specified and no active project. Use project_get or /projects to select a project.');
|
|
274
|
+
}
|
|
275
|
+
const updateInput = {};
|
|
276
|
+
if (input.status)
|
|
277
|
+
updateInput.status = input.status;
|
|
278
|
+
if (input.description !== undefined)
|
|
279
|
+
updateInput.description = input.description;
|
|
280
|
+
if (input.workflow_mode)
|
|
281
|
+
updateInput.workflow_mode = input.workflow_mode;
|
|
282
|
+
if (input.lifecycle_state)
|
|
283
|
+
updateInput.lifecycle_state = input.lifecycle_state;
|
|
284
|
+
if (input.current_item_id !== undefined)
|
|
285
|
+
updateInput.current_item_id = input.current_item_id;
|
|
286
|
+
if (input.last_context)
|
|
287
|
+
updateInput.last_context = input.last_context;
|
|
288
|
+
const project = projectRepository.update(projectId, updateInput);
|
|
289
|
+
if (!project) {
|
|
290
|
+
return createErrorResult(`Project with ID ${String(projectId)} not found`);
|
|
291
|
+
}
|
|
292
|
+
return createSuccessResult({
|
|
293
|
+
success: true,
|
|
294
|
+
message: `Project "${project.displayName}" updated`,
|
|
295
|
+
project: {
|
|
296
|
+
id: project.id,
|
|
297
|
+
name: project.name,
|
|
298
|
+
displayName: project.displayName,
|
|
299
|
+
status: project.status,
|
|
300
|
+
workflowMode: project.workflowMode,
|
|
301
|
+
lifecycleState: project.lifecycleState,
|
|
302
|
+
currentItemId: project.currentItemId,
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
return createErrorResult(`Failed to update project: ${error instanceof Error ? error.message : String(error)}`);
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
});
|
|
311
|
+
/**
|
|
312
|
+
* project_list - List projects
|
|
313
|
+
*/
|
|
314
|
+
export const projectListTool = defineTool({
|
|
315
|
+
name: 'project_list',
|
|
316
|
+
description: 'List all tracked projects, optionally filtered by status.',
|
|
317
|
+
inputSchema: {
|
|
318
|
+
type: 'object',
|
|
319
|
+
properties: {
|
|
320
|
+
status: {
|
|
321
|
+
type: 'string',
|
|
322
|
+
enum: ['active', 'paused', 'completed', 'archived', 'all'],
|
|
323
|
+
description: 'Filter by status (default: all)',
|
|
324
|
+
},
|
|
325
|
+
limit: {
|
|
326
|
+
type: 'number',
|
|
327
|
+
description: 'Maximum number of projects to return (default: 20)',
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
required: [],
|
|
331
|
+
},
|
|
332
|
+
execute: async (input) => {
|
|
333
|
+
await Promise.resolve(); // Required for async type signature
|
|
334
|
+
try {
|
|
335
|
+
const result = projectRepository.list({
|
|
336
|
+
status: input.status,
|
|
337
|
+
limit: input.limit || 20,
|
|
338
|
+
});
|
|
339
|
+
const projects = result.projects.map((p) => ({
|
|
340
|
+
id: p.id,
|
|
341
|
+
name: p.name,
|
|
342
|
+
displayName: p.displayName,
|
|
343
|
+
type: p.type,
|
|
344
|
+
status: p.status,
|
|
345
|
+
path: p.path,
|
|
346
|
+
workflowMode: p.workflowMode,
|
|
347
|
+
lifecycleState: p.lifecycleState,
|
|
348
|
+
lastActivityAt: p.lastActivityAt?.toISOString(),
|
|
349
|
+
}));
|
|
350
|
+
return createSuccessResult({
|
|
351
|
+
success: true,
|
|
352
|
+
projects,
|
|
353
|
+
total: result.total,
|
|
354
|
+
currentProjectId: currentProject?.id,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
return createErrorResult(`Failed to list projects: ${error instanceof Error ? error.message : String(error)}`);
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
/**
|
|
363
|
+
* All project tools
|
|
364
|
+
*/
|
|
365
|
+
export const projectDbTools = [
|
|
366
|
+
projectGetTool,
|
|
367
|
+
projectCreateTool,
|
|
368
|
+
projectUpdateTool,
|
|
369
|
+
projectListTool,
|
|
370
|
+
];
|