@girardmedia/bootspring 1.2.0 → 2.0.3
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 +107 -14
- package/bin/bootspring.js +166 -27
- package/cli/agent.js +189 -17
- package/cli/analyze.js +499 -0
- package/cli/audit.js +557 -0
- package/cli/auth.js +495 -38
- package/cli/billing.js +302 -0
- package/cli/build.js +695 -0
- package/cli/business.js +109 -26
- package/cli/checkpoint-utils.js +168 -0
- package/cli/checkpoint.js +639 -0
- package/cli/cloud-sync.js +447 -0
- package/cli/content.js +198 -0
- package/cli/context.js +1 -1
- package/cli/deploy.js +543 -0
- package/cli/fundraise.js +112 -50
- package/cli/github-cmd.js +435 -0
- package/cli/health.js +477 -0
- package/cli/init.js +84 -13
- package/cli/legal.js +107 -95
- package/cli/log.js +2 -2
- package/cli/loop.js +976 -73
- package/cli/manager.js +711 -0
- package/cli/metrics.js +480 -0
- package/cli/monitor.js +812 -0
- package/cli/onboard.js +521 -0
- package/cli/orchestrator.js +12 -24
- package/cli/prd.js +594 -0
- package/cli/preseed-start.js +1483 -0
- package/cli/preseed.js +2302 -0
- package/cli/project.js +436 -0
- package/cli/quality.js +233 -0
- package/cli/security.js +913 -0
- package/cli/seed.js +1441 -5
- package/cli/skill.js +273 -211
- package/cli/suggest.js +989 -0
- package/cli/switch.js +453 -0
- package/cli/visualize.js +527 -0
- package/cli/watch.js +769 -0
- package/cli/workspace.js +607 -0
- package/core/analyze-workflow.js +1134 -0
- package/core/api-client.js +535 -22
- package/core/audit-workflow.js +1350 -0
- package/core/build-orchestrator.js +480 -0
- package/core/build-state.js +577 -0
- package/core/checkpoint-engine.js +408 -0
- package/core/config.js +1109 -26
- package/core/context-loader.js +21 -1
- package/core/deploy-workflow.js +836 -0
- package/core/entitlements.js +93 -22
- package/core/github-sync.js +610 -0
- package/core/index.js +8 -1
- package/core/ingest.js +1111 -0
- package/core/metrics-engine.js +768 -0
- package/core/onboard-workflow.js +1007 -0
- package/core/preseed-workflow.js +934 -0
- package/core/preseed.js +1617 -0
- package/core/project-context.js +325 -0
- package/core/project-state.js +694 -0
- package/core/r2-sync.js +583 -0
- package/core/scaffold.js +525 -7
- package/core/session.js +258 -0
- package/core/task-extractor.js +758 -0
- package/core/telemetry.js +28 -6
- package/core/tier-enforcement.js +737 -0
- package/core/utils.js +38 -14
- package/generators/questionnaire.js +15 -12
- package/generators/sections/ai.js +7 -7
- package/generators/sections/content.js +300 -0
- package/generators/sections/index.js +3 -0
- package/generators/sections/plugins.js +7 -6
- package/generators/templates/build-planning.template.js +596 -0
- package/generators/templates/content.template.js +819 -0
- package/generators/templates/index.js +2 -1
- package/hooks/git-autopilot.js +1250 -0
- package/hooks/index.js +9 -0
- package/intelligence/agent-collab.js +2057 -0
- package/intelligence/auto-suggest.js +634 -0
- package/intelligence/content-gen.js +1589 -0
- package/intelligence/cross-project.js +1647 -0
- package/intelligence/index.js +184 -0
- package/intelligence/learning/insights.json +517 -7
- package/intelligence/learning/pattern-learner.js +1008 -14
- package/intelligence/memory/decision-tracker.js +1431 -31
- package/intelligence/memory/decisions.jsonl +0 -0
- package/intelligence/orchestrator.js +2896 -1
- package/intelligence/prd.js +92 -1
- package/intelligence/recommendation-weights.json +14 -2
- package/intelligence/recommendations.js +463 -9
- package/intelligence/workflow-composer.js +1451 -0
- package/marketplace/index.d.ts +324 -0
- package/marketplace/index.js +1921 -0
- package/mcp/contracts/mcp-contract.v1.json +342 -4
- package/mcp/registry.js +680 -3
- package/mcp/response-formatter.js +23 -0
- package/mcp/tools/assist-tool.js +78 -4
- package/mcp/tools/autopilot-tool.js +408 -0
- package/mcp/tools/content-tool.js +571 -0
- package/mcp/tools/dashboard-tool.js +251 -5
- package/mcp/tools/mvp-tool.js +344 -0
- package/mcp/tools/plugin-tool.js +23 -1
- package/mcp/tools/prd-tool.js +579 -0
- package/mcp/tools/seed-tool.js +447 -0
- package/mcp/tools/skill-tool.js +43 -14
- package/mcp/tools/suggest-tool.js +147 -0
- package/package.json +15 -6
- package/agents/README.md +0 -93
- package/agents/ai-integration-expert/context.md +0 -386
- package/agents/api-expert/context.md +0 -416
- package/agents/architecture-expert/context.md +0 -454
- package/agents/auth-expert/context.md +0 -399
- package/agents/backend-expert/context.md +0 -483
- package/agents/business-strategy-expert/context.md +0 -180
- package/agents/code-review-expert/context.md +0 -365
- package/agents/competitive-analysis-expert/context.md +0 -239
- package/agents/data-modeling-expert/context.md +0 -352
- package/agents/database-expert/context.md +0 -250
- package/agents/devops-expert/context.md +0 -446
- package/agents/email-expert/context.md +0 -379
- package/agents/financial-expert/context.md +0 -213
- package/agents/frontend-expert/context.md +0 -364
- package/agents/fundraising-expert/context.md +0 -257
- package/agents/growth-expert/context.md +0 -249
- package/agents/index.js +0 -140
- package/agents/investor-relations-expert/context.md +0 -266
- package/agents/legal-expert/context.md +0 -284
- package/agents/marketing-expert/context.md +0 -236
- package/agents/monitoring-expert/context.md +0 -362
- package/agents/operations-expert/context.md +0 -279
- package/agents/partnerships-expert/context.md +0 -286
- package/agents/payment-expert/context.md +0 -340
- package/agents/performance-expert/context.md +0 -377
- package/agents/private-equity-expert/context.md +0 -246
- package/agents/railway-expert/context.md +0 -284
- package/agents/research-expert/context.md +0 -245
- package/agents/sales-expert/context.md +0 -241
- package/agents/security-expert/context.md +0 -343
- package/agents/testing-expert/context.md +0 -414
- package/agents/ui-ux-expert/context.md +0 -448
- package/agents/vercel-expert/context.md +0 -426
- package/skills/index.js +0 -787
- package/skills/patterns/README.md +0 -163
- package/skills/patterns/ai/agents.md +0 -281
- package/skills/patterns/ai/claude.md +0 -138
- package/skills/patterns/ai/embeddings.md +0 -150
- package/skills/patterns/ai/rag.md +0 -266
- package/skills/patterns/ai/streaming.md +0 -170
- package/skills/patterns/ai/structured-output.md +0 -162
- package/skills/patterns/ai/tools.md +0 -154
- package/skills/patterns/analytics/tracking.md +0 -220
- package/skills/patterns/api/errors.md +0 -296
- package/skills/patterns/api/graphql.md +0 -440
- package/skills/patterns/api/middleware.md +0 -279
- package/skills/patterns/api/openapi.md +0 -285
- package/skills/patterns/api/rate-limiting.md +0 -231
- package/skills/patterns/api/route-handler.md +0 -217
- package/skills/patterns/api/server-action.md +0 -249
- package/skills/patterns/api/versioning.md +0 -443
- package/skills/patterns/api/webhooks.md +0 -247
- package/skills/patterns/auth/clerk.md +0 -132
- package/skills/patterns/auth/mfa.md +0 -313
- package/skills/patterns/auth/nextauth.md +0 -140
- package/skills/patterns/auth/oauth.md +0 -237
- package/skills/patterns/auth/rbac.md +0 -152
- package/skills/patterns/auth/session-management.md +0 -367
- package/skills/patterns/auth/session.md +0 -120
- package/skills/patterns/database/audit.md +0 -177
- package/skills/patterns/database/migrations.md +0 -177
- package/skills/patterns/database/pagination.md +0 -230
- package/skills/patterns/database/pooling.md +0 -357
- package/skills/patterns/database/prisma.md +0 -180
- package/skills/patterns/database/relations.md +0 -187
- package/skills/patterns/database/seeding.md +0 -246
- package/skills/patterns/database/soft-delete.md +0 -153
- package/skills/patterns/database/transactions.md +0 -162
- package/skills/patterns/deployment/ci-cd.md +0 -231
- package/skills/patterns/deployment/docker.md +0 -188
- package/skills/patterns/deployment/monitoring.md +0 -387
- package/skills/patterns/deployment/vercel.md +0 -160
- package/skills/patterns/email/resend.md +0 -143
- package/skills/patterns/email/templates.md +0 -245
- package/skills/patterns/email/transactional.md +0 -503
- package/skills/patterns/email/verification.md +0 -176
- package/skills/patterns/files/download.md +0 -243
- package/skills/patterns/files/upload.md +0 -239
- package/skills/patterns/i18n/nextintl.md +0 -188
- package/skills/patterns/logging/structured.md +0 -292
- package/skills/patterns/notifications/email-queue.md +0 -248
- package/skills/patterns/notifications/push.md +0 -279
- package/skills/patterns/payments/checkout.md +0 -303
- package/skills/patterns/payments/invoices.md +0 -287
- package/skills/patterns/payments/portal.md +0 -245
- package/skills/patterns/payments/stripe.md +0 -272
- package/skills/patterns/payments/subscriptions.md +0 -300
- package/skills/patterns/payments/usage.md +0 -279
- package/skills/patterns/performance/caching.md +0 -276
- package/skills/patterns/performance/code-splitting.md +0 -233
- package/skills/patterns/performance/edge.md +0 -254
- package/skills/patterns/performance/isr.md +0 -266
- package/skills/patterns/performance/lazy-loading.md +0 -281
- package/skills/patterns/realtime/sse.md +0 -327
- package/skills/patterns/realtime/websockets.md +0 -336
- package/skills/patterns/search/filtering.md +0 -329
- package/skills/patterns/search/fulltext.md +0 -260
- package/skills/patterns/security/audit-logging.md +0 -444
- package/skills/patterns/security/csrf.md +0 -234
- package/skills/patterns/security/headers.md +0 -252
- package/skills/patterns/security/sanitization.md +0 -258
- package/skills/patterns/security/secrets.md +0 -261
- package/skills/patterns/security/validation.md +0 -268
- package/skills/patterns/security/xss.md +0 -229
- package/skills/patterns/seo/metadata.md +0 -252
- package/skills/patterns/state/context.md +0 -349
- package/skills/patterns/state/react-query.md +0 -313
- package/skills/patterns/state/url-state.md +0 -482
- package/skills/patterns/state/zustand.md +0 -262
- package/skills/patterns/testing/api.md +0 -259
- package/skills/patterns/testing/component.md +0 -233
- package/skills/patterns/testing/coverage.md +0 -207
- package/skills/patterns/testing/fixtures.md +0 -225
- package/skills/patterns/testing/integration.md +0 -436
- package/skills/patterns/testing/mocking.md +0 -177
- package/skills/patterns/testing/playwright.md +0 -162
- package/skills/patterns/testing/snapshot.md +0 -175
- package/skills/patterns/testing/vitest.md +0 -307
- package/skills/patterns/ui/accordions.md +0 -395
- package/skills/patterns/ui/cards.md +0 -299
- package/skills/patterns/ui/dropdowns.md +0 -476
- package/skills/patterns/ui/empty-states.md +0 -320
- package/skills/patterns/ui/forms.md +0 -405
- package/skills/patterns/ui/inputs.md +0 -319
- package/skills/patterns/ui/layouts.md +0 -282
- package/skills/patterns/ui/loading.md +0 -291
- package/skills/patterns/ui/modals.md +0 -338
- package/skills/patterns/ui/navigation.md +0 -374
- package/skills/patterns/ui/tables.md +0 -407
- package/skills/patterns/ui/toasts.md +0 -300
- package/skills/patterns/ui/tooltips.md +0 -396
- package/skills/patterns/utils/dates.md +0 -435
- package/skills/patterns/utils/errors.md +0 -451
- package/skills/patterns/utils/formatting.md +0 -345
- package/skills/patterns/utils/validation.md +0 -434
- package/templates/bootspring.config.js +0 -83
- package/templates/business/business-model-canvas.md +0 -246
- package/templates/business/business-plan.md +0 -266
- package/templates/business/competitive-analysis.md +0 -312
- package/templates/fundraising/data-room-checklist.md +0 -300
- package/templates/fundraising/investor-research.md +0 -243
- package/templates/fundraising/pitch-deck-outline.md +0 -253
- package/templates/legal/gdpr-checklist.md +0 -339
- package/templates/legal/privacy-policy.md +0 -285
- package/templates/legal/terms-of-service.md +0 -222
- package/templates/mcp.json +0 -9
|
@@ -70,6 +70,28 @@ function error(message, suggestions = []) {
|
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
/**
|
|
74
|
+
* Format a warning response
|
|
75
|
+
* @param {string} message - Warning message
|
|
76
|
+
* @param {string[]} [suggestions] - Helpful suggestions
|
|
77
|
+
* @returns {object} MCP-formatted warning response
|
|
78
|
+
*/
|
|
79
|
+
function warning(message, suggestions = []) {
|
|
80
|
+
const sections = [`⚠️ Warning: ${message}`];
|
|
81
|
+
|
|
82
|
+
if (suggestions.length > 0) {
|
|
83
|
+
sections.push('\n💡 Suggestions:');
|
|
84
|
+
suggestions.forEach(s => sections.push(` • ${s}`));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
content: [{
|
|
89
|
+
type: 'text',
|
|
90
|
+
text: sections.join('\n')
|
|
91
|
+
}]
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
73
95
|
/**
|
|
74
96
|
* Format a list response with items
|
|
75
97
|
* @param {object} options - List options
|
|
@@ -631,6 +653,7 @@ function capabilitiesList(_capabilities) {
|
|
|
631
653
|
module.exports = {
|
|
632
654
|
success,
|
|
633
655
|
error,
|
|
656
|
+
warning,
|
|
634
657
|
list,
|
|
635
658
|
agentDetails,
|
|
636
659
|
skillDetails,
|
package/mcp/tools/assist-tool.js
CHANGED
|
@@ -69,12 +69,20 @@ function createHandler({ natural, contextDetector, memory, format }) {
|
|
|
69
69
|
const memoryRecommendations = [];
|
|
70
70
|
if (memory && parsed.action.type !== 'unknown') {
|
|
71
71
|
try {
|
|
72
|
-
|
|
72
|
+
// Map parsed action type to decision tracker type
|
|
73
|
+
const decisionType = mapActionToDecisionType(
|
|
73
74
|
parsed.action.type,
|
|
74
|
-
parsed.entities
|
|
75
|
+
parsed.entities
|
|
75
76
|
);
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
const decisionContext = parsed.entities.features[0] ||
|
|
78
|
+
parsed.action.parameters?.feature ||
|
|
79
|
+
parsed.entities.subjects[0];
|
|
80
|
+
|
|
81
|
+
if (decisionType && decisionContext) {
|
|
82
|
+
const rec = memory.getRecommendation(decisionType, decisionContext);
|
|
83
|
+
if (rec && rec.found) {
|
|
84
|
+
memoryRecommendations.push(rec);
|
|
85
|
+
}
|
|
78
86
|
}
|
|
79
87
|
} catch {
|
|
80
88
|
// Memory not available yet
|
|
@@ -98,6 +106,72 @@ function createHandler({ natural, contextDetector, memory, format }) {
|
|
|
98
106
|
};
|
|
99
107
|
}
|
|
100
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Map parsed action type to decision tracker DECISION_TYPES
|
|
111
|
+
* The parser uses action types like 'add_feature', 'analyze', etc.
|
|
112
|
+
* The decision tracker uses types like 'architecture', 'database', etc.
|
|
113
|
+
*/
|
|
114
|
+
function mapActionToDecisionType(actionType, entities) {
|
|
115
|
+
// Direct action type mappings
|
|
116
|
+
const actionTypeMap = {
|
|
117
|
+
'deploy': 'deployment',
|
|
118
|
+
'run_tests': 'testing',
|
|
119
|
+
'add_tests': 'testing',
|
|
120
|
+
'quality_check': 'testing',
|
|
121
|
+
'optimize': 'performance'
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
if (actionTypeMap[actionType]) {
|
|
125
|
+
return actionTypeMap[actionType];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// For feature-related actions, infer from the feature/subject
|
|
129
|
+
const featureTypeMap = {
|
|
130
|
+
'auth': 'security',
|
|
131
|
+
'security': 'security',
|
|
132
|
+
'database': 'database',
|
|
133
|
+
'api': 'api',
|
|
134
|
+
'ui': 'ui',
|
|
135
|
+
'testing': 'testing',
|
|
136
|
+
'payments': 'api',
|
|
137
|
+
'notifications': 'api',
|
|
138
|
+
'search': 'database',
|
|
139
|
+
'analytics': 'database',
|
|
140
|
+
'file-upload': 'api',
|
|
141
|
+
'ai': 'api'
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// Check entities for type inference
|
|
145
|
+
if (entities.features && entities.features.length > 0) {
|
|
146
|
+
const feature = entities.features[0];
|
|
147
|
+
if (featureTypeMap[feature]) {
|
|
148
|
+
return featureTypeMap[feature];
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (entities.subjects && entities.subjects.length > 0) {
|
|
153
|
+
const subject = entities.subjects[0];
|
|
154
|
+
if (featureTypeMap[subject]) {
|
|
155
|
+
return featureTypeMap[subject];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Default mappings for general action types
|
|
160
|
+
const defaultMappings = {
|
|
161
|
+
'add_feature': 'architecture',
|
|
162
|
+
'remove_feature': 'architecture',
|
|
163
|
+
'update_feature': 'architecture',
|
|
164
|
+
'invoke_agent': 'agent_selection',
|
|
165
|
+
'start_workflow': 'workflow_choice',
|
|
166
|
+
'find_skill': 'skill_usage',
|
|
167
|
+
'explain': 'architecture',
|
|
168
|
+
'analyze': 'architecture',
|
|
169
|
+
'generate': 'architecture'
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
return defaultMappings[actionType] || 'architecture';
|
|
173
|
+
}
|
|
174
|
+
|
|
101
175
|
/**
|
|
102
176
|
* Build response based on analysis
|
|
103
177
|
*/
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Git Autopilot Tool Module
|
|
3
|
+
*
|
|
4
|
+
* Provides MCP interface for git autopilot functionality.
|
|
5
|
+
* Automatically triggers workflows based on git events.
|
|
6
|
+
*
|
|
7
|
+
* @package bootspring
|
|
8
|
+
* @module mcp/tools/autopilot-tool
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
function getToolDefinition() {
|
|
12
|
+
return {
|
|
13
|
+
name: 'bootspring_autopilot',
|
|
14
|
+
description: 'Git Autopilot - automatically trigger workflows based on git events (commits, branches, merges, tags).',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
action: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
enum: [
|
|
21
|
+
'status',
|
|
22
|
+
'enable',
|
|
23
|
+
'disable',
|
|
24
|
+
'analyze',
|
|
25
|
+
'accept',
|
|
26
|
+
'dismiss',
|
|
27
|
+
'clear',
|
|
28
|
+
'start-watcher',
|
|
29
|
+
'stop-watcher',
|
|
30
|
+
'add-mapping',
|
|
31
|
+
'remove-mapping',
|
|
32
|
+
'install-hooks',
|
|
33
|
+
'remove-hooks',
|
|
34
|
+
'config',
|
|
35
|
+
'history'
|
|
36
|
+
],
|
|
37
|
+
description: 'Action to perform on autopilot'
|
|
38
|
+
},
|
|
39
|
+
workflow: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'Workflow name (for accept/dismiss actions)'
|
|
42
|
+
},
|
|
43
|
+
pattern: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'Event pattern for mapping (e.g., "branch:feature/*", "commit:feat:")'
|
|
46
|
+
},
|
|
47
|
+
autoStart: {
|
|
48
|
+
type: 'boolean',
|
|
49
|
+
description: 'Enable auto-start of workflows (for enable action)'
|
|
50
|
+
},
|
|
51
|
+
watchInterval: {
|
|
52
|
+
type: 'number',
|
|
53
|
+
description: 'Polling interval in milliseconds (for enable action)'
|
|
54
|
+
},
|
|
55
|
+
hooks: {
|
|
56
|
+
type: 'object',
|
|
57
|
+
properties: {
|
|
58
|
+
onBranchCreate: { type: 'boolean' },
|
|
59
|
+
onCommit: { type: 'boolean' },
|
|
60
|
+
onMerge: { type: 'boolean' },
|
|
61
|
+
onTag: { type: 'boolean' },
|
|
62
|
+
onFileChange: { type: 'boolean' }
|
|
63
|
+
},
|
|
64
|
+
description: 'Git event hooks configuration (for enable action)'
|
|
65
|
+
},
|
|
66
|
+
limit: {
|
|
67
|
+
type: 'number',
|
|
68
|
+
description: 'Limit for history entries (default: 50)'
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
required: ['action']
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function createHandler({ format }) {
|
|
77
|
+
// Lazy load to avoid circular dependencies
|
|
78
|
+
let gitAutopilot = null;
|
|
79
|
+
|
|
80
|
+
function getAutopilot() {
|
|
81
|
+
if (!gitAutopilot) {
|
|
82
|
+
gitAutopilot = require('../../hooks/git-autopilot');
|
|
83
|
+
}
|
|
84
|
+
return gitAutopilot;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return async (args) => {
|
|
88
|
+
const {
|
|
89
|
+
action,
|
|
90
|
+
workflow,
|
|
91
|
+
pattern,
|
|
92
|
+
autoStart,
|
|
93
|
+
watchInterval,
|
|
94
|
+
hooks,
|
|
95
|
+
limit
|
|
96
|
+
} = args;
|
|
97
|
+
|
|
98
|
+
const autopilot = getAutopilot();
|
|
99
|
+
|
|
100
|
+
switch (action) {
|
|
101
|
+
case 'status': {
|
|
102
|
+
const status = autopilot.getStatus();
|
|
103
|
+
return {
|
|
104
|
+
content: [{
|
|
105
|
+
type: 'text',
|
|
106
|
+
text: JSON.stringify({
|
|
107
|
+
enabled: status.enabled,
|
|
108
|
+
watcherActive: status.watcherActive,
|
|
109
|
+
pendingSuggestions: status.pendingSuggestions,
|
|
110
|
+
suggestions: status.suggestions,
|
|
111
|
+
lastCheck: status.lastCheck,
|
|
112
|
+
config: {
|
|
113
|
+
autoStart: status.config.autoStart,
|
|
114
|
+
watchInterval: status.config.watchInterval,
|
|
115
|
+
hooks: status.config.hooks,
|
|
116
|
+
ignoreBranches: status.config.ignoreBranches
|
|
117
|
+
}
|
|
118
|
+
}, null, 2)
|
|
119
|
+
}]
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
case 'enable': {
|
|
124
|
+
const options = {};
|
|
125
|
+
if (autoStart !== undefined) options.autoStart = autoStart;
|
|
126
|
+
if (watchInterval !== undefined) options.watchInterval = watchInterval;
|
|
127
|
+
if (hooks !== undefined) options.hooks = hooks;
|
|
128
|
+
|
|
129
|
+
const result = autopilot.enable(options);
|
|
130
|
+
return {
|
|
131
|
+
content: [{
|
|
132
|
+
type: 'text',
|
|
133
|
+
text: JSON.stringify({
|
|
134
|
+
success: result.success,
|
|
135
|
+
message: 'Git Autopilot enabled',
|
|
136
|
+
config: {
|
|
137
|
+
enabled: result.config.enabled,
|
|
138
|
+
autoStart: result.config.autoStart,
|
|
139
|
+
watchInterval: result.config.watchInterval,
|
|
140
|
+
hooks: result.config.hooks
|
|
141
|
+
},
|
|
142
|
+
nextStep: 'Use action="start-watcher" to begin monitoring git events'
|
|
143
|
+
}, null, 2)
|
|
144
|
+
}]
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
case 'disable': {
|
|
149
|
+
const result = autopilot.disable();
|
|
150
|
+
return {
|
|
151
|
+
content: [{
|
|
152
|
+
type: 'text',
|
|
153
|
+
text: JSON.stringify({
|
|
154
|
+
success: result.success,
|
|
155
|
+
message: 'Git Autopilot disabled'
|
|
156
|
+
}, null, 2)
|
|
157
|
+
}]
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
case 'analyze': {
|
|
162
|
+
const analysis = autopilot.analyzeGitState({ force: true });
|
|
163
|
+
return {
|
|
164
|
+
content: [{
|
|
165
|
+
type: 'text',
|
|
166
|
+
text: JSON.stringify({
|
|
167
|
+
enabled: analysis.enabled,
|
|
168
|
+
branch: analysis.branch,
|
|
169
|
+
isNewBranch: analysis.isNewBranch,
|
|
170
|
+
mergeInfo: analysis.mergeInfo,
|
|
171
|
+
suggestions: analysis.suggestions.map(s => ({
|
|
172
|
+
workflow: s.workflow,
|
|
173
|
+
trigger: s.trigger,
|
|
174
|
+
triggerType: s.triggerType,
|
|
175
|
+
value: s.value,
|
|
176
|
+
confidence: s.confidence,
|
|
177
|
+
autoStartEligible: s.autoStartEligible
|
|
178
|
+
})),
|
|
179
|
+
autoStartEnabled: analysis.autoStartEnabled
|
|
180
|
+
}, null, 2)
|
|
181
|
+
}]
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
case 'accept': {
|
|
186
|
+
if (!workflow) {
|
|
187
|
+
throw new Error('Workflow name required for accept action');
|
|
188
|
+
}
|
|
189
|
+
const result = autopilot.acceptSuggestion(workflow);
|
|
190
|
+
if (!result.success) {
|
|
191
|
+
throw new Error(result.error || 'Failed to accept suggestion');
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
content: [{
|
|
195
|
+
type: 'text',
|
|
196
|
+
text: JSON.stringify({
|
|
197
|
+
success: true,
|
|
198
|
+
workflow: result.workflow,
|
|
199
|
+
workflowStarted: result.startResult?.success,
|
|
200
|
+
currentPhase: result.startResult?.currentPhase
|
|
201
|
+
}, null, 2)
|
|
202
|
+
}]
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
case 'dismiss': {
|
|
207
|
+
if (!workflow) {
|
|
208
|
+
throw new Error('Workflow name required for dismiss action');
|
|
209
|
+
}
|
|
210
|
+
const result = autopilot.dismissSuggestion(workflow);
|
|
211
|
+
return {
|
|
212
|
+
content: [{
|
|
213
|
+
type: 'text',
|
|
214
|
+
text: JSON.stringify({
|
|
215
|
+
success: result.success,
|
|
216
|
+
workflow: result.workflow,
|
|
217
|
+
message: `Suggestion for ${workflow} dismissed`
|
|
218
|
+
}, null, 2)
|
|
219
|
+
}]
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
case 'clear': {
|
|
224
|
+
const result = autopilot.clearSuggestions();
|
|
225
|
+
return {
|
|
226
|
+
content: [{
|
|
227
|
+
type: 'text',
|
|
228
|
+
text: JSON.stringify({
|
|
229
|
+
success: result.success,
|
|
230
|
+
cleared: result.cleared,
|
|
231
|
+
message: `Cleared ${result.cleared} pending suggestions`
|
|
232
|
+
}, null, 2)
|
|
233
|
+
}]
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
case 'start-watcher': {
|
|
238
|
+
const result = autopilot.startWatcher();
|
|
239
|
+
if (!result.success) {
|
|
240
|
+
throw new Error(result.error || 'Failed to start watcher');
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
content: [{
|
|
244
|
+
type: 'text',
|
|
245
|
+
text: JSON.stringify({
|
|
246
|
+
success: true,
|
|
247
|
+
message: result.message,
|
|
248
|
+
interval: result.interval,
|
|
249
|
+
note: 'Watcher is now monitoring git events and will suggest workflows based on activity'
|
|
250
|
+
}, null, 2)
|
|
251
|
+
}]
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
case 'stop-watcher': {
|
|
256
|
+
const result = autopilot.stopWatcher();
|
|
257
|
+
if (!result.success) {
|
|
258
|
+
throw new Error(result.error || 'Failed to stop watcher');
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
content: [{
|
|
262
|
+
type: 'text',
|
|
263
|
+
text: JSON.stringify({
|
|
264
|
+
success: true,
|
|
265
|
+
message: result.message
|
|
266
|
+
}, null, 2)
|
|
267
|
+
}]
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
case 'add-mapping': {
|
|
272
|
+
if (!pattern) {
|
|
273
|
+
throw new Error('Pattern required (e.g., "branch:feature/*")');
|
|
274
|
+
}
|
|
275
|
+
if (!workflow) {
|
|
276
|
+
throw new Error('Workflow name required');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Validate pattern format
|
|
280
|
+
const validPrefixes = ['branch:', 'commit:', 'files:', 'merge:', 'tag:'];
|
|
281
|
+
const hasValidPrefix = validPrefixes.some(p => pattern.startsWith(p));
|
|
282
|
+
if (!hasValidPrefix) {
|
|
283
|
+
throw new Error(`Invalid pattern format. Must start with: ${validPrefixes.join(', ')}`);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const result = autopilot.addEventMapping(pattern, workflow);
|
|
287
|
+
return {
|
|
288
|
+
content: [{
|
|
289
|
+
type: 'text',
|
|
290
|
+
text: JSON.stringify({
|
|
291
|
+
success: result.success,
|
|
292
|
+
pattern: result.pattern,
|
|
293
|
+
workflow: result.workflow,
|
|
294
|
+
message: `Added mapping: ${pattern} -> ${workflow}`
|
|
295
|
+
}, null, 2)
|
|
296
|
+
}]
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
case 'remove-mapping': {
|
|
301
|
+
if (!pattern) {
|
|
302
|
+
throw new Error('Pattern required');
|
|
303
|
+
}
|
|
304
|
+
const result = autopilot.removeEventMapping(pattern);
|
|
305
|
+
if (!result.success) {
|
|
306
|
+
throw new Error(result.error || 'Failed to remove mapping');
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
content: [{
|
|
310
|
+
type: 'text',
|
|
311
|
+
text: JSON.stringify({
|
|
312
|
+
success: true,
|
|
313
|
+
pattern: result.pattern,
|
|
314
|
+
message: `Removed mapping for ${pattern}`
|
|
315
|
+
}, null, 2)
|
|
316
|
+
}]
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
case 'install-hooks': {
|
|
321
|
+
const result = autopilot.installGitHooks();
|
|
322
|
+
if (!result.success) {
|
|
323
|
+
throw new Error(result.error || 'Failed to install hooks');
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
content: [{
|
|
327
|
+
type: 'text',
|
|
328
|
+
text: JSON.stringify({
|
|
329
|
+
success: true,
|
|
330
|
+
installed: result.installed,
|
|
331
|
+
skipped: result.skipped,
|
|
332
|
+
message: result.message,
|
|
333
|
+
note: 'Git hooks provide immediate response to git events without polling'
|
|
334
|
+
}, null, 2)
|
|
335
|
+
}]
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
case 'remove-hooks': {
|
|
340
|
+
const result = autopilot.removeGitHooks();
|
|
341
|
+
if (!result.success) {
|
|
342
|
+
throw new Error(result.error || 'Failed to remove hooks');
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
content: [{
|
|
346
|
+
type: 'text',
|
|
347
|
+
text: JSON.stringify({
|
|
348
|
+
success: true,
|
|
349
|
+
removed: result.removed,
|
|
350
|
+
message: result.message
|
|
351
|
+
}, null, 2)
|
|
352
|
+
}]
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
case 'config': {
|
|
357
|
+
const state = autopilot.loadAutopilotState();
|
|
358
|
+
return {
|
|
359
|
+
content: [{
|
|
360
|
+
type: 'text',
|
|
361
|
+
text: JSON.stringify({
|
|
362
|
+
config: {
|
|
363
|
+
enabled: state.config.enabled,
|
|
364
|
+
autoStart: state.config.autoStart,
|
|
365
|
+
requireConfirmation: state.config.requireConfirmation,
|
|
366
|
+
watchInterval: state.config.watchInterval,
|
|
367
|
+
ignoreBranches: state.config.ignoreBranches,
|
|
368
|
+
ignorePatterns: state.config.ignorePatterns,
|
|
369
|
+
hooks: state.config.hooks,
|
|
370
|
+
allowedAutoStartWorkflows: state.config.allowedAutoStartWorkflows,
|
|
371
|
+
cooldownPeriod: state.config.cooldownPeriod
|
|
372
|
+
},
|
|
373
|
+
eventMappings: Object.entries(state.config.eventMapping || {}).map(([pattern, wf]) => ({
|
|
374
|
+
pattern,
|
|
375
|
+
workflow: wf
|
|
376
|
+
}))
|
|
377
|
+
}, null, 2)
|
|
378
|
+
}]
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
case 'history': {
|
|
383
|
+
const history = autopilot.getHistory(limit || 50);
|
|
384
|
+
return {
|
|
385
|
+
content: [{
|
|
386
|
+
type: 'text',
|
|
387
|
+
text: JSON.stringify({
|
|
388
|
+
count: history.length,
|
|
389
|
+
history: history.reverse() // Most recent first
|
|
390
|
+
}, null, 2)
|
|
391
|
+
}]
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
default:
|
|
396
|
+
return format.error(`Unknown action: ${action}`, [
|
|
397
|
+
'Valid actions: status, enable, disable, analyze, accept, dismiss, clear,',
|
|
398
|
+
'start-watcher, stop-watcher, add-mapping, remove-mapping,',
|
|
399
|
+
'install-hooks, remove-hooks, config, history'
|
|
400
|
+
]);
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
module.exports = {
|
|
406
|
+
getToolDefinition,
|
|
407
|
+
createHandler
|
|
408
|
+
};
|