tribunal-kit 6.0.0 → 7.0.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/.manifest.json +78 -0
- package/.agent/ARCHITECTURE.md +19 -241
- package/.agent/agents/accessibility-reviewer.md +23 -16
- package/.agent/agents/ai-code-reviewer.md +25 -21
- package/.agent/agents/anti-pattern-reviewer.md +12 -7
- package/.agent/agents/api-architect.md +1 -0
- package/.agent/agents/backend-specialist.md +23 -22
- package/.agent/agents/cloud-engineer.md +1 -0
- package/.agent/agents/code-archaeologist.md +1 -0
- package/.agent/agents/complexity-reviewer.md +10 -7
- package/.agent/agents/database-architect.md +3 -2
- package/.agent/agents/db-latency-auditor.md +6 -2
- package/.agent/agents/debugger.md +3 -2
- package/.agent/agents/dependency-reviewer.md +1 -0
- package/.agent/agents/devops-engineer.md +9 -8
- package/.agent/agents/documentation-writer.md +6 -5
- package/.agent/agents/explorer-agent.md +1 -0
- package/.agent/agents/frontend-reviewer.md +21 -17
- package/.agent/agents/frontend-specialist.md +23 -20
- package/.agent/agents/game-developer.md +1 -0
- package/.agent/agents/interaction-reviewer.md +10 -5
- package/.agent/agents/logic-reviewer.md +3 -0
- package/.agent/agents/minimalist-reviewer.md +6 -0
- package/.agent/agents/mobile-developer.md +7 -6
- package/.agent/agents/mobile-reviewer.md +14 -13
- package/.agent/agents/orchestrator.md +3 -0
- package/.agent/agents/penetration-tester.md +1 -0
- package/.agent/agents/performance-optimizer.md +6 -5
- package/.agent/agents/performance-reviewer.md +6 -6
- package/.agent/agents/pipeline-reviewer.md +144 -0
- package/.agent/agents/precedence-reviewer.md +1 -0
- package/.agent/agents/product-manager.md +1 -0
- package/.agent/agents/product-owner.md +1 -0
- package/.agent/agents/product-reviewer.md +12 -7
- package/.agent/agents/project-planner.md +3 -0
- package/.agent/agents/qa-automation-engineer.md +50 -43
- package/.agent/agents/resilience-reviewer.md +1 -0
- package/.agent/agents/schema-reviewer.md +1 -0
- package/.agent/agents/security-auditor.md +24 -24
- package/.agent/agents/seo-specialist.md +33 -23
- package/.agent/agents/sql-reviewer.md +5 -4
- package/.agent/agents/supervisor-agent.md +12 -2
- package/.agent/agents/swarm-worker-contracts.md +13 -13
- package/.agent/agents/swarm-worker-registry.md +51 -51
- package/.agent/agents/system-architect.md +1 -0
- package/.agent/agents/test-coverage-reviewer.md +25 -22
- package/.agent/agents/test-engineer.md +12 -11
- package/.agent/agents/throughput-optimizer.md +45 -40
- package/.agent/agents/type-safety-reviewer.md +5 -4
- package/.agent/agents/ui-ux-auditor.md +6 -4
- package/.agent/agents/ui-visual-auditor.md +3 -0
- package/.agent/agents/ux-reviewer.md +11 -6
- package/.agent/agents/visual-reviewer.md +11 -6
- package/.agent/agents/vitals-reviewer.md +5 -4
- package/.agent/history/memory/.memory.idx +3716 -1
- package/.agent/history/memory/MEMORY.md +246 -1
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2034 -263
- package/.agent/rules/GEMINI.md +12 -10
- package/.agent/rules/GEMINI_PLANNER.md +19 -21
- package/.agent/scripts/_colors.js +52 -54
- package/.agent/scripts/_utils.js +52 -53
- package/.agent/scripts/auto_preview.js +39 -43
- package/.agent/scripts/bundle_analyzer.js +47 -60
- package/.agent/scripts/case_law_manager.js +200 -294
- package/.agent/scripts/checklist.js +73 -94
- package/.agent/scripts/cicd_validator.js +305 -0
- package/.agent/scripts/compile_router.py +4 -111
- package/.agent/scripts/context_broker.js +317 -412
- package/.agent/scripts/contract_engine.js +402 -0
- package/.agent/scripts/dependency_analyzer.js +112 -124
- package/.agent/scripts/graph_builder.js +75 -103
- package/.agent/scripts/graph_visualizer.js +10 -12
- package/.agent/scripts/graph_zoom.js +38 -55
- package/.agent/scripts/guardrail_engine.js +195 -145
- package/.agent/scripts/impact_classifier.js +55 -30
- package/.agent/scripts/inner_loop_validator.js +108 -159
- package/.agent/scripts/integrity_manifest.js +59 -67
- package/.agent/scripts/lint_runner.js +65 -75
- package/.agent/scripts/marathon_harness.js +131 -208
- package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
- package/.agent/scripts/minify_context.js +29 -33
- package/.agent/scripts/minimal_change_engine.js +95 -87
- package/.agent/scripts/mutation_runner.js +46 -62
- package/.agent/scripts/pipeline_engine.js +320 -209
- package/.agent/scripts/prompt_compiler.js +118 -93
- package/.agent/scripts/schema_validator.js +73 -121
- package/.agent/scripts/security_scan.js +88 -117
- package/.agent/scripts/session_manager.js +52 -69
- package/.agent/scripts/signal_detector.js +24 -22
- package/.agent/scripts/skill_evolution.js +184 -245
- package/.agent/scripts/skill_integrator.js +35 -48
- package/.agent/scripts/socratic_gate_policy.js +15 -12
- package/.agent/scripts/strengthen_skills.js +29 -33
- package/.agent/scripts/swarm_dispatcher.js +120 -151
- package/.agent/scripts/test_runner.js +54 -56
- package/.agent/scripts/token_budget_broker.js +9 -7
- package/.agent/scripts/trace_engine.js +126 -0
- package/.agent/scripts/verify_all.js +76 -93
- package/.agent/scripts/visual_audit.js +16 -21
- package/.agent/skill_topic_map.json +237 -0
- package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
- package/.agent/skills/60fps-animation/SKILL.md +7 -0
- package/.agent/skills/accessible-animation/SKILL.md +5 -1
- package/.agent/skills/adapt/SKILL.md +7 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
- package/.agent/skills/agent-organizer/SKILL.md +1 -0
- package/.agent/skills/agentic-patterns/SKILL.md +33 -25
- package/.agent/skills/agentic-workflows-2026/SKILL.md +80 -0
- package/.agent/skills/ai-app-hardening/SKILL.md +59 -0
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
- package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
- package/.agent/skills/animation-systems/SKILL.md +11 -10
- package/.agent/skills/antfu-conventions/SKILL.md +7 -2
- package/.agent/skills/api-patterns/SKILL.md +14 -10
- package/.agent/skills/api-security-auditor/SKILL.md +15 -14
- package/.agent/skills/app-builder/SKILL.md +1 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
- package/.agent/skills/apple-design/SKILL.md +8 -7
- package/.agent/skills/architecture/SKILL.md +3 -2
- package/.agent/skills/audit-and-fix/SKILL.md +8 -5
- package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
- package/.agent/skills/backend-security-expert/SKILL.md +1 -0
- package/.agent/skills/baseline-ui/SKILL.md +8 -7
- package/.agent/skills/bash-linux/SKILL.md +1 -0
- package/.agent/skills/behavioral-modes/SKILL.md +1 -0
- package/.agent/skills/better-colors/SKILL.md +11 -7
- package/.agent/skills/better-typography/SKILL.md +30 -16
- package/.agent/skills/better-ui/SKILL.md +17 -10
- package/.agent/skills/bolder/SKILL.md +6 -0
- package/.agent/skills/brainstorming/SKILL.md +6 -4
- package/.agent/skills/browser-native-ai/SKILL.md +5 -4
- package/.agent/skills/build-primitive/SKILL.md +5 -0
- package/.agent/skills/building-native-ui/SKILL.md +1 -0
- package/.agent/skills/cicd-pro/SKILL.md +2 -1
- package/.agent/skills/clarify/SKILL.md +19 -14
- package/.agent/skills/clean-code/SKILL.md +16 -15
- package/.agent/skills/cloud-architect/SKILL.md +1 -0
- package/.agent/skills/cobejs/SKILL.md +7 -9
- package/.agent/skills/code-review-checklist/SKILL.md +1 -0
- package/.agent/skills/codebase-design/SKILL.md +7 -2
- package/.agent/skills/colorize/SKILL.md +8 -3
- package/.agent/skills/compact-landing/SKILL.md +8 -3
- package/.agent/skills/company-logos/SKILL.md +6 -0
- package/.agent/skills/config-validator/SKILL.md +10 -9
- package/.agent/skills/containerization-pro/SKILL.md +6 -5
- package/.agent/skills/context-engineering-pro/SKILL.md +70 -0
- package/.agent/skills/create-design-md/SKILL.md +13 -5
- package/.agent/skills/critique/SKILL.md +10 -8
- package/.agent/skills/csharp-developer/SKILL.md +1 -0
- package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
- package/.agent/skills/database-design/SKILL.md +2 -1
- package/.agent/skills/delight/SKILL.md +6 -0
- package/.agent/skills/deployment-procedures/SKILL.md +2 -1
- package/.agent/skills/design-lab/SKILL.md +5 -0
- package/.agent/skills/devops-engineer/SKILL.md +3 -2
- package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
- package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
- package/.agent/skills/distill/SKILL.md +7 -2
- package/.agent/skills/documentation-templates/SKILL.md +3 -2
- package/.agent/skills/domain-modeling/SKILL.md +12 -4
- package/.agent/skills/duckdb-analytical-sql/SKILL.md +59 -0
- package/.agent/skills/edge-ai-mobile/SKILL.md +50 -0
- package/.agent/skills/edge-computing/SKILL.md +9 -8
- package/.agent/skills/emil-design-eng/SKILL.md +43 -27
- package/.agent/skills/error-resilience/SKILL.md +34 -16
- package/.agent/skills/expo-router-v4/SKILL.md +81 -0
- package/.agent/skills/extract-design-system/SKILL.md +12 -11
- package/.agent/skills/fabel-protocol/SKILL.md +24 -17
- package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
- package/.agent/skills/fixing-metadata/SKILL.md +24 -13
- package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
- package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
- package/.agent/skills/frontend-design/SKILL.md +21 -13
- package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
- package/.agent/skills/game-design-expert/SKILL.md +1 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
- package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
- package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
- package/.agent/skills/git-pro/SKILL.md +10 -9
- package/.agent/skills/github-operations/SKILL.md +2 -1
- package/.agent/skills/gpt-taste/SKILL.md +7 -0
- package/.agent/skills/gsap-core/SKILL.md +26 -22
- package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
- package/.agent/skills/gsap-performance/SKILL.md +4 -3
- package/.agent/skills/gsap-plugins/SKILL.md +34 -33
- package/.agent/skills/gsap-react/SKILL.md +9 -8
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
- package/.agent/skills/gsap-timeline/SKILL.md +18 -15
- package/.agent/skills/gsap-utils/SKILL.md +25 -24
- package/.agent/skills/harden/SKILL.md +9 -3
- package/.agent/skills/harness-protocol/SKILL.md +1 -0
- package/.agent/skills/i18n-localization/SKILL.md +10 -9
- package/.agent/skills/impeccable/SKILL.md +5 -0
- package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
- package/.agent/skills/improve-ui/SKILL.md +12 -5
- package/.agent/skills/intelligent-routing/SKILL.md +7 -6
- package/.agent/skills/knowledge-graph/SKILL.md +1 -0
- package/.agent/skills/landing-page/SKILL.md +1 -0
- package/.agent/skills/lint-and-validate/SKILL.md +9 -4
- package/.agent/skills/llm-engineering/SKILL.md +55 -54
- package/.agent/skills/local-first/SKILL.md +20 -19
- package/.agent/skills/local-first-architecture/SKILL.md +6 -1
- package/.agent/skills/lottie-animation/SKILL.md +7 -3
- package/.agent/skills/marquee-loop/SKILL.md +1 -0
- package/.agent/skills/masked-reveal/SKILL.md +17 -4
- package/.agent/skills/mcp-builder/SKILL.md +13 -10
- package/.agent/skills/micro-interaction/SKILL.md +20 -5
- package/.agent/skills/mobile-design/SKILL.md +26 -15
- package/.agent/skills/monorepo-management/SKILL.md +3 -2
- package/.agent/skills/morphing-icons/SKILL.md +16 -6
- package/.agent/skills/motion-engineering/SKILL.md +19 -15
- package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
- package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
- package/.agent/skills/observability/SKILL.md +45 -44
- package/.agent/skills/opentelemetry-observability/SKILL.md +59 -0
- package/.agent/skills/page-transition-animation/SKILL.md +6 -3
- package/.agent/skills/parallel-agents/SKILL.md +7 -2
- package/.agent/skills/performance-profiling/SKILL.md +24 -13
- package/.agent/skills/plan-writing/SKILL.md +1 -0
- package/.agent/skills/platform-engineer/SKILL.md +3 -2
- package/.agent/skills/platform-engineering-opentofu/SKILL.md +68 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +60 -0
- package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
- package/.agent/skills/polish/SKILL.md +13 -12
- package/.agent/skills/powershell-windows/SKILL.md +1 -0
- package/.agent/skills/pricing-page/SKILL.md +8 -3
- package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
- package/.agent/skills/progressive-blur/SKILL.md +9 -4
- package/.agent/skills/project-idioms/SKILL.md +1 -0
- package/.agent/skills/property-based-testing/SKILL.md +58 -0
- package/.agent/skills/python-patterns/SKILL.md +1 -0
- package/.agent/skills/python-pro/SKILL.md +1 -0
- package/.agent/skills/quieter/SKILL.md +6 -0
- package/.agent/skills/react-doctor/SKILL.md +6 -0
- package/.agent/skills/react-specialist/SKILL.md +32 -28
- package/.agent/skills/readme-builder/SKILL.md +1 -0
- package/.agent/skills/realtime-patterns/SKILL.md +34 -33
- package/.agent/skills/red-team-tactics/SKILL.md +1 -0
- package/.agent/skills/redesign-skill/SKILL.md +6 -0
- package/.agent/skills/review-animations/SKILL.md +5 -2
- package/.agent/skills/review-animations/STANDARDS.md +37 -23
- package/.agent/skills/rust-pro/SKILL.md +1 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
- package/.agent/skills/server-management/SKILL.md +1 -0
- package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
- package/.agent/skills/shape/SKILL.md +9 -2
- package/.agent/skills/skill-creator/SKILL.md +1 -0
- package/.agent/skills/soft-skill/SKILL.md +6 -0
- package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
- package/.agent/skills/sql-pro/SKILL.md +1 -0
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
- package/.agent/skills/svg-animation/SKILL.md +16 -7
- package/.agent/skills/swiftui-expert/SKILL.md +1 -0
- package/.agent/skills/swiss-design/SKILL.md +5 -0
- package/.agent/skills/system-design-pro/SKILL.md +1 -0
- package/.agent/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
- package/.agent/skills/taste-skill/SKILL.md +6 -0
- package/.agent/skills/tdd-workflow/SKILL.md +5 -0
- package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
- package/.agent/skills/testing-patterns/SKILL.md +123 -115
- package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
- package/.agent/skills/thinking-protocol/SKILL.md +3 -0
- package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
- package/.agent/skills/transitions-dev/SKILL.md +19 -6
- package/.agent/skills/trend-researcher/SKILL.md +1 -0
- package/.agent/skills/typescript-advanced/SKILL.md +23 -18
- package/.agent/skills/typeset/SKILL.md +10 -1
- package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
- package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
- package/.agent/skills/ui-skills-root/SKILL.md +39 -38
- package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
- package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
- package/.agent/skills/vector-search-pgvector/SKILL.md +78 -0
- package/.agent/skills/vue-expert/SKILL.md +22 -19
- package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
- package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
- package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
- package/.agent/skills/web-quality-audit/SKILL.md +5 -0
- package/.agent/skills/webapp-testing/SKILL.md +14 -13
- package/.agent/skills/webgpu-performance/SKILL.md +1 -0
- package/.agent/skills/whimsy-injector/SKILL.md +9 -5
- package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
- package/.agent/skills/zero-trust-passkeys/SKILL.md +90 -0
- package/.agent/templates/DESIGN.md +119 -110
- package/.agent/templates/design-tokens.json +9 -6
- package/.agent/workflows/acf.md +1 -0
- package/.agent/workflows/api-tester.md +1 -0
- package/.agent/workflows/audit.md +1 -0
- package/.agent/workflows/brainstorm.md +1 -0
- package/.agent/workflows/changelog.md +1 -0
- package/.agent/workflows/contract.md +60 -0
- package/.agent/workflows/create.md +1 -0
- package/.agent/workflows/debug.md +1 -0
- package/.agent/workflows/deploy.md +1 -0
- package/.agent/workflows/enhance.md +1 -0
- package/.agent/workflows/fix-ci.md +89 -0
- package/.agent/workflows/fix.md +1 -0
- package/.agent/workflows/generate.md +1 -0
- package/.agent/workflows/marathon.md +1 -0
- package/.agent/workflows/migrate.md +1 -0
- package/.agent/workflows/minimal.md +9 -7
- package/.agent/workflows/orchestrate.md +1 -0
- package/.agent/workflows/performance-benchmarker.md +1 -0
- package/.agent/workflows/pipeline.md +26 -21
- package/.agent/workflows/plan.md +1 -0
- package/.agent/workflows/preview.md +1 -0
- package/.agent/workflows/refactor.md +3 -2
- package/.agent/workflows/review-ai.md +4 -3
- package/.agent/workflows/review.md +1 -0
- package/.agent/workflows/session.md +1 -0
- package/.agent/workflows/status.md +1 -0
- package/.agent/workflows/strengthen-skills.md +1 -0
- package/.agent/workflows/super-prompt.md +1 -0
- package/.agent/workflows/swarm.md +15 -3
- package/.agent/workflows/test.md +8 -7
- package/.agent/workflows/tribunal-backend.md +3 -2
- package/.agent/workflows/tribunal-cicd.md +104 -0
- package/.agent/workflows/tribunal-database.md +1 -0
- package/.agent/workflows/tribunal-frontend.md +8 -6
- package/.agent/workflows/tribunal-full.md +15 -14
- package/.agent/workflows/tribunal-mobile.md +6 -5
- package/.agent/workflows/tribunal-performance.md +1 -0
- package/.agent/workflows/tribunal-speed.md +1 -0
- package/.agent/workflows/tribunal-ui.md +29 -21
- package/.agent/workflows/ui-ux-pro-max.md +19 -15
- package/CONTRIBUTING.md +3 -3
- package/README.md +160 -88
- package/SECURITY.md +11 -11
- package/bin/mcp-server.js +512 -233
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +45 -48
- package/dist/cli.js +26 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/memory.js +3 -2
- package/dist/commands/native.js +36 -0
- package/dist/commands/status.js +6 -0
- package/dist/esm/index.mjs +32 -0
- package/dist/index.d.ts +58 -3
- package/package.json +20 -16
- package/scripts/benchmark.js +62 -86
- package/scripts/changelog.js +67 -73
- package/scripts/fix-vbc.js +13 -15
- package/scripts/fix-vbc.ps1 +2 -118
- package/scripts/stress_benchmark.js +358 -0
- package/scripts/sync-version.js +71 -41
- package/scripts/validate-payload.js +23 -30
- package/scripts/visual_audit.js +23 -13
|
@@ -1,64 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"""
|
|
2
|
+
DEPRECATED — Legacy Python frontmatter migration script.
|
|
3
|
+
Skill frontmatter and VBC protocol verification is managed by node scripts/fix-vbc.js and node .agent/scripts/strengthen_skills.js.
|
|
4
|
+
"""
|
|
5
5
|
|
|
6
|
-
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
|
|
7
|
-
|
|
8
|
-
AGENT_DIR = Path(__file__).parent.parent
|
|
9
|
-
SKILLS_DIR = AGENT_DIR / "skills"
|
|
10
|
-
|
|
11
|
-
FRONTMATTER_REGEX = re.compile(r"^---\n(.*?)\n---", re.DOTALL | re.MULTILINE)
|
|
12
|
-
|
|
13
|
-
def inject_routing_frontmatter(content: str) -> str:
|
|
14
|
-
"""Injects a baseline routing block into the YAML frontmatter if it doesn't exist."""
|
|
15
|
-
match = FRONTMATTER_REGEX.search(content)
|
|
16
|
-
if not match:
|
|
17
|
-
return content
|
|
18
|
-
|
|
19
|
-
frontmatter_text = match.group(1)
|
|
20
|
-
|
|
21
|
-
if "\nrouting:" in frontmatter_text or frontmatter_text.startswith("routing:"):
|
|
22
|
-
# Already migrated
|
|
23
|
-
return content
|
|
24
|
-
|
|
25
|
-
# Append the routing block to the end of the frontmatter
|
|
26
|
-
new_routing_block = "\nrouting:\n domain: general\n tier: basic"
|
|
27
|
-
new_frontmatter = frontmatter_text + new_routing_block
|
|
28
|
-
|
|
29
|
-
# Replace the old frontmatter with the new one
|
|
30
|
-
new_content = content[:match.start(1)] + new_frontmatter + content[match.end(1):]
|
|
31
|
-
return new_content
|
|
32
|
-
|
|
33
|
-
def main():
|
|
34
|
-
if not SKILLS_DIR.exists():
|
|
35
|
-
logging.error(f"Skills directory not found: {SKILLS_DIR}")
|
|
36
|
-
return
|
|
37
|
-
|
|
38
|
-
skill_dirs = [d for d in SKILLS_DIR.iterdir() if d.is_dir()]
|
|
39
|
-
migrated_count = 0
|
|
40
|
-
skipped_count = 0
|
|
41
|
-
|
|
42
|
-
logging.info(f"Scanning {len(skill_dirs)} skill directories for migration...")
|
|
43
|
-
|
|
44
|
-
for skill_dir in skill_dirs:
|
|
45
|
-
skill_file = skill_dir / "SKILL.md"
|
|
46
|
-
if not skill_file.exists():
|
|
47
|
-
continue
|
|
48
|
-
|
|
49
|
-
with open(skill_file, "r", encoding="utf-8") as f:
|
|
50
|
-
content = f.read()
|
|
51
|
-
|
|
52
|
-
new_content = inject_routing_frontmatter(content)
|
|
53
|
-
|
|
54
|
-
if new_content != content:
|
|
55
|
-
with open(skill_file, "w", encoding="utf-8") as f:
|
|
56
|
-
f.write(new_content)
|
|
57
|
-
migrated_count += 1
|
|
58
|
-
else:
|
|
59
|
-
skipped_count += 1
|
|
60
|
-
|
|
61
|
-
logging.info(f"Migration complete: {migrated_count} files updated, {skipped_count} skipped.")
|
|
62
|
-
|
|
63
|
-
if __name__ == "__main__":
|
|
64
|
-
main()
|
|
@@ -4,74 +4,70 @@
|
|
|
4
4
|
* Minifies markdown documentation in the .agent directory to save tokens.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
'use strict';
|
|
8
8
|
|
|
9
|
-
const fs = require(
|
|
10
|
-
const path = require(
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
11
|
|
|
12
12
|
function minifyMarkdown(filePath) {
|
|
13
|
-
let content = fs.readFileSync(filePath,
|
|
13
|
+
let content = fs.readFileSync(filePath, 'utf8');
|
|
14
14
|
const originalLen = content.length;
|
|
15
15
|
|
|
16
16
|
// 1. Strip repetitive Output Format templates
|
|
17
|
-
content = content.replace(/## Output Format\n\n```[\s\S]*?```\n/g,
|
|
17
|
+
content = content.replace(/## Output Format\n\n```[\s\S]*?```\n/g, '');
|
|
18
18
|
|
|
19
19
|
// 2. Convert bloated Cross-Workflow Navigation tables to dense YAML lists
|
|
20
20
|
content = content.replace(
|
|
21
21
|
/## Cross-Workflow Navigation\n\n\|.*?\|[\s\S]*?(?=\n## |\Z)/g,
|
|
22
|
-
|
|
23
|
-
const lines = match.trim().split(
|
|
22
|
+
match => {
|
|
23
|
+
const lines = match.trim().split('\n');
|
|
24
24
|
const out = [];
|
|
25
25
|
for (const line of lines) {
|
|
26
|
-
if (
|
|
27
|
-
line.startsWith("|") &&
|
|
28
|
-
!line.startsWith("|:") &&
|
|
29
|
-
!line.startsWith("| After")
|
|
30
|
-
) {
|
|
26
|
+
if (line.startsWith('|') && !line.startsWith('|:') && !line.startsWith('| After')) {
|
|
31
27
|
const parts = line
|
|
32
|
-
.split(
|
|
33
|
-
.map(
|
|
28
|
+
.split('|')
|
|
29
|
+
.map(p => p.trim())
|
|
34
30
|
.filter(Boolean);
|
|
35
31
|
if (parts.length >= 2) {
|
|
36
32
|
out.push(`- ${parts[0]} -> ${parts[1]}`);
|
|
37
33
|
}
|
|
38
34
|
}
|
|
39
35
|
}
|
|
40
|
-
return
|
|
36
|
+
return '## Cross-Workflow Navigation\n' + out.join('\n') + '\n';
|
|
41
37
|
},
|
|
42
38
|
);
|
|
43
39
|
|
|
44
40
|
// 3. Collapse multiple empty lines into a single one
|
|
45
|
-
content = content.replace(/\n{3,}/g,
|
|
41
|
+
content = content.replace(/\n{3,}/g, '\n\n');
|
|
46
42
|
|
|
47
43
|
// 4. Remove padding from remaining tables to save space tokens
|
|
48
|
-
content = content.replace(/^\|.+|$/gm,
|
|
44
|
+
content = content.replace(/^\|.+|$/gm, match => {
|
|
49
45
|
let line = match;
|
|
50
46
|
// remove spaces around |
|
|
51
|
-
line = line.replace(/\s+\|\s+/g,
|
|
52
|
-
line = line.replace(/\|\s+/g,
|
|
53
|
-
line = line.replace(/\s+\|/g,
|
|
47
|
+
line = line.replace(/\s+\|\s+/g, '|');
|
|
48
|
+
line = line.replace(/\|\s+/g, '|');
|
|
49
|
+
line = line.replace(/\s+\|/g, '|');
|
|
54
50
|
return line;
|
|
55
51
|
});
|
|
56
52
|
|
|
57
53
|
// 5. Remove conversational blockquotes > if they don't contain WARNING/NOTE/IMPORTANT
|
|
58
|
-
content = content.replace(/^>.*$/gm,
|
|
54
|
+
content = content.replace(/^>.*$/gm, match => {
|
|
59
55
|
if (
|
|
60
|
-
match.includes(
|
|
61
|
-
match.includes(
|
|
62
|
-
match.includes(
|
|
63
|
-
match.includes(
|
|
56
|
+
match.includes('⚠️') ||
|
|
57
|
+
match.includes('WARNING') ||
|
|
58
|
+
match.includes('CRITICAL') ||
|
|
59
|
+
match.includes('!')
|
|
64
60
|
) {
|
|
65
61
|
return match;
|
|
66
62
|
}
|
|
67
|
-
return match.replace(/> /g,
|
|
63
|
+
return match.replace(/> /g, '').replace(/>/g, '');
|
|
68
64
|
});
|
|
69
65
|
|
|
70
66
|
// 6. Dense Examples (convert ❌ Bad: and ✅ Good: blocks to single lines)
|
|
71
|
-
content = content.replace(/\n❌ Bad:/g,
|
|
72
|
-
content = content.replace(/\n✅ Good:/g,
|
|
67
|
+
content = content.replace(/\n❌ Bad:/g, ' ❌');
|
|
68
|
+
content = content.replace(/\n✅ Good:/g, ' ✅');
|
|
73
69
|
|
|
74
|
-
fs.writeFileSync(filePath, content,
|
|
70
|
+
fs.writeFileSync(filePath, content, 'utf8');
|
|
75
71
|
return [originalLen, content.length];
|
|
76
72
|
}
|
|
77
73
|
|
|
@@ -89,12 +85,12 @@ function walkDir(dir, callback) {
|
|
|
89
85
|
}
|
|
90
86
|
|
|
91
87
|
function main() {
|
|
92
|
-
const agentDir = path.join(
|
|
88
|
+
const agentDir = path.join('.agent');
|
|
93
89
|
let totalOriginal = 0;
|
|
94
90
|
let totalNew = 0;
|
|
95
91
|
|
|
96
|
-
walkDir(agentDir,
|
|
97
|
-
if (file.endsWith(
|
|
92
|
+
walkDir(agentDir, file => {
|
|
93
|
+
if (file.endsWith('.md')) {
|
|
98
94
|
const [orig, newLen] = minifyMarkdown(file);
|
|
99
95
|
totalOriginal += orig;
|
|
100
96
|
totalNew += newLen;
|
|
@@ -104,7 +100,7 @@ function main() {
|
|
|
104
100
|
const saved = totalOriginal - totalNew;
|
|
105
101
|
const percent = totalOriginal > 0 ? (saved / totalOriginal) * 100 : 0;
|
|
106
102
|
|
|
107
|
-
console.log(
|
|
103
|
+
console.log('Minification Complete.');
|
|
108
104
|
console.log(`Original size: ${totalOriginal} bytes`);
|
|
109
105
|
console.log(`New size: ${totalNew} bytes`);
|
|
110
106
|
console.log(`Saved: ${saved} bytes (${percent.toFixed(1)}%)`);
|
|
@@ -29,42 +29,41 @@
|
|
|
29
29
|
* node .agent/scripts/minimal_change_engine.js search --query "fetchRetry"
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
'use strict';
|
|
33
33
|
|
|
34
|
-
const fs = require(
|
|
35
|
-
const path = require(
|
|
34
|
+
const fs = require('fs');
|
|
35
|
+
const path = require('path');
|
|
36
36
|
|
|
37
37
|
// ── Shared Utilities & Colors ────────────────────────────────────────────────
|
|
38
|
-
const {
|
|
39
|
-
const { findAgentDir, loadJson, walkDir, DEFAULT_SKIP_DIRS } = require("./_utils");
|
|
38
|
+
const { loadJson, DEFAULT_SKIP_DIRS } = require('./_utils');
|
|
40
39
|
|
|
41
40
|
// ── Decision Order Hierarchy ─────────────────────────────────────────────────
|
|
42
41
|
const DECISION_HIERARCHY = [
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
42
|
+
'NO_CHANGE',
|
|
43
|
+
'REUSE',
|
|
44
|
+
'CONFIGURE',
|
|
45
|
+
'DELETE',
|
|
46
|
+
'MODIFY',
|
|
47
|
+
'EXTEND',
|
|
48
|
+
'CREATE',
|
|
50
49
|
];
|
|
51
50
|
|
|
52
51
|
// ── 14 Standardized Complexity Flag Types ────────────────────────────────────
|
|
53
52
|
const COMPLEXITY_FLAG_TYPES = [
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
53
|
+
'UNNECESSARY_ABSTRACTION',
|
|
54
|
+
'DUPLICATE_FUNCTIONALITY',
|
|
55
|
+
'DEPENDENCY_BLOAT',
|
|
56
|
+
'FILE_PROLIFERATION',
|
|
57
|
+
'PREMATURE_GENERALIZATION',
|
|
58
|
+
'SCOPE_EXPANSION',
|
|
59
|
+
'UNNECESSARY_REWRITE',
|
|
60
|
+
'FRAMEWORK_REINVENTION',
|
|
61
|
+
'STANDARD_LIBRARY_REINVENTION',
|
|
62
|
+
'EXCESSIVE_BOILERPLATE',
|
|
63
|
+
'SPECULATIVE_FEATURE',
|
|
64
|
+
'UNJUSTIFIED_INFRASTRUCTURE',
|
|
65
|
+
'UNNECESSARY_CONFIGURATION',
|
|
66
|
+
'DEAD_CODE_INTRODUCTION',
|
|
68
67
|
];
|
|
69
68
|
|
|
70
69
|
// ── Strictness Configurations ────────────────────────────────────────────────
|
|
@@ -133,10 +132,10 @@ function calculateMinimalityScore(budget, classification, flags = []) {
|
|
|
133
132
|
}
|
|
134
133
|
|
|
135
134
|
// Penalties for complexity flags based on severity
|
|
136
|
-
flags.forEach(
|
|
137
|
-
if (flag.severity ===
|
|
135
|
+
flags.forEach(flag => {
|
|
136
|
+
if (flag.severity === 'high' || flag.severity === 'critical') {
|
|
138
137
|
score -= 15;
|
|
139
|
-
} else if (flag.severity ===
|
|
138
|
+
} else if (flag.severity === 'medium') {
|
|
140
139
|
score -= 8;
|
|
141
140
|
} else {
|
|
142
141
|
score -= 4;
|
|
@@ -163,55 +162,55 @@ function calculateMinimalityScore(budget, classification, flags = []) {
|
|
|
163
162
|
/**
|
|
164
163
|
* Detects potential complexity flags within a proposed change or spec.
|
|
165
164
|
*/
|
|
166
|
-
function detectComplexityFlags(proposal = {},
|
|
165
|
+
function detectComplexityFlags(proposal = {}, _existingSymbols = [], mode = 'balanced') {
|
|
167
166
|
const flags = [];
|
|
168
167
|
const limits = STRICTNESS_CONFIGS[mode] || STRICTNESS_CONFIGS.balanced;
|
|
169
168
|
|
|
170
169
|
// Check 1: Dependency Bloat
|
|
171
170
|
if (proposal.dependencies_added > limits.max_deps_warn) {
|
|
172
171
|
flags.push({
|
|
173
|
-
type:
|
|
174
|
-
severity: proposal.dependencies_added > 1 ?
|
|
172
|
+
type: 'DEPENDENCY_BLOAT',
|
|
173
|
+
severity: proposal.dependencies_added > 1 ? 'high' : 'medium',
|
|
175
174
|
evidence: `${proposal.dependencies_added} new dependency/dependencies proposed.`,
|
|
176
|
-
location: proposal.target_file ||
|
|
177
|
-
reason:
|
|
178
|
-
recommended_action:
|
|
175
|
+
location: proposal.target_file || 'package.json',
|
|
176
|
+
reason: 'Adding dependencies increases security attack surface and maintenance overhead.',
|
|
177
|
+
recommended_action: 'Use standard library or existing codebase utilities.',
|
|
179
178
|
});
|
|
180
179
|
}
|
|
181
180
|
|
|
182
181
|
// Check 2: File Proliferation
|
|
183
182
|
if (proposal.files_added > limits.max_files_added_warn) {
|
|
184
183
|
flags.push({
|
|
185
|
-
type:
|
|
186
|
-
severity: proposal.files_added > 3 ?
|
|
184
|
+
type: 'FILE_PROLIFERATION',
|
|
185
|
+
severity: proposal.files_added > 3 ? 'high' : 'medium',
|
|
187
186
|
evidence: `${proposal.files_added} new files proposed for creation.`,
|
|
188
|
-
location: proposal.target_file ||
|
|
189
|
-
reason:
|
|
190
|
-
recommended_action:
|
|
187
|
+
location: proposal.target_file || 'workspace',
|
|
188
|
+
reason: 'Creating multiple new files increases architectural noise and fragmentation.',
|
|
189
|
+
recommended_action: 'Modify or extend existing files instead of creating new ones.',
|
|
191
190
|
});
|
|
192
191
|
}
|
|
193
192
|
|
|
194
193
|
// Check 3: Unnecessary Abstraction
|
|
195
194
|
if (proposal.new_abstractions > limits.max_abstractions_warn) {
|
|
196
195
|
flags.push({
|
|
197
|
-
type:
|
|
198
|
-
severity:
|
|
196
|
+
type: 'UNNECESSARY_ABSTRACTION',
|
|
197
|
+
severity: 'medium',
|
|
199
198
|
evidence: `${proposal.new_abstractions} new abstraction layer(s) proposed.`,
|
|
200
|
-
location: proposal.target_file ||
|
|
201
|
-
reason:
|
|
202
|
-
recommended_action:
|
|
199
|
+
location: proposal.target_file || 'codebase',
|
|
200
|
+
reason: 'Adding wrappers or single-consumer interfaces increases complexity without benefit.',
|
|
201
|
+
recommended_action: 'Implement concrete logic directly without extra abstraction.',
|
|
203
202
|
});
|
|
204
203
|
}
|
|
205
204
|
|
|
206
205
|
// Check 4: Duplicate Functionality
|
|
207
206
|
if (proposal.duplicate_candidates && proposal.duplicate_candidates.length > 0) {
|
|
208
|
-
proposal.duplicate_candidates.forEach(
|
|
207
|
+
proposal.duplicate_candidates.forEach(cand => {
|
|
209
208
|
flags.push({
|
|
210
|
-
type:
|
|
211
|
-
severity:
|
|
209
|
+
type: 'DUPLICATE_FUNCTIONALITY',
|
|
210
|
+
severity: 'high',
|
|
212
211
|
evidence: `Existing equivalent symbol '${cand.name}' found in ${cand.file}`,
|
|
213
212
|
location: cand.file,
|
|
214
|
-
reason:
|
|
213
|
+
reason: 'Duplicate functionality leads to fragmented state and maintenance confusion.',
|
|
215
214
|
recommended_action: `Reuse '${cand.name}' from ${cand.file}`,
|
|
216
215
|
});
|
|
217
216
|
});
|
|
@@ -220,11 +219,11 @@ function detectComplexityFlags(proposal = {}, existingSymbols = [], mode = "bala
|
|
|
220
219
|
// Check 5: Framework/Stdlib Reinvention
|
|
221
220
|
if (proposal.reinventing_stdlib) {
|
|
222
221
|
flags.push({
|
|
223
|
-
type:
|
|
224
|
-
severity:
|
|
222
|
+
type: 'STANDARD_LIBRARY_REINVENTION',
|
|
223
|
+
severity: 'medium',
|
|
225
224
|
evidence: `Proposed custom utility '${proposal.reinventing_stdlib.name}'`,
|
|
226
|
-
location: proposal.target_file ||
|
|
227
|
-
reason:
|
|
225
|
+
location: proposal.target_file || 'utils',
|
|
226
|
+
reason: 'Language standard library already provides built-in methods for this.',
|
|
228
227
|
recommended_action: `Use native JS/TS methods (e.g., Array.prototype, URL, crypto).`,
|
|
229
228
|
});
|
|
230
229
|
}
|
|
@@ -238,26 +237,26 @@ function detectComplexityFlags(proposal = {}, existingSymbols = [], mode = "bala
|
|
|
238
237
|
function searchRepositoryForCapability(query, searchDir) {
|
|
239
238
|
const matches = [];
|
|
240
239
|
|
|
241
|
-
if (!query || typeof query !==
|
|
240
|
+
if (!query || typeof query !== 'string') return matches;
|
|
242
241
|
|
|
243
242
|
let agentDir = null;
|
|
244
243
|
let current = path.resolve(searchDir || process.cwd());
|
|
245
244
|
const rootPath = path.parse(current).root;
|
|
246
245
|
while (current !== rootPath) {
|
|
247
|
-
const candidate = path.join(current,
|
|
246
|
+
const candidate = path.join(current, '.agent');
|
|
248
247
|
if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
|
|
249
248
|
agentDir = candidate;
|
|
250
249
|
break;
|
|
251
250
|
}
|
|
252
251
|
current = path.dirname(current);
|
|
253
252
|
}
|
|
254
|
-
const repoRoot = agentDir ? path.dirname(agentDir) :
|
|
253
|
+
const repoRoot = agentDir ? path.dirname(agentDir) : searchDir || process.cwd();
|
|
255
254
|
|
|
256
255
|
const normalizedQuery = query.toLowerCase();
|
|
257
|
-
const searchKeywords = normalizedQuery.split(/\s+/).filter(
|
|
256
|
+
const searchKeywords = normalizedQuery.split(/\s+/).filter(k => k.length > 2);
|
|
258
257
|
|
|
259
258
|
// Search package.json dependencies
|
|
260
|
-
const pkgPath = path.join(repoRoot,
|
|
259
|
+
const pkgPath = path.join(repoRoot, 'package.json');
|
|
261
260
|
if (fs.existsSync(pkgPath)) {
|
|
262
261
|
const pkg = loadJson(pkgPath);
|
|
263
262
|
if (pkg) {
|
|
@@ -265,12 +264,12 @@ function searchRepositoryForCapability(query, searchDir) {
|
|
|
265
264
|
...pkg.dependencies,
|
|
266
265
|
...pkg.devDependencies,
|
|
267
266
|
};
|
|
268
|
-
Object.keys(allDeps).forEach(
|
|
267
|
+
Object.keys(allDeps).forEach(dep => {
|
|
269
268
|
if (dep.toLowerCase().includes(normalizedQuery)) {
|
|
270
269
|
matches.push({
|
|
271
|
-
type:
|
|
270
|
+
type: 'dependency',
|
|
272
271
|
name: dep,
|
|
273
|
-
file:
|
|
272
|
+
file: 'package.json',
|
|
274
273
|
snippet: `Version: ${allDeps[dep]}`,
|
|
275
274
|
});
|
|
276
275
|
}
|
|
@@ -286,28 +285,31 @@ function searchRepositoryForCapability(query, searchDir) {
|
|
|
286
285
|
for (const entry of entries) {
|
|
287
286
|
const fullPath = path.join(dir, entry.name);
|
|
288
287
|
if (entry.isDirectory()) {
|
|
289
|
-
if (DEFAULT_SKIP_DIRS.has(entry.name) || entry.name ===
|
|
288
|
+
if (DEFAULT_SKIP_DIRS.has(entry.name) || entry.name === 'target') {
|
|
290
289
|
continue;
|
|
291
290
|
}
|
|
292
291
|
scan(fullPath);
|
|
293
292
|
} else if (entry.isFile() && /\.(js|ts|tsx|jsx|json|md)$/.test(entry.name)) {
|
|
294
293
|
try {
|
|
295
|
-
const content = fs.readFileSync(fullPath,
|
|
294
|
+
const content = fs.readFileSync(fullPath, 'utf8');
|
|
296
295
|
const lower = content.toLowerCase();
|
|
297
296
|
|
|
298
|
-
const hasMatch = searchKeywords.some(
|
|
297
|
+
const hasMatch = searchKeywords.some(kw => lower.includes(kw));
|
|
299
298
|
if (hasMatch) {
|
|
300
299
|
const relPath = path.relative(repoRoot, fullPath);
|
|
301
300
|
// Extract function/class exports
|
|
302
|
-
const symbolRegex =
|
|
301
|
+
const symbolRegex =
|
|
302
|
+
/(?:export\s+(?:function|class|const|let|var|type|interface)|module\.exports\s*=)\s+([A-Za-z0-9_]+)/g;
|
|
303
303
|
let m;
|
|
304
304
|
while ((m = symbolRegex.exec(content)) !== null) {
|
|
305
305
|
if (m[1].toLowerCase().includes(normalizedQuery)) {
|
|
306
306
|
matches.push({
|
|
307
|
-
type:
|
|
307
|
+
type: 'symbol',
|
|
308
308
|
name: m[1],
|
|
309
309
|
file: relPath,
|
|
310
|
-
snippet: content
|
|
310
|
+
snippet: content
|
|
311
|
+
.substring(Math.max(0, m.index - 40), m.index + 80)
|
|
312
|
+
.replace(/\n/g, ' '),
|
|
311
313
|
});
|
|
312
314
|
}
|
|
313
315
|
}
|
|
@@ -334,37 +336,37 @@ function classifyProposal(taskDescription, proposal = {}, repoMatches = []) {
|
|
|
334
336
|
const estimatedLinesAdded = proposal.estimated_lines_added || 0;
|
|
335
337
|
|
|
336
338
|
if (repoMatches.length > 0 && filesAdded === 0) {
|
|
337
|
-
return
|
|
339
|
+
return 'REUSE';
|
|
338
340
|
}
|
|
339
341
|
|
|
340
342
|
if (filesAdded === 0 && filesModified === 0 && filesDeleted === 0) {
|
|
341
|
-
return
|
|
343
|
+
return 'NO_CHANGE';
|
|
342
344
|
}
|
|
343
345
|
|
|
344
346
|
if (proposal.is_config_only) {
|
|
345
|
-
return
|
|
347
|
+
return 'CONFIGURE';
|
|
346
348
|
}
|
|
347
349
|
|
|
348
350
|
if (filesDeleted > 0 && filesAdded === 0 && estimatedLinesAdded === 0) {
|
|
349
|
-
return
|
|
351
|
+
return 'DELETE';
|
|
350
352
|
}
|
|
351
353
|
|
|
352
354
|
if (filesAdded === 0 && filesModified <= 2 && newAbstractions === 0) {
|
|
353
|
-
return
|
|
355
|
+
return 'MODIFY';
|
|
354
356
|
}
|
|
355
357
|
|
|
356
358
|
if (filesAdded <= 2 && newAbstractions <= 1) {
|
|
357
|
-
return
|
|
359
|
+
return 'EXTEND';
|
|
358
360
|
}
|
|
359
361
|
|
|
360
|
-
return
|
|
362
|
+
return 'CREATE';
|
|
361
363
|
}
|
|
362
364
|
|
|
363
365
|
/**
|
|
364
366
|
* Evaluates an implementation proposal completely.
|
|
365
367
|
*/
|
|
366
368
|
function evaluateMinimalChange(taskDescription, proposal = {}, options = {}) {
|
|
367
|
-
const mode = options.mode ||
|
|
369
|
+
const mode = options.mode || 'balanced';
|
|
368
370
|
const searchDir = options.cwd || process.cwd();
|
|
369
371
|
|
|
370
372
|
const budget = calculateChangeBudget(proposal);
|
|
@@ -379,18 +381,20 @@ function evaluateMinimalChange(taskDescription, proposal = {}, options = {}) {
|
|
|
379
381
|
const score = calculateMinimalityScore(budget, classification, flags);
|
|
380
382
|
|
|
381
383
|
const reuseOpportunities = repoMatches.map(
|
|
382
|
-
|
|
384
|
+
m => `Reuse existing ${m.type} '${m.name}' in ${m.file}`,
|
|
383
385
|
);
|
|
384
386
|
|
|
385
387
|
const recommendedReductions = [];
|
|
386
388
|
if (budget.dependencies_added > 0) {
|
|
387
|
-
recommendedReductions.push(
|
|
389
|
+
recommendedReductions.push(
|
|
390
|
+
'Avoid introducing new npm dependencies; leverage existing utilities.',
|
|
391
|
+
);
|
|
388
392
|
}
|
|
389
393
|
if (budget.files_added > 1) {
|
|
390
|
-
recommendedReductions.push(
|
|
394
|
+
recommendedReductions.push('Combine proposed new files into existing module structure.');
|
|
391
395
|
}
|
|
392
396
|
if (budget.new_abstractions > 0) {
|
|
393
|
-
recommendedReductions.push(
|
|
397
|
+
recommendedReductions.push('Remove single-use interface/class abstractions.');
|
|
394
398
|
}
|
|
395
399
|
|
|
396
400
|
return {
|
|
@@ -399,7 +403,7 @@ function evaluateMinimalChange(taskDescription, proposal = {}, options = {}) {
|
|
|
399
403
|
change_budget: budget,
|
|
400
404
|
complexity_flags: flags,
|
|
401
405
|
reuse_opportunities: reuseOpportunities,
|
|
402
|
-
unnecessary_changes: flags.map(
|
|
406
|
+
unnecessary_changes: flags.map(f => f.evidence),
|
|
403
407
|
recommended_reductions: recommendedReductions,
|
|
404
408
|
decision_order: DECISION_HIERARCHY,
|
|
405
409
|
passed: score >= (STRICTNESS_CONFIGS[mode]?.min_score_pass || 75),
|
|
@@ -409,14 +413,18 @@ function evaluateMinimalChange(taskDescription, proposal = {}, options = {}) {
|
|
|
409
413
|
// ── CLI Main Entry Point ────────────────────────────────────────────────────
|
|
410
414
|
if (require.main === module) {
|
|
411
415
|
const args = process.argv.slice(2);
|
|
412
|
-
const command = args[0] ||
|
|
413
|
-
const taskArg = args.find(
|
|
414
|
-
const modeArg = args.find(
|
|
415
|
-
|
|
416
|
-
if (command ===
|
|
417
|
-
const result = evaluateMinimalChange(
|
|
416
|
+
const command = args[0] || 'evaluate';
|
|
417
|
+
const taskArg = args.find(a => a.startsWith('--task='))?.split('=')[1] || 'Default Task';
|
|
418
|
+
const modeArg = args.find(a => a.startsWith('--mode='))?.split('=')[1] || 'balanced';
|
|
419
|
+
|
|
420
|
+
if (command === 'evaluate' || command === 'audit') {
|
|
421
|
+
const result = evaluateMinimalChange(
|
|
422
|
+
taskArg,
|
|
423
|
+
{ files_modified: 1, estimated_lines_added: 12 },
|
|
424
|
+
{ mode: modeArg },
|
|
425
|
+
);
|
|
418
426
|
console.log(JSON.stringify(result, null, 2));
|
|
419
|
-
} else if (command ===
|
|
427
|
+
} else if (command === 'search') {
|
|
420
428
|
const matches = searchRepositoryForCapability(taskArg);
|
|
421
429
|
console.log(JSON.stringify(matches, null, 2));
|
|
422
430
|
} else {
|