@monoes/monomindcli 2.16.12 → 2.16.13
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/.claude/agents/core/coder.md +1 -1
- package/.claude/agents/engineering/engineering-devops-automator.md +1 -1
- package/.claude/agents/github/repo-architect.md +1 -1
- package/.claude/agents/testing/production-validator.md +1 -1
- package/.claude/agents/testing/testing-tool-evaluator.md +1 -1
- package/.claude/commands/github/pr-manager.md +1 -1
- package/.claude/helpers/pick-rank.cjs +34 -4
- package/.claude/skills/monolean-audit/SKILL.md +1 -1
- package/dist/src/commands/cleanup-data.d.ts +30 -0
- package/dist/src/commands/cleanup-data.d.ts.map +1 -0
- package/dist/src/commands/cleanup-data.js +138 -0
- package/dist/src/commands/cleanup-data.js.map +1 -0
- package/dist/src/commands/cleanup-scratch.d.ts +43 -0
- package/dist/src/commands/cleanup-scratch.d.ts.map +1 -0
- package/dist/src/commands/cleanup-scratch.js +125 -0
- package/dist/src/commands/cleanup-scratch.js.map +1 -0
- package/dist/src/commands/cleanup.d.ts +2 -39
- package/dist/src/commands/cleanup.d.ts.map +1 -1
- package/dist/src/commands/cleanup.js +5 -247
- package/dist/src/commands/cleanup.js.map +1 -1
- package/dist/src/commands/doctor-gitignore-checks.d.ts +10 -0
- package/dist/src/commands/doctor-gitignore-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-gitignore-checks.js +141 -0
- package/dist/src/commands/doctor-gitignore-checks.js.map +1 -0
- package/dist/src/commands/doctor-helpers-checks.d.ts +10 -0
- package/dist/src/commands/doctor-helpers-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-helpers-checks.js +292 -0
- package/dist/src/commands/doctor-helpers-checks.js.map +1 -0
- package/dist/src/commands/doctor-memory-checks.d.ts +47 -0
- package/dist/src/commands/doctor-memory-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-memory-checks.js +298 -0
- package/dist/src/commands/doctor-memory-checks.js.map +1 -0
- package/dist/src/commands/doctor-monograph-checks.d.ts +9 -0
- package/dist/src/commands/doctor-monograph-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-monograph-checks.js +331 -0
- package/dist/src/commands/doctor-monograph-checks.js.map +1 -0
- package/dist/src/commands/doctor-project-checks.d.ts +7 -66
- package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-project-checks.js +10 -1331
- package/dist/src/commands/doctor-project-checks.js.map +1 -1
- package/dist/src/commands/doctor-routing-checks.d.ts +10 -0
- package/dist/src/commands/doctor-routing-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-routing-checks.js +194 -0
- package/dist/src/commands/doctor-routing-checks.js.map +1 -0
- package/dist/src/commands/doctor-worker-checks.d.ts +17 -0
- package/dist/src/commands/doctor-worker-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-worker-checks.js +122 -0
- package/dist/src/commands/doctor-worker-checks.js.map +1 -0
- package/dist/src/commands/hooks-routing-commands.js +1 -1
- package/dist/src/commands/hooks-routing-commands.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +6 -15
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/never-commit.d.ts +3 -3
- package/dist/src/init/types.d.ts +1 -1
- package/dist/src/init/types.js +1 -1
- package/dist/src/knowledge/document-store.js +1 -1
- package/dist/src/knowledge/document-store.js.map +1 -1
- package/dist/src/mcp-tools/hooks-edit-command.d.ts +10 -0
- package/dist/src/mcp-tools/hooks-edit-command.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-edit-command.js +247 -0
- package/dist/src/mcp-tools/hooks-edit-command.js.map +1 -0
- package/dist/src/mcp-tools/hooks-learning.d.ts +9 -0
- package/dist/src/mcp-tools/hooks-learning.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-learning.js +408 -0
- package/dist/src/mcp-tools/hooks-learning.js.map +1 -0
- package/dist/src/mcp-tools/hooks-metrics-list.d.ts +8 -0
- package/dist/src/mcp-tools/hooks-metrics-list.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-metrics-list.js +205 -0
- package/dist/src/mcp-tools/hooks-metrics-list.js.map +1 -0
- package/dist/src/mcp-tools/hooks-route.d.ts +12 -0
- package/dist/src/mcp-tools/hooks-route.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-route.js +251 -0
- package/dist/src/mcp-tools/hooks-route.js.map +1 -0
- package/dist/src/mcp-tools/hooks-routing.d.ts +6 -27
- package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.js +6 -1727
- package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
- package/dist/src/mcp-tools/hooks-session.d.ts +9 -0
- package/dist/src/mcp-tools/hooks-session.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-session.js +243 -0
- package/dist/src/mcp-tools/hooks-session.js.map +1 -0
- package/dist/src/mcp-tools/hooks-task.d.ts +17 -0
- package/dist/src/mcp-tools/hooks-task.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-task.js +427 -0
- package/dist/src/mcp-tools/hooks-task.js.map +1 -0
- package/dist/src/mcp-tools/hooks-tools.d.ts +2 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +2 -1
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +1 -1
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/memory/bm25-index.d.ts +2 -2
- package/dist/src/memory/bm25-index.js +2 -2
- package/dist/src/memory/embedding-operations.js +2 -2
- package/dist/src/memory/embedding-operations.js.map +1 -1
- package/dist/src/memory/entity-name-key.d.ts +1 -1
- package/dist/src/memory/entity-name-key.js +1 -1
- package/dist/src/memory/hnsw-operations.d.ts +1 -1
- package/dist/src/memory/hnsw-operations.js +1 -1
- package/dist/src/memory/memory-bridge-backend.d.ts +43 -0
- package/dist/src/memory/memory-bridge-backend.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-backend.js +363 -0
- package/dist/src/memory/memory-bridge-backend.js.map +1 -0
- package/dist/src/memory/memory-bridge-core.d.ts +42 -0
- package/dist/src/memory/memory-bridge-core.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-core.js +126 -0
- package/dist/src/memory/memory-bridge-core.js.map +1 -0
- package/dist/src/memory/memory-bridge-entries.d.ts +131 -0
- package/dist/src/memory/memory-bridge-entries.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-entries.js +227 -0
- package/dist/src/memory/memory-bridge-entries.js.map +1 -0
- package/dist/src/memory/memory-bridge-feedback.d.ts +60 -0
- package/dist/src/memory/memory-bridge-feedback.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-feedback.js +118 -0
- package/dist/src/memory/memory-bridge-feedback.js.map +1 -0
- package/dist/src/memory/memory-bridge-paths.d.ts +123 -0
- package/dist/src/memory/memory-bridge-paths.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-paths.js +335 -0
- package/dist/src/memory/memory-bridge-paths.js.map +1 -0
- package/dist/src/memory/memory-bridge-search.d.ts +48 -0
- package/dist/src/memory/memory-bridge-search.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-search.js +383 -0
- package/dist/src/memory/memory-bridge-search.js.map +1 -0
- package/dist/src/memory/memory-bridge-sessions.d.ts +38 -0
- package/dist/src/memory/memory-bridge-sessions.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-sessions.js +109 -0
- package/dist/src/memory/memory-bridge-sessions.js.map +1 -0
- package/dist/src/memory/memory-bridge-store.d.ts +58 -0
- package/dist/src/memory/memory-bridge-store.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-store.js +201 -0
- package/dist/src/memory/memory-bridge-store.js.map +1 -0
- package/dist/src/memory/memory-bridge.d.ts +10 -438
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +14 -1787
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-kg-claims.d.ts +52 -0
- package/dist/src/memory/memory-kg-claims.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-claims.js +99 -0
- package/dist/src/memory/memory-kg-claims.js.map +1 -0
- package/dist/src/memory/memory-kg-index.d.ts +86 -0
- package/dist/src/memory/memory-kg-index.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-index.js +256 -0
- package/dist/src/memory/memory-kg-index.js.map +1 -0
- package/dist/src/memory/memory-kg-ingest.d.ts +44 -0
- package/dist/src/memory/memory-kg-ingest.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-ingest.js +361 -0
- package/dist/src/memory/memory-kg-ingest.js.map +1 -0
- package/dist/src/memory/memory-kg-model.d.ts +168 -0
- package/dist/src/memory/memory-kg-model.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-model.js +158 -0
- package/dist/src/memory/memory-kg-model.js.map +1 -0
- package/dist/src/memory/memory-kg-names.d.ts +64 -0
- package/dist/src/memory/memory-kg-names.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-names.js +187 -0
- package/dist/src/memory/memory-kg-names.js.map +1 -0
- package/dist/src/memory/memory-kg-promote.d.ts +79 -0
- package/dist/src/memory/memory-kg-promote.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-promote.js +248 -0
- package/dist/src/memory/memory-kg-promote.js.map +1 -0
- package/dist/src/memory/memory-kg-rebuild.d.ts +77 -0
- package/dist/src/memory/memory-kg-rebuild.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-rebuild.js +299 -0
- package/dist/src/memory/memory-kg-rebuild.js.map +1 -0
- package/dist/src/memory/memory-kg-rollback.d.ts +47 -0
- package/dist/src/memory/memory-kg-rollback.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-rollback.js +193 -0
- package/dist/src/memory/memory-kg-rollback.js.map +1 -0
- package/dist/src/memory/memory-kg-rules.d.ts +64 -0
- package/dist/src/memory/memory-kg-rules.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-rules.js +251 -0
- package/dist/src/memory/memory-kg-rules.js.map +1 -0
- package/dist/src/memory/memory-kg-scan.d.ts +118 -0
- package/dist/src/memory/memory-kg-scan.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-scan.js +209 -0
- package/dist/src/memory/memory-kg-scan.js.map +1 -0
- package/dist/src/memory/memory-kg-search.d.ts +80 -0
- package/dist/src/memory/memory-kg-search.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-search.js +239 -0
- package/dist/src/memory/memory-kg-search.js.map +1 -0
- package/dist/src/memory/memory-kg.d.ts +19 -547
- package/dist/src/memory/memory-kg.d.ts.map +1 -1
- package/dist/src/memory/memory-kg.js +10 -2389
- package/dist/src/memory/memory-kg.js.map +1 -1
- package/dist/src/ui/org-hil.mjs +1 -1
- package/dist/src/ui/routes-org-agents.mjs +318 -0
- package/dist/src/ui/routes-org-approvals.mjs +133 -0
- package/dist/src/ui/routes-org-config.mjs +459 -0
- package/dist/src/ui/routes-org-control.mjs +300 -0
- package/dist/src/ui/routes-org-files.mjs +172 -0
- package/dist/src/ui/routes-org-helpers.mjs +84 -0
- package/dist/src/ui/routes-org-knowledge.mjs +262 -0
- package/dist/src/ui/routes-org-lifecycle.mjs +224 -0
- package/dist/src/ui/routes-org-live.mjs +278 -0
- package/dist/src/ui/routes-org-mastermind.mjs +346 -0
- package/dist/src/ui/routes-org-planning.mjs +398 -0
- package/dist/src/ui/routes-org-runs.mjs +430 -0
- package/dist/src/ui/routes-org-status.mjs +342 -0
- package/dist/src/ui/routes-org-workflows.mjs +212 -0
- package/dist/src/ui/routes-org.mjs +26 -3847
- package/dist/src/ui/server.mjs +1 -1
- package/dist/src/utils/native-error.d.ts +1 -1
- package/dist/src/utils/native-error.js +1 -1
- package/dist/src/utils/paths.d.ts +2 -1
- package/dist/src/utils/paths.d.ts.map +1 -1
- package/dist/src/utils/paths.js +2 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/org-skills/adversarial-reviewer/SKILL.md +1 -1
- package/org-skills/board-deck-builder/SKILL.md +1 -1
- package/org-skills/code-reviewer/SKILL.md +1 -1
- package/org-skills/debugging-wizard/SKILL.md +1 -1
- package/org-skills/scientific-thinking-literature-review/SKILL.md +1 -1
- package/org-skills/scientific-thinking-scholar-evaluation/SKILL.md +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hooks MCP Tools — pre/post edit and pre/post command.
|
|
3
|
+
* Extracted from hooks-routing.ts.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, mkdirSync, renameSync, writeFileSync } from 'node:fs';
|
|
6
|
+
import { join, resolve } from 'node:path';
|
|
7
|
+
import { recordCommand } from '../monovector/command-outcomes.js';
|
|
8
|
+
import { validateMcpString } from '../utils/input-guards.js';
|
|
9
|
+
import { assessCommandRisk, getFileExtension, getMemoryPath, getRouteOutcomesBaseDir, loadMemoryStore, MEMORY_DIR, suggestAgentsForFile, } from './hooks-embedding.js';
|
|
10
|
+
import { getProjectCwd } from './types.js';
|
|
11
|
+
// MCP Tool implementations - return raw data for direct CLI use
|
|
12
|
+
export const hooksPreEdit = {
|
|
13
|
+
name: 'hooks_pre-edit',
|
|
14
|
+
description: 'Get context and agent suggestions before editing a file',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
filePath: { type: 'string', description: 'Path to the file being edited' },
|
|
19
|
+
operation: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
description: 'Type of operation (create, update, delete, refactor)',
|
|
22
|
+
},
|
|
23
|
+
context: { type: 'string', description: 'Additional context' },
|
|
24
|
+
},
|
|
25
|
+
required: ['filePath'],
|
|
26
|
+
},
|
|
27
|
+
handler: async (params) => {
|
|
28
|
+
// Cap filePath: passed to suggestAgentsForFile (O(n) regex) and reflected in
|
|
29
|
+
// response. Cap operation to prevent oversized strings in recommendations.
|
|
30
|
+
const MAX_PRE_EDIT_PATH_LEN = 4 * 1024;
|
|
31
|
+
const MAX_PRE_EDIT_OP_LEN = 64;
|
|
32
|
+
const filePath = validateMcpString(params.filePath, 'filePath', MAX_PRE_EDIT_PATH_LEN);
|
|
33
|
+
if (!filePath) {
|
|
34
|
+
return { error: 'filePath is required (non-empty string, no control chars, max 4KB)' };
|
|
35
|
+
}
|
|
36
|
+
const operation = validateMcpString(params.operation, 'operation', MAX_PRE_EDIT_OP_LEN) ?? 'update';
|
|
37
|
+
const suggestedAgents = suggestAgentsForFile(filePath);
|
|
38
|
+
const ext = getFileExtension(filePath);
|
|
39
|
+
return {
|
|
40
|
+
filePath,
|
|
41
|
+
operation,
|
|
42
|
+
context: {
|
|
43
|
+
fileExists: existsSync(resolve(getProjectCwd(), filePath)),
|
|
44
|
+
fileType: ext || 'unknown',
|
|
45
|
+
suggestedAgents,
|
|
46
|
+
risks: operation === 'delete' ? ['File deletion is irreversible'] : [],
|
|
47
|
+
},
|
|
48
|
+
recommendations: [
|
|
49
|
+
`Recommended agents: ${suggestedAgents.join(', ')}`,
|
|
50
|
+
'Run tests after changes',
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
export const hooksPostEdit = {
|
|
56
|
+
name: 'hooks_post-edit',
|
|
57
|
+
description: 'Record editing outcome for learning',
|
|
58
|
+
inputSchema: {
|
|
59
|
+
type: 'object',
|
|
60
|
+
properties: {
|
|
61
|
+
filePath: { type: 'string', description: 'Path to the edited file' },
|
|
62
|
+
success: { type: 'boolean', description: 'Whether the edit was successful' },
|
|
63
|
+
agent: { type: 'string', description: 'Agent that performed the edit' },
|
|
64
|
+
},
|
|
65
|
+
required: ['filePath'],
|
|
66
|
+
},
|
|
67
|
+
handler: async (params) => {
|
|
68
|
+
// Cap filePath: interpolated into taskId and task text forwarded to
|
|
69
|
+
// bridgeRecordFeedback (which calls generateEmbedding — O(n) hash fallback).
|
|
70
|
+
// Cap agent: stored in feedback record and forwarded to bridge.
|
|
71
|
+
const MAX_POST_EDIT_PATH_LEN = 4 * 1024;
|
|
72
|
+
const MAX_POST_EDIT_AGENT_LEN = 256;
|
|
73
|
+
const filePath = validateMcpString(params.filePath, 'filePath', MAX_POST_EDIT_PATH_LEN);
|
|
74
|
+
if (!filePath) {
|
|
75
|
+
return { error: 'filePath is required (non-empty string, no control chars, max 4KB)' };
|
|
76
|
+
}
|
|
77
|
+
const success = params.success !== false;
|
|
78
|
+
const agent = validateMcpString(params.agent, 'agent', MAX_POST_EDIT_AGENT_LEN) ?? undefined;
|
|
79
|
+
// Wire recordFeedback through bridge (issue #1209)
|
|
80
|
+
let feedbackResult = null;
|
|
81
|
+
try {
|
|
82
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
83
|
+
feedbackResult = await bridge.bridgeRecordFeedback({
|
|
84
|
+
taskType: agent ?? 'coder',
|
|
85
|
+
action: `edit ${filePath}`,
|
|
86
|
+
outcome: success ? 'success' : 'failure',
|
|
87
|
+
confidence: success ? 0.85 : 0.3,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
// Bridge not available — continue with basic response
|
|
92
|
+
if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
|
|
93
|
+
console.error('[hooks-post-edit] memory bridge feedback failed:', e);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
// The feedback record is the only write this hook makes.
|
|
97
|
+
recorded: feedbackResult?.success === true,
|
|
98
|
+
filePath,
|
|
99
|
+
success,
|
|
100
|
+
timestamp: new Date().toISOString(),
|
|
101
|
+
feedback: feedbackResult
|
|
102
|
+
? {
|
|
103
|
+
recorded: feedbackResult.success,
|
|
104
|
+
controller: feedbackResult.success ? 'sqlite' : 'unavailable',
|
|
105
|
+
updates: feedbackResult.success ? 1 : 0,
|
|
106
|
+
}
|
|
107
|
+
: { recorded: false, controller: 'unavailable', updates: 0 },
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
export const hooksPreCommand = {
|
|
112
|
+
name: 'hooks_pre-command',
|
|
113
|
+
description: 'Assess risk before executing a command',
|
|
114
|
+
inputSchema: {
|
|
115
|
+
type: 'object',
|
|
116
|
+
properties: {
|
|
117
|
+
command: { type: 'string', description: 'Command to execute' },
|
|
118
|
+
},
|
|
119
|
+
required: ['command'],
|
|
120
|
+
},
|
|
121
|
+
handler: async (params) => {
|
|
122
|
+
// Cap command length: assessCommandRisk runs O(n) string searches, and the
|
|
123
|
+
// raw command is reflected verbatim in the response. Limit to 4 KB which
|
|
124
|
+
// is far beyond any realistic shell command.
|
|
125
|
+
const MAX_CMD_LEN = 4 * 1024;
|
|
126
|
+
const command = validateMcpString(params.command, 'command', MAX_CMD_LEN);
|
|
127
|
+
if (!command) {
|
|
128
|
+
return { error: 'command is required (non-empty string, no control chars, max 4KB)' };
|
|
129
|
+
}
|
|
130
|
+
const assessment = assessCommandRisk(command);
|
|
131
|
+
const riskLevel = assessment.level >= 0.8
|
|
132
|
+
? 'critical'
|
|
133
|
+
: assessment.level >= 0.6
|
|
134
|
+
? 'high'
|
|
135
|
+
: assessment.level >= 0.3
|
|
136
|
+
? 'medium'
|
|
137
|
+
: 'low';
|
|
138
|
+
return {
|
|
139
|
+
command,
|
|
140
|
+
riskLevel,
|
|
141
|
+
risks: assessment.warnings.map((warning, i) => ({
|
|
142
|
+
type: `risk-${i + 1}`,
|
|
143
|
+
severity: assessment.level >= 0.6 ? 'high' : 'medium',
|
|
144
|
+
description: warning,
|
|
145
|
+
})),
|
|
146
|
+
recommendations: assessment.warnings.length > 0
|
|
147
|
+
? ['Review warnings before proceeding', 'Consider using safer alternative']
|
|
148
|
+
: ['Command appears safe to execute'],
|
|
149
|
+
safeAlternatives: [],
|
|
150
|
+
shouldProceed: assessment.level < 0.7,
|
|
151
|
+
};
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
export const hooksPostCommand = {
|
|
155
|
+
name: 'hooks_post-command',
|
|
156
|
+
description: 'Record command execution outcome',
|
|
157
|
+
inputSchema: {
|
|
158
|
+
type: 'object',
|
|
159
|
+
properties: {
|
|
160
|
+
command: { type: 'string', description: 'Executed command' },
|
|
161
|
+
exitCode: { type: 'number', description: 'Command exit code' },
|
|
162
|
+
success: {
|
|
163
|
+
type: 'boolean',
|
|
164
|
+
description: 'Whether the command succeeded. false records a failure even with exit code 0; a non-zero exit code is always a failure.',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
required: ['command'],
|
|
168
|
+
},
|
|
169
|
+
handler: async (params) => {
|
|
170
|
+
// Cap command: it is stored in JSON memory store (line 824), forwarded to
|
|
171
|
+
// bridgeStoreEntry which calls generateEmbedding by default — O(n) hash
|
|
172
|
+
// fallback, and reflected verbatim in the response. The recordCommand path
|
|
173
|
+
// already caps to 200 chars; apply a consistent 4 KB cap here that still
|
|
174
|
+
// covers any realistic shell command.
|
|
175
|
+
const MAX_POST_CMD_LEN = 4 * 1024;
|
|
176
|
+
const command = validateMcpString(params.command, 'command', MAX_POST_CMD_LEN);
|
|
177
|
+
if (!command) {
|
|
178
|
+
return { error: 'command is required (non-empty string, no control chars, max 4KB)' };
|
|
179
|
+
}
|
|
180
|
+
const exitCode = typeof params.exitCode === 'number' && Number.isFinite(params.exitCode)
|
|
181
|
+
? Math.floor(params.exitCode)
|
|
182
|
+
: 0;
|
|
183
|
+
// An explicit success: false wins over a 0 exit code (e.g. a command that
|
|
184
|
+
// exited 0 but printed errors); a non-zero exit code is always a failure.
|
|
185
|
+
const success = exitCode === 0 && params.success !== false;
|
|
186
|
+
// Record the real exit code in the time-windowed command-outcome store so
|
|
187
|
+
// post-task can derive a MEASURED success signal (grounded in actual exit
|
|
188
|
+
// codes) when the caller does not explicitly assert --success. Non-fatal.
|
|
189
|
+
await recordCommand(getRouteOutcomesBaseDir(), {
|
|
190
|
+
ts: Date.now(),
|
|
191
|
+
command: typeof command === 'string' ? command.slice(0, 200) : String(command).slice(0, 200),
|
|
192
|
+
exitCode,
|
|
193
|
+
success,
|
|
194
|
+
});
|
|
195
|
+
// Persist command outcome via memory backend
|
|
196
|
+
let _storedIn = 'none';
|
|
197
|
+
try {
|
|
198
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
199
|
+
const stored = await bridge.bridgeStoreEntry({
|
|
200
|
+
key: `cmd-${Date.now()}`,
|
|
201
|
+
value: JSON.stringify({ command, exitCode, success }),
|
|
202
|
+
namespace: 'commands',
|
|
203
|
+
tags: [success ? 'success' : 'error'],
|
|
204
|
+
});
|
|
205
|
+
// #293: bridgeStoreEntry RETURNS null when the backend cannot be loaded,
|
|
206
|
+
// it does not throw. Claiming `_storedIn = 'sqlite'` on that return
|
|
207
|
+
// reported `recorded: true` for a write that never happened AND skipped
|
|
208
|
+
// the JSON fallback below, so the record was lost twice over.
|
|
209
|
+
if (!stored?.success)
|
|
210
|
+
throw new Error(stored?.error ?? 'memory backend unavailable');
|
|
211
|
+
_storedIn = 'sqlite';
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// memory backend unavailable or refused the write — store in JSON
|
|
215
|
+
try {
|
|
216
|
+
const store = loadMemoryStore();
|
|
217
|
+
const key = `cmd-${Date.now()}`;
|
|
218
|
+
store.entries[key] = {
|
|
219
|
+
key,
|
|
220
|
+
value: JSON.stringify({ command, exitCode, success }),
|
|
221
|
+
namespace: 'commands',
|
|
222
|
+
createdAt: new Date().toISOString(),
|
|
223
|
+
};
|
|
224
|
+
const memDir = join(getProjectCwd(), MEMORY_DIR);
|
|
225
|
+
if (!existsSync(memDir))
|
|
226
|
+
mkdirSync(memDir, { recursive: true });
|
|
227
|
+
const _mp = getMemoryPath();
|
|
228
|
+
const _mptmp = `${_mp}.tmp`;
|
|
229
|
+
writeFileSync(_mptmp, JSON.stringify(store, null, 2), 'utf-8');
|
|
230
|
+
renameSync(_mptmp, _mp);
|
|
231
|
+
_storedIn = 'json-store';
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
/* non-critical */
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
recorded: _storedIn !== 'none',
|
|
239
|
+
command,
|
|
240
|
+
exitCode,
|
|
241
|
+
success,
|
|
242
|
+
timestamp: new Date().toISOString(),
|
|
243
|
+
_storedIn,
|
|
244
|
+
};
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
//# sourceMappingURL=hooks-edit-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-edit-command.js","sourceRoot":"","sources":["../../../src/mcp-tools/hooks-edit-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hooks MCP Tools — pretrain, transfer and intelligence.
|
|
3
|
+
* Extracted from hooks-routing.ts.
|
|
4
|
+
*/
|
|
5
|
+
import { type MCPTool } from './types.js';
|
|
6
|
+
export declare const hooksPretrain: MCPTool;
|
|
7
|
+
export declare const hooksTransfer: MCPTool;
|
|
8
|
+
export declare const hooksIntelligence: MCPTool;
|
|
9
|
+
//# sourceMappingURL=hooks-learning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-learning.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/hooks-learning.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAczD,eAAO,MAAM,aAAa,EAAE,OAyK3B,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,OAqI3B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAwG/B,CAAC"}
|