@mandible-ai/mandible 0.3.9 → 0.3.10
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/src/hosts/docker.d.ts +5 -0
- package/dist/src/hosts/docker.d.ts.map +1 -1
- package/dist/src/hosts/docker.js +37 -0
- package/dist/src/hosts/docker.js.map +1 -1
- package/package.json +1 -1
- package/dist/examples/code-pipeline/colonies.d.ts +0 -10
- package/dist/examples/code-pipeline/colonies.d.ts.map +0 -1
- package/dist/examples/code-pipeline/colonies.js +0 -112
- package/dist/examples/code-pipeline/colonies.js.map +0 -1
- package/dist/examples/code-pipeline/docker.d.ts +0 -3
- package/dist/examples/code-pipeline/docker.d.ts.map +0 -1
- package/dist/examples/code-pipeline/docker.js +0 -63
- package/dist/examples/code-pipeline/docker.js.map +0 -1
- package/dist/examples/code-pipeline/index.d.ts +0 -3
- package/dist/examples/code-pipeline/index.d.ts.map +0 -1
- package/dist/examples/code-pipeline/index.js +0 -45
- package/dist/examples/code-pipeline/index.js.map +0 -1
- package/dist/examples/code-pipeline/with-providers.d.ts +0 -3
- package/dist/examples/code-pipeline/with-providers.d.ts.map +0 -1
- package/dist/examples/code-pipeline/with-providers.js +0 -190
- package/dist/examples/code-pipeline/with-providers.js.map +0 -1
- package/dist/examples/github-colony/mandible.config.d.ts +0 -2
- package/dist/examples/github-colony/mandible.config.d.ts.map +0 -1
- package/dist/examples/github-colony/mandible.config.js +0 -55
- package/dist/examples/github-colony/mandible.config.js.map +0 -1
- package/dist/examples/repo-maintenance/fixer.d.ts +0 -87
- package/dist/examples/repo-maintenance/fixer.d.ts.map +0 -1
- package/dist/examples/repo-maintenance/fixer.js +0 -224
- package/dist/examples/repo-maintenance/fixer.js.map +0 -1
- package/dist/examples/repo-maintenance/mandible.config.d.ts +0 -2
- package/dist/examples/repo-maintenance/mandible.config.d.ts.map +0 -1
- package/dist/examples/repo-maintenance/mandible.config.js +0 -34
- package/dist/examples/repo-maintenance/mandible.config.js.map +0 -1
- package/dist/examples/repo-maintenance/scout.d.ts +0 -46
- package/dist/examples/repo-maintenance/scout.d.ts.map +0 -1
- package/dist/examples/repo-maintenance/scout.js +0 -170
- package/dist/examples/repo-maintenance/scout.js.map +0 -1
- package/dist/examples/repo-maintenance/seed.d.ts +0 -3
- package/dist/examples/repo-maintenance/seed.d.ts.map +0 -1
- package/dist/examples/repo-maintenance/seed.js +0 -151
- package/dist/examples/repo-maintenance/seed.js.map +0 -1
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
// PURPOSE: Scout colony — scans a repository for issues using a Claude agent.
|
|
2
|
-
// PURPOSE: Deposits one `issue:detected` signal per issue found, plus a `scan:completed` summary.
|
|
3
|
-
import { withClaudeCode } from '../../src/providers/claude-code.js';
|
|
4
|
-
// ----------------------------------------------------------
|
|
5
|
-
// Scout colony configurator
|
|
6
|
-
// ----------------------------------------------------------
|
|
7
|
-
/**
|
|
8
|
-
* Returns a colony configurator for use with the mandible() DSL.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* await mandible('repo-maintenance')
|
|
12
|
-
* .environment(env)
|
|
13
|
-
* .colony('scout', configureScout(repoRoot))
|
|
14
|
-
* .start();
|
|
15
|
-
*/
|
|
16
|
-
export function configureScout(repoRoot, options = {}) {
|
|
17
|
-
const { senseTypes = 'scan:trigger', model = 'claude-sonnet-4-5-20250929', maxBudgetUsd = 0.50, maxTurns = 50, allowedTools = ['Read', 'Glob', 'Grep', 'Bash'], disallowedTools = ['Edit', 'Write'], bedrock, } = options;
|
|
18
|
-
const types = Array.isArray(senseTypes) ? senseTypes : [senseTypes];
|
|
19
|
-
return (c) => {
|
|
20
|
-
for (const t of types) {
|
|
21
|
-
c = c.sense(t, { unclaimed: true });
|
|
22
|
-
}
|
|
23
|
-
return c
|
|
24
|
-
.do('scan-repo', withClaudeCode({
|
|
25
|
-
model,
|
|
26
|
-
systemPrompt: [
|
|
27
|
-
'You are a Scout agent in a repo-maintenance colony.',
|
|
28
|
-
'Your job is to scan a repository and identify issues.',
|
|
29
|
-
'',
|
|
30
|
-
'Categories to check:',
|
|
31
|
-
'- dependency: outdated or vulnerable dependencies',
|
|
32
|
-
'- dead-code: unused exports, unreachable code, unused files',
|
|
33
|
-
'- test-coverage: untested code paths, missing edge cases',
|
|
34
|
-
'- security: potential vulnerabilities (injection, secrets, etc.)',
|
|
35
|
-
'- style: inconsistent formatting, naming, or patterns',
|
|
36
|
-
'- stale-todo: TODO/FIXME/HACK comments that should be addressed',
|
|
37
|
-
'',
|
|
38
|
-
'For each issue found, include:',
|
|
39
|
-
'- category (one of the above)',
|
|
40
|
-
'- severity: low, medium, high, or critical',
|
|
41
|
-
'- title: short one-line summary',
|
|
42
|
-
'- description: what the issue is and why it matters',
|
|
43
|
-
'- files: which files are affected',
|
|
44
|
-
'- suggested_fix: optional fix suggestion',
|
|
45
|
-
'',
|
|
46
|
-
'IMPORTANT: Output your findings as a JSON array inside a ```json code block.',
|
|
47
|
-
'Each element must match the schema above. Example:',
|
|
48
|
-
'```json',
|
|
49
|
-
'[',
|
|
50
|
-
' {',
|
|
51
|
-
' "category": "stale-todo",',
|
|
52
|
-
' "severity": "low",',
|
|
53
|
-
' "title": "Stale TODO in auth.ts",',
|
|
54
|
-
' "description": "TODO comment from 6 months ago about refactoring auth flow",',
|
|
55
|
-
' "files": ["src/auth.ts"],',
|
|
56
|
-
' "suggested_fix": "Either implement the refactor or remove the TODO"',
|
|
57
|
-
' }',
|
|
58
|
-
']',
|
|
59
|
-
'```',
|
|
60
|
-
'',
|
|
61
|
-
'If no issues are found, output an empty array: ```json\n[]\n```',
|
|
62
|
-
].join('\n'),
|
|
63
|
-
prompt: (signal) => {
|
|
64
|
-
const p = signal.payload;
|
|
65
|
-
const scope = p.scope ?? 'full';
|
|
66
|
-
return [
|
|
67
|
-
`## Repository Scan Request`,
|
|
68
|
-
'',
|
|
69
|
-
`**Scope:** ${scope}`,
|
|
70
|
-
`**Triggered by:** ${p.triggered_by ?? 'manual'}`,
|
|
71
|
-
'',
|
|
72
|
-
'Scan this repository for issues across all categories.',
|
|
73
|
-
'Focus on actionable findings — skip minor style nitpicks unless they indicate a pattern.',
|
|
74
|
-
'Use the Glob, Grep, and Read tools to explore the codebase.',
|
|
75
|
-
'Do NOT modify any files.',
|
|
76
|
-
].join('\n');
|
|
77
|
-
},
|
|
78
|
-
allowedTools,
|
|
79
|
-
disallowedTools,
|
|
80
|
-
workingDirectory: repoRoot,
|
|
81
|
-
maxBudgetUsd,
|
|
82
|
-
maxTurns,
|
|
83
|
-
bedrock,
|
|
84
|
-
output: (result, signal) => {
|
|
85
|
-
const issues = parseScoutOutput(result.text);
|
|
86
|
-
const deposits = [];
|
|
87
|
-
for (const issue of issues) {
|
|
88
|
-
deposits.push({
|
|
89
|
-
type: 'issue:detected',
|
|
90
|
-
payload: issue,
|
|
91
|
-
tags: [issue.category, issue.severity],
|
|
92
|
-
ttl: 60 * 60_000, // 60 min — survive long enough for fixer to work the backlog
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
deposits.push({
|
|
96
|
-
type: 'scan:completed',
|
|
97
|
-
payload: {
|
|
98
|
-
scope: signal.payload.scope ?? 'full',
|
|
99
|
-
issueCount: issues.length,
|
|
100
|
-
costUsd: result.costUsd,
|
|
101
|
-
durationMs: result.durationMs,
|
|
102
|
-
},
|
|
103
|
-
tags: ['summary'],
|
|
104
|
-
});
|
|
105
|
-
return deposits;
|
|
106
|
-
},
|
|
107
|
-
autoWithdraw: true,
|
|
108
|
-
}))
|
|
109
|
-
.concurrency(1)
|
|
110
|
-
.claim('none')
|
|
111
|
-
.poll(3000);
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
// ----------------------------------------------------------
|
|
115
|
-
// Output parser
|
|
116
|
-
// ----------------------------------------------------------
|
|
117
|
-
/**
|
|
118
|
-
* Extracts JSON issue array from the agent's markdown-formatted output.
|
|
119
|
-
* Looks for a ```json code block, parses it, and validates the shape.
|
|
120
|
-
*/
|
|
121
|
-
export function parseScoutOutput(text) {
|
|
122
|
-
if (!text)
|
|
123
|
-
return [];
|
|
124
|
-
// Try to find a JSON code block
|
|
125
|
-
const codeBlockMatch = text.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
|
|
126
|
-
const jsonStr = codeBlockMatch ? codeBlockMatch[1].trim() : text.trim();
|
|
127
|
-
let parsed;
|
|
128
|
-
try {
|
|
129
|
-
parsed = JSON.parse(jsonStr);
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
// If the whole text isn't valid JSON, try to find an array in it
|
|
133
|
-
const arrayMatch = jsonStr.match(/\[[\s\S]*\]/);
|
|
134
|
-
if (arrayMatch) {
|
|
135
|
-
try {
|
|
136
|
-
parsed = JSON.parse(arrayMatch[0]);
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
return [];
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
return [];
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (!Array.isArray(parsed))
|
|
147
|
-
return [];
|
|
148
|
-
// Validate and normalize each issue
|
|
149
|
-
const validCategories = new Set(['dependency', 'dead-code', 'test-coverage', 'security', 'style', 'stale-todo', 'other']);
|
|
150
|
-
const validSeverities = new Set(['low', 'medium', 'high', 'critical']);
|
|
151
|
-
return parsed
|
|
152
|
-
.filter((item) => typeof item === 'object' && item !== null &&
|
|
153
|
-
typeof item.title === 'string' &&
|
|
154
|
-
typeof item.description === 'string')
|
|
155
|
-
.map((item) => ({
|
|
156
|
-
category: validCategories.has(item.category)
|
|
157
|
-
? item.category
|
|
158
|
-
: 'other',
|
|
159
|
-
severity: validSeverities.has(item.severity)
|
|
160
|
-
? item.severity
|
|
161
|
-
: 'medium',
|
|
162
|
-
title: item.title,
|
|
163
|
-
description: item.description,
|
|
164
|
-
files: Array.isArray(item.files)
|
|
165
|
-
? item.files.filter(f => typeof f === 'string')
|
|
166
|
-
: [],
|
|
167
|
-
...(typeof item.suggested_fix === 'string' ? { suggested_fix: item.suggested_fix } : {}),
|
|
168
|
-
}));
|
|
169
|
-
}
|
|
170
|
-
//# sourceMappingURL=scout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout.js","sourceRoot":"","sources":["../../../examples/repo-maintenance/scout.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../examples/repo-maintenance/seed.ts"],"names":[],"mappings":""}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
// PURPOSE: Seed script for Scout + Fixer colonies — deposits a scan:trigger and runs the pipeline.
|
|
3
|
-
// PURPOSE: Usage: npx tsx examples/repo-maintenance/seed.ts [/path/to/repo] [--fix]
|
|
4
|
-
import { resolve } from 'node:path';
|
|
5
|
-
import { rm, mkdir } from 'node:fs/promises';
|
|
6
|
-
import { mandible } from '../../src/dsl/mandible.js';
|
|
7
|
-
import { FilesystemEnvironment } from '../../src/environments/filesystem/index.js';
|
|
8
|
-
import { configureScout } from './scout.js';
|
|
9
|
-
import { configureFixer } from './fixer.js';
|
|
10
|
-
const ENV_ROOT = resolve('/tmp/mandible-repo-maintenance');
|
|
11
|
-
const args = process.argv.slice(2);
|
|
12
|
-
const FIX_MODE = args.includes('--fix');
|
|
13
|
-
const TARGET_REPO = resolve(args.find(a => !a.startsWith('--')) ?? process.cwd());
|
|
14
|
-
async function main() {
|
|
15
|
-
// 1. Set up fresh environment
|
|
16
|
-
await rm(ENV_ROOT, { recursive: true, force: true });
|
|
17
|
-
await mkdir(ENV_ROOT, { recursive: true });
|
|
18
|
-
console.log(`\n${FIX_MODE ? 'Scout + Fixer' : 'Scout'} Colony — Repo Maintenance`);
|
|
19
|
-
console.log(`${'─'.repeat(50)}`);
|
|
20
|
-
console.log(` Environment: ${ENV_ROOT}`);
|
|
21
|
-
console.log(` Target repo: ${TARGET_REPO}`);
|
|
22
|
-
console.log(` Fix mode: ${FIX_MODE ? 'ON' : 'OFF (use --fix to enable)'}`);
|
|
23
|
-
console.log(`${'─'.repeat(50)}\n`);
|
|
24
|
-
const env = new FilesystemEnvironment({ root: ENV_ROOT, name: 'repo-maintenance' });
|
|
25
|
-
// 2. Build and start colonies via mandible DSL
|
|
26
|
-
const builder = mandible('repo-maintenance')
|
|
27
|
-
.environment(env)
|
|
28
|
-
.colony('scout', configureScout(TARGET_REPO));
|
|
29
|
-
if (FIX_MODE) {
|
|
30
|
-
builder.colony('fixer', configureFixer(TARGET_REPO));
|
|
31
|
-
}
|
|
32
|
-
const host = await builder.start();
|
|
33
|
-
console.log(`Started ${host.colonies.length} colony(s) (id: ${host.metadata.id})\n`);
|
|
34
|
-
// 3. Deposit scan trigger
|
|
35
|
-
console.log('Depositing scan:trigger signal...');
|
|
36
|
-
const trigger = await env.deposit({
|
|
37
|
-
type: 'scan:trigger',
|
|
38
|
-
payload: {
|
|
39
|
-
scope: 'full',
|
|
40
|
-
triggered_by: 'seed-script',
|
|
41
|
-
},
|
|
42
|
-
meta: { deposited_by: 'seed' },
|
|
43
|
-
});
|
|
44
|
-
console.log(` -> ${trigger.type} (${trigger.id})\n`);
|
|
45
|
-
// 4. Wait for scan to complete
|
|
46
|
-
const maxWaitMs = 5 * 60_000; // 5 minutes max
|
|
47
|
-
const pollMs = 2_000;
|
|
48
|
-
const deadline = Date.now() + maxWaitMs;
|
|
49
|
-
while (Date.now() < deadline) {
|
|
50
|
-
const signals = await env.observe({ type: 'scan:completed' });
|
|
51
|
-
if (signals.length > 0) {
|
|
52
|
-
console.log('\nScan completed!');
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
55
|
-
// Also check for errors
|
|
56
|
-
const errors = await env.observe({ type: 'scan:error' });
|
|
57
|
-
if (errors.length > 0) {
|
|
58
|
-
console.error('\nScan encountered an error:');
|
|
59
|
-
for (const e of errors) {
|
|
60
|
-
console.error(JSON.stringify(e.payload, null, 2));
|
|
61
|
-
}
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
await sleep(pollMs);
|
|
65
|
-
}
|
|
66
|
-
// 5. Report results
|
|
67
|
-
console.log('\n' + '='.repeat(50));
|
|
68
|
-
console.log(' Results');
|
|
69
|
-
console.log('='.repeat(50) + '\n');
|
|
70
|
-
const issues = await env.observe({ type: 'issue:detected' });
|
|
71
|
-
if (issues.length === 0) {
|
|
72
|
-
console.log(' No issues detected.\n');
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
console.log(` Found ${issues.length} issue(s):\n`);
|
|
76
|
-
for (const issue of issues) {
|
|
77
|
-
const p = issue.payload;
|
|
78
|
-
const severity = String(p.severity ?? 'unknown').toUpperCase();
|
|
79
|
-
console.log(` [${severity}] ${p.title}`);
|
|
80
|
-
console.log(` Category: ${p.category}`);
|
|
81
|
-
console.log(` Files: ${p.files?.join(', ') || 'n/a'}`);
|
|
82
|
-
console.log(` ${p.description}`);
|
|
83
|
-
if (p.suggested_fix)
|
|
84
|
-
console.log(` Fix: ${p.suggested_fix}`);
|
|
85
|
-
console.log('');
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
const summaries = await env.observe({ type: 'scan:completed' });
|
|
89
|
-
if (summaries.length > 0) {
|
|
90
|
-
const summary = summaries[0].payload;
|
|
91
|
-
console.log(` Cost: $${Number(summary.costUsd ?? 0).toFixed(4)}`);
|
|
92
|
-
console.log(` Duration: ${Number(summary.durationMs ?? 0)}ms`);
|
|
93
|
-
console.log(` Issues found: ${summary.issueCount}`);
|
|
94
|
-
}
|
|
95
|
-
// 5b. If fix mode, wait for fixes to complete
|
|
96
|
-
if (FIX_MODE) {
|
|
97
|
-
const issueCount = issues.length;
|
|
98
|
-
if (issueCount > 0) {
|
|
99
|
-
console.log(`\nWaiting for Fixer colony to process ${issueCount} issue(s)...`);
|
|
100
|
-
const fixDeadline = Date.now() + 5 * 60_000;
|
|
101
|
-
while (Date.now() < fixDeadline) {
|
|
102
|
-
const proposed = await env.observe({ type: 'fix:proposed' });
|
|
103
|
-
const failed = await env.observe({ type: 'fix:failed' });
|
|
104
|
-
const total = proposed.length + failed.length;
|
|
105
|
-
if (total >= issueCount)
|
|
106
|
-
break;
|
|
107
|
-
await sleep(pollMs);
|
|
108
|
-
}
|
|
109
|
-
console.log('\n' + '='.repeat(50));
|
|
110
|
-
console.log(' Fix Results');
|
|
111
|
-
console.log('='.repeat(50) + '\n');
|
|
112
|
-
const proposed = await env.observe({ type: 'fix:proposed' });
|
|
113
|
-
for (const fix of proposed) {
|
|
114
|
-
const p = fix.payload;
|
|
115
|
-
const conf = String(p.confidence ?? 'unknown').toUpperCase();
|
|
116
|
-
console.log(` [${conf}] ${p.issue_title}`);
|
|
117
|
-
console.log(` Branch: ${p.branch}`);
|
|
118
|
-
console.log(` Files: ${p.files_changed?.join(', ') || 'n/a'}`);
|
|
119
|
-
console.log(` Tests: ${p.tests_passed ? 'PASS' : 'FAIL'}`);
|
|
120
|
-
console.log(` ${p.diff_summary}`);
|
|
121
|
-
console.log('');
|
|
122
|
-
}
|
|
123
|
-
const failed = await env.observe({ type: 'fix:failed' });
|
|
124
|
-
for (const fix of failed) {
|
|
125
|
-
const p = fix.payload;
|
|
126
|
-
console.log(` [FAILED] ${p.issue_title}`);
|
|
127
|
-
console.log(` Reason: ${p.reason}`);
|
|
128
|
-
if (p.attempted_approach)
|
|
129
|
-
console.log(` Approach: ${p.attempted_approach}`);
|
|
130
|
-
console.log('');
|
|
131
|
-
}
|
|
132
|
-
console.log(` Proposed: ${proposed.length}, Failed: ${failed.length}`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
// 6. Report colony status from host metadata
|
|
136
|
-
console.log('\n Colony status:');
|
|
137
|
-
for (const col of host.colonies) {
|
|
138
|
-
console.log(` ${col.name}: ${col.state}`);
|
|
139
|
-
}
|
|
140
|
-
// 7. Stop
|
|
141
|
-
await host.stop();
|
|
142
|
-
console.log('\nDone.\n');
|
|
143
|
-
}
|
|
144
|
-
function sleep(ms) {
|
|
145
|
-
return new Promise(r => setTimeout(r, ms));
|
|
146
|
-
}
|
|
147
|
-
main().catch((err) => {
|
|
148
|
-
console.error('Fatal error:', err);
|
|
149
|
-
process.exit(1);
|
|
150
|
-
});
|
|
151
|
-
//# sourceMappingURL=seed.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../examples/repo-maintenance/seed.ts"],"names":[],"mappings":"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"}
|