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
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tribunal-kit",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
|
+
"description": "Your AI writes code that doesn't exist. Tribunal Kit stops it. The governance layer for AI coding agents — 52 specialists, 28 parallel reviewers, 183 skills, Rust core, MCP server. Works with Cursor, VSCode, Windsurf, Claude Code, and Aider.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
7
7
|
"ai-agent",
|
|
@@ -80,9 +80,9 @@
|
|
|
80
80
|
"node": ">=18.0.0"
|
|
81
81
|
},
|
|
82
82
|
"scripts": {
|
|
83
|
-
"test": "npm run validate-payload && jest --runInBand --coverage",
|
|
84
|
-
"test:unit": "jest test/unit --coverage",
|
|
85
|
-
"test:integration": "jest test/integration --coverage",
|
|
83
|
+
"test": "npm run validate-payload && jest --runInBand --coverage --forceExit",
|
|
84
|
+
"test:unit": "jest test/unit --coverage --forceExit",
|
|
85
|
+
"test:integration": "jest test/integration --coverage --forceExit",
|
|
86
86
|
"preversion": "node scripts/sync-version.js",
|
|
87
87
|
"version": "node scripts/changelog.js && git add CHANGELOG.md",
|
|
88
88
|
"changelog": "node scripts/changelog.js",
|
|
@@ -90,25 +90,29 @@
|
|
|
90
90
|
"sync": "node scripts/sync-version.js",
|
|
91
91
|
"validate-payload": "node scripts/validate-payload.js",
|
|
92
92
|
"benchmark": "node scripts/benchmark.js",
|
|
93
|
+
"benchmark:stress": "node scripts/stress_benchmark.js",
|
|
93
94
|
"benchmark:rust": "cargo build --release && node scripts/benchmark.js",
|
|
94
95
|
"build:rust": "cargo build --release",
|
|
95
96
|
"build:core": "cargo build --release --manifest-path crates/core/Cargo.toml",
|
|
96
97
|
"test:rust": "cargo test --manifest-path crates/core/Cargo.toml",
|
|
97
|
-
"test:all": "npm run validate-payload && npm run test:rust && jest --runInBand --coverage",
|
|
98
|
+
"test:all": "npm run validate-payload && npm run test:rust && jest --runInBand --coverage --forceExit",
|
|
99
|
+
"format": "prettier --write .",
|
|
100
|
+
"format:check": "prettier --check .",
|
|
98
101
|
"build": "npm run build:rust"
|
|
99
102
|
},
|
|
100
103
|
"devDependencies": {
|
|
101
|
-
"eslint": "9.1.1",
|
|
102
|
-
"jest": "30.4.2",
|
|
103
|
-
"
|
|
104
|
-
|
|
104
|
+
"eslint": "^9.1.1",
|
|
105
|
+
"jest": "^30.4.2",
|
|
106
|
+
"prettier": "^3.2.5",
|
|
107
|
+
"typescript": "^5.4.5"
|
|
108
|
+
},
|
|
105
109
|
"optionalDependencies": {
|
|
106
|
-
"@tribunal-kit/core-darwin-arm64": "^
|
|
107
|
-
"@tribunal-kit/core-darwin-x64": "^
|
|
108
|
-
"@tribunal-kit/core-linux-arm64": "^
|
|
109
|
-
"@tribunal-kit/core-linux-x64": "^
|
|
110
|
-
"@tribunal-kit/core-win32-arm64": "^
|
|
111
|
-
"@tribunal-kit/core-win32-x64": "^
|
|
110
|
+
"@tribunal-kit/core-darwin-arm64": "^7.0.0",
|
|
111
|
+
"@tribunal-kit/core-darwin-x64": "^7.0.0",
|
|
112
|
+
"@tribunal-kit/core-linux-arm64": "^7.0.0",
|
|
113
|
+
"@tribunal-kit/core-linux-x64": "^7.0.0",
|
|
114
|
+
"@tribunal-kit/core-win32-arm64": "^7.0.0",
|
|
115
|
+
"@tribunal-kit/core-win32-x64": "^7.0.0"
|
|
112
116
|
},
|
|
113
117
|
"jest": {
|
|
114
118
|
"testMatch": [
|
package/scripts/benchmark.js
CHANGED
|
@@ -6,22 +6,22 @@
|
|
|
6
6
|
* Run: node scripts/benchmark.js
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
const { spawnSync } = require(
|
|
10
|
-
const path = require(
|
|
11
|
-
const fs = require(
|
|
12
|
-
const os = require(
|
|
9
|
+
const { spawnSync } = require('child_process');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const os = require('os');
|
|
13
13
|
|
|
14
14
|
// ANSI colors
|
|
15
15
|
const C = {
|
|
16
|
-
reset:
|
|
17
|
-
bold:
|
|
18
|
-
dim:
|
|
19
|
-
red:
|
|
20
|
-
green:
|
|
21
|
-
yellow:
|
|
22
|
-
cyan:
|
|
23
|
-
white:
|
|
24
|
-
gray:
|
|
16
|
+
reset: '\x1b[0m',
|
|
17
|
+
bold: '\x1b[1m',
|
|
18
|
+
dim: '\x1b[2m',
|
|
19
|
+
red: '\x1b[91m',
|
|
20
|
+
green: '\x1b[92m',
|
|
21
|
+
yellow: '\x1b[93m',
|
|
22
|
+
cyan: '\x1b[96m',
|
|
23
|
+
white: '\x1b[97m',
|
|
24
|
+
gray: '\x1b[90m',
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
function c(color, text) {
|
|
@@ -59,10 +59,10 @@ function benchmarkCommand(label, command, runs = 3) {
|
|
|
59
59
|
return benchmark(
|
|
60
60
|
label,
|
|
61
61
|
() => {
|
|
62
|
-
spawnSync(
|
|
63
|
-
stdio:
|
|
64
|
-
encoding:
|
|
65
|
-
env: { ...process.env, TK_SKIP_UPDATE_CHECK:
|
|
62
|
+
spawnSync('node', command.split(' '), {
|
|
63
|
+
stdio: 'pipe',
|
|
64
|
+
encoding: 'utf8',
|
|
65
|
+
env: { ...process.env, TK_SKIP_UPDATE_CHECK: '1' },
|
|
66
66
|
});
|
|
67
67
|
},
|
|
68
68
|
runs,
|
|
@@ -72,67 +72,50 @@ function benchmarkCommand(label, command, runs = 3) {
|
|
|
72
72
|
async function main() {
|
|
73
73
|
console.log();
|
|
74
74
|
console.log(bold(` ⚡ Tribunal-Kit Performance Benchmark`));
|
|
75
|
-
console.log(c(
|
|
76
|
-
console.log(c(
|
|
77
|
-
console.log(c(
|
|
78
|
-
console.log(
|
|
79
|
-
|
|
80
|
-
"gray",
|
|
81
|
-
` CPUs: ${os.cpus().length}x ${os.cpus()[0]?.model || "unknown"}`,
|
|
82
|
-
),
|
|
83
|
-
);
|
|
84
|
-
console.log(c("gray", ` ─────────────────────────────────────────`));
|
|
75
|
+
console.log(c('gray', ` ─────────────────────────────────────────`));
|
|
76
|
+
console.log(c('gray', ` Platform: ${os.platform()} ${os.arch()}`));
|
|
77
|
+
console.log(c('gray', ` Node: ${process.version}`));
|
|
78
|
+
console.log(c('gray', ` CPUs: ${os.cpus().length}x ${os.cpus()[0]?.model || 'unknown'}`));
|
|
79
|
+
console.log(c('gray', ` ─────────────────────────────────────────`));
|
|
85
80
|
console.log();
|
|
86
81
|
|
|
87
|
-
const cliPath = path.resolve(__dirname,
|
|
82
|
+
const cliPath = path.resolve(__dirname, '../bin/wrapper.js');
|
|
88
83
|
const tempDir = path.join(os.tmpdir(), `tribunal-bench-${Date.now()}`);
|
|
89
84
|
fs.mkdirSync(tempDir, { recursive: true });
|
|
90
85
|
|
|
91
86
|
const results = [];
|
|
92
87
|
|
|
93
88
|
// 1. Cold start (help)
|
|
94
|
-
console.log(c(
|
|
95
|
-
const helpResult = await benchmarkCommand(
|
|
96
|
-
"CLI cold-start (--help)",
|
|
97
|
-
`${cliPath} --help`,
|
|
98
|
-
5,
|
|
99
|
-
);
|
|
89
|
+
console.log(c('cyan', ' ▸ Benchmarking: CLI cold-start (--help)'));
|
|
90
|
+
const helpResult = await benchmarkCommand('CLI cold-start (--help)', `${cliPath} --help`, 5);
|
|
100
91
|
results.push(helpResult);
|
|
101
92
|
|
|
102
93
|
// 2. Status check
|
|
103
|
-
console.log(c(
|
|
104
|
-
const statusResult = await benchmarkCommand(
|
|
105
|
-
"Status check",
|
|
106
|
-
`${cliPath} status --quiet`,
|
|
107
|
-
5,
|
|
108
|
-
);
|
|
94
|
+
console.log(c('cyan', ' ▸ Benchmarking: tk status'));
|
|
95
|
+
const statusResult = await benchmarkCommand('Status check', `${cliPath} status --quiet`, 5);
|
|
109
96
|
results.push(statusResult);
|
|
110
97
|
|
|
111
98
|
// 3. Init (dry-run)
|
|
112
|
-
console.log(c(
|
|
99
|
+
console.log(c('cyan', ' ▸ Benchmarking: tk init --dry-run'));
|
|
113
100
|
const initResult = await benchmarkCommand(
|
|
114
|
-
|
|
101
|
+
'Init (dry-run)',
|
|
115
102
|
`${cliPath} init --dry-run --quiet --skip-update-check --path=${tempDir}`,
|
|
116
103
|
3,
|
|
117
104
|
);
|
|
118
105
|
results.push(initResult);
|
|
119
106
|
|
|
120
107
|
// 4. Init (real, to temp dir)
|
|
121
|
-
console.log(c(
|
|
108
|
+
console.log(c('cyan', ' ▸ Benchmarking: tk init (real copy)'));
|
|
122
109
|
const initRealResult = await benchmark(
|
|
123
|
-
|
|
110
|
+
'Init (full copy)',
|
|
124
111
|
() => {
|
|
125
112
|
const runDir = path.join(tempDir, `run-${Date.now()}`);
|
|
126
113
|
fs.mkdirSync(runDir, { recursive: true });
|
|
127
|
-
spawnSync(
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
{
|
|
131
|
-
|
|
132
|
-
encoding: "utf8",
|
|
133
|
-
env: { ...process.env, TK_SKIP_UPDATE_CHECK: "1" },
|
|
134
|
-
},
|
|
135
|
-
);
|
|
114
|
+
spawnSync('node', [cliPath, 'init', '--quiet', '--skip-update-check', `--path=${runDir}`], {
|
|
115
|
+
stdio: 'pipe',
|
|
116
|
+
encoding: 'utf8',
|
|
117
|
+
env: { ...process.env, TK_SKIP_UPDATE_CHECK: '1' },
|
|
118
|
+
});
|
|
136
119
|
// Cleanup
|
|
137
120
|
try {
|
|
138
121
|
fs.rmSync(runDir, { recursive: true, force: true });
|
|
@@ -143,35 +126,35 @@ async function main() {
|
|
|
143
126
|
results.push(initRealResult);
|
|
144
127
|
|
|
145
128
|
// 5. DAG scheduling benchmark
|
|
146
|
-
console.log(c(
|
|
129
|
+
console.log(c('cyan', ' ▸ Benchmarking: DAG scheduling calculation'));
|
|
147
130
|
const dagResult = await benchmark(
|
|
148
|
-
|
|
131
|
+
'DAG wave scheduling',
|
|
149
132
|
() => {
|
|
150
133
|
const workers = [
|
|
151
|
-
{ task_id:
|
|
152
|
-
{ task_id:
|
|
153
|
-
{ task_id:
|
|
154
|
-
{ task_id:
|
|
134
|
+
{ task_id: 'w1', dependencies: [] },
|
|
135
|
+
{ task_id: 'w2', dependencies: ['w1'] },
|
|
136
|
+
{ task_id: 'w3', dependencies: ['w1'] },
|
|
137
|
+
{ task_id: 'w4', dependencies: ['w2', 'w3'] },
|
|
155
138
|
];
|
|
156
139
|
const inDegree = {};
|
|
157
140
|
const adjList = {};
|
|
158
|
-
workers.forEach(
|
|
141
|
+
workers.forEach(w => {
|
|
159
142
|
inDegree[w.task_id] = 0;
|
|
160
143
|
adjList[w.task_id] = [];
|
|
161
144
|
});
|
|
162
|
-
workers.forEach(
|
|
163
|
-
w.dependencies.forEach(
|
|
145
|
+
workers.forEach(w => {
|
|
146
|
+
w.dependencies.forEach(dep => {
|
|
164
147
|
adjList[dep].push(w.task_id);
|
|
165
148
|
inDegree[w.task_id] += 1;
|
|
166
149
|
});
|
|
167
150
|
});
|
|
168
|
-
let currentWave = Object.keys(inDegree).filter(
|
|
151
|
+
let currentWave = Object.keys(inDegree).filter(id => inDegree[id] === 0);
|
|
169
152
|
const waves = [];
|
|
170
153
|
while (currentWave.length > 0) {
|
|
171
154
|
waves.push(currentWave);
|
|
172
155
|
const next = [];
|
|
173
|
-
currentWave.forEach(
|
|
174
|
-
adjList[id].forEach(
|
|
156
|
+
currentWave.forEach(id => {
|
|
157
|
+
adjList[id].forEach(nbr => {
|
|
175
158
|
inDegree[nbr] -= 1;
|
|
176
159
|
if (inDegree[nbr] === 0) next.push(nbr);
|
|
177
160
|
});
|
|
@@ -184,12 +167,12 @@ async function main() {
|
|
|
184
167
|
results.push(dagResult);
|
|
185
168
|
|
|
186
169
|
// 6. Minimal Change Governance Engine benchmark
|
|
187
|
-
console.log(c(
|
|
170
|
+
console.log(c('cyan', ' ▸ Benchmarking: Minimal Change Governance Engine'));
|
|
188
171
|
const minResult = await benchmark(
|
|
189
|
-
|
|
172
|
+
'Minimal Change Audit',
|
|
190
173
|
() => {
|
|
191
|
-
const minEngine = require(
|
|
192
|
-
minEngine.evaluateMinimalChange(
|
|
174
|
+
const minEngine = require('../.agent/scripts/minimal_change_engine');
|
|
175
|
+
minEngine.evaluateMinimalChange('add retry logic to API requests', {
|
|
193
176
|
files_added: 0,
|
|
194
177
|
files_modified: 1,
|
|
195
178
|
estimated_lines_added: 15,
|
|
@@ -199,39 +182,32 @@ async function main() {
|
|
|
199
182
|
);
|
|
200
183
|
results.push(minResult);
|
|
201
184
|
|
|
202
|
-
|
|
203
185
|
// Print results table
|
|
204
186
|
console.log();
|
|
205
187
|
console.log(bold(` Results`));
|
|
188
|
+
console.log(c('gray', ` ─────────────────────────────────────────────────────────`));
|
|
206
189
|
console.log(
|
|
207
|
-
c(
|
|
208
|
-
);
|
|
209
|
-
console.log(
|
|
210
|
-
` ${c("white", "Operation".padEnd(30))} ${c("white", "Avg (ms)".padStart(10))} ${c("white", "Min".padStart(8))} ${c("white", "Max".padStart(8))}`,
|
|
211
|
-
);
|
|
212
|
-
console.log(
|
|
213
|
-
c("gray", ` ─────────────────────────────────────────────────────────`),
|
|
190
|
+
` ${c('white', 'Operation'.padEnd(30))} ${c('white', 'Avg (ms)'.padStart(10))} ${c('white', 'Min'.padStart(8))} ${c('white', 'Max'.padStart(8))}`,
|
|
214
191
|
);
|
|
192
|
+
console.log(c('gray', ` ─────────────────────────────────────────────────────────`));
|
|
215
193
|
|
|
216
194
|
for (const r of results) {
|
|
217
|
-
const avgColor = r.avg < 100 ?
|
|
195
|
+
const avgColor = r.avg < 100 ? 'green' : r.avg < 500 ? 'yellow' : 'red';
|
|
218
196
|
console.log(
|
|
219
|
-
` ${c(
|
|
197
|
+
` ${c('white', r.label.padEnd(30))} ${c(avgColor, String(Math.round(r.avg)).padStart(10))} ${c('gray', String(Math.round(r.min)).padStart(8))} ${c('gray', String(Math.round(r.max)).padStart(8))}`,
|
|
220
198
|
);
|
|
221
199
|
}
|
|
222
200
|
|
|
223
|
-
console.log(
|
|
224
|
-
c("gray", ` ─────────────────────────────────────────────────────────`),
|
|
225
|
-
);
|
|
201
|
+
console.log(c('gray', ` ─────────────────────────────────────────────────────────`));
|
|
226
202
|
console.log();
|
|
227
203
|
|
|
228
204
|
// Write results to JSON for CI/comparison
|
|
229
|
-
const outputPath = path.resolve(__dirname,
|
|
205
|
+
const outputPath = path.resolve(__dirname, '../benchmark-results.json');
|
|
230
206
|
const outputData = {
|
|
231
207
|
timestamp: new Date().toISOString(),
|
|
232
208
|
platform: `${os.platform()}-${os.arch()}`,
|
|
233
209
|
node: process.version,
|
|
234
|
-
results: results.map(
|
|
210
|
+
results: results.map(r => ({
|
|
235
211
|
label: r.label,
|
|
236
212
|
avg_ms: Math.round(r.avg),
|
|
237
213
|
min_ms: Math.round(r.min),
|
|
@@ -240,7 +216,7 @@ async function main() {
|
|
|
240
216
|
})),
|
|
241
217
|
};
|
|
242
218
|
fs.writeFileSync(outputPath, JSON.stringify(outputData, null, 2));
|
|
243
|
-
console.log(c(
|
|
219
|
+
console.log(c('green', ` ✔ Results saved to benchmark-results.json`));
|
|
244
220
|
|
|
245
221
|
// Cleanup temp
|
|
246
222
|
try {
|
|
@@ -249,7 +225,7 @@ async function main() {
|
|
|
249
225
|
console.log();
|
|
250
226
|
}
|
|
251
227
|
|
|
252
|
-
main().catch(
|
|
228
|
+
main().catch(err => {
|
|
253
229
|
console.error(`Benchmark failed: ${err.message}`);
|
|
254
230
|
process.exit(1);
|
|
255
231
|
});
|
package/scripts/changelog.js
CHANGED
|
@@ -18,93 +18,91 @@
|
|
|
18
18
|
* node scripts/changelog.js --since v4.1.0 → Changes since a specific tag
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
'use strict';
|
|
22
22
|
|
|
23
|
-
const { execSync } = require(
|
|
24
|
-
const fs = require(
|
|
25
|
-
const path = require(
|
|
23
|
+
const { execSync } = require('child_process');
|
|
24
|
+
const fs = require('fs');
|
|
25
|
+
const path = require('path');
|
|
26
26
|
|
|
27
|
-
const PKG = require(path.resolve(__dirname,
|
|
28
|
-
const CHANGELOG_PATH = path.resolve(__dirname,
|
|
27
|
+
const PKG = require(path.resolve(__dirname, '..', 'package.json'));
|
|
28
|
+
const CHANGELOG_PATH = path.resolve(__dirname, '..', 'CHANGELOG.md');
|
|
29
29
|
|
|
30
30
|
// ── Commit Categories ────────────────────────────────────
|
|
31
31
|
const CATEGORIES = {
|
|
32
|
-
feat: { emoji:
|
|
33
|
-
fix: { emoji:
|
|
34
|
-
perf: { emoji:
|
|
35
|
-
docs: { emoji:
|
|
36
|
-
test: { emoji:
|
|
37
|
-
refactor: { emoji:
|
|
38
|
-
chore: { emoji:
|
|
39
|
-
ci: { emoji:
|
|
40
|
-
style: { emoji:
|
|
41
|
-
breaking: { emoji:
|
|
32
|
+
feat: { emoji: '✨', title: 'Features' },
|
|
33
|
+
fix: { emoji: '🐛', title: 'Bug Fixes' },
|
|
34
|
+
perf: { emoji: '⚡', title: 'Performance' },
|
|
35
|
+
docs: { emoji: '📝', title: 'Documentation' },
|
|
36
|
+
test: { emoji: '✅', title: 'Tests' },
|
|
37
|
+
refactor: { emoji: '♻️', title: 'Refactors' },
|
|
38
|
+
chore: { emoji: '🔧', title: 'Chores' },
|
|
39
|
+
ci: { emoji: '🏗️', title: 'CI/CD' },
|
|
40
|
+
style: { emoji: '🎨', title: 'Style' },
|
|
41
|
+
breaking: { emoji: '💥', title: 'Breaking Changes' },
|
|
42
42
|
};
|
|
43
43
|
|
|
44
44
|
// ── Git Helpers ──────────────────────────────────────────
|
|
45
45
|
function git(cmd) {
|
|
46
46
|
try {
|
|
47
|
-
return execSync(`git ${cmd}`, { encoding:
|
|
47
|
+
return execSync(`git ${cmd}`, { encoding: 'utf8', timeout: 10000 }).trim();
|
|
48
48
|
} catch {
|
|
49
|
-
return
|
|
49
|
+
return '';
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
function getLatestTag() {
|
|
54
54
|
return (
|
|
55
|
-
git(
|
|
56
|
-
git("describe --tags --abbrev=0 2>/dev/null") ||
|
|
57
|
-
""
|
|
55
|
+
git('describe --tags --abbrev=0 2>nul') || git('describe --tags --abbrev=0 2>/dev/null') || ''
|
|
58
56
|
);
|
|
59
57
|
}
|
|
60
58
|
|
|
61
59
|
function getCommits(since) {
|
|
62
|
-
const range = since ? `${since}..HEAD` :
|
|
60
|
+
const range = since ? `${since}..HEAD` : 'HEAD';
|
|
63
61
|
const MAX_COMMITS = 500;
|
|
64
|
-
const format =
|
|
62
|
+
const format = '--format=%H||%s||%an||%ai';
|
|
65
63
|
const raw = git(`log ${range} ${format} --no-merges -n ${MAX_COMMITS}`);
|
|
66
64
|
if (!raw) return [];
|
|
67
65
|
|
|
68
66
|
return raw
|
|
69
|
-
.
|
|
70
|
-
.
|
|
71
|
-
.
|
|
72
|
-
|
|
67
|
+
.replace(/\r/g, '')
|
|
68
|
+
.split('\n')
|
|
69
|
+
.filter(line => line.includes('||'))
|
|
70
|
+
.map(line => {
|
|
71
|
+
const [hash, subject = '', author = '', date = ''] = line.split('||');
|
|
73
72
|
return {
|
|
74
|
-
hash: hash?.replace(/^"/,
|
|
75
|
-
subject,
|
|
76
|
-
author,
|
|
77
|
-
date: date?.replace(/"$/,
|
|
73
|
+
hash: hash?.replace(/^"/, '').slice(0, 7),
|
|
74
|
+
subject: subject.trim(),
|
|
75
|
+
author: author.trim(),
|
|
76
|
+
date: date?.replace(/"$/, '').slice(0, 10),
|
|
78
77
|
};
|
|
79
78
|
});
|
|
80
79
|
}
|
|
81
80
|
|
|
82
|
-
function categorize(subject) {
|
|
83
|
-
const lower = subject.toLowerCase();
|
|
81
|
+
function categorize(subject = '') {
|
|
82
|
+
const lower = (subject || '').toLowerCase();
|
|
84
83
|
|
|
85
84
|
// Check for BREAKING CHANGE
|
|
86
|
-
if (lower.includes(
|
|
87
|
-
return
|
|
85
|
+
if (lower.includes('breaking') || lower.includes('!:')) {
|
|
86
|
+
return 'breaking';
|
|
88
87
|
}
|
|
89
88
|
|
|
90
89
|
// Match conventional commit prefix
|
|
91
|
-
const match = subject.match(/^(\w+)(?:\(.+?\))?:\s*/);
|
|
90
|
+
const match = (subject || '').match(/^(\w+)(?:\(.+?\))?:\s*/);
|
|
92
91
|
if (match) {
|
|
93
92
|
const type = match[1].toLowerCase();
|
|
94
93
|
if (CATEGORIES[type]) return type;
|
|
95
94
|
}
|
|
96
95
|
|
|
97
96
|
// Heuristic fallback
|
|
98
|
-
if (lower.includes(
|
|
99
|
-
if (lower.includes(
|
|
100
|
-
|
|
101
|
-
if (lower.includes(
|
|
102
|
-
if (lower.includes(
|
|
103
|
-
if (lower.includes(
|
|
104
|
-
if (lower.includes(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return "chore";
|
|
97
|
+
if (lower.includes('fix') || lower.includes('bug')) return 'fix';
|
|
98
|
+
if (lower.includes('add') || lower.includes('new') || lower.includes('feat')) return 'feat';
|
|
99
|
+
if (lower.includes('doc') || lower.includes('readme')) return 'docs';
|
|
100
|
+
if (lower.includes('test')) return 'test';
|
|
101
|
+
if (lower.includes('refactor') || lower.includes('clean')) return 'refactor';
|
|
102
|
+
if (lower.includes('perf') || lower.includes('optim')) return 'perf';
|
|
103
|
+
if (lower.includes('ci') || lower.includes('workflow')) return 'ci';
|
|
104
|
+
|
|
105
|
+
return 'chore';
|
|
108
106
|
}
|
|
109
107
|
|
|
110
108
|
// ── Changelog Generation ─────────────────────────────────
|
|
@@ -114,7 +112,7 @@ function generateChangelog(commits, version, date) {
|
|
|
114
112
|
const cat = categorize(commit.subject);
|
|
115
113
|
if (!grouped[cat]) grouped[cat] = [];
|
|
116
114
|
// Strip conventional prefix for cleaner display
|
|
117
|
-
const clean = commit.subject.replace(/^\w+(\(.+?\))?:\s*/,
|
|
115
|
+
const clean = (commit.subject || '').replace(/^\w+(\(.+?\))?:\s*/, '');
|
|
118
116
|
grouped[cat].push({ ...commit, clean });
|
|
119
117
|
}
|
|
120
118
|
|
|
@@ -122,16 +120,16 @@ function generateChangelog(commits, version, date) {
|
|
|
122
120
|
|
|
123
121
|
// Breaking changes first
|
|
124
122
|
const order = [
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
123
|
+
'breaking',
|
|
124
|
+
'feat',
|
|
125
|
+
'fix',
|
|
126
|
+
'perf',
|
|
127
|
+
'refactor',
|
|
128
|
+
'docs',
|
|
129
|
+
'test',
|
|
130
|
+
'ci',
|
|
131
|
+
'style',
|
|
132
|
+
'chore',
|
|
135
133
|
];
|
|
136
134
|
for (const cat of order) {
|
|
137
135
|
if (!grouped[cat] || grouped[cat].length === 0) continue;
|
|
@@ -140,7 +138,7 @@ function generateChangelog(commits, version, date) {
|
|
|
140
138
|
for (const c of grouped[cat]) {
|
|
141
139
|
md += `- ${c.clean} (\`${c.hash}\`)\n`;
|
|
142
140
|
}
|
|
143
|
-
md +=
|
|
141
|
+
md += '\n';
|
|
144
142
|
}
|
|
145
143
|
|
|
146
144
|
return md;
|
|
@@ -149,48 +147,44 @@ function generateChangelog(commits, version, date) {
|
|
|
149
147
|
// ── Main ─────────────────────────────────────────────────
|
|
150
148
|
function main() {
|
|
151
149
|
const args = process.argv.slice(2);
|
|
152
|
-
const isPreview = args.includes(
|
|
153
|
-
const sinceIdx = args.indexOf(
|
|
150
|
+
const isPreview = args.includes('--preview');
|
|
151
|
+
const sinceIdx = args.indexOf('--since');
|
|
154
152
|
const sinceTag = sinceIdx !== -1 ? args[sinceIdx + 1] : null;
|
|
155
153
|
|
|
156
154
|
const since = sinceTag || getLatestTag();
|
|
157
155
|
const commits = getCommits(since);
|
|
158
156
|
|
|
159
157
|
if (commits.length === 0) {
|
|
160
|
-
console.log(
|
|
158
|
+
console.log(' ℹ️ No new commits found since', since || 'beginning');
|
|
161
159
|
process.exit(0);
|
|
162
160
|
}
|
|
163
161
|
|
|
164
162
|
const today = new Date().toISOString().slice(0, 10);
|
|
165
|
-
const version = isPreview ?
|
|
163
|
+
const version = isPreview ? 'Unreleased' : PKG.version;
|
|
166
164
|
|
|
167
165
|
const changelog = generateChangelog(commits, version, today);
|
|
168
166
|
|
|
169
167
|
if (isPreview) {
|
|
170
|
-
console.log(
|
|
168
|
+
console.log('\n 📋 Changelog Preview\n ' + '─'.repeat(40) + '\n');
|
|
171
169
|
console.log(changelog);
|
|
172
|
-
console.log(
|
|
173
|
-
` 📊 ${commits.length} commits since ${since || "initial commit"}`,
|
|
174
|
-
);
|
|
170
|
+
console.log(` 📊 ${commits.length} commits since ${since || 'initial commit'}`);
|
|
175
171
|
return;
|
|
176
172
|
}
|
|
177
173
|
|
|
178
174
|
// Write or prepend to CHANGELOG.md
|
|
179
175
|
const header = `# Changelog\n\nAll notable changes to Tribunal Kit are documented here.\nFormat follows [Keep a Changelog](https://keepachangelog.com/).\n\n`;
|
|
180
176
|
|
|
181
|
-
let existing =
|
|
177
|
+
let existing = '';
|
|
182
178
|
if (fs.existsSync(CHANGELOG_PATH)) {
|
|
183
|
-
existing = fs.readFileSync(CHANGELOG_PATH,
|
|
179
|
+
existing = fs.readFileSync(CHANGELOG_PATH, 'utf8');
|
|
184
180
|
// Remove existing header
|
|
185
|
-
existing = existing.replace(/^# Changelog[\s\S]*?(?=## )/,
|
|
181
|
+
existing = existing.replace(/^# Changelog[\s\S]*?(?=## )/, '');
|
|
186
182
|
}
|
|
187
183
|
|
|
188
184
|
const full = header + changelog + existing;
|
|
189
|
-
fs.writeFileSync(CHANGELOG_PATH, full,
|
|
185
|
+
fs.writeFileSync(CHANGELOG_PATH, full, 'utf8');
|
|
190
186
|
|
|
191
|
-
console.log(
|
|
192
|
-
` ✔ CHANGELOG.md updated — v${version} (${commits.length} commits)`,
|
|
193
|
-
);
|
|
187
|
+
console.log(` ✔ CHANGELOG.md updated — v${version} (${commits.length} commits)`);
|
|
194
188
|
}
|
|
195
189
|
|
|
196
190
|
main();
|
package/scripts/fix-vbc.js
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
* Dry-run: node scripts/fix-vbc.js --dry-run
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
const fs = require(
|
|
11
|
-
const path = require(
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
12
|
|
|
13
|
-
const ROOT = path.resolve(__dirname,
|
|
14
|
-
const SKILLS_DIR = path.join(ROOT,
|
|
15
|
-
const DRY_RUN = process.argv.includes(
|
|
13
|
+
const ROOT = path.resolve(__dirname, '..');
|
|
14
|
+
const SKILLS_DIR = path.join(ROOT, '.agent', 'skills');
|
|
15
|
+
const DRY_RUN = process.argv.includes('--dry-run');
|
|
16
16
|
|
|
17
17
|
const PRE_FLIGHT_BLOCK = `
|
|
18
18
|
### ✅ Pre-Flight Self-Audit
|
|
@@ -38,34 +38,32 @@ let fixedCount = 0;
|
|
|
38
38
|
let skippedCount = 0;
|
|
39
39
|
let errorCount = 0;
|
|
40
40
|
|
|
41
|
-
const skillDirs = fs.readdirSync(SKILLS_DIR).filter(
|
|
41
|
+
const skillDirs = fs.readdirSync(SKILLS_DIR).filter(d => {
|
|
42
42
|
return fs.statSync(path.join(SKILLS_DIR, d)).isDirectory();
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
for (const dir of skillDirs) {
|
|
46
|
-
const skillPath = path.join(SKILLS_DIR, dir,
|
|
46
|
+
const skillPath = path.join(SKILLS_DIR, dir, 'SKILL.md');
|
|
47
47
|
if (!fs.existsSync(skillPath)) continue;
|
|
48
48
|
|
|
49
49
|
let content;
|
|
50
50
|
try {
|
|
51
|
-
content = fs.readFileSync(skillPath,
|
|
51
|
+
content = fs.readFileSync(skillPath, 'utf8');
|
|
52
52
|
} catch (e) {
|
|
53
53
|
console.error(` ❌ Failed to read: ${dir}/SKILL.md — ${e.message}`);
|
|
54
54
|
errorCount++;
|
|
55
55
|
continue;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
const hasPreFlight =
|
|
59
|
-
|
|
60
|
-
const hasVBC =
|
|
61
|
-
content.includes("VBC Protocol") || content.includes("VBC");
|
|
58
|
+
const hasPreFlight = content.includes('Pre-Flight Checklist') || content.includes('Pre-Flight');
|
|
59
|
+
const hasVBC = content.includes('VBC Protocol') || content.includes('VBC');
|
|
62
60
|
|
|
63
61
|
if (hasPreFlight && hasVBC) {
|
|
64
62
|
skippedCount++;
|
|
65
63
|
continue;
|
|
66
64
|
}
|
|
67
65
|
|
|
68
|
-
let appendText =
|
|
66
|
+
let appendText = '';
|
|
69
67
|
|
|
70
68
|
if (!hasPreFlight) {
|
|
71
69
|
appendText += PRE_FLIGHT_BLOCK;
|
|
@@ -81,7 +79,7 @@ for (const dir of skillDirs) {
|
|
|
81
79
|
console.log(` [DRY-RUN] Would append to ${dir}/SKILL.md`);
|
|
82
80
|
} else {
|
|
83
81
|
try {
|
|
84
|
-
fs.appendFileSync(skillPath, appendText,
|
|
82
|
+
fs.appendFileSync(skillPath, appendText, 'utf8');
|
|
85
83
|
fixedCount++;
|
|
86
84
|
} catch (e) {
|
|
87
85
|
console.error(` ❌ Failed to write: ${dir}/SKILL.md — ${e.message}`);
|
|
@@ -94,5 +92,5 @@ console.log(`\n━━━ VBC Fix Summary ━━━━━━━━━━━━━
|
|
|
94
92
|
console.log(` Fixed: ${fixedCount}`);
|
|
95
93
|
console.log(` Skipped: ${skippedCount} (already compliant)`);
|
|
96
94
|
console.log(` Errors: ${errorCount}`);
|
|
97
|
-
console.log(` Mode: ${DRY_RUN ?
|
|
95
|
+
console.log(` Mode: ${DRY_RUN ? 'DRY-RUN (no changes)' : 'LIVE'}`);
|
|
98
96
|
console.log();
|