@matimo/cli 0.1.0-alpha.9 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +50 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +64 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +174 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/mcp-setup.d.ts +9 -0
- package/dist/commands/mcp-setup.d.ts.map +1 -0
- package/dist/commands/mcp-setup.js +106 -0
- package/dist/commands/mcp-setup.js.map +1 -0
- package/dist/commands/mcp.d.ts +17 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +228 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/review.d.ts +10 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +176 -0
- package/dist/commands/review.js.map +1 -0
- package/package.json +6 -7
- package/LICENSE +0 -21
- package/bin/matimo.cjs +0 -26
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Matimo CLI entry point
|
|
4
|
+
*
|
|
5
|
+
* This is the npm bin target — compiled to dist/bin.js.
|
|
6
|
+
* All command routing (install, list, search, mcp, etc.) is handled by cli.ts.
|
|
7
|
+
*
|
|
8
|
+
* Uses tsx to register ESM hooks so extensionless imports in @matimo/core work
|
|
9
|
+
* correctly. This is required because @matimo/core compiles TypeScript with
|
|
10
|
+
* "moduleResolution": "bundler" which omits .js extensions in the output.
|
|
11
|
+
*
|
|
12
|
+
* Tool discovery works automatically via ToolLoader.getNodeModulesPath():
|
|
13
|
+
* 1. Walks up from process.cwd() to find node_modules/@matimo/*
|
|
14
|
+
* 2. Falls back to __dirname-based discovery (for Claude Desktop where cwd='/')
|
|
15
|
+
*
|
|
16
|
+
* Users run:
|
|
17
|
+
* npx matimo mcp # stdio mode
|
|
18
|
+
* npx matimo mcp --transport http # http mode
|
|
19
|
+
* npx matimo install slack gmail # install providers
|
|
20
|
+
* npx matimo list # list installed tools
|
|
21
|
+
*/
|
|
22
|
+
import { spawn } from 'child_process';
|
|
23
|
+
import { dirname, join } from 'path';
|
|
24
|
+
import { fileURLToPath } from 'url';
|
|
25
|
+
import { createRequire } from 'module';
|
|
26
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
27
|
+
const __dirname = dirname(__filename);
|
|
28
|
+
// Resolve tsx from this package's dependencies
|
|
29
|
+
const require = createRequire(import.meta.url);
|
|
30
|
+
let tsxBin;
|
|
31
|
+
try {
|
|
32
|
+
const tsxPkgPath = require.resolve('tsx/package.json');
|
|
33
|
+
tsxBin = join(dirname(tsxPkgPath), 'dist', 'cli.mjs');
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
tsxBin = 'tsx';
|
|
37
|
+
}
|
|
38
|
+
const cliScript = join(__dirname, 'cli.js');
|
|
39
|
+
const child = spawn(process.execPath, [tsxBin, cliScript, ...process.argv.slice(2)], {
|
|
40
|
+
stdio: 'inherit',
|
|
41
|
+
env: process.env,
|
|
42
|
+
});
|
|
43
|
+
child.on('error', (error) => {
|
|
44
|
+
console.error('❌ Failed to start Matimo CLI. Make sure tsx is installed.');
|
|
45
|
+
console.error(' Run: npm install tsx');
|
|
46
|
+
console.error(' Error:', error.message);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
});
|
|
49
|
+
child.on('exit', (code) => process.exit(code || 0));
|
|
50
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,+CAA+C;AAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,IAAI,MAAc,CAAC;AACnB,IAAI,CAAC;IACH,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAAC,MAAM,CAAC;IACP,MAAM,GAAG,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;IACnF,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,OAAO,CAAC,GAAG;CACjB,CAAC,CAAC;AAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;IACjC,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAmBA,wBAAgB,QAAQ,IAAI,IAAI,CAmE/B;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD5D"}
|
package/dist/cli.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { readFileSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
2
|
+
import { join, basename } from 'path';
|
|
3
3
|
import { installCommand } from './commands/install.js';
|
|
4
4
|
import { listCommand } from './commands/list.js';
|
|
5
5
|
import { searchCommand } from './commands/search.js';
|
|
6
|
+
import { mcpCommand } from './commands/mcp.js';
|
|
7
|
+
import { doctorCommand } from './commands/doctor.js';
|
|
8
|
+
import { reviewCommand } from './commands/review.js';
|
|
6
9
|
function getPackageVersion() {
|
|
7
10
|
try {
|
|
8
11
|
const pkgPath = join(process.cwd(), 'package.json');
|
|
@@ -29,10 +32,34 @@ Commands:
|
|
|
29
32
|
search <query> Search for available tools
|
|
30
33
|
Example: matimo search slack
|
|
31
34
|
|
|
35
|
+
mcp Start MCP server (Model Context Protocol)
|
|
36
|
+
Example: matimo mcp
|
|
37
|
+
Example: matimo mcp --transport http --port 3000
|
|
38
|
+
|
|
39
|
+
mcp setup Generate config for Claude Desktop / Cursor
|
|
40
|
+
Example: matimo mcp setup
|
|
41
|
+
|
|
42
|
+
doctor Diagnose your Matimo setup (env vars, YAML validity, Node version)
|
|
43
|
+
Example: matimo doctor
|
|
44
|
+
|
|
45
|
+
review Review agent-created tools awaiting human approval
|
|
46
|
+
Example: matimo review list
|
|
47
|
+
Example: matimo review approve my_tool
|
|
48
|
+
Example: matimo review reject my_tool
|
|
49
|
+
|
|
32
50
|
help Show this help message
|
|
33
51
|
|
|
34
52
|
version Show version information
|
|
35
53
|
|
|
54
|
+
MCP Options:
|
|
55
|
+
--transport <type> Transport mode: stdio (default) or http
|
|
56
|
+
--port <number> HTTP port (default: 3000)
|
|
57
|
+
--tools <list> Comma-separated tool allowlist
|
|
58
|
+
--exclude <list> Comma-separated tool denylist
|
|
59
|
+
--secrets <list> Secret resolvers: env,dotenv,vault,aws
|
|
60
|
+
--token <string> Bearer token for HTTP mode
|
|
61
|
+
--env-file <path> Path to .env file
|
|
62
|
+
|
|
36
63
|
Examples:
|
|
37
64
|
# Install new tools
|
|
38
65
|
$ matimo install slack
|
|
@@ -43,7 +70,15 @@ Examples:
|
|
|
43
70
|
|
|
44
71
|
# Search for tools
|
|
45
72
|
$ matimo search email
|
|
46
|
-
|
|
73
|
+
|
|
74
|
+
# Start MCP server for Claude Desktop
|
|
75
|
+
$ matimo mcp
|
|
76
|
+
|
|
77
|
+
# Start MCP HTTP server with auth
|
|
78
|
+
$ MATIMO_MCP_TOKEN=secret matimo mcp --transport http
|
|
79
|
+
|
|
80
|
+
# Generate Claude Desktop config
|
|
81
|
+
$ matimo mcp setup
|
|
47
82
|
|
|
48
83
|
Documentation: https://github.com/tallclub/matimo#readme
|
|
49
84
|
Issues: https://github.com/tallclub/matimo/issues
|
|
@@ -71,6 +106,15 @@ export async function main(cliArgs) {
|
|
|
71
106
|
case 'search':
|
|
72
107
|
await searchCommand(params[0] || '');
|
|
73
108
|
break;
|
|
109
|
+
case 'mcp':
|
|
110
|
+
await mcpCommand(params);
|
|
111
|
+
break;
|
|
112
|
+
case 'doctor':
|
|
113
|
+
await doctorCommand();
|
|
114
|
+
break;
|
|
115
|
+
case 'review':
|
|
116
|
+
await reviewCommand(params);
|
|
117
|
+
break;
|
|
74
118
|
case 'help':
|
|
75
119
|
case '-h':
|
|
76
120
|
case '--help':
|
|
@@ -92,4 +136,22 @@ export async function main(cliArgs) {
|
|
|
92
136
|
process.exit(1);
|
|
93
137
|
}
|
|
94
138
|
}
|
|
139
|
+
// Auto-execute when run directly (e.g., via tsx src/cli.ts or through bin.ts).
|
|
140
|
+
// bin.ts spawns: node <tsx-cli.mjs> <cli.js> ...args
|
|
141
|
+
// - When tsx shifts its own entry out of argv: process.argv[1] == cli.js
|
|
142
|
+
// - When tsx does NOT shift argv: process.argv[2] == cli.js
|
|
143
|
+
// Checking both slots handles either tsx version. When imported as a module
|
|
144
|
+
// (tests, bin.ts import) neither slot contains 'cli.js'.
|
|
145
|
+
// Use basename() to normalise path separators (POSIX / and Windows \).
|
|
146
|
+
/* istanbul ignore next */
|
|
147
|
+
const toCliJs = (s) => basename(s).replace(/\.ts$/, '.js');
|
|
148
|
+
/* istanbul ignore next */
|
|
149
|
+
const isRunDirectly = toCliJs(process.argv[1] ?? '') === 'cli.js' || toCliJs(process.argv[2] ?? '') === 'cli.js';
|
|
150
|
+
/* istanbul ignore next */
|
|
151
|
+
if (isRunDirectly) {
|
|
152
|
+
main().catch((error) => {
|
|
153
|
+
console.error('❌ Fatal error:', error);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
95
157
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAmDA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA8JnD"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
const issues = [];
|
|
4
|
+
function check(label, pass, message, severity = 'error') {
|
|
5
|
+
const icon = pass ? '✅' : severity === 'error' ? '❌' : '⚠️ ';
|
|
6
|
+
console.info(` ${icon} ${label}`);
|
|
7
|
+
if (!pass) {
|
|
8
|
+
issues.push({ severity, message });
|
|
9
|
+
console.info(` ${message}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function findNodeModules() {
|
|
13
|
+
let dir = process.cwd();
|
|
14
|
+
for (let i = 0; i < 10; i++) {
|
|
15
|
+
const candidate = path.join(dir, 'node_modules');
|
|
16
|
+
if (fs.existsSync(candidate))
|
|
17
|
+
return candidate;
|
|
18
|
+
const parent = path.dirname(dir);
|
|
19
|
+
if (parent === dir)
|
|
20
|
+
break;
|
|
21
|
+
dir = parent;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
async function loadMatimoCoreExport(exportName) {
|
|
26
|
+
try {
|
|
27
|
+
// Dynamic import works in both ESM (built CLI) and CJS (ts-jest test transform)
|
|
28
|
+
const core = (await import('@matimo/core'));
|
|
29
|
+
return core[exportName] ?? null;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function doctorCommand() {
|
|
36
|
+
// Ensure issues do not accumulate across multiple invocations
|
|
37
|
+
issues.length = 0;
|
|
38
|
+
console.info('\n🩺 Matimo Doctor — Checking your setup...\n');
|
|
39
|
+
// ─── 1. Node.js version ────────────────────────────────────────────────
|
|
40
|
+
console.info('Node.js:');
|
|
41
|
+
const nodeVersion = process.versions.node;
|
|
42
|
+
const [major] = nodeVersion.split('.').map(Number);
|
|
43
|
+
check(`Node.js v${nodeVersion}`, major >= 18, `Node.js 18+ required. You are running ${nodeVersion}. Upgrade: https://nodejs.org`);
|
|
44
|
+
console.info('');
|
|
45
|
+
// ─── 2. @matimo/* packages ─────────────────────────────────────────────
|
|
46
|
+
const nodeModulesPath = findNodeModules();
|
|
47
|
+
console.info('@matimo/* packages:');
|
|
48
|
+
if (!nodeModulesPath) {
|
|
49
|
+
check('node_modules', false, 'node_modules not found. Run "pnpm install" or "npm install".');
|
|
50
|
+
console.info('');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const matimoScope = path.join(nodeModulesPath, '@matimo');
|
|
54
|
+
const hasScope = fs.existsSync(matimoScope);
|
|
55
|
+
if (!hasScope) {
|
|
56
|
+
check('@matimo scope', false, 'No @matimo/* packages installed. Run "matimo install slack" to get started.', 'warn');
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const packages = fs.readdirSync(matimoScope).filter((d) => !d.startsWith('.'));
|
|
60
|
+
if (packages.length === 0) {
|
|
61
|
+
check('@matimo scope', false, 'No @matimo/* packages installed. Run "matimo install slack" to get started.', 'warn');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
for (const pkg of packages) {
|
|
65
|
+
const pkgDir = path.join(matimoScope, pkg);
|
|
66
|
+
const pkgJsonPath = path.join(pkgDir, 'package.json');
|
|
67
|
+
if (!fs.existsSync(pkgJsonPath))
|
|
68
|
+
continue;
|
|
69
|
+
console.info(` 📦 @matimo/${pkg}`);
|
|
70
|
+
// Check env vars for auth placeholders
|
|
71
|
+
const toolsDir = path.join(pkgDir, 'tools');
|
|
72
|
+
if (fs.existsSync(toolsDir)) {
|
|
73
|
+
const toolDirs = fs.readdirSync(toolsDir).filter((d) => {
|
|
74
|
+
return fs.existsSync(path.join(toolsDir, d, 'definition.yaml'));
|
|
75
|
+
});
|
|
76
|
+
const missingEnv = [];
|
|
77
|
+
const seenVars = new Set();
|
|
78
|
+
for (const toolName of toolDirs) {
|
|
79
|
+
const yamlPath = path.join(toolsDir, toolName, 'definition.yaml');
|
|
80
|
+
const content = fs.readFileSync(yamlPath, 'utf-8');
|
|
81
|
+
// Scan for {ENV_VAR_NAME} placeholders in headers/URLs
|
|
82
|
+
const placeholderRegex = /\{(\w+)\}/g;
|
|
83
|
+
let match;
|
|
84
|
+
while ((match = placeholderRegex.exec(content)) !== null) {
|
|
85
|
+
const name = match[1];
|
|
86
|
+
if (isAuthVar(name) && !seenVars.has(name)) {
|
|
87
|
+
seenVars.add(name);
|
|
88
|
+
if (!process.env[name]) {
|
|
89
|
+
missingEnv.push(name);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (missingEnv.length > 0) {
|
|
95
|
+
issues.push({
|
|
96
|
+
severity: 'error',
|
|
97
|
+
message: `@matimo/${pkg}: missing env vars: ${missingEnv.join(', ')}`,
|
|
98
|
+
});
|
|
99
|
+
for (const v of missingEnv) {
|
|
100
|
+
console.info(` ❌ Missing env var: ${v}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.info(` ✅ All required env vars are set`);
|
|
105
|
+
}
|
|
106
|
+
// Validate YAML schemas
|
|
107
|
+
let yamlErrors = 0;
|
|
108
|
+
const validateToolDefinition = await loadMatimoCoreExport('validateToolDefinition');
|
|
109
|
+
if (validateToolDefinition) {
|
|
110
|
+
const yaml = await import('js-yaml');
|
|
111
|
+
for (const toolName of toolDirs) {
|
|
112
|
+
const yamlPath = path.join(toolsDir, toolName, 'definition.yaml');
|
|
113
|
+
try {
|
|
114
|
+
const parsed = yaml.load(fs.readFileSync(yamlPath, 'utf-8'));
|
|
115
|
+
validateToolDefinition(parsed);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
yamlErrors++;
|
|
119
|
+
issues.push({
|
|
120
|
+
severity: 'error',
|
|
121
|
+
message: `@matimo/${pkg}/${toolName}: YAML invalid — ${err.message}`,
|
|
122
|
+
});
|
|
123
|
+
console.info(` ❌ ${toolName}: invalid YAML`);
|
|
124
|
+
console.info(` ${err.message.split('\n')[0]}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (yamlErrors === 0 && toolDirs.length > 0) {
|
|
128
|
+
console.info(` ✅ ${toolDirs.length} tool YAML(s) valid`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
console.info('');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// ─── 3. MATIMO_APPROVAL_SECRET ─────────────────────────────────────────
|
|
138
|
+
console.info('Policy / Approval:');
|
|
139
|
+
const hasApprovalSecret = !!process.env.MATIMO_APPROVAL_SECRET;
|
|
140
|
+
check('MATIMO_APPROVAL_SECRET', hasApprovalSecret, 'MATIMO_APPROVAL_SECRET is not set. Agent-created tool approvals will use a random secret (not persistent across restarts). Set it in your .env file.', 'warn');
|
|
141
|
+
console.info('');
|
|
142
|
+
// ─── 4. Summary ────────────────────────────────────────────────────────
|
|
143
|
+
const errors = issues.filter((i) => i.severity === 'error');
|
|
144
|
+
const warnings = issues.filter((i) => i.severity === 'warn');
|
|
145
|
+
console.info('─'.repeat(60));
|
|
146
|
+
if (errors.length === 0 && warnings.length === 0) {
|
|
147
|
+
console.info('\n✅ Matimo is ready! No issues found.\n');
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
if (errors.length > 0) {
|
|
151
|
+
console.info(`\n❌ ${errors.length} error(s) found — fix before using Matimo:\n`);
|
|
152
|
+
errors.forEach((e, i) => console.info(` ${i + 1}. ${e.message}`));
|
|
153
|
+
console.info('');
|
|
154
|
+
}
|
|
155
|
+
if (warnings.length > 0) {
|
|
156
|
+
console.info(`⚠️ ${warnings.length} warning(s):\n`);
|
|
157
|
+
warnings.forEach((w, i) => console.info(` ${i + 1}. ${w.message}`));
|
|
158
|
+
console.info('');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (errors.length > 0)
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
/** Heuristic: is this placeholder likely an auth/secret env var? */
|
|
165
|
+
function isAuthVar(name) {
|
|
166
|
+
const upper = name.toUpperCase();
|
|
167
|
+
return (upper.includes('TOKEN') ||
|
|
168
|
+
upper.includes('SECRET') ||
|
|
169
|
+
upper.includes('KEY') ||
|
|
170
|
+
upper.includes('PASSWORD') ||
|
|
171
|
+
upper.includes('CREDENTIAL') ||
|
|
172
|
+
upper.includes('AUTH'));
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: matimo mcp setup
|
|
3
|
+
*
|
|
4
|
+
* Interactive config generator for MCP server.
|
|
5
|
+
* Detects installed tools, scans for required auth env vars,
|
|
6
|
+
* and outputs a ready-to-paste Claude Desktop / Cursor config.
|
|
7
|
+
*/
|
|
8
|
+
export declare function mcpSetupCommand(): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=mcp-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-setup.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-setup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAiHrD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: matimo mcp setup
|
|
3
|
+
*
|
|
4
|
+
* Interactive config generator for MCP server.
|
|
5
|
+
* Detects installed tools, scans for required auth env vars,
|
|
6
|
+
* and outputs a ready-to-paste Claude Desktop / Cursor config.
|
|
7
|
+
*/
|
|
8
|
+
export async function mcpSetupCommand() {
|
|
9
|
+
console.info('\n🔨 Matimo MCP Setup\n');
|
|
10
|
+
console.info('Scanning for installed tool packages...\n');
|
|
11
|
+
try {
|
|
12
|
+
// @ts-ignore - dynamic import of package resolved at runtime
|
|
13
|
+
const { ToolLoader, extractAuthPlaceholders } = await import('@matimo/core');
|
|
14
|
+
const loader = new ToolLoader();
|
|
15
|
+
// Auto-discover installed packages
|
|
16
|
+
const toolPaths = loader.autoDiscoverPackages();
|
|
17
|
+
if (toolPaths.length === 0) {
|
|
18
|
+
console.info('No @matimo/* tool packages found.');
|
|
19
|
+
console.info('Install tools first: matimo install slack github\n');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Load all tools
|
|
23
|
+
const tools = loader.loadToolsFromMultiplePaths(toolPaths);
|
|
24
|
+
console.info(`Found ${tools.size} tools across ${toolPaths.length} package(s):\n`);
|
|
25
|
+
// Group tools by provider (extract from tool name prefix)
|
|
26
|
+
const providers = new Map();
|
|
27
|
+
const authVars = new Set();
|
|
28
|
+
for (const [name, tool] of tools) {
|
|
29
|
+
// Extract provider from tool name (e.g., "slack_send" → "slack")
|
|
30
|
+
const provider = name.includes('_')
|
|
31
|
+
? name.split('_')[0]
|
|
32
|
+
: name.includes('-')
|
|
33
|
+
? name.split('-')[0]
|
|
34
|
+
: 'core';
|
|
35
|
+
if (!providers.has(provider)) {
|
|
36
|
+
providers.set(provider, []);
|
|
37
|
+
}
|
|
38
|
+
providers.get(provider).push(name);
|
|
39
|
+
// Extract auth placeholders
|
|
40
|
+
const placeholders = extractAuthPlaceholders(tool);
|
|
41
|
+
for (const p of placeholders) {
|
|
42
|
+
authVars.add(p);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Display providers and tools
|
|
46
|
+
for (const [provider, toolNames] of providers) {
|
|
47
|
+
console.info(` 📦 ${provider} (${toolNames.length} tools)`);
|
|
48
|
+
for (const name of toolNames.slice(0, 5)) {
|
|
49
|
+
console.info(` • ${name}`);
|
|
50
|
+
}
|
|
51
|
+
if (toolNames.length > 5) {
|
|
52
|
+
console.info(` ... and ${toolNames.length - 5} more`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
console.info('');
|
|
56
|
+
// Display required env vars
|
|
57
|
+
if (authVars.size > 0) {
|
|
58
|
+
console.info('🔐 Required environment variables:\n');
|
|
59
|
+
for (const v of authVars) {
|
|
60
|
+
const value = process.env[v] || process.env[`MATIMO_${v}`];
|
|
61
|
+
const status = value ? '✅' : '❌';
|
|
62
|
+
console.info(` ${status} ${v}`);
|
|
63
|
+
}
|
|
64
|
+
console.info('');
|
|
65
|
+
}
|
|
66
|
+
// Generate Claude Desktop config
|
|
67
|
+
const envBlock = {};
|
|
68
|
+
for (const v of authVars) {
|
|
69
|
+
envBlock[v] = process.env[v] || process.env[`MATIMO_${v}`] || '<your-token>';
|
|
70
|
+
}
|
|
71
|
+
const claudeConfig = {
|
|
72
|
+
mcpServers: {
|
|
73
|
+
matimo: {
|
|
74
|
+
command: 'npx',
|
|
75
|
+
args: ['matimo', 'mcp'],
|
|
76
|
+
env: envBlock,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
console.info('📋 Claude Desktop config (paste into Settings → Developer → MCP Servers):\n');
|
|
81
|
+
console.info(JSON.stringify(claudeConfig, null, 2));
|
|
82
|
+
// Generate Cursor config
|
|
83
|
+
console.info('\n📋 Cursor config (paste into .cursor/mcp.json):\n');
|
|
84
|
+
const cursorConfig = {
|
|
85
|
+
mcpServers: {
|
|
86
|
+
matimo: {
|
|
87
|
+
command: 'npx',
|
|
88
|
+
args: ['matimo', 'mcp'],
|
|
89
|
+
env: envBlock,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
console.info(JSON.stringify(cursorConfig, null, 2));
|
|
94
|
+
// HTTP mode example
|
|
95
|
+
console.info('\n📋 HTTP mode (for remote hosting / Docker):\n');
|
|
96
|
+
const envExport = [...authVars].map((v) => ` ${v}=<your-token>`).join(' \\\n');
|
|
97
|
+
console.info(` ${envExport} \\`);
|
|
98
|
+
console.info(` MATIMO_MCP_TOKEN=<your-server-secret> \\`);
|
|
99
|
+
console.info(` npx matimo mcp --transport http --port 3000\n`);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error('❌ Setup failed:', error instanceof Error ? error.message : String(error));
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=mcp-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-setup.js","sourceRoot":"","sources":["../../src/commands/mcp-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: matimo mcp
|
|
3
|
+
*
|
|
4
|
+
* Starts the Matimo MCP server with configurable transport and options.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* matimo mcp # stdio mode (default)
|
|
8
|
+
* matimo mcp --transport http --port 3000 # HTTP mode
|
|
9
|
+
* matimo mcp --tools slack,github # only these tools
|
|
10
|
+
* matimo mcp --exclude postgres # exclude these tools
|
|
11
|
+
* matimo mcp --secrets env,vault # secret resolver chain
|
|
12
|
+
* matimo mcp --token my-secret # HTTP bearer token
|
|
13
|
+
* matimo mcp --tool-paths /path/to/tools # custom tool paths
|
|
14
|
+
* matimo mcp --skill-paths /path/to/skills # custom skill paths
|
|
15
|
+
*/
|
|
16
|
+
export declare function mcpCommand(params: string[]): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA8KH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FhE"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: matimo mcp
|
|
3
|
+
*
|
|
4
|
+
* Starts the Matimo MCP server with configurable transport and options.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* matimo mcp # stdio mode (default)
|
|
8
|
+
* matimo mcp --transport http --port 3000 # HTTP mode
|
|
9
|
+
* matimo mcp --tools slack,github # only these tools
|
|
10
|
+
* matimo mcp --exclude postgres # exclude these tools
|
|
11
|
+
* matimo mcp --secrets env,vault # secret resolver chain
|
|
12
|
+
* matimo mcp --token my-secret # HTTP bearer token
|
|
13
|
+
* matimo mcp --tool-paths /path/to/tools # custom tool paths
|
|
14
|
+
* matimo mcp --skill-paths /path/to/skills # custom skill paths
|
|
15
|
+
*/
|
|
16
|
+
function parseArgs(params) {
|
|
17
|
+
const args = {
|
|
18
|
+
transport: 'stdio',
|
|
19
|
+
port: 3000,
|
|
20
|
+
};
|
|
21
|
+
/** Assert that a value-consuming flag was given an argument, not another flag or end-of-input. */
|
|
22
|
+
const requireValue = (flag, value) => {
|
|
23
|
+
if (!value || value.startsWith('-')) {
|
|
24
|
+
console.error(`❌ ${flag} requires a value`);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
};
|
|
29
|
+
for (let i = 0; i < params.length; i++) {
|
|
30
|
+
const flag = params[i];
|
|
31
|
+
const next = params[i + 1];
|
|
32
|
+
switch (flag) {
|
|
33
|
+
case '--transport':
|
|
34
|
+
case '-t':
|
|
35
|
+
if (next === 'stdio' || next === 'http') {
|
|
36
|
+
args.transport = next;
|
|
37
|
+
i++;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.error('❌ --transport must be "stdio" or "http"');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
case '--port':
|
|
45
|
+
case '-p':
|
|
46
|
+
args.port = parseInt(next, 10);
|
|
47
|
+
if (isNaN(args.port)) {
|
|
48
|
+
console.error('❌ --port must be a number');
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
i++;
|
|
52
|
+
break;
|
|
53
|
+
case '--tools':
|
|
54
|
+
args.tools = requireValue('--tools', next)
|
|
55
|
+
.split(',')
|
|
56
|
+
.map((s) => s.trim());
|
|
57
|
+
i++;
|
|
58
|
+
break;
|
|
59
|
+
case '--exclude':
|
|
60
|
+
args.excludeTools = requireValue('--exclude', next)
|
|
61
|
+
.split(',')
|
|
62
|
+
.map((s) => s.trim());
|
|
63
|
+
i++;
|
|
64
|
+
break;
|
|
65
|
+
case '--secrets':
|
|
66
|
+
args.secrets = requireValue('--secrets', next)
|
|
67
|
+
.split(',')
|
|
68
|
+
.map((s) => s.trim());
|
|
69
|
+
i++;
|
|
70
|
+
break;
|
|
71
|
+
case '--env-file':
|
|
72
|
+
args.envFile = requireValue('--env-file', next);
|
|
73
|
+
i++;
|
|
74
|
+
break;
|
|
75
|
+
case '--vault-path':
|
|
76
|
+
args.vaultPath = requireValue('--vault-path', next);
|
|
77
|
+
i++;
|
|
78
|
+
break;
|
|
79
|
+
case '--aws-secret-id':
|
|
80
|
+
args.awsSecretId = requireValue('--aws-secret-id', next);
|
|
81
|
+
i++;
|
|
82
|
+
break;
|
|
83
|
+
case '--token':
|
|
84
|
+
args.token = requireValue('--token', next);
|
|
85
|
+
i++;
|
|
86
|
+
break;
|
|
87
|
+
case '--tool-paths':
|
|
88
|
+
args.toolPaths = requireValue('--tool-paths', next)
|
|
89
|
+
.split(',')
|
|
90
|
+
.map((s) => s.trim());
|
|
91
|
+
i++;
|
|
92
|
+
break;
|
|
93
|
+
case '--skill-paths':
|
|
94
|
+
args.skillPaths = requireValue('--skill-paths', next)
|
|
95
|
+
.split(',')
|
|
96
|
+
.map((s) => s.trim());
|
|
97
|
+
i++;
|
|
98
|
+
break;
|
|
99
|
+
case '--https':
|
|
100
|
+
args.https = true;
|
|
101
|
+
break;
|
|
102
|
+
case '--self-signed':
|
|
103
|
+
args.https = true;
|
|
104
|
+
args.selfSigned = true;
|
|
105
|
+
break;
|
|
106
|
+
case '--cert':
|
|
107
|
+
args.certPath = requireValue('--cert', next);
|
|
108
|
+
args.https = true;
|
|
109
|
+
i++;
|
|
110
|
+
break;
|
|
111
|
+
case '--key':
|
|
112
|
+
args.keyPath = requireValue('--key', next);
|
|
113
|
+
args.https = true;
|
|
114
|
+
i++;
|
|
115
|
+
break;
|
|
116
|
+
case 'setup':
|
|
117
|
+
// Handled separately in cli.ts
|
|
118
|
+
break;
|
|
119
|
+
default:
|
|
120
|
+
if (flag.startsWith('-')) {
|
|
121
|
+
console.error(`❌ Unknown flag: ${flag}`);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return args;
|
|
127
|
+
}
|
|
128
|
+
function buildResolverConfig(args) {
|
|
129
|
+
const secretTypes = args.secrets ?? ['env', 'dotenv'];
|
|
130
|
+
const resolvers = secretTypes.map((type) => {
|
|
131
|
+
switch (type) {
|
|
132
|
+
case 'env':
|
|
133
|
+
return { type: 'env' };
|
|
134
|
+
case 'dotenv':
|
|
135
|
+
return { type: 'dotenv', path: args.envFile };
|
|
136
|
+
case 'vault':
|
|
137
|
+
return { type: 'vault', secretPath: args.vaultPath };
|
|
138
|
+
case 'aws':
|
|
139
|
+
return { type: 'aws', secretId: args.awsSecretId };
|
|
140
|
+
default:
|
|
141
|
+
console.error(`❌ Unknown secret resolver: ${type}. Use: env, dotenv, vault, aws`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
return { resolvers };
|
|
146
|
+
}
|
|
147
|
+
export async function mcpCommand(params) {
|
|
148
|
+
// Check for 'setup' subcommand
|
|
149
|
+
if (params[0] === 'setup') {
|
|
150
|
+
const { mcpSetupCommand } = await import('./mcp-setup.js');
|
|
151
|
+
await mcpSetupCommand();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const args = parseArgs(params);
|
|
155
|
+
// Lazy-import core MCP server
|
|
156
|
+
// @ts-ignore - dynamic import of package resolved at runtime
|
|
157
|
+
const { MCPServer } = await import('@matimo/core');
|
|
158
|
+
const server = new MCPServer({
|
|
159
|
+
transport: args.transport,
|
|
160
|
+
port: args.port,
|
|
161
|
+
tools: args.tools,
|
|
162
|
+
excludeTools: args.excludeTools,
|
|
163
|
+
secretResolver: buildResolverConfig(args),
|
|
164
|
+
mcpToken: args.token,
|
|
165
|
+
toolPaths: args.toolPaths,
|
|
166
|
+
skillPaths: args.skillPaths,
|
|
167
|
+
autoDiscover: true,
|
|
168
|
+
https: args.https,
|
|
169
|
+
selfSigned: args.selfSigned,
|
|
170
|
+
certPath: args.certPath,
|
|
171
|
+
keyPath: args.keyPath,
|
|
172
|
+
});
|
|
173
|
+
// Graceful shutdown
|
|
174
|
+
const shutdown = async () => {
|
|
175
|
+
// Only log to stderr in stdio mode (stdout is JSON-RPC)
|
|
176
|
+
if (args.transport === 'stdio') {
|
|
177
|
+
process.stderr.write('\nShutting down Matimo MCP server...\n');
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.info('\nShutting down Matimo MCP server...');
|
|
181
|
+
}
|
|
182
|
+
await server.stop();
|
|
183
|
+
process.exit(0);
|
|
184
|
+
};
|
|
185
|
+
process.on('SIGINT', shutdown);
|
|
186
|
+
process.on('SIGTERM', shutdown);
|
|
187
|
+
try {
|
|
188
|
+
await server.start();
|
|
189
|
+
if (args.transport === 'http') {
|
|
190
|
+
const protocol = args.https ? 'https' : 'http';
|
|
191
|
+
const url = `${protocol}://localhost:${args.port}/mcp`;
|
|
192
|
+
const token = server.getActiveToken();
|
|
193
|
+
console.info('');
|
|
194
|
+
console.info(`🚀 Matimo MCP server running at ${url}`);
|
|
195
|
+
if (args.https) {
|
|
196
|
+
if (args.selfSigned || (!args.certPath && !args.keyPath)) {
|
|
197
|
+
console.info('🔒 HTTPS enabled (self-signed certificate)');
|
|
198
|
+
console.info(' ⚠️ Clients may need to disable cert verification for self-signed certs');
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
console.info('🔒 HTTPS enabled');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (token) {
|
|
205
|
+
const isAutoGenerated = !args.token && !process.env.MATIMO_MCP_TOKEN;
|
|
206
|
+
console.info('');
|
|
207
|
+
console.info(`🔐 Bearer Token${isAutoGenerated ? ' (auto-generated)' : ''}:`);
|
|
208
|
+
console.info(` ${token}`);
|
|
209
|
+
console.info('');
|
|
210
|
+
console.info(' Connect your MCP client:');
|
|
211
|
+
console.info(` url: ${url}`);
|
|
212
|
+
console.info(` Authorization: Bearer ${token}`);
|
|
213
|
+
if (isAutoGenerated) {
|
|
214
|
+
console.info('');
|
|
215
|
+
console.info(' To use a fixed token, set MATIMO_MCP_TOKEN or use --token <value>');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
console.info('');
|
|
219
|
+
console.info(' Press Ctrl+C to stop');
|
|
220
|
+
console.info('');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
console.error('❌ Failed to start MCP server:', error instanceof Error ? error.message : String(error));
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `matimo review` — Human oversight for agent-created tools.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* matimo review list Show all tools awaiting approval
|
|
6
|
+
* matimo review approve <name> Approve a pending tool (requires MATIMO_APPROVAL_SECRET)
|
|
7
|
+
* matimo review reject <name> Reject / revoke a tool's approval
|
|
8
|
+
*/
|
|
9
|
+
export declare function reviewCommand(args: string[]): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA+LH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBjE"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `matimo review` — Human oversight for agent-created tools.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* matimo review list Show all tools awaiting approval
|
|
6
|
+
* matimo review approve <name> Approve a pending tool (requires MATIMO_APPROVAL_SECRET)
|
|
7
|
+
* matimo review reject <name> Reject / revoke a tool's approval
|
|
8
|
+
*/
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import * as YAML from 'yaml';
|
|
11
|
+
function resolveManifestDir() {
|
|
12
|
+
// Look for the approvals file in cwd or the MATIMO_TOOL_DIR env var.
|
|
13
|
+
const toolDir = process.env.MATIMO_TOOL_DIR;
|
|
14
|
+
return toolDir ? path.resolve(toolDir) : process.cwd();
|
|
15
|
+
}
|
|
16
|
+
/** Try to import @matimo/core and return ApprovalManifest, or null if unavailable. */
|
|
17
|
+
async function tryLoadManifest(dir) {
|
|
18
|
+
try {
|
|
19
|
+
// Dynamic import works in both ESM (built CLI) and CJS (ts-jest test transform)
|
|
20
|
+
const core = (await import('@matimo/core'));
|
|
21
|
+
const ApprovalManifest = core['ApprovalManifest'];
|
|
22
|
+
return new ApprovalManifest(dir);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function printTable(headers, rows) {
|
|
29
|
+
const cols = headers.length;
|
|
30
|
+
const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)));
|
|
31
|
+
const divider = widths.map((w) => '─'.repeat(w + 2)).join('┼');
|
|
32
|
+
const fmt = (row) => '│ ' + row.map((cell, idx) => cell.padEnd(widths[idx])).join(' │ ') + ' │';
|
|
33
|
+
console.info('┌' + widths.map((w) => '─'.repeat(w + 2)).join('┬') + '┐');
|
|
34
|
+
console.info(fmt(headers));
|
|
35
|
+
console.info('├' + divider + '┤');
|
|
36
|
+
for (const row of rows) {
|
|
37
|
+
console.info(fmt(row.map((c) => c ?? '').slice(0, cols)));
|
|
38
|
+
}
|
|
39
|
+
console.info('└' + widths.map((w) => '─'.repeat(w + 2)).join('┴') + '┘');
|
|
40
|
+
}
|
|
41
|
+
async function listPending(dir) {
|
|
42
|
+
const manifest = await tryLoadManifest(dir);
|
|
43
|
+
if (!manifest) {
|
|
44
|
+
console.error('❌ @matimo/core is not available. Run `pnpm install` first.');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
const pending = manifest.getPendingTools();
|
|
48
|
+
const approved = manifest.listApproved();
|
|
49
|
+
if (pending.length === 0 && approved.length === 0) {
|
|
50
|
+
console.info('ℹ️ No tools are pending or approved.');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (pending.length > 0) {
|
|
54
|
+
console.info('\n⏳ Pending approval:\n');
|
|
55
|
+
const rows = pending.map((name) => [name, 'pending', '—', '—']);
|
|
56
|
+
printTable(['Tool name', 'Status', 'Approved by', 'Approved at'], rows);
|
|
57
|
+
}
|
|
58
|
+
if (approved.length > 0) {
|
|
59
|
+
console.info('\n✅ Approved tools:\n');
|
|
60
|
+
const rows = approved.map((name) => {
|
|
61
|
+
const rec = manifest.getApproval(name);
|
|
62
|
+
return [name, 'approved', rec.approvedBy ?? '—', rec.approvedAt];
|
|
63
|
+
});
|
|
64
|
+
printTable(['Tool name', 'Status', 'Approved by', 'Approved at'], rows);
|
|
65
|
+
}
|
|
66
|
+
if (pending.length > 0) {
|
|
67
|
+
console.info(`\nRun "matimo review approve <tool-name>" to approve, or "matimo review reject <tool-name>" to reject.`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function approveTool(toolName, dir) {
|
|
71
|
+
if (!toolName) {
|
|
72
|
+
console.error('❌ Usage: matimo review approve <tool-name>');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
const manifest = await tryLoadManifest(dir);
|
|
76
|
+
if (!manifest) {
|
|
77
|
+
console.error('❌ @matimo/core is not available. Run `pnpm install` first.');
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
const pending = manifest.getPendingTools();
|
|
81
|
+
if (!pending.includes(toolName)) {
|
|
82
|
+
const approved = manifest.listApproved();
|
|
83
|
+
if (approved.includes(toolName)) {
|
|
84
|
+
console.info(`ℹ️ "${toolName}" is already approved.`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.error(`❌ No pending tool named "${toolName}". Run "matimo review list" to see pending tools.`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
// Require a human-set approval secret — not the auto-generated one
|
|
91
|
+
const secret = process.env.MATIMO_APPROVAL_SECRET;
|
|
92
|
+
if (!secret) {
|
|
93
|
+
console.error('❌ MATIMO_APPROVAL_SECRET is not set.\n' +
|
|
94
|
+
' Set it to approve tools: export MATIMO_APPROVAL_SECRET=<your-secret>');
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
// Find the definition YAML to hash it
|
|
98
|
+
const fs = await import('fs');
|
|
99
|
+
const toolDir = path.join(dir, toolName);
|
|
100
|
+
const yamlPath = path.join(toolDir, 'definition.yaml');
|
|
101
|
+
if (!fs.existsSync(yamlPath)) {
|
|
102
|
+
console.error(`❌ Cannot find definition.yaml for tool "${toolName}" at:\n ${yamlPath}`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
const originalYamlContent = fs.readFileSync(yamlPath, 'utf-8');
|
|
106
|
+
let finalYamlContent = originalYamlContent;
|
|
107
|
+
// Promote status in definition.yaml to "approved" so runtime policy sees the approval.
|
|
108
|
+
try {
|
|
109
|
+
const parsed = YAML.parse(originalYamlContent) ?? {};
|
|
110
|
+
if (parsed && typeof parsed === 'object') {
|
|
111
|
+
const currentStatus = parsed.status;
|
|
112
|
+
if (currentStatus !== 'approved') {
|
|
113
|
+
parsed.status = 'approved';
|
|
114
|
+
finalYamlContent = YAML.stringify(parsed);
|
|
115
|
+
// Write atomically using tmp + rename pattern
|
|
116
|
+
const tmpPath = yamlPath + '.tmp';
|
|
117
|
+
fs.writeFileSync(tmpPath, finalYamlContent, 'utf-8');
|
|
118
|
+
fs.renameSync(tmpPath, yamlPath);
|
|
119
|
+
console.info(` 📝 Updated status: draft → approved in definition.yaml`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
console.warn('⚠️ Failed to update status in definition.yaml; proceeding with manifest approval only.');
|
|
125
|
+
}
|
|
126
|
+
const hash = manifest.computeHash(finalYamlContent);
|
|
127
|
+
const approvedBy = process.env.USER ?? process.env.USERNAME ?? 'cli';
|
|
128
|
+
manifest.approve(toolName, hash, approvedBy);
|
|
129
|
+
console.info(`✅ Tool "${toolName}" approved.`);
|
|
130
|
+
}
|
|
131
|
+
async function rejectTool(toolName, dir) {
|
|
132
|
+
if (!toolName) {
|
|
133
|
+
console.error('❌ Usage: matimo review reject <tool-name>');
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
const manifest = await tryLoadManifest(dir);
|
|
137
|
+
if (!manifest) {
|
|
138
|
+
console.error('❌ @matimo/core is not available. Run `pnpm install` first.');
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
const wasApproved = manifest.revoke(toolName);
|
|
142
|
+
// Remove from pending even if it wasn't in approved set
|
|
143
|
+
// (revoke only removes from approved; pending is cleaned up on next loadFromDisk)
|
|
144
|
+
// Re-save by marking and un-marking is not clean — just confirm action
|
|
145
|
+
const pending = manifest.getPendingTools();
|
|
146
|
+
const wasPending = pending.includes(toolName);
|
|
147
|
+
if (!wasApproved && !wasPending) {
|
|
148
|
+
console.info(`ℹ️ No record of tool "${toolName}". Nothing to reject.`);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
console.info(`🗑 Tool "${toolName}" has been rejected/revoked.`);
|
|
152
|
+
if (wasApproved) {
|
|
153
|
+
console.info(' (Approval signature removed — the tool will be blocked until re-approved.)');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
export async function reviewCommand(args) {
|
|
157
|
+
const sub = args[0];
|
|
158
|
+
const dir = resolveManifestDir();
|
|
159
|
+
switch (sub) {
|
|
160
|
+
case 'list':
|
|
161
|
+
case undefined:
|
|
162
|
+
await listPending(dir);
|
|
163
|
+
break;
|
|
164
|
+
case 'approve':
|
|
165
|
+
await approveTool(args[1], dir);
|
|
166
|
+
break;
|
|
167
|
+
case 'reject':
|
|
168
|
+
await rejectTool(args[1], dir);
|
|
169
|
+
break;
|
|
170
|
+
default:
|
|
171
|
+
console.error(`❌ Unknown review subcommand: "${sub}"`);
|
|
172
|
+
console.info('Usage: matimo review [list|approve|reject] [tool-name]');
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,28 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matimo/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "CLI tools for managing Matimo tool installations",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
9
|
-
"matimo": "bin
|
|
9
|
+
"matimo": "dist/bin.js"
|
|
10
10
|
},
|
|
11
11
|
"files": [
|
|
12
|
-
"bin",
|
|
13
12
|
"dist",
|
|
14
13
|
"README.md"
|
|
15
14
|
],
|
|
16
15
|
"dependencies": {
|
|
17
|
-
"
|
|
16
|
+
"tsx": "^4.21.0",
|
|
17
|
+
"@matimo/core": "0.1.2"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@types/node": "^25.1.0",
|
|
21
|
-
"typescript": "^5.9.3"
|
|
22
|
-
"tsx": "^4.21.0"
|
|
21
|
+
"typescript": "^5.9.3"
|
|
23
22
|
},
|
|
24
23
|
"peerDependencies": {
|
|
25
|
-
"matimo": "0.1.
|
|
24
|
+
"matimo": "0.1.2"
|
|
26
25
|
},
|
|
27
26
|
"scripts": {
|
|
28
27
|
"build": "tsc",
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 tallclub
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
package/bin/matimo.cjs
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// Simple CommonJS entry point - avoids ESM/test issues
|
|
4
|
-
const path = require('path');
|
|
5
|
-
|
|
6
|
-
// Check for version flag
|
|
7
|
-
const versionFlags = ['-v', '-V', '--version'];
|
|
8
|
-
if (versionFlags.includes(process.argv[process.argv.length - 1])) {
|
|
9
|
-
try {
|
|
10
|
-
const pkg = require(path.join(__dirname, '../package.json'));
|
|
11
|
-
console.log(`matimo-cli v${pkg.version}`);
|
|
12
|
-
process.exit(0);
|
|
13
|
-
} catch {
|
|
14
|
-
console.log('matimo-cli v unknown');
|
|
15
|
-
process.exit(0);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Import and run the ESM main function
|
|
20
|
-
(async () => {
|
|
21
|
-
const { main } = await import(path.join(__dirname, '../dist/cli.js'));
|
|
22
|
-
await main();
|
|
23
|
-
})().catch((error) => {
|
|
24
|
-
console.error('❌ Fatal error:', error);
|
|
25
|
-
process.exit(1);
|
|
26
|
-
});
|