tribunal-kit 6.0.1 → 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/ARCHITECTURE.md +9 -6
- 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 +1532 -1
- package/.agent/history/memory/MEMORY.md +102 -1
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2033 -263
- package/.agent/rules/GEMINI.md +11 -9
- 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 +22 -3
- 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 +6 -2
- package/.agent/skills/ai-app-hardening/SKILL.md +9 -8
- 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 +5 -4
- 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 +7 -3
- package/.agent/skills/edge-ai-mobile/SKILL.md +5 -1
- 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 +2 -1
- 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 +2 -1
- 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 +1 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +3 -2
- 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 +10 -12
- 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 +3 -2
- 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 +11 -6
- 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 +2 -1
- 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 +94 -44
- package/SECURITY.md +10 -10
- package/bin/mcp-server.js +385 -252
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +40 -46
- package/dist/cli.js +6 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/status.js +6 -0
- package/dist/index.d.ts +8 -1
- package/package.json +13 -12
- 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/.agent/rules/GEMINI.md
CHANGED
|
@@ -139,12 +139,12 @@ Did I load the agent's required skills? → If no: check frontmatter skills: fi
|
|
|
139
139
|
|
|
140
140
|
The Socratic Gate is **adaptive** based on the task's **Impact Tier** evaluated by `impact_classifier.js`:
|
|
141
141
|
|
|
142
|
-
| Impact Tier
|
|
143
|
-
|
|
|
144
|
-
| **Tier 0 (Fast-Pass)**
|
|
145
|
-
| **Tier 1 (Express Pass)**
|
|
146
|
-
| **Tier 2 (Targeted Audit)** | Multi-file feature edit
|
|
147
|
-
| **Tier 3 (Full Gauntlet)**
|
|
142
|
+
| Impact Tier | Scope | Socratic Gate Policy |
|
|
143
|
+
| --------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
144
|
+
| **Tier 0 (Fast-Pass)** | Typo, CSS, markdown, formatting | **BYPASS** — 0 questions, 0 LLM calls |
|
|
145
|
+
| **Tier 1 (Express Pass)** | Single-file component or function logic edit | **BYPASS** — 0 questions, single specialist pass |
|
|
146
|
+
| **Tier 2 (Targeted Audit)** | Multi-file feature edit | **CONDITIONAL** — Ask 1 question ONLY if ambiguity score > 0.5 |
|
|
147
|
+
| **Tier 3 (Full Gauntlet)** | Auth, schema, migration, breaking architectural changes | **REQUIRED** — 1-2 targeted questions before execution (bypassable via `--no-gate` / `--express`) |
|
|
148
148
|
|
|
149
149
|
**Rules:**
|
|
150
150
|
|
|
@@ -213,14 +213,15 @@ The Human Gate is never skipped. No code is written to a file without explicit u
|
|
|
213
213
|
|
|
214
214
|
**Reviewer assignment by domain:**
|
|
215
215
|
|
|
216
|
-
| Code type | Reviewers
|
|
217
|
-
| --------------------- |
|
|
216
|
+
| Code type | Reviewers |
|
|
217
|
+
| --------------------- | --------------------------------------------------------------------------------------------------- |
|
|
218
218
|
| Backend/API | logic + security + dependency + type-safety + resilience + schema + complexity-reviewer |
|
|
219
219
|
| Frontend/React | logic + security + frontend + type-safety + ui-ux-auditor + review-animations + complexity-reviewer |
|
|
220
220
|
| Database/SQL | logic + security + sql + schema + complexity-reviewer |
|
|
221
221
|
| Mobile/Cross-platform | logic + security + mobile-reviewer + type-safety + complexity-reviewer |
|
|
222
|
+
| CI/CD / DevOps | pipeline-reviewer + security + dependency + resilience + complexity-reviewer |
|
|
222
223
|
| Any domain | + performance (if optimization) |
|
|
223
|
-
| Before merge | /tribunal-full (all
|
|
224
|
+
| Before merge | /tribunal-full (all 28 reviewers) |
|
|
224
225
|
|
|
225
226
|
---
|
|
226
227
|
|
|
@@ -281,6 +282,7 @@ These scripts live in `.agent/scripts/`. Agents and skills can invoke them:
|
|
|
281
282
|
| -------------------------- | ------------------------------------------------- | --------------------------------------------- |
|
|
282
283
|
| `checklist.js` | Priority audit: Security→Lint→Schema→Tests→UX→SEO | Before/after any major change |
|
|
283
284
|
| `verify_all.js` | Full pre-deploy validation suite | Pre-deploy |
|
|
285
|
+
| `cicd_validator.js` | GitHub Actions & CI/CD workflow security/syntax | Deploys, CI changes, /tribunal-cicd |
|
|
284
286
|
| `auto_preview.js` | Start/stop/restart local dev server | After /create or /enhance |
|
|
285
287
|
| `session_manager.js` | Track session state between conversations | Multi-session work |
|
|
286
288
|
| `lint_runner.js` | Standalone lint runner (ESLint, Prettier, Ruff) | Every code change |
|
|
@@ -12,29 +12,29 @@ Full rules (GEMINI.md) are NOT loaded — this saves ~4,800 tokens.
|
|
|
12
12
|
|
|
13
13
|
## Task Classification
|
|
14
14
|
|
|
15
|
-
| Type
|
|
16
|
-
|
|
|
17
|
-
| Question
|
|
18
|
-
| Simple edit
|
|
19
|
-
| Complex build
|
|
20
|
-
| Refactor
|
|
21
|
-
| Test
|
|
15
|
+
| Type | Signals | Output |
|
|
16
|
+
| ------------- | ---------------------------------------- | ------------------- |
|
|
17
|
+
| Question | "what is", "how does", "explain" | Text only — no code |
|
|
18
|
+
| Simple edit | "fix", "change", "update" (single file) | Direct edit |
|
|
19
|
+
| Complex build | "build", "create", "implement", "design" | Structured spec |
|
|
20
|
+
| Refactor | "refactor", "clean", "extract", "split" | Structured spec |
|
|
21
|
+
| Test | "test", "spec", "e2e" | Test spec |
|
|
22
22
|
|
|
23
23
|
---
|
|
24
24
|
|
|
25
25
|
## Stack Detection
|
|
26
26
|
|
|
27
|
-
| Keywords
|
|
28
|
-
|
|
|
29
|
-
| react, jsx, tsx, component, hook
|
|
30
|
-
| next, nextjs, server component
|
|
31
|
-
| vue, nuxt, composition api
|
|
32
|
-
| typescript, interface, generic
|
|
33
|
-
| python, fastapi, django, flask
|
|
34
|
-
| express, hono, koa, node
|
|
35
|
-
| sql, postgres, prisma, drizzle
|
|
36
|
-
| rust, cargo, tokio, axum
|
|
37
|
-
| css, tailwind, responsive
|
|
27
|
+
| Keywords | Stack |
|
|
28
|
+
| -------------------------------- | ---------- |
|
|
29
|
+
| react, jsx, tsx, component, hook | react |
|
|
30
|
+
| next, nextjs, server component | nextjs |
|
|
31
|
+
| vue, nuxt, composition api | vue |
|
|
32
|
+
| typescript, interface, generic | typescript |
|
|
33
|
+
| python, fastapi, django, flask | python |
|
|
34
|
+
| express, hono, koa, node | node |
|
|
35
|
+
| sql, postgres, prisma, drizzle | sql |
|
|
36
|
+
| rust, cargo, tokio, axum | rust |
|
|
37
|
+
| css, tailwind, responsive | css |
|
|
38
38
|
|
|
39
39
|
---
|
|
40
40
|
|
|
@@ -56,9 +56,7 @@ The planner MUST output a JSON object matching this schema:
|
|
|
56
56
|
"task_type": "frontend_component | api_endpoint | database_query | auth_flow | test_suite | refactor | animation | general",
|
|
57
57
|
"stack": ["react", "typescript", "css"],
|
|
58
58
|
"target_file": "path/to/file.tsx",
|
|
59
|
-
"essential_skills": [
|
|
60
|
-
{ "name": "skill-name", "score": 5.0 }
|
|
61
|
-
],
|
|
59
|
+
"essential_skills": [{ "name": "skill-name", "score": 5.0 }],
|
|
62
60
|
"constraints": {
|
|
63
61
|
"accessibility": true,
|
|
64
62
|
"responsive": true,
|
|
@@ -9,48 +9,48 @@
|
|
|
9
9
|
* const C = require('./_colors'); // C.RED, C.banner('Title'), etc.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
'use strict';
|
|
13
13
|
|
|
14
14
|
// ── Core ANSI Escape Codes ──────────────────────────────────────────────────
|
|
15
|
-
const GREEN =
|
|
16
|
-
const YELLOW =
|
|
17
|
-
const CYAN =
|
|
18
|
-
const RED =
|
|
19
|
-
const BLUE =
|
|
20
|
-
const MAGENTA =
|
|
21
|
-
const WHITE =
|
|
22
|
-
const GRAY =
|
|
23
|
-
const BOLD =
|
|
24
|
-
const DIM =
|
|
25
|
-
const ITALIC =
|
|
26
|
-
const UNDERLINE =
|
|
27
|
-
const RESET =
|
|
15
|
+
const GREEN = '\x1b[92m';
|
|
16
|
+
const YELLOW = '\x1b[93m';
|
|
17
|
+
const CYAN = '\x1b[96m';
|
|
18
|
+
const RED = '\x1b[91m';
|
|
19
|
+
const BLUE = '\x1b[94m';
|
|
20
|
+
const MAGENTA = '\x1b[95m';
|
|
21
|
+
const WHITE = '\x1b[97m';
|
|
22
|
+
const GRAY = '\x1b[90m';
|
|
23
|
+
const BOLD = '\x1b[1m';
|
|
24
|
+
const DIM = '\x1b[2m';
|
|
25
|
+
const ITALIC = '\x1b[3m';
|
|
26
|
+
const UNDERLINE = '\x1b[4m';
|
|
27
|
+
const RESET = '\x1b[0m';
|
|
28
28
|
|
|
29
29
|
// ── Box Drawing Characters ──────────────────────────────────────────────────
|
|
30
30
|
const BOX = {
|
|
31
|
-
TL:
|
|
32
|
-
TR:
|
|
33
|
-
BL:
|
|
34
|
-
BR:
|
|
35
|
-
H:
|
|
36
|
-
V:
|
|
37
|
-
tl:
|
|
38
|
-
tr:
|
|
39
|
-
bl:
|
|
40
|
-
br:
|
|
41
|
-
h:
|
|
42
|
-
v:
|
|
43
|
-
cross:
|
|
44
|
-
teeL:
|
|
45
|
-
teeR:
|
|
46
|
-
teeT:
|
|
47
|
-
teeB:
|
|
48
|
-
bullet:
|
|
49
|
-
bulletEmpty:
|
|
50
|
-
arrow:
|
|
51
|
-
arrowLeft:
|
|
52
|
-
check:
|
|
53
|
-
cross_mark:
|
|
31
|
+
TL: '╔',
|
|
32
|
+
TR: '╗',
|
|
33
|
+
BL: '╚',
|
|
34
|
+
BR: '╝',
|
|
35
|
+
H: '═',
|
|
36
|
+
V: '║',
|
|
37
|
+
tl: '┌',
|
|
38
|
+
tr: '┐',
|
|
39
|
+
bl: '└',
|
|
40
|
+
br: '┘',
|
|
41
|
+
h: '─',
|
|
42
|
+
v: '│',
|
|
43
|
+
cross: '┼',
|
|
44
|
+
teeL: '├',
|
|
45
|
+
teeR: '┤',
|
|
46
|
+
teeT: '┬',
|
|
47
|
+
teeB: '┴',
|
|
48
|
+
bullet: '●',
|
|
49
|
+
bulletEmpty: '○',
|
|
50
|
+
arrow: '→',
|
|
51
|
+
arrowLeft: '←',
|
|
52
|
+
check: '✔',
|
|
53
|
+
cross_mark: '✖',
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
// ── Branded Output Helpers ──────────────────────────────────────────────────
|
|
@@ -62,10 +62,8 @@ const BOX = {
|
|
|
62
62
|
* @returns {string} Formatted banner string
|
|
63
63
|
*/
|
|
64
64
|
function banner(title, meta = {}) {
|
|
65
|
-
const timestamp = new Date().toISOString().replace(
|
|
66
|
-
const lines = [
|
|
67
|
-
` ${BOLD}${CYAN}⚖️ TRIBUNAL KIT${RESET} ${DIM}— ${title}${RESET}`,
|
|
68
|
-
];
|
|
65
|
+
const timestamp = new Date().toISOString().replace('T', ' ').slice(0, 19);
|
|
66
|
+
const lines = [` ${BOLD}${CYAN}⚖️ TRIBUNAL KIT${RESET} ${DIM}— ${title}${RESET}`];
|
|
69
67
|
|
|
70
68
|
const metaEntries = Object.entries(meta);
|
|
71
69
|
if (metaEntries.length > 0) {
|
|
@@ -75,8 +73,8 @@ function banner(title, meta = {}) {
|
|
|
75
73
|
}
|
|
76
74
|
lines.push(` ${DIM}${timestamp}${RESET}`);
|
|
77
75
|
|
|
78
|
-
const divider = `${CYAN}${
|
|
79
|
-
return `\n${divider}\n${lines.join(
|
|
76
|
+
const divider = `${CYAN}${'━'.repeat(56)}${RESET}`;
|
|
77
|
+
return `\n${divider}\n${lines.join('\n')}\n${divider}`;
|
|
80
78
|
}
|
|
81
79
|
|
|
82
80
|
/**
|
|
@@ -87,8 +85,8 @@ function banner(title, meta = {}) {
|
|
|
87
85
|
* @returns {string}
|
|
88
86
|
*/
|
|
89
87
|
function sectionHeader(title, index, ms) {
|
|
90
|
-
const num = index != null ? `${index} — ` :
|
|
91
|
-
const timing = ms != null ? `${DIM} (${formatMs(ms)})${RESET}` :
|
|
88
|
+
const num = index != null ? `${index} — ` : '';
|
|
89
|
+
const timing = ms != null ? `${DIM} (${formatMs(ms)})${RESET}` : '';
|
|
92
90
|
return `\n${BOLD}${BLUE}━━━ ${num}${title} ━━━${RESET}${timing}`;
|
|
93
91
|
}
|
|
94
92
|
|
|
@@ -137,29 +135,29 @@ function info(msg) {
|
|
|
137
135
|
* @param {Array<{name: string, status: 'pass'|'fail'|'skip'|'warn', ms?: number}>} rows
|
|
138
136
|
*/
|
|
139
137
|
function summaryTable(rows) {
|
|
140
|
-
const maxName = Math.max(...rows.map(
|
|
138
|
+
const maxName = Math.max(...rows.map(r => r.name.length), 18);
|
|
141
139
|
const colW = maxName + 2;
|
|
142
140
|
|
|
143
|
-
const statusIcon =
|
|
144
|
-
if (s ===
|
|
145
|
-
if (s ===
|
|
146
|
-
if (s ===
|
|
147
|
-
if (s ===
|
|
141
|
+
const statusIcon = s => {
|
|
142
|
+
if (s === 'pass') return `${GREEN} ✅ ${RESET}`;
|
|
143
|
+
if (s === 'fail') return `${RED} ❌ ${RESET}`;
|
|
144
|
+
if (s === 'skip') return `${YELLOW} ⏭️ ${RESET}`;
|
|
145
|
+
if (s === 'warn') return `${YELLOW} ⚠️ ${RESET}`;
|
|
148
146
|
return `${DIM} — ${RESET}`;
|
|
149
147
|
};
|
|
150
148
|
|
|
151
|
-
const pad = (str, len) => str +
|
|
149
|
+
const pad = (str, len) => str + ' '.repeat(Math.max(0, len - str.length));
|
|
152
150
|
const top = ` ${BOX.tl}${BOX.h.repeat(colW)}${BOX.teeT}${BOX.h.repeat(6)}${BOX.teeT}${BOX.h.repeat(10)}${BOX.tr}`;
|
|
153
151
|
const mid = ` ${BOX.teeL}${BOX.h.repeat(colW)}${BOX.cross}${BOX.h.repeat(6)}${BOX.cross}${BOX.h.repeat(10)}${BOX.teeR}`;
|
|
154
152
|
const bot = ` ${BOX.bl}${BOX.h.repeat(colW)}${BOX.teeB}${BOX.h.repeat(6)}${BOX.teeB}${BOX.h.repeat(10)}${BOX.br}`;
|
|
155
|
-
const hdr = ` ${BOX.v} ${BOLD}${pad(
|
|
153
|
+
const hdr = ` ${BOX.v} ${BOLD}${pad('Check', colW - 2)}${RESET} ${BOX.v}${BOLD} Res ${RESET}${BOX.v} ${BOLD}${pad('Time', 8)}${RESET}${BOX.v}`;
|
|
156
154
|
|
|
157
155
|
console.log(top);
|
|
158
156
|
console.log(hdr);
|
|
159
157
|
console.log(mid);
|
|
160
158
|
|
|
161
159
|
for (const row of rows) {
|
|
162
|
-
const time = row.ms != null ? formatMs(row.ms) :
|
|
160
|
+
const time = row.ms != null ? formatMs(row.ms) : '—';
|
|
163
161
|
const line = ` ${BOX.v} ${pad(row.name, colW - 2)} ${BOX.v}${statusIcon(row.status)}${BOX.v} ${pad(time, 8)}${BOX.v}`;
|
|
164
162
|
console.log(line);
|
|
165
163
|
}
|
package/.agent/scripts/_utils.js
CHANGED
|
@@ -8,46 +8,46 @@
|
|
|
8
8
|
* const { findAgentDir, walkDir, loadJson } = require('./_utils');
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
'use strict';
|
|
12
12
|
|
|
13
|
-
const fs = require(
|
|
14
|
-
const path = require(
|
|
15
|
-
const { RED, RESET } = require(
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const { RED, RESET } = require('./_colors');
|
|
16
16
|
|
|
17
17
|
// ── Default Skip Directories ────────────────────────────────────────────────
|
|
18
18
|
const DEFAULT_SKIP_DIRS = new Set([
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
19
|
+
'node_modules',
|
|
20
|
+
'.git',
|
|
21
|
+
'dist',
|
|
22
|
+
'build',
|
|
23
|
+
'.next',
|
|
24
|
+
'.agent',
|
|
25
|
+
'__pycache__',
|
|
26
|
+
'.venv',
|
|
27
|
+
'venv',
|
|
28
|
+
'coverage',
|
|
29
|
+
'.turbo',
|
|
30
|
+
'.svelte-kit',
|
|
31
|
+
'.nuxt',
|
|
32
|
+
'.output',
|
|
33
33
|
]);
|
|
34
34
|
|
|
35
35
|
// ── Default Source Extensions ───────────────────────────────────────────────
|
|
36
36
|
const SOURCE_EXTENSIONS = new Set([
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
37
|
+
'.ts',
|
|
38
|
+
'.tsx',
|
|
39
|
+
'.js',
|
|
40
|
+
'.jsx',
|
|
41
|
+
'.mjs',
|
|
42
|
+
'.cjs',
|
|
43
|
+
'.py',
|
|
44
|
+
'.rs',
|
|
45
|
+
'.go',
|
|
46
|
+
'.java',
|
|
47
|
+
'.cs',
|
|
48
|
+
'.rb',
|
|
49
|
+
'.vue',
|
|
50
|
+
'.svelte',
|
|
51
51
|
]);
|
|
52
52
|
|
|
53
53
|
// ── Agent Directory Discovery ───────────────────────────────────────────────
|
|
@@ -62,7 +62,7 @@ function findAgentDir(startDir) {
|
|
|
62
62
|
const root = path.parse(current).root;
|
|
63
63
|
|
|
64
64
|
while (current !== root) {
|
|
65
|
-
const candidate = path.join(current,
|
|
65
|
+
const candidate = path.join(current, '.agent');
|
|
66
66
|
if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
|
|
67
67
|
return candidate;
|
|
68
68
|
}
|
|
@@ -83,7 +83,7 @@ function findAgentDir(startDir) {
|
|
|
83
83
|
* @returns {boolean}
|
|
84
84
|
*/
|
|
85
85
|
function hasNpm(dir) {
|
|
86
|
-
return fs.existsSync(path.join(dir,
|
|
86
|
+
return fs.existsSync(path.join(dir, 'package.json'));
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
/**
|
|
@@ -93,7 +93,7 @@ function hasNpm(dir) {
|
|
|
93
93
|
*/
|
|
94
94
|
function loadJson(filePath) {
|
|
95
95
|
try {
|
|
96
|
-
return JSON.parse(fs.readFileSync(filePath,
|
|
96
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
97
97
|
} catch {
|
|
98
98
|
return null;
|
|
99
99
|
}
|
|
@@ -164,8 +164,7 @@ function countFiles(dir, skipDirs = DEFAULT_SKIP_DIRS) {
|
|
|
164
164
|
return;
|
|
165
165
|
}
|
|
166
166
|
for (const e of entries) {
|
|
167
|
-
if (e.isDirectory() && !skipDirs.has(e.name))
|
|
168
|
-
_count(path.join(d, e.name));
|
|
167
|
+
if (e.isDirectory() && !skipDirs.has(e.name)) _count(path.join(d, e.name));
|
|
169
168
|
else if (e.isFile()) count++;
|
|
170
169
|
}
|
|
171
170
|
}
|
|
@@ -189,31 +188,31 @@ function parseArgs(argv, schema = {}) {
|
|
|
189
188
|
|
|
190
189
|
// Set defaults
|
|
191
190
|
for (const [key, def] of Object.entries(schema)) {
|
|
192
|
-
flags[key] = def.default ?? (def.type ===
|
|
191
|
+
flags[key] = def.default ?? (def.type === 'boolean' ? false : null);
|
|
193
192
|
}
|
|
194
193
|
|
|
195
194
|
for (let i = 0; i < argv.length; i++) {
|
|
196
195
|
const arg = argv[i];
|
|
197
196
|
|
|
198
|
-
if (arg ===
|
|
197
|
+
if (arg === '-h' || arg === '--help') {
|
|
199
198
|
flags.help = true;
|
|
200
199
|
continue;
|
|
201
200
|
}
|
|
202
201
|
|
|
203
|
-
if (arg.startsWith(
|
|
202
|
+
if (arg.startsWith('--')) {
|
|
204
203
|
const flagName = arg.slice(2);
|
|
205
204
|
const schemaDef = schema[flagName];
|
|
206
205
|
|
|
207
|
-
if (schemaDef && schemaDef.type ===
|
|
206
|
+
if (schemaDef && schemaDef.type === 'boolean') {
|
|
208
207
|
flags[flagName] = true;
|
|
209
208
|
} else if (schemaDef && i + 1 < argv.length) {
|
|
210
209
|
const val = argv[++i];
|
|
211
|
-
flags[flagName] = schemaDef.type ===
|
|
210
|
+
flags[flagName] = schemaDef.type === 'number' ? Number(val) : val;
|
|
212
211
|
} else {
|
|
213
212
|
// Unknown flag, store as boolean
|
|
214
213
|
flags[flagName] = true;
|
|
215
214
|
}
|
|
216
|
-
} else if (arg.startsWith(
|
|
215
|
+
} else if (arg.startsWith('-') && arg.length === 2) {
|
|
217
216
|
// Short flag — treat as boolean
|
|
218
217
|
flags[arg.slice(1)] = true;
|
|
219
218
|
} else {
|
|
@@ -226,7 +225,7 @@ function parseArgs(argv, schema = {}) {
|
|
|
226
225
|
|
|
227
226
|
// ── Command Runner ──────────────────────────────────────────────────────────
|
|
228
227
|
|
|
229
|
-
const WINDOWS_CMD_SHIMS = new Set([
|
|
228
|
+
const WINDOWS_CMD_SHIMS = new Set(['npm', 'npx', 'pnpm', 'yarn', 'bun', 'bunx']);
|
|
230
229
|
|
|
231
230
|
/**
|
|
232
231
|
* Select the executable that should be passed to spawnSync.
|
|
@@ -239,11 +238,11 @@ const WINDOWS_CMD_SHIMS = new Set(["npm", "npx", "pnpm", "yarn", "bun", "bunx"])
|
|
|
239
238
|
*/
|
|
240
239
|
function normalizeCommand(cmd, platform = process.platform) {
|
|
241
240
|
const lowerCaseCommand = cmd.toLowerCase();
|
|
242
|
-
const hasPath = cmd.includes(
|
|
241
|
+
const hasPath = cmd.includes('/') || cmd.includes('\\\\');
|
|
243
242
|
if (
|
|
244
|
-
platform ===
|
|
243
|
+
platform === 'win32' &&
|
|
245
244
|
!hasPath &&
|
|
246
|
-
!lowerCaseCommand.endsWith(
|
|
245
|
+
!lowerCaseCommand.endsWith('.cmd') &&
|
|
247
246
|
WINDOWS_CMD_SHIMS.has(lowerCaseCommand)
|
|
248
247
|
) {
|
|
249
248
|
return `${cmd}.cmd`;
|
|
@@ -261,22 +260,22 @@ function normalizeCommand(cmd, platform = process.platform) {
|
|
|
261
260
|
* @returns {{ status: number, stdout: string, stderr: string, ok: boolean }}
|
|
262
261
|
*/
|
|
263
262
|
function runCommand(cmd, args = [], opts = {}) {
|
|
264
|
-
const { spawnSync } = require(
|
|
263
|
+
const { spawnSync } = require('child_process');
|
|
265
264
|
const executable = normalizeCommand(cmd);
|
|
266
265
|
|
|
267
266
|
const result = spawnSync(executable, args, {
|
|
268
|
-
encoding:
|
|
267
|
+
encoding: 'utf8',
|
|
269
268
|
timeout: opts.timeout || 120000,
|
|
270
269
|
cwd: opts.cwd || process.cwd(),
|
|
271
|
-
shell: process.platform ===
|
|
272
|
-
stdio: opts.stdio ||
|
|
270
|
+
shell: process.platform === 'win32',
|
|
271
|
+
stdio: opts.stdio || 'pipe',
|
|
273
272
|
...opts,
|
|
274
273
|
});
|
|
275
274
|
|
|
276
275
|
return {
|
|
277
276
|
status: result.status ?? 1,
|
|
278
|
-
stdout: (result.stdout ||
|
|
279
|
-
stderr: (result.stderr ||
|
|
277
|
+
stdout: (result.stdout || '').toString(),
|
|
278
|
+
stderr: (result.stderr || '').toString(),
|
|
280
279
|
ok: result.status === 0,
|
|
281
280
|
};
|
|
282
281
|
}
|