tribunal-kit 5.8.5 → 6.0.1
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/.manifest.json +78 -0
- package/.agent/ARCHITECTURE.md +32 -253
- package/.agent/agents/accessibility-reviewer.md +66 -151
- package/.agent/agents/ai-code-reviewer.md +22 -2
- package/.agent/agents/anti-pattern-reviewer.md +99 -0
- package/.agent/agents/api-architect.md +19 -2
- package/.agent/agents/backend-specialist.md +25 -3
- package/.agent/agents/cloud-engineer.md +21 -0
- package/.agent/agents/code-archaeologist.md +20 -3
- package/.agent/agents/complexity-reviewer.md +22 -2
- package/.agent/agents/database-architect.md +24 -3
- package/.agent/agents/db-latency-auditor.md +22 -2
- package/.agent/agents/debugger.md +19 -3
- package/.agent/agents/dependency-reviewer.md +19 -2
- package/.agent/agents/devops-engineer.md +24 -3
- package/.agent/agents/documentation-writer.md +21 -3
- package/.agent/agents/explorer-agent.md +21 -3
- package/.agent/agents/frontend-reviewer.md +19 -3
- package/.agent/agents/frontend-specialist.md +72 -224
- package/.agent/agents/game-developer.md +22 -3
- package/.agent/agents/interaction-reviewer.md +118 -0
- package/.agent/agents/logic-reviewer.md +18 -3
- package/.agent/agents/minimalist-reviewer.md +98 -0
- package/.agent/agents/mobile-developer.md +21 -3
- package/.agent/agents/mobile-reviewer.md +22 -2
- package/.agent/agents/orchestrator.md +19 -3
- package/.agent/agents/penetration-tester.md +22 -3
- package/.agent/agents/performance-optimizer.md +21 -3
- package/.agent/agents/performance-reviewer.md +2 -0
- package/.agent/agents/precedence-reviewer.md +19 -5
- package/.agent/agents/product-manager.md +20 -3
- package/.agent/agents/product-owner.md +22 -1
- package/.agent/agents/product-reviewer.md +98 -0
- package/.agent/agents/project-planner.md +19 -3
- package/.agent/agents/qa-automation-engineer.md +24 -3
- package/.agent/agents/resilience-reviewer.md +21 -2
- package/.agent/agents/schema-reviewer.md +21 -2
- package/.agent/agents/security-auditor.md +7 -1
- package/.agent/agents/seo-specialist.md +18 -3
- package/.agent/agents/sql-reviewer.md +22 -2
- package/.agent/agents/supervisor-agent.md +22 -3
- package/.agent/agents/swarm-worker-registry.md +7 -0
- package/.agent/agents/system-architect.md +19 -0
- package/.agent/agents/test-coverage-reviewer.md +22 -2
- package/.agent/agents/test-engineer.md +21 -2
- package/.agent/agents/throughput-optimizer.md +22 -2
- package/.agent/agents/type-safety-reviewer.md +21 -2
- package/.agent/agents/ui-ux-auditor.md +44 -242
- package/.agent/agents/ui-visual-auditor.md +99 -0
- package/.agent/agents/ux-reviewer.md +104 -0
- package/.agent/agents/visual-reviewer.md +98 -0
- package/.agent/agents/vitals-reviewer.md +23 -2
- package/.agent/history/README.md +53 -0
- package/.agent/history/case-law/cases/template-case.json +19 -0
- package/.agent/history/integrity_manifest.json +63 -33
- package/.agent/history/memory/.memory.idx +2701 -1
- package/.agent/history/memory/MEMORY.md +179 -1
- package/.agent/routing_index.json +273 -690
- package/.agent/rules/GEMINI.md +11 -13
- package/.agent/rules/GEMINI_PLANNER.md +84 -0
- package/.agent/scripts/case_law_manager.js +2 -0
- package/.agent/scripts/context_broker.js +152 -0
- package/.agent/scripts/guardrail_engine.js +59 -4
- package/.agent/scripts/impact_classifier.js +167 -0
- package/.agent/scripts/minimal_change_engine.js +437 -0
- package/.agent/scripts/pipeline_engine.js +856 -0
- package/.agent/scripts/socratic_gate_policy.js +60 -0
- package/.agent/scripts/token_budget_broker.js +52 -0
- package/.agent/scripts/verify_all.js +13 -0
- package/.agent/scripts/visual_audit.js +92 -0
- package/.agent/skill_topic_map.json +218 -0
- package/.agent/skills/12-principles-of-animation/SKILL.md +19 -10
- package/.agent/skills/60fps-animation/SKILL.md +19 -10
- package/.agent/skills/accessible-animation/SKILL.md +19 -10
- package/.agent/skills/adapt/SKILL.md +19 -10
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +21 -3
- package/.agent/skills/agent-organizer/SKILL.md +21 -7
- package/.agent/skills/agentic-patterns/SKILL.md +19 -7
- package/.agent/skills/agentic-workflows-2026/SKILL.md +76 -0
- package/.agent/skills/ai-app-hardening/SKILL.md +58 -0
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +21 -7
- package/.agent/skills/animation-on-scroll/SKILL.md +19 -10
- package/.agent/skills/animation-systems/SKILL.md +19 -10
- package/.agent/skills/antfu-conventions/SKILL.md +21 -10
- package/.agent/skills/api-patterns/SKILL.md +21 -7
- package/.agent/skills/api-security-auditor/SKILL.md +21 -7
- package/.agent/skills/app-builder/SKILL.md +21 -7
- package/.agent/skills/apple-design/SKILL.md +19 -10
- package/.agent/skills/architecture/SKILL.md +21 -7
- package/.agent/skills/audit-and-fix/SKILL.md +19 -10
- package/.agent/skills/authentication-best-practices/SKILL.md +21 -7
- package/.agent/skills/backend-security-expert/SKILL.md +21 -7
- package/.agent/skills/baseline-ui/SKILL.md +19 -10
- package/.agent/skills/bash-linux/SKILL.md +21 -7
- package/.agent/skills/behavioral-modes/SKILL.md +19 -7
- package/.agent/skills/better-colors/SKILL.md +19 -10
- package/.agent/skills/better-ui/SKILL.md +19 -10
- package/.agent/skills/bolder/SKILL.md +19 -10
- package/.agent/skills/brainstorming/SKILL.md +17 -7
- package/.agent/skills/browser-native-ai/SKILL.md +19 -3
- package/.agent/skills/build-primitive/SKILL.md +19 -10
- package/.agent/skills/building-native-ui/SKILL.md +21 -7
- package/.agent/skills/cicd-pro/SKILL.md +21 -10
- package/.agent/skills/clarify/SKILL.md +19 -10
- package/.agent/skills/clean-code/SKILL.md +21 -7
- package/.agent/skills/cloud-architect/SKILL.md +21 -10
- package/.agent/skills/cobejs/SKILL.md +19 -10
- package/.agent/skills/code-review-checklist/SKILL.md +21 -7
- package/.agent/skills/codebase-design/SKILL.md +21 -10
- package/.agent/skills/colorize/SKILL.md +19 -10
- package/.agent/skills/compact-landing/SKILL.md +19 -10
- package/.agent/skills/company-logos/SKILL.md +19 -10
- package/.agent/skills/config-validator/SKILL.md +21 -7
- package/.agent/skills/containerization-pro/SKILL.md +21 -10
- package/.agent/skills/context-engineering-pro/SKILL.md +69 -0
- package/.agent/skills/create-design-md/SKILL.md +19 -10
- package/.agent/skills/critique/SKILL.md +19 -10
- package/.agent/skills/csharp-developer/SKILL.md +21 -7
- package/.agent/skills/data-validation-schemas/SKILL.md +21 -7
- package/.agent/skills/database-design/SKILL.md +21 -7
- package/.agent/skills/delight/SKILL.md +19 -10
- package/.agent/skills/deployment-procedures/SKILL.md +21 -7
- package/.agent/skills/design-lab/SKILL.md +21 -10
- package/.agent/skills/devops-engineer/SKILL.md +21 -7
- package/.agent/skills/devops-incident-responder/SKILL.md +21 -7
- package/.agent/skills/diagnosing-bugs/SKILL.md +21 -10
- package/.agent/skills/distill/SKILL.md +19 -10
- package/.agent/skills/documentation-templates/SKILL.md +21 -7
- package/.agent/skills/domain-modeling/SKILL.md +21 -10
- package/.agent/skills/duckdb-analytical-sql/SKILL.md +55 -0
- package/.agent/skills/edge-ai-mobile/SKILL.md +46 -0
- package/.agent/skills/edge-computing/SKILL.md +21 -7
- package/.agent/skills/emil-design-eng/SKILL.md +19 -10
- package/.agent/skills/error-resilience/SKILL.md +21 -7
- package/.agent/skills/expo-router-v4/SKILL.md +80 -0
- package/.agent/skills/extract-design-system/SKILL.md +21 -7
- package/.agent/skills/fabel-protocol/SKILL.md +19 -2
- package/.agent/skills/fixing-accessibility/SKILL.md +19 -10
- package/.agent/skills/fixing-metadata/SKILL.md +19 -10
- package/.agent/skills/fixing-motion-performance/SKILL.md +19 -10
- package/.agent/skills/framer-motion-expert/SKILL.md +19 -6
- package/.agent/skills/frontend-design/SKILL.md +64 -201
- package/.agent/skills/frontend-security-expert/SKILL.md +21 -7
- package/.agent/skills/game-design-expert/SKILL.md +21 -7
- package/.agent/skills/game-engineering-expert/SKILL.md +21 -7
- package/.agent/skills/generative-ui-expert/SKILL.md +19 -3
- package/.agent/skills/geo-fundamentals/SKILL.md +21 -7
- package/.agent/skills/git-pro/SKILL.md +21 -10
- package/.agent/skills/github-operations/SKILL.md +21 -7
- package/.agent/skills/gpt-taste/SKILL.md +19 -10
- package/.agent/skills/gsap-core/SKILL.md +21 -4
- package/.agent/skills/gsap-frameworks/SKILL.md +21 -4
- package/.agent/skills/gsap-performance/SKILL.md +20 -5
- package/.agent/skills/gsap-plugins/SKILL.md +20 -5
- package/.agent/skills/gsap-react/SKILL.md +20 -5
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +21 -4
- package/.agent/skills/gsap-timeline/SKILL.md +20 -5
- package/.agent/skills/gsap-utils/SKILL.md +20 -5
- package/.agent/skills/harden/SKILL.md +19 -10
- package/.agent/skills/harness-protocol/SKILL.md +20 -4
- package/.agent/skills/i18n-localization/SKILL.md +21 -7
- package/.agent/skills/impeccable/SKILL.md +19 -10
- package/.agent/skills/improve-codebase-architecture/SKILL.md +21 -10
- package/.agent/skills/improve-ui/SKILL.md +19 -10
- package/.agent/skills/intelligent-routing/SKILL.md +19 -7
- package/.agent/skills/knowledge-graph/SKILL.md +20 -4
- package/.agent/skills/landing-page/SKILL.md +20 -10
- package/.agent/skills/lint-and-validate/SKILL.md +21 -7
- package/.agent/skills/llm-engineering/SKILL.md +21 -7
- package/.agent/skills/local-first/SKILL.md +21 -7
- package/.agent/skills/local-first-architecture/SKILL.md +19 -10
- package/.agent/skills/lottie-animation/SKILL.md +19 -10
- package/.agent/skills/marquee-loop/SKILL.md +19 -10
- package/.agent/skills/masked-reveal/SKILL.md +19 -10
- package/.agent/skills/mcp-builder/SKILL.md +21 -7
- package/.agent/skills/micro-interaction/SKILL.md +19 -10
- package/.agent/skills/mobile-design/SKILL.md +21 -6
- package/.agent/skills/monorepo-management/SKILL.md +21 -7
- package/.agent/skills/morphing-icons/SKILL.md +19 -10
- package/.agent/skills/motion-engineering/SKILL.md +20 -7
- package/.agent/skills/nextjs-react-expert/SKILL.md +19 -7
- package/.agent/skills/nodejs-best-practices/SKILL.md +21 -7
- package/.agent/skills/observability/SKILL.md +21 -7
- package/.agent/skills/opentelemetry-observability/SKILL.md +58 -0
- package/.agent/skills/page-transition-animation/SKILL.md +19 -10
- package/.agent/skills/parallel-agents/SKILL.md +23 -7
- package/.agent/skills/performance-profiling/SKILL.md +21 -7
- package/.agent/skills/plan-writing/SKILL.md +21 -7
- package/.agent/skills/platform-engineer/SKILL.md +21 -7
- package/.agent/skills/platform-engineering-opentofu/SKILL.md +67 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +59 -0
- package/.agent/skills/playwright-best-practices/SKILL.md +21 -7
- package/.agent/skills/polish/SKILL.md +19 -10
- package/.agent/skills/powershell-windows/SKILL.md +21 -7
- package/.agent/skills/pricing-page/SKILL.md +19 -10
- package/.agent/skills/product-aware-heuristics/SKILL.md +358 -0
- package/.agent/skills/progressive-blur/SKILL.md +19 -10
- package/.agent/skills/project-idioms/SKILL.md +20 -8
- package/.agent/skills/property-based-testing/SKILL.md +60 -0
- package/.agent/skills/python-patterns/SKILL.md +21 -7
- package/.agent/skills/python-pro/SKILL.md +21 -6
- package/.agent/skills/quieter/SKILL.md +19 -10
- package/.agent/skills/react-doctor/SKILL.md +19 -10
- package/.agent/skills/react-specialist/SKILL.md +19 -6
- package/.agent/skills/readme-builder/SKILL.md +21 -7
- package/.agent/skills/realtime-patterns/SKILL.md +21 -7
- package/.agent/skills/red-team-tactics/SKILL.md +21 -7
- package/.agent/skills/redesign-skill/SKILL.md +19 -10
- package/.agent/skills/review-animations/SKILL.md +21 -10
- package/.agent/skills/rust-pro/SKILL.md +21 -7
- package/.agent/skills/seo-fundamentals/SKILL.md +21 -7
- package/.agent/skills/server-management/SKILL.md +21 -7
- package/.agent/skills/shadcn-ui-expert/SKILL.md +21 -7
- package/.agent/skills/shape/SKILL.md +19 -10
- package/.agent/skills/skill-creator/SKILL.md +21 -7
- package/.agent/skills/soft-skill/SKILL.md +19 -10
- package/.agent/skills/sounds-on-the-web/SKILL.md +19 -10
- package/.agent/skills/sql-pro/SKILL.md +21 -7
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +21 -7
- package/.agent/skills/svg-animation/SKILL.md +19 -10
- package/.agent/skills/swiftui-expert/SKILL.md +21 -7
- package/.agent/skills/swiss-design/SKILL.md +19 -10
- package/.agent/skills/system-design-pro/SKILL.md +21 -9
- package/.agent/skills/systematic-debugging/SKILL.md +21 -7
- package/.agent/skills/tailwind-patterns/SKILL.md +21 -7
- package/.agent/skills/taste-skill/SKILL.md +19 -10
- package/.agent/skills/tdd-workflow/SKILL.md +21 -10
- package/.agent/skills/test-result-analyzer/SKILL.md +18 -6
- package/.agent/skills/testing-patterns/SKILL.md +21 -7
- package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +21 -10
- package/.agent/skills/thinking-protocol/SKILL.md +20 -8
- package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +19 -10
- package/.agent/skills/transitions-dev/SKILL.md +19 -10
- package/.agent/skills/trend-researcher/SKILL.md +17 -6
- package/.agent/skills/typescript-advanced/SKILL.md +21 -7
- package/.agent/skills/typeset/SKILL.md +19 -10
- package/.agent/skills/ui-reasoning-engine/SKILL.md +154 -0
- package/.agent/skills/ui-skill-packs/SKILL.md +77 -0
- package/.agent/skills/ui-skills-root/SKILL.md +21 -9
- package/.agent/skills/ui-ux-pro-max/SKILL.md +62 -583
- package/.agent/skills/ui-ux-researcher/SKILL.md +17 -6
- package/.agent/skills/vector-search-pgvector/SKILL.md +77 -0
- package/.agent/skills/vue-expert/SKILL.md +19 -6
- package/.agent/skills/vulnerability-scanner/SKILL.md +21 -7
- package/.agent/skills/web-accessibility-auditor/SKILL.md +21 -7
- package/.agent/skills/web-design-guidelines/SKILL.md +32 -206
- package/.agent/skills/web-quality-audit/SKILL.md +19 -10
- package/.agent/skills/webapp-testing/SKILL.md +21 -7
- package/.agent/skills/webgpu-performance/SKILL.md +19 -3
- package/.agent/skills/whimsy-injector/SKILL.md +20 -10
- package/.agent/skills/workflow-optimizer/SKILL.md +16 -6
- package/.agent/skills/zero-trust-passkeys/SKILL.md +85 -0
- package/.agent/templates/DESIGN.md +292 -0
- package/.agent/templates/design-tokens.json +137 -0
- package/.agent/workflows/acf.md +13 -6
- package/.agent/workflows/api-tester.md +15 -8
- package/.agent/workflows/audit.md +19 -8
- package/.agent/workflows/brainstorm.md +14 -9
- package/.agent/workflows/changelog.md +14 -8
- package/.agent/workflows/create.md +16 -8
- package/.agent/workflows/debug.md +15 -10
- package/.agent/workflows/deploy.md +16 -8
- package/.agent/workflows/enhance.md +15 -10
- package/.agent/workflows/fix.md +15 -8
- package/.agent/workflows/generate.md +17 -11
- package/.agent/workflows/marathon.md +15 -8
- package/.agent/workflows/migrate.md +16 -8
- package/.agent/workflows/minimal.md +94 -0
- package/.agent/workflows/orchestrate.md +15 -8
- package/.agent/workflows/performance-benchmarker.md +15 -8
- package/.agent/workflows/pipeline.md +155 -0
- package/.agent/workflows/plan.md +14 -10
- package/.agent/workflows/preview.md +14 -7
- package/.agent/workflows/refactor.md +16 -8
- package/.agent/workflows/review-ai.md +15 -7
- package/.agent/workflows/review.md +15 -7
- package/.agent/workflows/session.md +14 -7
- package/.agent/workflows/status.md +13 -7
- package/.agent/workflows/strengthen-skills.md +15 -6
- package/.agent/workflows/super-prompt.md +19 -10
- package/.agent/workflows/swarm.md +15 -7
- package/.agent/workflows/test.md +15 -8
- package/.agent/workflows/tribunal-backend.md +16 -9
- package/.agent/workflows/tribunal-database.md +15 -8
- package/.agent/workflows/tribunal-frontend.md +26 -11
- package/.agent/workflows/tribunal-full.md +41 -26
- package/.agent/workflows/tribunal-mobile.md +15 -8
- package/.agent/workflows/tribunal-performance.md +15 -8
- package/.agent/workflows/tribunal-speed.md +16 -9
- package/.agent/workflows/tribunal-ui.md +82 -0
- package/.agent/workflows/ui-ux-pro-max.md +51 -107
- package/CONTRIBUTING.md +2 -2
- package/README.md +82 -60
- package/SECURITY.md +3 -3
- package/bin/mcp-server.js +253 -57
- package/bin/wrapper.js +24 -10
- package/dist/cli.js +29 -1
- package/dist/commands/compile.js +7 -0
- package/dist/commands/context.js +8 -3
- package/dist/commands/graph.js +8 -2
- package/dist/commands/init.js +13 -2
- package/dist/commands/memory.js +120 -68
- package/dist/commands/minimal.js +71 -0
- package/dist/commands/native.js +36 -0
- package/dist/commands/optimize.js +15 -5
- package/dist/esm/index.mjs +58 -32
- package/dist/index.d.ts +50 -2
- package/dist/utils/fs.js +10 -4
- package/dist/utils/helpers.js +10 -1
- package/dist/utils/version.js +9 -2
- package/mcp_config.json +10 -1
- package/package.json +16 -10
- package/scripts/benchmark.js +16 -0
- package/scripts/sync-version.js +1 -1
- package/scripts/visual_audit.js +126 -0
package/dist/commands/memory.js
CHANGED
|
@@ -31,6 +31,43 @@ const PROJECTION_FILE = 'MEMORY.md';
|
|
|
31
31
|
const MAX_ENTRIES = 500;
|
|
32
32
|
const EPISODIC_TTL_DAYS = 30;
|
|
33
33
|
|
|
34
|
+
function acquireLock(agentDest) {
|
|
35
|
+
const lockPath = getIndexPath(agentDest) + '.lock';
|
|
36
|
+
const maxRetries = 10;
|
|
37
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
38
|
+
try {
|
|
39
|
+
const fd = fs_1.default.openSync(lockPath, 'wx');
|
|
40
|
+
fs_1.default.closeSync(fd);
|
|
41
|
+
return lockPath;
|
|
42
|
+
} catch (err) {
|
|
43
|
+
if (err.code !== 'EEXIST') {
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
// Non-blocking sleep — avoids busy-wait event loop blocking
|
|
47
|
+
const waitBuf = new Int32Array(new SharedArrayBuffer(4));
|
|
48
|
+
Atomics.wait(waitBuf, 0, 0, 50);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const stats = fs_1.default.statSync(lockPath);
|
|
53
|
+
if (Date.now() - stats.mtimeMs > 10000) {
|
|
54
|
+
fs_1.default.unlinkSync(lockPath);
|
|
55
|
+
const fd = fs_1.default.openSync(lockPath, 'wx');
|
|
56
|
+
fs_1.default.closeSync(fd);
|
|
57
|
+
return lockPath;
|
|
58
|
+
}
|
|
59
|
+
} catch {}
|
|
60
|
+
throw new Error('Could not acquire lock for memory index');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function releaseLock(lockPath) {
|
|
64
|
+
try {
|
|
65
|
+
if (lockPath && fs_1.default.existsSync(lockPath)) {
|
|
66
|
+
fs_1.default.unlinkSync(lockPath);
|
|
67
|
+
}
|
|
68
|
+
} catch {}
|
|
69
|
+
}
|
|
70
|
+
|
|
34
71
|
function getMemoryDir(agentDest) {
|
|
35
72
|
return path_1.default.join(agentDest, MEMORY_DIR);
|
|
36
73
|
}
|
|
@@ -121,95 +158,110 @@ function memoryStore(agentDest, type, content, tags, sessionId) {
|
|
|
121
158
|
throw new Error('Memory content cannot be empty');
|
|
122
159
|
}
|
|
123
160
|
|
|
124
|
-
const
|
|
161
|
+
const lockPath = acquireLock(agentDest);
|
|
162
|
+
try {
|
|
163
|
+
const index = loadIndex(agentDest);
|
|
125
164
|
|
|
126
|
-
|
|
127
|
-
if (index.entries.length >= MAX_ENTRIES) {
|
|
128
|
-
index.entries = index.entries.filter(e => e.memory_type !== 'working');
|
|
129
|
-
if (index.entries.length >= MAX_ENTRIES) {
|
|
130
|
-
index.entries = index.entries.filter(e => {
|
|
131
|
-
if (e.memory_type === 'episodic') {
|
|
132
|
-
return daysSince(e.created_at) < EPISODIC_TTL_DAYS;
|
|
133
|
-
}
|
|
134
|
-
return true;
|
|
135
|
-
});
|
|
136
|
-
}
|
|
165
|
+
// Enforce cap — auto-GC if needed
|
|
137
166
|
if (index.entries.length >= MAX_ENTRIES) {
|
|
138
|
-
|
|
167
|
+
index.entries = index.entries.filter(e => e.memory_type !== 'working');
|
|
168
|
+
if (index.entries.length >= MAX_ENTRIES) {
|
|
169
|
+
index.entries = index.entries.filter(e => {
|
|
170
|
+
if (e.memory_type === 'episodic') {
|
|
171
|
+
return daysSince(e.created_at) < EPISODIC_TTL_DAYS; // Typo correction or TTL match
|
|
172
|
+
}
|
|
173
|
+
return true;
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
if (index.entries.length >= MAX_ENTRIES) {
|
|
177
|
+
throw new Error(`Memory at capacity (${MAX_ENTRIES}). Run: tk memory gc`);
|
|
178
|
+
}
|
|
139
179
|
}
|
|
140
|
-
}
|
|
141
180
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
181
|
+
const now = nowEpochStr();
|
|
182
|
+
const id = index.next_id || (index.entries.length > 0 ? Math.max(...index.entries.map(e => e.id)) + 1 : 1);
|
|
183
|
+
const entry = {
|
|
184
|
+
id,
|
|
185
|
+
memory_type: type,
|
|
186
|
+
content: content.trim(),
|
|
187
|
+
tags: tags.filter(t => t.length > 0),
|
|
188
|
+
created_at: now,
|
|
189
|
+
last_accessed: now,
|
|
190
|
+
access_count: 0,
|
|
191
|
+
token_estimate: estimateTokens(content),
|
|
192
|
+
source: type === 'working' ? 'session' : 'manual',
|
|
193
|
+
session_id: sessionId || null,
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
index.entries.push(entry);
|
|
197
|
+
index.next_id = id + 1;
|
|
198
|
+
saveIndex(agentDest, index);
|
|
199
|
+
generateProjection(agentDest, index);
|
|
200
|
+
|
|
201
|
+
return { id, token_estimate: entry.token_estimate };
|
|
202
|
+
} finally {
|
|
203
|
+
releaseLock(lockPath);
|
|
204
|
+
}
|
|
163
205
|
}
|
|
164
206
|
|
|
165
207
|
// ── Recall ──────────────────────────────────────────────────────────────────
|
|
166
208
|
|
|
167
209
|
function memoryRecall(agentDest, query, budget = 2000) {
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
210
|
+
const lockPath = acquireLock(agentDest);
|
|
211
|
+
try {
|
|
212
|
+
const index = loadIndex(agentDest);
|
|
213
|
+
|
|
214
|
+
const scored = index.entries
|
|
215
|
+
.map(entry => ({ entry, score: computeScore(entry, query) }))
|
|
216
|
+
.filter(s => s.score > 0)
|
|
217
|
+
.sort((a, b) => b.score - a.score);
|
|
218
|
+
|
|
219
|
+
let totalTokens = 0;
|
|
220
|
+
const results = [];
|
|
221
|
+
|
|
222
|
+
for (const { entry, score } of scored) {
|
|
223
|
+
if (totalTokens + entry.token_estimate > budget) break;
|
|
224
|
+
totalTokens += entry.token_estimate;
|
|
225
|
+
entry.last_accessed = nowEpochStr();
|
|
226
|
+
entry.access_count = (entry.access_count || 0) + 1;
|
|
227
|
+
results.push({ ...entry, score });
|
|
228
|
+
}
|
|
174
229
|
|
|
175
|
-
|
|
176
|
-
|
|
230
|
+
// Save updated access counts
|
|
231
|
+
saveIndex(agentDest, index);
|
|
177
232
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
entry.last_accessed = nowEpochStr();
|
|
182
|
-
entry.access_count = (entry.access_count || 0) + 1;
|
|
183
|
-
results.push({ ...entry, score });
|
|
233
|
+
return { results, tokens_used: totalTokens, budget };
|
|
234
|
+
} finally {
|
|
235
|
+
releaseLock(lockPath);
|
|
184
236
|
}
|
|
185
|
-
|
|
186
|
-
// Save updated access counts
|
|
187
|
-
saveIndex(agentDest, index);
|
|
188
|
-
|
|
189
|
-
return { results, tokens_used: totalTokens, budget };
|
|
190
237
|
}
|
|
191
238
|
|
|
192
239
|
// ── Garbage Collect ─────────────────────────────────────────────────────────
|
|
193
240
|
|
|
194
241
|
function memoryGc(agentDest) {
|
|
195
|
-
const
|
|
196
|
-
|
|
242
|
+
const lockPath = acquireLock(agentDest);
|
|
243
|
+
try {
|
|
244
|
+
const index = loadIndex(agentDest);
|
|
245
|
+
const before = index.entries.length;
|
|
197
246
|
|
|
198
|
-
|
|
199
|
-
|
|
247
|
+
let workingRemoved = 0;
|
|
248
|
+
let episodicRemoved = 0;
|
|
200
249
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
250
|
+
index.entries = index.entries.filter(e => {
|
|
251
|
+
if (e.memory_type === 'working') { workingRemoved++; return false; }
|
|
252
|
+
if (e.memory_type === 'episodic' && daysSince(e.created_at) >= EPISODIC_TTL_DAYS) {
|
|
253
|
+
episodicRemoved++; return false;
|
|
254
|
+
}
|
|
255
|
+
return true;
|
|
256
|
+
});
|
|
208
257
|
|
|
209
|
-
|
|
210
|
-
|
|
258
|
+
saveIndex(agentDest, index);
|
|
259
|
+
generateProjection(agentDest, index);
|
|
211
260
|
|
|
212
|
-
|
|
261
|
+
return { working_removed: workingRemoved, episodic_removed: episodicRemoved, before, after: index.entries.length };
|
|
262
|
+
} finally {
|
|
263
|
+
releaseLock(lockPath);
|
|
264
|
+
}
|
|
213
265
|
}
|
|
214
266
|
|
|
215
267
|
// ── Stats ───────────────────────────────────────────────────────────────────
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cmdMinimal = cmdMinimal;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
const helpers_1 = require("../utils/helpers");
|
|
11
|
+
|
|
12
|
+
function cmdMinimal(flags, quiet = false) {
|
|
13
|
+
const targetDir = flags.path ? path_1.default.resolve(flags.path) : process.cwd();
|
|
14
|
+
const agentDest = path_1.default.join(targetDir, '.agent');
|
|
15
|
+
(0, helpers_1.banner)(quiet);
|
|
16
|
+
|
|
17
|
+
if (!fs_1.default.existsSync(agentDest)) {
|
|
18
|
+
(0, logger_1.log)(` ${(0, logger_1.c)('red', '✖')} ${(0, logger_1.bold)('Not installed')} in this project`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const enginePath = path_1.default.join(agentDest, 'scripts', 'minimal_change_engine.js');
|
|
23
|
+
if (!fs_1.default.existsSync(enginePath)) {
|
|
24
|
+
(0, logger_1.log)(` ${(0, logger_1.c)('red', '✖')} minimal_change_engine.js not found`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
const engine = require(enginePath);
|
|
30
|
+
const task = flags.task || flags._?.slice(1).join(' ') || 'Default task evaluation';
|
|
31
|
+
const mode = flags.mode || 'balanced';
|
|
32
|
+
const result = engine.evaluateMinimalChange(task, {
|
|
33
|
+
files_added: flags.filesAdded ? parseInt(flags.filesAdded, 10) : 0,
|
|
34
|
+
files_modified: flags.filesModified ? parseInt(flags.filesModified, 10) : 1,
|
|
35
|
+
estimated_lines_added: flags.linesAdded ? parseInt(flags.linesAdded, 10) : 20,
|
|
36
|
+
}, { mode, cwd: targetDir });
|
|
37
|
+
|
|
38
|
+
if (flags.json) {
|
|
39
|
+
console.log(JSON.stringify(result, null, 2));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
(0, logger_1.log)(` ${(0, logger_1.bold)('Minimal Change Governance Audit')}`);
|
|
44
|
+
(0, logger_1.log)(` Minimality Score: ${result.passed ? (0, logger_1.c)('green', result.minimality_score + '/100') : (0, logger_1.c)('red', result.minimality_score + '/100')}`);
|
|
45
|
+
(0, logger_1.log)(` Decision Classification: ${(0, logger_1.c)('cyan', result.minimality_classification)}`);
|
|
46
|
+
(0, logger_1.log)(` Strictness Mode: ${(0, logger_1.c)('yellow', mode)}`);
|
|
47
|
+
console.log();
|
|
48
|
+
|
|
49
|
+
if (result.change_budget) {
|
|
50
|
+
(0, logger_1.log)(` ${(0, logger_1.bold)('Change Budget:')}`);
|
|
51
|
+
(0, logger_1.log)(` files_added: ${result.change_budget.files_added}`);
|
|
52
|
+
(0, logger_1.log)(` files_modified: ${result.change_budget.files_modified}`);
|
|
53
|
+
(0, logger_1.log)(` dependencies_added: ${result.change_budget.dependencies_added}`);
|
|
54
|
+
(0, logger_1.log)(` new_abstractions: ${result.change_budget.new_abstractions}`);
|
|
55
|
+
console.log();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (result.complexity_flags.length > 0) {
|
|
59
|
+
(0, logger_1.log)(` ${(0, logger_1.c)('yellow', 'Complexity Flags Detected:')}`);
|
|
60
|
+
result.complexity_flags.forEach(f => {
|
|
61
|
+
(0, logger_1.log)(` • [${f.severity.toUpperCase()}] ${f.type}: ${f.evidence}`);
|
|
62
|
+
});
|
|
63
|
+
console.log();
|
|
64
|
+
} else {
|
|
65
|
+
(0, logger_1.log)(` ${(0, logger_1.c)('green', '✔ Zero Complexity Flags Detected')}`);
|
|
66
|
+
console.log();
|
|
67
|
+
}
|
|
68
|
+
} catch (err) {
|
|
69
|
+
(0, logger_1.log)(` ${(0, logger_1.c)('red', '✖ Error executing Minimal Change Engine:')} ${err.message}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
package/dist/commands/native.js
CHANGED
|
@@ -219,10 +219,46 @@ function cmdOptimizeStep(processArgs, quiet = false) {
|
|
|
219
219
|
console.log(JSON.stringify(result));
|
|
220
220
|
return true;
|
|
221
221
|
}
|
|
222
|
+
function cmdImpactTier(processArgs, quiet = false) {
|
|
223
|
+
const args = processArgs.slice(3);
|
|
224
|
+
const files = getOption(args, ["--files"]) || "";
|
|
225
|
+
const lines = parseInt(getOption(args, ["--lines"]) || "0", 10);
|
|
226
|
+
const task = getOption(args, ["--task"]) || "";
|
|
227
|
+
|
|
228
|
+
const fileList = files ? files.split(",").map(f => f.trim()).filter(Boolean) : [];
|
|
229
|
+
const fileCount = fileList.length;
|
|
230
|
+
|
|
231
|
+
// Tier classification heuristics (mirrors Rust ImpactTier logic)
|
|
232
|
+
let tier = 0;
|
|
233
|
+
if (fileCount === 0 && lines <= 5) tier = 0;
|
|
234
|
+
else if (fileCount <= 1 && lines <= 50) tier = 1;
|
|
235
|
+
else if (fileCount <= 5 && lines <= 200) tier = 2;
|
|
236
|
+
else tier = 3;
|
|
237
|
+
|
|
238
|
+
// Check for high-risk patterns that force Tier 3
|
|
239
|
+
const highRiskPatterns = /\b(auth|migration|schema|security|password|token|jwt|rbac|permissions)\b/i;
|
|
240
|
+
const highRiskExtensions = /\.(sql|prisma|tf|tofu)$/i;
|
|
241
|
+
if (highRiskPatterns.test(task) || fileList.some(f => highRiskExtensions.test(f))) {
|
|
242
|
+
tier = Math.max(tier, 3);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const tierNames = ["Fast-Pass", "Express Pass", "Targeted Audit", "Full Gauntlet"];
|
|
246
|
+
const result = {
|
|
247
|
+
tier,
|
|
248
|
+
tier_name: tierNames[tier],
|
|
249
|
+
file_count: fileCount,
|
|
250
|
+
line_count: lines,
|
|
251
|
+
socratic_gate: tier >= 3 ? "required" : tier >= 2 ? "conditional" : "bypass",
|
|
252
|
+
};
|
|
253
|
+
if (!quiet) console.error(`✓ Impact Tier: ${tier} (${tierNames[tier]})`);
|
|
254
|
+
console.log(JSON.stringify(result));
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
222
257
|
|
|
223
258
|
module.exports = {
|
|
224
259
|
cmdMinContext,
|
|
225
260
|
cmdDagSchedule,
|
|
226
261
|
cmdContextCompress,
|
|
227
262
|
cmdOptimizeStep,
|
|
263
|
+
cmdImpactTier,
|
|
228
264
|
};
|
|
@@ -9,7 +9,7 @@ const fs = __importDefault(require("fs"));
|
|
|
9
9
|
const path = __importDefault(require("path"));
|
|
10
10
|
const os = __importDefault(require("os"));
|
|
11
11
|
const https = __importDefault(require("https"));
|
|
12
|
-
const { execSync } = require("child_process");
|
|
12
|
+
const { execSync, spawnSync } = require("child_process");
|
|
13
13
|
const logger = require("../utils/logger");
|
|
14
14
|
const helpers = require("../utils/helpers");
|
|
15
15
|
|
|
@@ -253,10 +253,20 @@ Each edit must follow this schema:
|
|
|
253
253
|
const tempFile = path.default.join(os.default.tmpdir(), `edits-${Date.now()}.json`);
|
|
254
254
|
fs.default.writeFileSync(tempFile, cleanedJson, 'utf8');
|
|
255
255
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
256
|
+
const result = spawnSync(binPath, [
|
|
257
|
+
"optimize-step",
|
|
258
|
+
"--skill-path",
|
|
259
|
+
skillPath,
|
|
260
|
+
"--edits-json",
|
|
261
|
+
cleanedJson,
|
|
262
|
+
"--budget",
|
|
263
|
+
String(editBudget)
|
|
264
|
+
], { encoding: 'utf8', cwd: targetDir, stdio: 'pipe' });
|
|
265
|
+
|
|
266
|
+
if (result.error) {
|
|
267
|
+
throw result.error;
|
|
268
|
+
}
|
|
269
|
+
optResultStr = result.stdout || "";
|
|
260
270
|
|
|
261
271
|
try { fs.default.unlinkSync(tempFile); } catch {}
|
|
262
272
|
} catch (e) {
|
package/dist/esm/index.mjs
CHANGED
|
@@ -34,83 +34,109 @@ export const runShellAsync = helpers.runShellAsync;
|
|
|
34
34
|
export const getKitAgent = helpers.getKitAgent;
|
|
35
35
|
export const banner = helpers.banner;
|
|
36
36
|
|
|
37
|
+
// Helper to wrap CommonJS requires in friendly error diagnostics
|
|
38
|
+
function loadCommand(modulePath, functionName, ...args) {
|
|
39
|
+
try {
|
|
40
|
+
const mod = require(modulePath);
|
|
41
|
+
return mod[functionName](...args);
|
|
42
|
+
} catch (err) {
|
|
43
|
+
throw new Error(`Tribunal ESM wrapper failed to load command '${functionName}' from '${modulePath}': ${err.message}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
37
47
|
// ── Lazy command loaders (imported on demand) ────────────
|
|
38
48
|
export async function cmdInit(flags, quiet) {
|
|
39
|
-
|
|
40
|
-
return mod.cmdInit(flags, quiet);
|
|
49
|
+
return loadCommand('../commands/init.js', 'cmdInit', flags, quiet);
|
|
41
50
|
}
|
|
42
51
|
|
|
43
52
|
export async function cmdUpdate(flags) {
|
|
44
|
-
|
|
45
|
-
return mod.cmdUpdate(flags);
|
|
53
|
+
return loadCommand('../commands/update.js', 'cmdUpdate', flags);
|
|
46
54
|
}
|
|
47
55
|
|
|
48
56
|
export function cmdStatus(flags, quiet) {
|
|
49
|
-
|
|
50
|
-
return mod.cmdStatus(flags, quiet);
|
|
57
|
+
return loadCommand('../commands/status.js', 'cmdStatus', flags, quiet);
|
|
51
58
|
}
|
|
52
59
|
|
|
53
60
|
export async function cmdLearn(flags, quiet) {
|
|
54
|
-
|
|
55
|
-
return mod.cmdLearn(flags, quiet);
|
|
61
|
+
return loadCommand('../commands/learn.js', 'cmdLearn', flags, quiet);
|
|
56
62
|
}
|
|
57
63
|
|
|
58
64
|
export async function cmdCase(flags, argv, quiet) {
|
|
59
|
-
|
|
60
|
-
return mod.cmdCase(flags, argv, quiet);
|
|
65
|
+
return loadCommand('../commands/case.js', 'cmdCase', flags, argv, quiet);
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
export function cmdHook(flags) {
|
|
64
|
-
|
|
65
|
-
return mod.cmdHook(flags);
|
|
69
|
+
return loadCommand('../commands/hook.js', 'cmdHook', flags);
|
|
66
70
|
}
|
|
67
71
|
|
|
68
72
|
export async function cmdGraph(flags, quiet) {
|
|
69
|
-
|
|
70
|
-
return mod.cmdGraph(flags, quiet);
|
|
73
|
+
return loadCommand('../commands/graph.js', 'cmdGraph', flags, quiet);
|
|
71
74
|
}
|
|
72
75
|
|
|
73
76
|
export async function cmdMutate(flags, argv) {
|
|
74
|
-
|
|
75
|
-
return mod.cmdMutate(flags, argv);
|
|
77
|
+
return loadCommand('../commands/mutate.js', 'cmdMutate', flags, argv);
|
|
76
78
|
}
|
|
77
79
|
|
|
78
80
|
export function cmdContext(flags, argv) {
|
|
79
|
-
|
|
80
|
-
return mod.cmdContext(flags, argv);
|
|
81
|
+
return loadCommand('../commands/context.js', 'cmdContext', flags, argv);
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
export async function cmdSync() {
|
|
84
|
-
|
|
85
|
-
return mod.cmdSync();
|
|
85
|
+
return loadCommand('../commands/sync.js', 'cmdSync');
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
export async function cmdAlign(flags, argv, quiet) {
|
|
89
|
-
|
|
90
|
-
return mod.cmdAlign(flags, argv, quiet);
|
|
89
|
+
return loadCommand('../commands/align.js', 'cmdAlign', flags, argv, quiet);
|
|
91
90
|
}
|
|
92
91
|
|
|
93
92
|
export async function cmdMarathon(flags, argv, quiet) {
|
|
94
|
-
|
|
95
|
-
return mod.cmdMarathon(flags, argv, quiet);
|
|
93
|
+
return loadCommand('../commands/marathon.js', 'cmdMarathon', flags, argv, quiet);
|
|
96
94
|
}
|
|
97
95
|
|
|
98
96
|
export async function cmdCompile(flags, quiet) {
|
|
99
|
-
|
|
100
|
-
return mod.cmdCompile(flags, quiet);
|
|
97
|
+
return loadCommand('../commands/compile.js', 'cmdCompile', flags, quiet);
|
|
101
98
|
}
|
|
102
99
|
|
|
103
100
|
export async function cmdMemory(flags, argv, quiet) {
|
|
104
|
-
|
|
105
|
-
return mod.cmdMemory(flags, argv, quiet);
|
|
101
|
+
return loadCommand('../commands/memory.js', 'cmdMemory', flags, argv, quiet);
|
|
106
102
|
}
|
|
107
103
|
|
|
108
104
|
export function cmdUninstall(flags, quiet) {
|
|
109
|
-
|
|
110
|
-
return mod.cmdUninstall(flags, quiet);
|
|
105
|
+
return loadCommand('../commands/uninstall.js', 'cmdUninstall', flags, quiet);
|
|
111
106
|
}
|
|
112
107
|
|
|
113
108
|
export async function generateIDEBridges(cwd, agentDest, quiet) {
|
|
114
|
-
|
|
115
|
-
|
|
109
|
+
return loadCommand('../commands/init.js', 'generateIDEBridges', cwd, agentDest, quiet);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export async function cmdGuardrail(flags, argv, quiet) {
|
|
113
|
+
return loadCommand('../commands/guardrail.js', 'cmdGuardrail', flags, argv, quiet);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export async function cmdOptimizeSkill(flags, argv, quiet) {
|
|
117
|
+
return loadCommand('../commands/optimize.js', 'cmdOptimizeSkill', flags, argv, quiet);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function cmdMinimal(flags, quiet) {
|
|
121
|
+
return loadCommand('../commands/minimal.js', 'cmdMinimal', flags, quiet);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function cmdValidate(flags, argv, quiet) {
|
|
125
|
+
return loadCommand('../commands/validate.js', 'cmdValidate', flags, argv, quiet);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function cmdMinContext(argv, quiet) {
|
|
129
|
+
return loadCommand('../commands/native.js', 'cmdMinContext', argv, quiet);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function cmdDagSchedule(argv, quiet) {
|
|
133
|
+
return loadCommand('../commands/native.js', 'cmdDagSchedule', argv, quiet);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function cmdContextCompress(argv, quiet) {
|
|
137
|
+
return loadCommand('../commands/native.js', 'cmdContextCompress', argv, quiet);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function cmdOptimizeStep(argv, quiet) {
|
|
141
|
+
return loadCommand('../commands/native.js', 'cmdOptimizeStep', argv, quiet);
|
|
116
142
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -37,8 +37,8 @@ export interface CliFlags {
|
|
|
37
37
|
log?: string;
|
|
38
38
|
/** Memory mutation strategy: 'balanced' | 'harden' | 'repair-only'. */
|
|
39
39
|
strategy?: string;
|
|
40
|
-
/**
|
|
41
|
-
|
|
40
|
+
/** Install profile: 'full' | 'minimal' | 'web' | 'mobile' | 'backend' | 'ai'. */
|
|
41
|
+
profile?: string;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/** Parsed CLI arguments returned by the internal arg parser. */
|
|
@@ -145,6 +145,54 @@ export function cmdUninstall(flags: CliFlags, quiet?: boolean): void;
|
|
|
145
145
|
*/
|
|
146
146
|
export function generateIDEBridges(cwd: string, agentDest: string, quiet?: boolean): Promise<void>;
|
|
147
147
|
|
|
148
|
+
/**
|
|
149
|
+
* Validate `.agent/` integrity (phantom refs, count mismatches, drift).
|
|
150
|
+
* Equivalent to `npx tribunal-kit guardrail`.
|
|
151
|
+
*/
|
|
152
|
+
export function cmdGuardrail(flags: CliFlags, argv: string[], quiet?: boolean): Promise<void>;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Optimize project skills using SkillOpt validation gates.
|
|
156
|
+
* Equivalent to `npx tribunal-kit optimize-skill`.
|
|
157
|
+
*/
|
|
158
|
+
export function cmdOptimizeSkill(flags: CliFlags, argv: string[], quiet?: boolean): Promise<void>;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Show minimal change analysis for the current project.
|
|
162
|
+
* Equivalent to `npx tribunal-kit minimal`.
|
|
163
|
+
*/
|
|
164
|
+
export function cmdMinimal(flags: CliFlags, quiet?: boolean): void;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Validate a JSON payload against a Tribunal schema.
|
|
168
|
+
* Equivalent to `npx tribunal-kit validate`.
|
|
169
|
+
*/
|
|
170
|
+
export function cmdValidate(flags: CliFlags, argv: string[], quiet?: boolean): void;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Remove empty lines from a context file.
|
|
174
|
+
* Equivalent to `npx tribunal-kit min-context`.
|
|
175
|
+
*/
|
|
176
|
+
export function cmdMinContext(argv: string[], quiet?: boolean): void;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Compute parallel execution waves from task dependencies.
|
|
180
|
+
* Equivalent to `npx tribunal-kit dag-schedule`.
|
|
181
|
+
*/
|
|
182
|
+
export function cmdDagSchedule(argv: string[], quiet?: boolean): void;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Compress a context file while retaining VERIFY comments.
|
|
186
|
+
* Equivalent to `npx tribunal-kit context-compress`.
|
|
187
|
+
*/
|
|
188
|
+
export function cmdContextCompress(argv: string[], quiet?: boolean): void;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Apply bounded SkillOpt edits from a JSON payload.
|
|
192
|
+
* Equivalent to `npx tribunal-kit optimize-step`.
|
|
193
|
+
*/
|
|
194
|
+
export function cmdOptimizeStep(argv: string[], quiet?: boolean): void;
|
|
195
|
+
|
|
148
196
|
// ── Logger Utilities ─────────────────────────────────────────────────────────
|
|
149
197
|
|
|
150
198
|
/** ANSI color code map. */
|
package/dist/utils/fs.js
CHANGED
|
@@ -12,7 +12,10 @@ const logger_1 = require("./logger");
|
|
|
12
12
|
// Concurrency limit for parallel file operations to avoid fd exhaustion
|
|
13
13
|
const COPY_CONCURRENCY = 32;
|
|
14
14
|
|
|
15
|
-
async function copyDir(src, dest, dryRun = false, filter = null) {
|
|
15
|
+
async function copyDir(src, dest, dryRun = false, filter = null, currentDepth = 0) {
|
|
16
|
+
if (currentDepth > 20) {
|
|
17
|
+
throw new Error(`Maximum directory copy depth (20) exceeded at: ${src}`);
|
|
18
|
+
}
|
|
16
19
|
if (!dryRun) {
|
|
17
20
|
await fs_1.default.promises.mkdir(dest, { recursive: true });
|
|
18
21
|
}
|
|
@@ -51,7 +54,7 @@ async function copyDir(src, dest, dryRun = false, filter = null) {
|
|
|
51
54
|
|
|
52
55
|
// Recurse into directories in parallel (dirs are I/O-independent)
|
|
53
56
|
const dirResults = await Promise.all(
|
|
54
|
-
dirs.map(({ srcPath, destPath }) => copyDir(srcPath, destPath, dryRun, filter))
|
|
57
|
+
dirs.map(({ srcPath, destPath }) => copyDir(srcPath, destPath, dryRun, filter, currentDepth + 1))
|
|
55
58
|
);
|
|
56
59
|
for (const dirCount of dirResults) {
|
|
57
60
|
count += dirCount;
|
|
@@ -59,12 +62,15 @@ async function copyDir(src, dest, dryRun = false, filter = null) {
|
|
|
59
62
|
|
|
60
63
|
return count;
|
|
61
64
|
}
|
|
62
|
-
async function countDir(dir) {
|
|
65
|
+
async function countDir(dir, currentDepth = 0) {
|
|
66
|
+
if (currentDepth > 20) {
|
|
67
|
+
throw new Error(`Maximum directory count depth (20) exceeded at: ${dir}`);
|
|
68
|
+
}
|
|
63
69
|
let count = 0;
|
|
64
70
|
const entries = await fs_1.default.promises.readdir(dir, { withFileTypes: true });
|
|
65
71
|
for (const e of entries) {
|
|
66
72
|
if (e.isDirectory())
|
|
67
|
-
count += await countDir(path_1.default.join(dir, e.name));
|
|
73
|
+
count += await countDir(path_1.default.join(dir, e.name), currentDepth + 1);
|
|
68
74
|
else
|
|
69
75
|
count++;
|
|
70
76
|
}
|
package/dist/utils/helpers.js
CHANGED
|
@@ -12,14 +12,23 @@ const path_1 = __importDefault(require("path"));
|
|
|
12
12
|
const logger_1 = require("./logger");
|
|
13
13
|
function runShellAsync(command, options) {
|
|
14
14
|
return new Promise((resolve, reject) => {
|
|
15
|
+
const timeoutMs = (options && options.timeout) || 120000;
|
|
15
16
|
const child = (0, child_process_1.spawn)(command, [], { ...options, shell: true });
|
|
17
|
+
const timer = setTimeout(() => {
|
|
18
|
+
child.kill('SIGTERM');
|
|
19
|
+
reject(new Error(`Command timed out after ${timeoutMs}ms: ${command}`));
|
|
20
|
+
}, timeoutMs);
|
|
16
21
|
child.on('close', code => {
|
|
22
|
+
clearTimeout(timer);
|
|
17
23
|
if (code !== 0)
|
|
18
24
|
reject(new Error(`Command failed with exit code ${code}`));
|
|
19
25
|
else
|
|
20
26
|
resolve();
|
|
21
27
|
});
|
|
22
|
-
child.on('error',
|
|
28
|
+
child.on('error', err => {
|
|
29
|
+
clearTimeout(timer);
|
|
30
|
+
reject(err);
|
|
31
|
+
});
|
|
23
32
|
});
|
|
24
33
|
}
|
|
25
34
|
function getKitAgent() {
|