tribunal-kit 4.5.0 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/.shared/ui-ux-pro-max/README.md +4 -4
- package/.agent/ARCHITECTURE.md +279 -277
- package/.agent/GEMINI.md +127 -121
- package/.agent/agents/accessibility-reviewer.md +187 -187
- package/.agent/agents/ai-code-reviewer.md +199 -199
- package/.agent/agents/api-architect.md +71 -66
- package/.agent/agents/backend-specialist.md +219 -215
- package/.agent/agents/cloud-engineer.md +98 -0
- package/.agent/agents/code-archaeologist.md +168 -161
- package/.agent/agents/database-architect.md +184 -184
- package/.agent/agents/db-latency-auditor.md +213 -216
- package/.agent/agents/debugger.md +198 -191
- package/.agent/agents/dependency-reviewer.md +106 -103
- package/.agent/agents/devops-engineer.md +218 -218
- package/.agent/agents/documentation-writer.md +209 -201
- package/.agent/agents/explorer-agent.md +167 -160
- package/.agent/agents/frontend-reviewer.md +162 -160
- package/.agent/agents/frontend-specialist.md +257 -248
- package/.agent/agents/game-developer.md +48 -48
- package/.agent/agents/logic-reviewer.md +118 -116
- package/.agent/agents/mobile-developer.md +197 -200
- package/.agent/agents/mobile-reviewer.md +159 -162
- package/.agent/agents/orchestrator.md +187 -181
- package/.agent/agents/penetration-tester.md +160 -157
- package/.agent/agents/performance-optimizer.md +183 -183
- package/.agent/agents/performance-reviewer.md +178 -178
- package/.agent/agents/precedence-reviewer.md +251 -250
- package/.agent/agents/product-manager.md +149 -142
- package/.agent/agents/product-owner.md +81 -80
- package/.agent/agents/project-planner.md +152 -142
- package/.agent/agents/qa-automation-engineer.md +216 -225
- package/.agent/agents/resilience-reviewer.md +88 -88
- package/.agent/agents/schema-reviewer.md +67 -67
- package/.agent/agents/security-auditor.md +180 -174
- package/.agent/agents/seo-specialist.md +188 -193
- package/.agent/agents/sql-reviewer.md +159 -161
- package/.agent/agents/supervisor-agent.md +173 -184
- package/.agent/agents/swarm-worker-contracts.md +170 -166
- package/.agent/agents/swarm-worker-registry.md +92 -92
- package/.agent/agents/system-architect.md +85 -0
- package/.agent/agents/test-coverage-reviewer.md +158 -160
- package/.agent/agents/test-engineer.md +118 -118
- package/.agent/agents/throughput-optimizer.md +291 -299
- package/.agent/agents/type-safety-reviewer.md +182 -175
- package/.agent/agents/ui-ux-auditor.md +300 -292
- package/.agent/agents/vitals-reviewer.md +223 -223
- package/.agent/mcp_config.json +37 -40
- package/.agent/patterns/generator.md +11 -9
- package/.agent/patterns/inversion.md +14 -12
- package/.agent/patterns/pipeline.md +11 -9
- package/.agent/patterns/reviewer.md +15 -13
- package/.agent/patterns/tool-wrapper.md +11 -9
- package/.agent/routing_index.json +654 -0
- package/.agent/rules/GEMINI.md +358 -352
- package/.agent/scripts/compile_router.py +112 -0
- package/.agent/scripts/migrate_skills_frontmatter.py +64 -0
- package/.agent/scripts/strengthen_skills.js +1 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +56 -0
- package/.agent/skills/agent-organizer/SKILL.md +156 -150
- package/.agent/skills/agentic-patterns/SKILL.md +313 -315
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +190 -184
- package/.agent/skills/api-patterns/SKILL.md +253 -247
- package/.agent/skills/api-security-auditor/SKILL.md +195 -193
- package/.agent/skills/app-builder/SKILL.md +573 -572
- package/.agent/skills/app-builder/templates/SKILL.md +108 -115
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -76
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -92
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -88
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -88
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -83
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -90
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -90
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +126 -122
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +127 -122
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +172 -169
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +139 -134
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -83
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +122 -119
- package/.agent/skills/appflow-wireframe/SKILL.md +146 -145
- package/.agent/skills/architecture/SKILL.md +226 -219
- package/.agent/skills/authentication-best-practices/SKILL.md +197 -189
- package/.agent/skills/backend-security-expert/SKILL.md +16 -2
- package/.agent/skills/bash-linux/SKILL.md +179 -179
- package/.agent/skills/behavioral-modes/SKILL.md +239 -223
- package/.agent/skills/brainstorming/SKILL.md +498 -486
- package/.agent/skills/browser-native-ai/SKILL.md +57 -4
- package/.agent/skills/building-native-ui/SKILL.md +202 -202
- package/.agent/skills/cicd-pro/SKILL.md +442 -0
- package/.agent/skills/clean-code/SKILL.md +400 -381
- package/.agent/skills/cloud-architect/SKILL.md +439 -0
- package/.agent/skills/code-review-checklist/SKILL.md +203 -194
- package/.agent/skills/config-validator/SKILL.md +165 -165
- package/.agent/skills/containerization-pro/SKILL.md +452 -0
- package/.agent/skills/csharp-developer/SKILL.md +518 -518
- package/.agent/skills/data-validation-schemas/SKILL.md +333 -328
- package/.agent/skills/database-design/SKILL.md +247 -240
- package/.agent/skills/deployment-procedures/SKILL.md +172 -169
- package/.agent/skills/devops-engineer/SKILL.md +345 -345
- package/.agent/skills/devops-incident-responder/SKILL.md +143 -137
- package/.agent/skills/doc.md +209 -177
- package/.agent/skills/documentation-templates/SKILL.md +291 -279
- package/.agent/skills/edge-computing/SKILL.md +183 -181
- package/.agent/skills/error-resilience/SKILL.md +411 -428
- package/.agent/skills/extract-design-system/SKILL.md +160 -158
- package/.agent/skills/framer-motion-expert/SKILL.md +253 -244
- package/.agent/skills/frontend-design/SKILL.md +208 -201
- package/.agent/skills/frontend-security-expert/SKILL.md +16 -3
- package/.agent/skills/game-design-expert/SKILL.md +132 -129
- package/.agent/skills/game-engineering-expert/SKILL.md +148 -146
- package/.agent/skills/generative-ui-expert/SKILL.md +57 -1
- package/.agent/skills/geo-fundamentals/SKILL.md +148 -147
- package/.agent/skills/git-pro/SKILL.md +435 -0
- package/.agent/skills/github-operations/SKILL.md +335 -329
- package/.agent/skills/gsap-core/SKILL.md +319 -308
- package/.agent/skills/gsap-frameworks/SKILL.md +213 -207
- package/.agent/skills/gsap-performance/SKILL.md +139 -133
- package/.agent/skills/gsap-plugins/SKILL.md +486 -480
- package/.agent/skills/gsap-react/SKILL.md +202 -189
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +357 -350
- package/.agent/skills/gsap-timeline/SKILL.md +165 -161
- package/.agent/skills/gsap-utils/SKILL.md +344 -338
- package/.agent/skills/harness-protocol/SKILL.md +48 -0
- package/.agent/skills/i18n-localization/SKILL.md +174 -163
- package/.agent/skills/intelligent-routing/SKILL.md +202 -246
- package/.agent/skills/knowledge-graph/SKILL.md +60 -52
- package/.agent/skills/lint-and-validate/SKILL.md +261 -261
- package/.agent/skills/llm-engineering/SKILL.md +400 -394
- package/.agent/skills/local-first/SKILL.md +178 -178
- package/.agent/skills/mcp-builder/SKILL.md +143 -142
- package/.agent/skills/mobile-design/SKILL.md +272 -263
- package/.agent/skills/monorepo-management/SKILL.md +335 -334
- package/.agent/skills/motion-engineering/SKILL.md +266 -234
- package/.agent/skills/nextjs-react-expert/SKILL.md +236 -234
- package/.agent/skills/nodejs-best-practices/SKILL.md +547 -548
- package/.agent/skills/observability/SKILL.md +343 -343
- package/.agent/skills/parallel-agents/SKILL.md +143 -146
- package/.agent/skills/performance-profiling/SKILL.md +259 -267
- package/.agent/skills/plan-writing/SKILL.md +150 -142
- package/.agent/skills/platform-engineer/SKILL.md +148 -147
- package/.agent/skills/playwright-best-practices/SKILL.md +188 -187
- package/.agent/skills/powershell-windows/SKILL.md +162 -162
- package/.agent/skills/project-idioms/SKILL.md +137 -137
- package/.agent/skills/python-patterns/SKILL.md +260 -259
- package/.agent/skills/python-pro/SKILL.md +324 -323
- package/.agent/skills/react-specialist/SKILL.md +305 -277
- package/.agent/skills/readme-builder/SKILL.md +310 -300
- package/.agent/skills/realtime-patterns/SKILL.md +323 -319
- package/.agent/skills/red-team-tactics/SKILL.md +231 -218
- package/.agent/skills/rust-pro/SKILL.md +671 -673
- package/.agent/skills/seo-fundamentals/SKILL.md +179 -179
- package/.agent/skills/server-management/SKILL.md +218 -214
- package/.agent/skills/shadcn-ui-expert/SKILL.md +231 -231
- package/.agent/skills/skill-creator/SKILL.md +87 -86
- package/.agent/skills/sql-pro/SKILL.md +629 -629
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +97 -97
- package/.agent/skills/swiftui-expert/SKILL.md +204 -201
- package/.agent/skills/system-design-pro/SKILL.md +345 -0
- package/.agent/skills/systematic-debugging/SKILL.md +153 -142
- package/.agent/skills/tailwind-patterns/SKILL.md +610 -566
- package/.agent/skills/tdd-workflow/SKILL.md +169 -161
- package/.agent/skills/test-result-analyzer/SKILL.md +313 -309
- package/.agent/skills/testing-patterns/SKILL.md +566 -579
- package/.agent/skills/trend-researcher/SKILL.md +243 -237
- package/.agent/skills/typescript-advanced/SKILL.md +336 -335
- package/.agent/skills/ui-ux-pro-max/SKILL.md +590 -562
- package/.agent/skills/ui-ux-researcher/SKILL.md +244 -244
- package/.agent/skills/vue-expert/SKILL.md +294 -275
- package/.agent/skills/vulnerability-scanner/SKILL.md +416 -404
- package/.agent/skills/web-accessibility-auditor/SKILL.md +219 -218
- package/.agent/skills/web-design-guidelines/SKILL.md +192 -186
- package/.agent/skills/webapp-testing/SKILL.md +167 -169
- package/.agent/skills/webgpu-performance/SKILL.md +56 -2
- package/.agent/skills/whimsy-injector/SKILL.md +346 -325
- package/.agent/skills/workflow-optimizer/SKILL.md +231 -229
- package/.agent/workflows/acf.md +141 -0
- package/.agent/workflows/api-tester.md +176 -151
- package/.agent/workflows/audit.md +150 -127
- package/.agent/workflows/brainstorm.md +134 -110
- package/.agent/workflows/changelog.md +140 -112
- package/.agent/workflows/create.md +168 -124
- package/.agent/workflows/debug.md +190 -165
- package/.agent/workflows/deploy.md +201 -180
- package/.agent/workflows/enhance.md +154 -128
- package/.agent/workflows/fix.md +136 -114
- package/.agent/workflows/generate.md +198 -183
- package/.agent/workflows/marathon.md +37 -11
- package/.agent/workflows/migrate.md +184 -160
- package/.agent/workflows/orchestrate.md +192 -168
- package/.agent/workflows/performance-benchmarker.md +135 -114
- package/.agent/workflows/plan.md +196 -173
- package/.agent/workflows/preview.md +103 -80
- package/.agent/workflows/refactor.md +192 -161
- package/.agent/workflows/review-ai.md +125 -101
- package/.agent/workflows/review.md +141 -116
- package/.agent/workflows/session.md +122 -94
- package/.agent/workflows/status.md +101 -79
- package/.agent/workflows/strengthen-skills.md +164 -138
- package/.agent/workflows/super-prompt.md +24 -0
- package/.agent/workflows/swarm.md +193 -179
- package/.agent/workflows/test.md +211 -189
- package/.agent/workflows/tribunal-backend.md +136 -105
- package/.agent/workflows/tribunal-database.md +122 -95
- package/.agent/workflows/tribunal-frontend.md +221 -96
- package/.agent/workflows/tribunal-full.md +129 -100
- package/.agent/workflows/tribunal-mobile.md +122 -95
- package/.agent/workflows/tribunal-performance.md +136 -110
- package/.agent/workflows/tribunal-speed.md +209 -183
- package/.agent/workflows/ui-ux-pro-max.md +145 -122
- package/README.md +107 -55
- package/bin/mcp-server.js +159 -0
- package/bin/tribunal-kit.js +105 -29
- package/bin/wrapper.js +16 -7
- package/mcp_config.json +9 -0
- package/package.json +94 -86
- package/scripts/changelog.js +4 -3
- package/scripts/validate-payload.js +6 -1
- package/scripts/postinstall.js +0 -127
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tribunal-Kit MCP Server
|
|
5
|
+
*
|
|
6
|
+
* This file exposes tribunal-kit tools via the Model Context Protocol (MCP)
|
|
7
|
+
* over standard I/O, allowing AI clients (Cursor, Windsurf, Claude) to natively
|
|
8
|
+
* invoke tribunal checks.
|
|
9
|
+
*
|
|
10
|
+
* Protocol: MCP 2024-11-05 over JSON-RPC 2.0 / stdio
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const { spawnSync } = require('child_process');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
|
|
16
|
+
const CLI = path.resolve(__dirname, './tribunal-kit.js');
|
|
17
|
+
const PKG = require(path.resolve(__dirname, '../package.json'));
|
|
18
|
+
|
|
19
|
+
// Timeout for spawned processes (30 seconds)
|
|
20
|
+
const SPAWN_TIMEOUT_MS = 30000;
|
|
21
|
+
|
|
22
|
+
// Minimal JSON-RPC 2.0 over stdio
|
|
23
|
+
const readline = require('readline');
|
|
24
|
+
|
|
25
|
+
const rl = readline.createInterface({
|
|
26
|
+
input: process.stdin,
|
|
27
|
+
output: process.stdout,
|
|
28
|
+
terminal: false
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Run a CLI command with timeout protection.
|
|
33
|
+
* Returns { stdout, stderr, status }.
|
|
34
|
+
*/
|
|
35
|
+
function runCommand(args) {
|
|
36
|
+
return spawnSync(process.execPath, [CLI, ...args], {
|
|
37
|
+
encoding: 'utf8',
|
|
38
|
+
timeout: SPAWN_TIMEOUT_MS,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function handleRequest(req) {
|
|
43
|
+
// MCP spec: method names follow path-style convention
|
|
44
|
+
if (req.method === 'initialize') {
|
|
45
|
+
return {
|
|
46
|
+
protocolVersion: "2024-11-05",
|
|
47
|
+
capabilities: {
|
|
48
|
+
tools: {}
|
|
49
|
+
},
|
|
50
|
+
serverInfo: {
|
|
51
|
+
name: "tribunal-kit-mcp",
|
|
52
|
+
version: PKG.version
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (req.method === 'tools/list') {
|
|
58
|
+
return {
|
|
59
|
+
tools: [
|
|
60
|
+
{
|
|
61
|
+
name: "run_tribunal_audit",
|
|
62
|
+
description: "Runs a full anti-hallucination audit across the workspace.",
|
|
63
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false }
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "sync_ide_bridges",
|
|
67
|
+
description: "Synchronize IDE bridge files with the current GEMINI.md rules.",
|
|
68
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false }
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "search_case_law",
|
|
72
|
+
description: "Search historical code rejections and legal precedent. Use this before writing code to avoid past mistakes.",
|
|
73
|
+
inputSchema: {
|
|
74
|
+
type: "object",
|
|
75
|
+
properties: {
|
|
76
|
+
query: { type: "string", description: "Search query (e.g. 'useEffect state')" }
|
|
77
|
+
},
|
|
78
|
+
required: ["query"],
|
|
79
|
+
additionalProperties: false
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (req.method === 'tools/call') {
|
|
87
|
+
const toolName = req.params && req.params.name;
|
|
88
|
+
if (!toolName) {
|
|
89
|
+
throw { code: -32602, message: "Missing required parameter: params.name" };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (toolName === 'run_tribunal_audit') {
|
|
93
|
+
const result = runCommand(['validate']);
|
|
94
|
+
return { content: [{ type: "text", text: result.stdout || result.stderr || "No output" }] };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (toolName === 'sync_ide_bridges') {
|
|
98
|
+
const result = runCommand(['sync']);
|
|
99
|
+
return { content: [{ type: "text", text: result.stdout || result.stderr || "No output" }] };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (toolName === 'search_case_law') {
|
|
103
|
+
const query = req.params && req.params.arguments && req.params.arguments.query;
|
|
104
|
+
if (!query || typeof query !== 'string') {
|
|
105
|
+
throw { code: -32602, message: "Missing or invalid required argument: query (string)" };
|
|
106
|
+
}
|
|
107
|
+
const script = path.resolve(__dirname, '../.agent/scripts/case_law_manager.js');
|
|
108
|
+
// Arguments passed as array — no shell interpolation
|
|
109
|
+
const result = spawnSync(process.execPath, [script, 'search-cases', '--query', query], {
|
|
110
|
+
encoding: 'utf8',
|
|
111
|
+
timeout: SPAWN_TIMEOUT_MS,
|
|
112
|
+
});
|
|
113
|
+
return { content: [{ type: "text", text: result.stdout || result.stderr || "No results" }] };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
throw { code: -32601, message: `Unknown tool: ${toolName}` };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
throw { code: -32601, message: `Unknown method: ${req.method}` };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
rl.on('line', (line) => {
|
|
123
|
+
if (!line.trim()) return;
|
|
124
|
+
|
|
125
|
+
let req;
|
|
126
|
+
try {
|
|
127
|
+
req = JSON.parse(line);
|
|
128
|
+
} catch (parseErr) {
|
|
129
|
+
// Invalid JSON — send a parse error
|
|
130
|
+
const errorRes = {
|
|
131
|
+
jsonrpc: "2.0",
|
|
132
|
+
id: null,
|
|
133
|
+
error: { code: -32700, message: "Parse error: " + parseErr.message }
|
|
134
|
+
};
|
|
135
|
+
console.log(JSON.stringify(errorRes));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
try {
|
|
140
|
+
const result = handleRequest(req);
|
|
141
|
+
const res = { jsonrpc: "2.0", id: req.id, result };
|
|
142
|
+
console.log(JSON.stringify(res));
|
|
143
|
+
|
|
144
|
+
// After initialize, send the initialized notification per MCP spec
|
|
145
|
+
if (req.method === 'initialize') {
|
|
146
|
+
console.log(JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized", params: {} }));
|
|
147
|
+
}
|
|
148
|
+
} catch (e) {
|
|
149
|
+
// Send proper JSON-RPC error response
|
|
150
|
+
const code = (e && typeof e.code === 'number') ? e.code : -32603;
|
|
151
|
+
const message = (e && e.message) ? e.message : "Internal server error";
|
|
152
|
+
const errorRes = {
|
|
153
|
+
jsonrpc: "2.0",
|
|
154
|
+
id: req.id || null,
|
|
155
|
+
error: { code, message }
|
|
156
|
+
};
|
|
157
|
+
console.log(JSON.stringify(errorRes));
|
|
158
|
+
}
|
|
159
|
+
});
|
package/bin/tribunal-kit.js
CHANGED
|
@@ -38,6 +38,24 @@ function runShellAsync(command, options) {
|
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Safely run a Node.js script with arguments as an array.
|
|
43
|
+
* No shell interpolation — immune to injection.
|
|
44
|
+
*/
|
|
45
|
+
function runScriptAsync(scriptPath, args = [], options = {}) {
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
const child = spawn(process.execPath, [scriptPath, ...args], {
|
|
48
|
+
stdio: 'inherit',
|
|
49
|
+
...options,
|
|
50
|
+
});
|
|
51
|
+
child.on('close', code => {
|
|
52
|
+
if (code !== 0) reject(new Error(`Script failed with exit code ${code}`));
|
|
53
|
+
else resolve();
|
|
54
|
+
});
|
|
55
|
+
child.on('error', reject);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
41
59
|
const PKG = require(path.resolve(__dirname, '..', 'package.json'));
|
|
42
60
|
const CURRENT_VERSION = PKG.version;
|
|
43
61
|
|
|
@@ -245,6 +263,7 @@ async function autoUpdateCheck(originalArgs) {
|
|
|
245
263
|
return false;
|
|
246
264
|
}
|
|
247
265
|
|
|
266
|
+
log(' Checking for updates...');
|
|
248
267
|
const latestVersion = await fetchLatestVersion();
|
|
249
268
|
|
|
250
269
|
if (!latestVersion) {
|
|
@@ -385,15 +404,13 @@ async function cmdInit(flags) {
|
|
|
385
404
|
const backupDir = path.join(agentDest, '.backups', `backup-${Date.now()}`);
|
|
386
405
|
fs.mkdirSync(backupDir, { recursive: true });
|
|
387
406
|
|
|
388
|
-
// PRESERVE_DIRS: user-generated content that must survive updates
|
|
389
|
-
const _PRESERVE_DIRS = ['history', 'patterns', 'mcp_config.json'];
|
|
390
407
|
const subdirs = ['agents', 'workflows', 'skills', 'scripts', '.shared', 'rules'];
|
|
391
408
|
for (const sub of subdirs) {
|
|
392
409
|
const subPath = path.join(agentDest, sub);
|
|
393
410
|
if (fs.existsSync(subPath)) {
|
|
394
411
|
// Copy to backup dir
|
|
395
412
|
await copyDir(subPath, path.join(backupDir, sub), false);
|
|
396
|
-
|
|
413
|
+
// Removed aggressive deletion so user custom files persist
|
|
397
414
|
}
|
|
398
415
|
}
|
|
399
416
|
log(` ${c('gray', '✦ Backed up existing configurations to .agent/.backups/')}`);
|
|
@@ -509,6 +526,8 @@ async function cmdInit(flags) {
|
|
|
509
526
|
console.log(plainRow('', () => ''));
|
|
510
527
|
console.log(` ${c('cyan', '╚' + '═'.repeat(W) + '╝')}`);
|
|
511
528
|
console.log();
|
|
529
|
+
log(` ${c('gray', '✦ Updating .gitignore...')}`);
|
|
530
|
+
await updateGitignore(targetDir, dryRun);
|
|
512
531
|
log(` ${c('gray', '✦ Generating IDE bridge files...')}`);
|
|
513
532
|
await generateIDEBridges(targetDir, agentDest, dryRun);
|
|
514
533
|
}
|
|
@@ -520,6 +539,30 @@ async function cmdInit(flags) {
|
|
|
520
539
|
}
|
|
521
540
|
}
|
|
522
541
|
|
|
542
|
+
// ── Gitignore Management ──────────────────────────────────
|
|
543
|
+
async function updateGitignore(targetDir, dryRun = false) {
|
|
544
|
+
if (dryRun) return;
|
|
545
|
+
const gitignorePath = path.join(targetDir, '.gitignore');
|
|
546
|
+
const entries = ['.agent/.backups/', '.agent/history/'];
|
|
547
|
+
let content = '';
|
|
548
|
+
try {
|
|
549
|
+
content = await fs.promises.readFile(gitignorePath, 'utf8');
|
|
550
|
+
} catch (err) {
|
|
551
|
+
if (err.code !== 'ENOENT') throw err;
|
|
552
|
+
}
|
|
553
|
+
let appended = false;
|
|
554
|
+
for (const entry of entries) {
|
|
555
|
+
if (!content.includes(entry)) {
|
|
556
|
+
content += (content.length > 0 && !content.endsWith('\n') ? '\n' : '') + entry + '\n';
|
|
557
|
+
appended = true;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
if (appended) {
|
|
561
|
+
await fs.promises.writeFile(gitignorePath, content, 'utf8');
|
|
562
|
+
dbg(' Updated .gitignore');
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
523
566
|
// ── IDE Bridge Files ──────────────────────────────────────
|
|
524
567
|
// Each AI IDE reads rules from a different location.
|
|
525
568
|
// We generate bridge files that point each IDE at .agent/
|
|
@@ -532,17 +575,46 @@ async function generateIDEBridges(targetDir, agentDest, dryRun = false) {
|
|
|
532
575
|
// rules file doesn't exist
|
|
533
576
|
}
|
|
534
577
|
|
|
535
|
-
// Helper: write a bridge file
|
|
536
|
-
const writeBridge = async (filePath, content, label) => {
|
|
578
|
+
// Helper: write a bridge file or merge it if it exists
|
|
579
|
+
const writeBridge = async (filePath, content, label, isJson = false) => {
|
|
537
580
|
if (dryRun) {
|
|
538
|
-
dbg(` would create: ${filePath}`);
|
|
581
|
+
dbg(` would create/update: ${filePath}`);
|
|
539
582
|
return;
|
|
540
583
|
}
|
|
541
584
|
const dir = path.dirname(filePath);
|
|
585
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
586
|
+
|
|
542
587
|
try {
|
|
543
|
-
await fs.promises.
|
|
544
|
-
|
|
545
|
-
|
|
588
|
+
const existingContent = await fs.promises.readFile(filePath, 'utf8');
|
|
589
|
+
if (isJson) {
|
|
590
|
+
try {
|
|
591
|
+
const existingData = JSON.parse(existingContent);
|
|
592
|
+
const newData = JSON.parse(content);
|
|
593
|
+
|
|
594
|
+
if (!existingData.rules) existingData.rules = [];
|
|
595
|
+
const rulePath = newData.rules[0].path;
|
|
596
|
+
const ruleExists = existingData.rules.some(r => r.path === rulePath);
|
|
597
|
+
if (!ruleExists) {
|
|
598
|
+
existingData.rules.push(newData.rules[0]);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
existingData.agents = { ...existingData.agents, ...newData.agents };
|
|
602
|
+
existingData.skills = { ...existingData.skills, ...newData.skills };
|
|
603
|
+
existingData.workflows = { ...existingData.workflows, ...newData.workflows };
|
|
604
|
+
|
|
605
|
+
await fs.promises.writeFile(filePath, JSON.stringify(existingData, null, 2) + '\n', 'utf8');
|
|
606
|
+
ok(`${label} (merged) → ${c('gray', path.relative(targetDir, filePath))}`);
|
|
607
|
+
} catch (e) {
|
|
608
|
+
warn(`Failed to merge ${label}: ${e.message}`);
|
|
609
|
+
}
|
|
610
|
+
} else {
|
|
611
|
+
if (!existingContent.includes('Tribunal Kit') && (!rulesContent || !existingContent.includes(rulesContent.slice(0, 50)))) {
|
|
612
|
+
await fs.promises.appendFile(filePath, '\n' + content, 'utf8');
|
|
613
|
+
ok(`${label} (appended) → ${c('gray', path.relative(targetDir, filePath))}`);
|
|
614
|
+
} else {
|
|
615
|
+
dbg(` skip (rules exist): ${path.basename(filePath)}`);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
546
618
|
} catch (err) {
|
|
547
619
|
if (err.code === 'ENOENT') {
|
|
548
620
|
await fs.promises.writeFile(filePath, content, 'utf8');
|
|
@@ -579,7 +651,6 @@ ${rulesContent}
|
|
|
579
651
|
|
|
580
652
|
// ── 3. Gemini / Antigravity (.gemini/settings.json) ──
|
|
581
653
|
const geminiSettings = JSON.stringify({
|
|
582
|
-
"$schema": "https://raw.githubusercontent.com/anthropics/anthropic-cookbook/main/.gemini/settings.schema.json",
|
|
583
654
|
"rules": [
|
|
584
655
|
{ "path": "../.agent/rules/GEMINI.md", "trigger": "always_on" }
|
|
585
656
|
],
|
|
@@ -590,7 +661,8 @@ ${rulesContent}
|
|
|
590
661
|
await writeBridge(
|
|
591
662
|
path.join(targetDir, '.gemini', 'settings.json'),
|
|
592
663
|
geminiSettings,
|
|
593
|
-
'Gemini/Antigravity'
|
|
664
|
+
'Gemini/Antigravity',
|
|
665
|
+
true
|
|
594
666
|
);
|
|
595
667
|
|
|
596
668
|
// ── Also create .gemini/GEMINI.md as a direct rules file ──
|
|
@@ -700,8 +772,9 @@ async function cmdLearn(flags) {
|
|
|
700
772
|
console.log(` ${c('cyan', '\u255a' + '\u2550'.repeat(W) + '\u255d')}`);
|
|
701
773
|
console.log();
|
|
702
774
|
|
|
703
|
-
const
|
|
704
|
-
|
|
775
|
+
const evoArgs = ['digest'];
|
|
776
|
+
if (flags.dryRun) evoArgs.push('--dry-run');
|
|
777
|
+
if (flags.head) evoArgs.push('--head');
|
|
705
778
|
|
|
706
779
|
|
|
707
780
|
// Phase 1: Skill Evolution
|
|
@@ -711,8 +784,7 @@ async function cmdLearn(flags) {
|
|
|
711
784
|
warn('skill_evolution.js not found \u2014 run: npx tribunal-kit update');
|
|
712
785
|
} else {
|
|
713
786
|
try {
|
|
714
|
-
|
|
715
|
-
await runShellAsync(cmd, { stdio: 'inherit', cwd: targetDir });
|
|
787
|
+
await runScriptAsync(evoScript, evoArgs, { cwd: targetDir });
|
|
716
788
|
} catch (e) {
|
|
717
789
|
warn(`Skill Evolution error: ${e.message}`);
|
|
718
790
|
}
|
|
@@ -807,8 +879,8 @@ async function cmdCase(flags) {
|
|
|
807
879
|
process.exit(1);
|
|
808
880
|
}
|
|
809
881
|
|
|
810
|
-
const args = process.argv.slice(3)
|
|
811
|
-
if (
|
|
882
|
+
const args = process.argv.slice(3);
|
|
883
|
+
if (args.length === 0 || args[0] === 'help' || args[0] === '--help' || args[0] === '-h') {
|
|
812
884
|
banner();
|
|
813
885
|
log(` ${c('cyan', '\u2554' + '\u2550'.repeat(60) + '\u2557')}`);
|
|
814
886
|
log(` ${c('cyan', '\u2551')}${c('bold', c('white', ' Tribunal Case Law Engine \u2014 Supreme Court '))}${c('cyan', '\u2551')}`);
|
|
@@ -827,13 +899,13 @@ async function cmdCase(flags) {
|
|
|
827
899
|
|
|
828
900
|
const caseLawScript = path.join(agentDest, 'scripts', 'case_law_manager.js');
|
|
829
901
|
|
|
830
|
-
// Make shorthand aliases
|
|
831
|
-
|
|
832
|
-
if (
|
|
833
|
-
if (
|
|
902
|
+
// Make shorthand aliases for the subcommand (first arg only)
|
|
903
|
+
const caseArgs = [...args];
|
|
904
|
+
if (caseArgs[0] === 'add') caseArgs[0] = 'add-case';
|
|
905
|
+
if (caseArgs[0] === 'search') caseArgs[0] = 'search-cases';
|
|
834
906
|
|
|
835
907
|
try {
|
|
836
|
-
await
|
|
908
|
+
await runScriptAsync(caseLawScript, caseArgs, { cwd: targetDir });
|
|
837
909
|
} catch {
|
|
838
910
|
process.exit(1); // Script already prints errors
|
|
839
911
|
}
|
|
@@ -854,12 +926,17 @@ async function cmdGraph(flags) {
|
|
|
854
926
|
const htmlFile = path.join(agentDest, 'history', 'architecture-explorer.html');
|
|
855
927
|
|
|
856
928
|
try {
|
|
857
|
-
await
|
|
858
|
-
await
|
|
929
|
+
await runScriptAsync(builderScript, [], { cwd: targetDir });
|
|
930
|
+
await runScriptAsync(visualizerScript, [], { cwd: targetDir });
|
|
859
931
|
|
|
860
932
|
log(` ${c('cyan', '▸')} Opening visualizer in browser...`);
|
|
861
|
-
|
|
862
|
-
|
|
933
|
+
// Open browser safely without shell interpolation
|
|
934
|
+
const { opener, openerArgs } = (() => {
|
|
935
|
+
if (process.platform === 'win32') return { opener: 'cmd', openerArgs: ['/c', 'start', '', htmlFile] };
|
|
936
|
+
if (process.platform === 'darwin') return { opener: 'open', openerArgs: [htmlFile] };
|
|
937
|
+
return { opener: 'xdg-open', openerArgs: [htmlFile] };
|
|
938
|
+
})();
|
|
939
|
+
spawn(opener, openerArgs, { stdio: 'ignore', detached: true }).unref();
|
|
863
940
|
} catch (e) {
|
|
864
941
|
err(`Graph generation failed: ${e.message}`);
|
|
865
942
|
process.exit(1);
|
|
@@ -908,7 +985,7 @@ async function cmdMutate(flags) {
|
|
|
908
985
|
|
|
909
986
|
const mutateScript = path.join(agentDest, 'scripts', 'mutation_runner.js');
|
|
910
987
|
try {
|
|
911
|
-
await
|
|
988
|
+
await runScriptAsync(mutateScript, args, { cwd: targetDir });
|
|
912
989
|
} catch {
|
|
913
990
|
process.exit(1);
|
|
914
991
|
}
|
|
@@ -1051,7 +1128,6 @@ async function cmdMarathon(flags) {
|
|
|
1051
1128
|
}
|
|
1052
1129
|
|
|
1053
1130
|
const args = process.argv.slice(3);
|
|
1054
|
-
const argsStr = args.join(' ');
|
|
1055
1131
|
if (args.length === 0 || args[0] === 'help' || args[0] === '--help' || args[0] === '-h') {
|
|
1056
1132
|
banner();
|
|
1057
1133
|
log(` ${c('cyan', '╔' + '═'.repeat(60) + '╗')}`);
|
|
@@ -1073,7 +1149,7 @@ async function cmdMarathon(flags) {
|
|
|
1073
1149
|
|
|
1074
1150
|
const marathonScript = path.join(agentDest, 'scripts', 'marathon_harness.js');
|
|
1075
1151
|
try {
|
|
1076
|
-
await
|
|
1152
|
+
await runScriptAsync(marathonScript, args, { cwd: targetDir });
|
|
1077
1153
|
} catch {
|
|
1078
1154
|
process.exit(1);
|
|
1079
1155
|
}
|
package/bin/wrapper.js
CHANGED
|
@@ -21,14 +21,23 @@ const RUST_COMMANDS = new Set(['init', 'validate', 'status']);
|
|
|
21
21
|
function getBinaryPath() {
|
|
22
22
|
const isWindows = os.platform() === 'win32';
|
|
23
23
|
const ext = isWindows ? '.exe' : '';
|
|
24
|
+
const platform = os.platform();
|
|
25
|
+
const arch = os.arch();
|
|
24
26
|
|
|
25
|
-
// First,
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
// First, try production resolution (from optionalDependencies)
|
|
28
|
+
const pkgName = `@tribunal-kit/core-${platform}-${arch}`;
|
|
29
|
+
try {
|
|
30
|
+
// Try to resolve the binary from the optional dependency package
|
|
31
|
+
const pkgPath = require.resolve(`${pkgName}/package.json`);
|
|
32
|
+
const binPath = path.resolve(path.dirname(pkgPath), `bin/tribunal-core${ext}`);
|
|
33
|
+
if (fs.existsSync(binPath)) {
|
|
34
|
+
return binPath;
|
|
35
|
+
}
|
|
36
|
+
} catch (e) {
|
|
37
|
+
// Package not found, ignore and fall back to local dev targets
|
|
29
38
|
}
|
|
30
39
|
|
|
31
|
-
// Second, try to find the binary compiled from crates/core/Cargo.toml
|
|
40
|
+
// Second, try to find the binary compiled from crates/core/Cargo.toml (Local dev)
|
|
32
41
|
const devPath = path.resolve(__dirname, '..', 'target', 'release', `tribunal-core${ext}`);
|
|
33
42
|
if (fs.existsSync(devPath)) {
|
|
34
43
|
return devPath;
|
|
@@ -40,13 +49,13 @@ function getBinaryPath() {
|
|
|
40
49
|
return debugPath;
|
|
41
50
|
}
|
|
42
51
|
|
|
43
|
-
// Production resolution (from optionalDependencies) would go here
|
|
44
52
|
return null;
|
|
45
53
|
}
|
|
46
54
|
|
|
47
55
|
function runRustBinary(binPath, args) {
|
|
56
|
+
const stdio = ['inherit', process.stdout.isTTY ? 'ignore' : 'inherit', 'inherit'];
|
|
48
57
|
const result = spawnSync(binPath, args, {
|
|
49
|
-
stdio:
|
|
58
|
+
stdio: stdio,
|
|
50
59
|
env: process.env
|
|
51
60
|
});
|
|
52
61
|
|
package/mcp_config.json
ADDED
package/package.json
CHANGED
|
@@ -1,86 +1,94 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "tribunal-kit",
|
|
3
|
+
"version": "4.6.0",
|
|
4
|
+
"description": "Anti-Hallucination AI Agent Kit — 40 specialist agents, 32 slash commands, 16 parallel Tribunal reviewers, Performance Swarm engine, Supreme Court case law pipeline, and long-running agent harness.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"ai-agent",
|
|
8
|
+
"long-running-agents",
|
|
9
|
+
"agent",
|
|
10
|
+
"agents",
|
|
11
|
+
"multi-agent",
|
|
12
|
+
"agentic",
|
|
13
|
+
"swarm",
|
|
14
|
+
"orchestration",
|
|
15
|
+
"llm",
|
|
16
|
+
"anti-hallucination",
|
|
17
|
+
"hallucination",
|
|
18
|
+
"code-review",
|
|
19
|
+
"code-quality",
|
|
20
|
+
"cursor",
|
|
21
|
+
"cursor-rules",
|
|
22
|
+
"cursorrules",
|
|
23
|
+
"windsurf",
|
|
24
|
+
"copilot",
|
|
25
|
+
"cline",
|
|
26
|
+
"gemini",
|
|
27
|
+
"antigravity",
|
|
28
|
+
"tribunal",
|
|
29
|
+
"mcp",
|
|
30
|
+
"model-context-protocol",
|
|
31
|
+
"cli",
|
|
32
|
+
"devtools",
|
|
33
|
+
"ai-coding",
|
|
34
|
+
"autonomous-agents",
|
|
35
|
+
"coding-assistant",
|
|
36
|
+
"automation"
|
|
37
|
+
],
|
|
38
|
+
"homepage": "https://github.com/Harmitx7/tribunal-kit",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/Harmitx7/tribunal-kit.git"
|
|
42
|
+
},
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"bin": {
|
|
45
|
+
"tribunal-kit": "bin/wrapper.js",
|
|
46
|
+
"tk": "bin/wrapper.js"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"bin/",
|
|
50
|
+
"scripts/",
|
|
51
|
+
".agent/",
|
|
52
|
+
"README.md",
|
|
53
|
+
"LICENSE",
|
|
54
|
+
"mcp_config.json"
|
|
55
|
+
],
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=18.0.0"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"test": "npm run validate-payload && jest --coverage",
|
|
61
|
+
"test:unit": "jest test/unit --coverage",
|
|
62
|
+
"test:integration": "jest test/integration --coverage",
|
|
63
|
+
"preversion": "node scripts/sync-version.js",
|
|
64
|
+
"version": "node scripts/changelog.js && git add CHANGELOG.md",
|
|
65
|
+
"changelog": "node scripts/changelog.js",
|
|
66
|
+
"changelog:preview": "node scripts/changelog.js --preview",
|
|
67
|
+
"sync": "node scripts/sync-version.js",
|
|
68
|
+
"validate-payload": "node scripts/validate-payload.js",
|
|
69
|
+
"build": "echo 'No build step required for this project'"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"eslint": "^9.1.1",
|
|
73
|
+
"jest": "^25.0.0",
|
|
74
|
+
"typescript": "^5.4.5"
|
|
75
|
+
},
|
|
76
|
+
"optionalDependencies": {
|
|
77
|
+
"@tribunal-kit/core-darwin-arm64": "^4.5.1",
|
|
78
|
+
"@tribunal-kit/core-darwin-x64": "^4.5.1",
|
|
79
|
+
"@tribunal-kit/core-linux-arm64": "^4.5.1",
|
|
80
|
+
"@tribunal-kit/core-linux-x64": "^4.5.1",
|
|
81
|
+
"@tribunal-kit/core-win32-arm64": "^4.5.1",
|
|
82
|
+
"@tribunal-kit/core-win32-x64": "^4.5.1"
|
|
83
|
+
},
|
|
84
|
+
"jest": {
|
|
85
|
+
"testMatch": [
|
|
86
|
+
"**/test/**/*.test.js"
|
|
87
|
+
],
|
|
88
|
+
"testEnvironment": "node",
|
|
89
|
+
"coverageDirectory": "coverage",
|
|
90
|
+
"collectCoverageFrom": [
|
|
91
|
+
"bin/**/*.js"
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
}
|