@monoes/monomindcli 2.16.3 → 2.16.5
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/.claude/agents/github/repo-architect.md +1 -1
- package/.claude/agents/specialists/integration-architect.md +9 -13
- package/.claude/commands/agents/agent-capabilities.md +1 -0
- package/.claude/commands/agents/agent-coordination.md +1 -0
- package/.claude/commands/agents/agent-spawning.md +1 -0
- package/.claude/commands/agents/agent-types.md +1 -0
- package/.claude/commands/analysis/bottleneck-detect.md +1 -0
- package/.claude/commands/analysis/performance-bottlenecks.md +1 -0
- package/.claude/commands/analysis/performance-report.md +1 -0
- package/.claude/commands/analysis/token-usage.md +1 -0
- package/.claude/commands/automation/README.md +1 -1
- package/.claude/commands/automation/auto-agent.md +1 -0
- package/.claude/commands/automation/self-healing.md +1 -0
- package/.claude/commands/automation/session-memory.md +1 -0
- package/.claude/commands/automation/smart-agents.md +1 -0
- package/.claude/commands/automation/smart-spawn.md +1 -0
- package/.claude/commands/automation/workflow-select.md +22 -27
- package/.claude/commands/coordination/README.md +2 -2
- package/.claude/commands/coordination/agent-spawn.md +1 -0
- package/.claude/commands/coordination/monoswarm-init.md +9 -8
- package/.claude/commands/coordination/task-orchestrate.md +6 -5
- package/.claude/commands/github/README.md +1 -1
- package/.claude/commands/github/github-modes.md +1 -0
- package/.claude/commands/github/issue-tracker.md +1 -0
- package/.claude/commands/github/pr-manager.md +1 -0
- package/.claude/commands/github/release-manager.md +1 -2
- package/.claude/commands/github/repo-architect.md +1 -0
- package/.claude/commands/github/sync-coordinator.md +1 -0
- package/.claude/commands/hooks/overview.md +1 -0
- package/.claude/commands/hooks/post-edit.md +1 -0
- package/.claude/commands/hooks/post-task.md +1 -0
- package/.claude/commands/hooks/pre-edit.md +1 -0
- package/.claude/commands/hooks/pre-task.md +1 -0
- package/.claude/commands/hooks/session-end.md +1 -0
- package/.claude/commands/hooks/setup.md +1 -0
- package/.claude/commands/mastermind/adr.md +3 -1
- package/.claude/commands/mastermind/brain.md +3 -1
- package/.claude/commands/mastermind/budget.md +3 -1
- package/.claude/commands/mastermind/code-review.md +3 -1
- package/.claude/commands/mastermind/content.md +3 -1
- package/.claude/commands/mastermind/createorg.md +4 -2
- package/.claude/commands/mastermind/createtask.md +6 -4
- package/.claude/commands/mastermind/debug.md +3 -1
- package/.claude/commands/mastermind/design.md +3 -1
- package/.claude/commands/mastermind/do.md +5 -3
- package/.claude/commands/mastermind/execute.md +3 -1
- package/.claude/commands/mastermind/finance.md +3 -1
- package/.claude/commands/mastermind/graph-status.md +3 -1
- package/.claude/commands/mastermind/help.md +17 -20
- package/.claude/commands/mastermind/idea.md +3 -1
- package/.claude/commands/mastermind/ideate.md +4 -2
- package/.claude/commands/mastermind/improve.md +4 -2
- package/.claude/commands/mastermind/loops.md +3 -1
- package/.claude/commands/mastermind/marketing.md +3 -1
- package/.claude/commands/mastermind/master.md +4 -3
- package/.claude/commands/mastermind/memory.md +8 -36
- package/.claude/commands/mastermind/monoswarm.md +3 -2
- package/.claude/commands/mastermind/okf-export.md +3 -1
- package/.claude/commands/mastermind/okf-import.md +3 -1
- package/.claude/commands/mastermind/ops.md +3 -1
- package/.claude/commands/mastermind/orgs.md +3 -1
- package/.claude/commands/mastermind/orgstatus.md +3 -1
- package/.claude/commands/mastermind/plan.md +3 -1
- package/.claude/commands/mastermind/receive-review.md +3 -1
- package/.claude/commands/mastermind/release.md +3 -1
- package/.claude/commands/mastermind/repeat.md +3 -1
- package/.claude/commands/mastermind/research.md +3 -1
- package/.claude/commands/mastermind/review.md +3 -1
- package/.claude/commands/mastermind/runorg.md +4 -2
- package/.claude/commands/mastermind/sales.md +3 -1
- package/.claude/commands/mastermind/skill-builder.md +3 -1
- package/.claude/commands/mastermind/specialagents.md +3 -1
- package/.claude/commands/mastermind/stoporg.md +9 -11
- package/.claude/commands/mastermind/techport.md +3 -1
- package/.claude/commands/mastermind/topology.md +4 -3
- package/.claude/commands/mastermind/understand.md +3 -1
- package/.claude/commands/mastermind/worktree.md +3 -1
- package/.claude/commands/memory/memory-search.md +1 -0
- package/.claude/commands/monitoring/README.md +1 -1
- package/.claude/commands/monitoring/agent-metrics.md +1 -0
- package/.claude/commands/monitoring/agents.md +1 -0
- package/.claude/commands/monitoring/status.md +1 -0
- package/.claude/commands/monoswarm/README.md +3 -3
- package/.claude/commands/monoswarm/analysis.md +2 -2
- package/.claude/commands/monoswarm/consensus.md +1 -0
- package/.claude/commands/monoswarm/development.md +3 -3
- package/.claude/commands/monoswarm/examples.md +4 -4
- package/.claude/commands/monoswarm/init.md +2 -1
- package/.claude/commands/monoswarm/maintenance.md +2 -2
- package/.claude/commands/monoswarm/memory.md +1 -0
- package/.claude/commands/monoswarm/monoswarm.md +5 -5
- package/.claude/commands/monoswarm/optimization.md +2 -2
- package/.claude/commands/monoswarm/research.md +2 -2
- package/.claude/commands/monoswarm/spawn.md +1 -0
- package/.claude/commands/monoswarm/status.md +2 -1
- package/.claude/commands/monoswarm/stop.md +2 -1
- package/.claude/commands/monoswarm/testing.md +2 -2
- package/.claude/commands/pair/README.md +8 -9
- package/.claude/commands/pair/examples.md +3 -4
- package/.claude/commands/pair/session.md +1 -1
- package/.claude/commands/workflows/README.md +45 -40
- package/.claude/commands/workflows/development.md +42 -55
- package/.claude/commands/workflows/research.md +41 -57
- package/.claude/commands/workflows/workflow-create.md +43 -45
- package/.claude/commands/workflows/workflow-execute.md +58 -68
- package/.claude/commands/workflows/workflow-export.md +37 -63
- package/.claude/helpers/agent-registry.cjs +434 -0
- package/.claude/helpers/build-skill-registry.cjs +10 -6
- package/.claude/helpers/handlers/pick-core.cjs +55 -26
- package/.claude/helpers/handlers/route-handler.cjs +11 -3
- package/.claude/helpers/handlers/session-restore-handler.cjs +4 -1
- package/.claude/helpers/hook-handler.cjs +4 -2
- package/.claude/helpers/jev-catalog.cjs +14 -6
- package/.claude/helpers/jev-picker.cjs +52 -8
- package/.claude/helpers/pick-rank.cjs +184 -6
- package/.claude/helpers/pick-stats.cjs +86 -2
- package/.claude/skills/agentic-jujutsu/SKILL.md +2 -3
- package/.claude/skills/github-toolkit/SKILL.md +1 -1
- package/.claude/skills/hooks-automation/SKILL.md +243 -938
- package/.claude/skills/mastermind-agent-detail/SKILL.md +1 -1
- package/.claude/skills/mastermind-agent-select/SKILL.md +16 -1
- package/.claude/skills/mastermind-agents/SKILL.md +31 -38
- package/.claude/skills/mastermind-createorg/SKILL.md +3 -3
- package/.claude/skills/mastermind-env/SKILL.md +4 -18
- package/.claude/skills/mastermind-inbox/SKILL.md +31 -52
- package/.claude/skills/mastermind-instance/SKILL.md +7 -5
- package/.claude/skills/mastermind-new-agent/SKILL.md +3 -3
- package/.claude/skills/mastermind-org-settings/SKILL.md +3 -4
- package/.claude/skills/mastermind-orgs/SKILL.md +26 -32
- package/.claude/skills/mastermind-orgstatus/SKILL.md +49 -140
- package/.claude/skills/mastermind-plugins/SKILL.md +1 -1
- package/.claude/skills/mastermind-release/SKILL.md +9 -1
- package/.claude/skills/mastermind-research/SKILL.md +9 -1
- package/.claude/skills/mastermind-review/SKILL.md +9 -1
- package/.claude/skills/mastermind-routine-detail/SKILL.md +1 -1
- package/.claude/skills/mastermind-runorg/SKILL.md +13 -13
- package/.claude/skills/mastermind-stoporg/SKILL.md +7 -62
- package/.claude/skills/mastermind-tasks/SKILL.md +6 -8
- package/.claude/skills/monodesign/SKILL.md +257 -0
- package/.claude/skills/monodesign/adapt.md +53 -0
- package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +100 -0
- package/.claude/skills/monodesign/agents/monodesign-manual-edit-applier.md +103 -0
- package/.claude/skills/monodesign/animate.md +65 -0
- package/.claude/skills/monodesign/audit.md +89 -0
- package/.claude/skills/monodesign/bolder.md +50 -0
- package/.claude/skills/monodesign/clarify.md +64 -0
- package/.claude/skills/monodesign/colorize.md +68 -0
- package/.claude/skills/monodesign/craft.md +51 -0
- package/.claude/skills/monodesign/critique.md +66 -0
- package/.claude/skills/monodesign/delight.md +47 -0
- package/.claude/skills/monodesign/distill.md +56 -0
- package/.claude/skills/monodesign/document.md +83 -0
- package/.claude/skills/monodesign/extract.md +74 -0
- package/.claude/skills/monodesign/harden.md +65 -0
- package/.claude/skills/monodesign/init.md +30 -0
- package/.claude/skills/monodesign/layout.md +36 -0
- package/.claude/skills/monodesign/live.md +34 -0
- package/.claude/skills/monodesign/onboard.md +50 -0
- package/.claude/skills/monodesign/optimize.md +64 -0
- package/.claude/skills/monodesign/overdrive.md +56 -0
- package/.claude/skills/monodesign/polish.md +68 -0
- package/.claude/skills/monodesign/quieter.md +57 -0
- package/.claude/skills/monodesign/reference/adapt.md +312 -0
- package/.claude/skills/monodesign/reference/adapt.native.md +58 -0
- package/.claude/skills/monodesign/reference/android.md +40 -0
- package/.claude/skills/monodesign/reference/animate.md +203 -0
- package/.claude/skills/monodesign/reference/antipatterns-catalog.md +410 -0
- package/.claude/skills/monodesign/reference/audit.md +135 -0
- package/.claude/skills/monodesign/reference/audit.native.md +139 -0
- package/.claude/skills/monodesign/reference/bolder.md +120 -0
- package/.claude/skills/monodesign/reference/brand-workflow.md +180 -0
- package/.claude/skills/monodesign/reference/brand.md +108 -0
- package/.claude/skills/monodesign/reference/clarify.md +288 -0
- package/.claude/skills/monodesign/reference/codex.md +105 -0
- package/.claude/skills/monodesign/reference/cognitive-load.md +106 -0
- package/.claude/skills/monodesign/reference/color-and-contrast.md +105 -0
- package/.claude/skills/monodesign/reference/colorize.md +257 -0
- package/.claude/skills/monodesign/reference/component-specs.md +260 -0
- package/.claude/skills/monodesign/reference/component-states.md +274 -0
- package/.claude/skills/monodesign/reference/component-system.md +358 -0
- package/.claude/skills/monodesign/reference/copy-formulas.md +160 -0
- package/.claude/skills/monodesign/reference/craft.md +123 -0
- package/.claude/skills/monodesign/reference/critique.md +780 -0
- package/.claude/skills/monodesign/reference/delight.md +302 -0
- package/.claude/skills/monodesign/reference/design-principles.md +246 -0
- package/.claude/skills/monodesign/reference/distill.md +111 -0
- package/.claude/skills/monodesign/reference/document.md +429 -0
- package/.claude/skills/monodesign/reference/extract.md +69 -0
- package/.claude/skills/monodesign/reference/harden.md +347 -0
- package/.claude/skills/monodesign/reference/heuristics-scoring.md +234 -0
- package/.claude/skills/monodesign/reference/hooks.md +92 -0
- package/.claude/skills/monodesign/reference/image-prompts.md +130 -0
- package/.claude/skills/monodesign/reference/init.md +221 -0
- package/.claude/skills/monodesign/reference/interaction-design.md +189 -0
- package/.claude/skills/monodesign/reference/ios.md +45 -0
- package/.claude/skills/monodesign/reference/layout.md +185 -0
- package/.claude/skills/monodesign/reference/live.md +710 -0
- package/.claude/skills/monodesign/reference/motion-design.md +109 -0
- package/.claude/skills/monodesign/reference/onboard.md +234 -0
- package/.claude/skills/monodesign/reference/optimize.md +258 -0
- package/.claude/skills/monodesign/reference/overdrive.md +130 -0
- package/.claude/skills/monodesign/reference/personas.md +179 -0
- package/.claude/skills/monodesign/reference/polish.md +241 -0
- package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +108 -0
- package/.claude/skills/monodesign/reference/product.md +60 -0
- package/.claude/skills/monodesign/reference/quieter.md +99 -0
- package/.claude/skills/monodesign/reference/responsive-design.md +114 -0
- package/.claude/skills/monodesign/reference/shape.md +165 -0
- package/.claude/skills/monodesign/reference/spatial-design.md +100 -0
- package/.claude/skills/monodesign/reference/teach.md +10 -0
- package/.claude/skills/monodesign/reference/token-architecture.md +222 -0
- package/.claude/skills/monodesign/reference/typeset.md +301 -0
- package/.claude/skills/monodesign/reference/typography.md +159 -0
- package/.claude/skills/monodesign/reference/ux-research.md +143 -0
- package/.claude/skills/monodesign/reference/ux-rules.md +211 -0
- package/.claude/skills/monodesign/reference/ux-writing.md +107 -0
- package/.claude/skills/monodesign/scripts/command-metadata.json +94 -0
- package/.claude/skills/monodesign/scripts/context-signals.mjs +260 -0
- package/.claude/skills/monodesign/scripts/context.mjs +1065 -0
- package/.claude/skills/monodesign/scripts/critique-storage.mjs +416 -0
- package/.claude/skills/monodesign/scripts/detect-csp.mjs +193 -0
- package/.claude/skills/monodesign/scripts/detect.mjs +33 -0
- package/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +1960 -0
- package/.claude/skills/monodesign/scripts/detector/cli/main.mjs +321 -0
- package/.claude/skills/monodesign/scripts/detector/design-system.mjs +814 -0
- package/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +5628 -0
- package/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +50 -0
- package/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +259 -0
- package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +339 -0
- package/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +636 -0
- package/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +1016 -0
- package/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +253 -0
- package/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +198 -0
- package/.claude/skills/monodesign/scripts/detector/findings.mjs +12 -0
- package/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +181 -0
- package/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +373 -0
- package/.claude/skills/monodesign/scripts/detector/fix/index.mjs +426 -0
- package/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +198 -0
- package/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +166 -0
- package/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +563 -0
- package/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +3024 -0
- package/.claude/skills/monodesign/scripts/detector/shared/color.mjs +124 -0
- package/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +101 -0
- package/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +30 -0
- package/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +148 -0
- package/.claude/skills/monodesign/scripts/detector/shared/page.mjs +7 -0
- package/.claude/skills/monodesign/scripts/hook-admin.mjs +694 -0
- package/.claude/skills/monodesign/scripts/hook-before-edit.mjs +516 -0
- package/.claude/skills/monodesign/scripts/hook-lib.mjs +1785 -0
- package/.claude/skills/monodesign/scripts/hook.mjs +61 -0
- package/.claude/skills/monodesign/scripts/lib/design-parser.mjs +809 -0
- package/.claude/skills/monodesign/scripts/lib/is-generated.mjs +69 -0
- package/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +640 -0
- package/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +129 -0
- package/.claude/skills/monodesign/scripts/lib/provider.mjs +4 -0
- package/.claude/skills/monodesign/scripts/lib/target-args.mjs +42 -0
- package/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +50 -0
- package/.claude/skills/monodesign/scripts/live/completion.mjs +19 -0
- package/.claude/skills/monodesign/scripts/live/event-validation.mjs +137 -0
- package/.claude/skills/monodesign/scripts/live/insert-ui.mjs +458 -0
- package/.claude/skills/monodesign/scripts/live/manual-apply.mjs +939 -0
- package/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +357 -0
- package/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +152 -0
- package/.claude/skills/monodesign/scripts/live/session-store.mjs +293 -0
- package/.claude/skills/monodesign/scripts/live/svelte-component.mjs +826 -0
- package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +279 -0
- package/.claude/skills/monodesign/scripts/live/ui-core.mjs +180 -0
- package/.claude/skills/monodesign/scripts/live/vocabulary.mjs +36 -0
- package/.claude/skills/monodesign/scripts/live-accept.mjs +812 -0
- package/.claude/skills/monodesign/scripts/live-browser-dom.js +147 -0
- package/.claude/skills/monodesign/scripts/live-browser-session.js +124 -0
- package/.claude/skills/monodesign/scripts/live-browser.js +11213 -0
- package/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +1241 -0
- package/.claude/skills/monodesign/scripts/live-complete.mjs +75 -0
- package/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +683 -0
- package/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +51 -0
- package/.claude/skills/monodesign/scripts/live-inject.mjs +596 -0
- package/.claude/skills/monodesign/scripts/live-insert.mjs +272 -0
- package/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +363 -0
- package/.claude/skills/monodesign/scripts/live-poll.mjs +384 -0
- package/.claude/skills/monodesign/scripts/live-resume.mjs +94 -0
- package/.claude/skills/monodesign/scripts/live-server.mjs +1210 -0
- package/.claude/skills/monodesign/scripts/live-status.mjs +61 -0
- package/.claude/skills/monodesign/scripts/live-target.mjs +30 -0
- package/.claude/skills/monodesign/scripts/live-wrap.mjs +884 -0
- package/.claude/skills/monodesign/scripts/live.mjs +297 -0
- package/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +14 -0
- package/.claude/skills/monodesign/scripts/palette.mjs +635 -0
- package/.claude/skills/monodesign/scripts/pin.mjs +221 -0
- package/.claude/skills/monodesign/shape.md +71 -0
- package/.claude/skills/monodesign/teach.md +18 -0
- package/.claude/skills/monodesign/typeset.md +59 -0
- package/.claude/skills/monolean-audit/SKILL.md +4 -6
- package/.claude/skills/monolean-help/SKILL.md +0 -1
- package/.claude/skills/monoswarm/SKILL.md +17 -17
- package/.claude/skills/pair-programming/SKILL.md +127 -1100
- package/README.md +28 -43
- package/dist/src/agents/registry-builder.d.ts +58 -22
- package/dist/src/agents/registry-builder.d.ts.map +1 -1
- package/dist/src/agents/registry-builder.js +41 -341
- package/dist/src/agents/registry-builder.js.map +1 -1
- package/dist/src/agents/registry-freshness.d.ts +4 -4
- package/dist/src/agents/registry-freshness.d.ts.map +1 -1
- package/dist/src/agents/registry-freshness.js +11 -60
- package/dist/src/agents/registry-freshness.js.map +1 -1
- package/dist/src/commands/doc.d.ts.map +1 -1
- package/dist/src/commands/doc.js +6 -15
- package/dist/src/commands/doc.js.map +1 -1
- package/dist/src/commands/doctor-pick-checks.d.ts +20 -3
- package/dist/src/commands/doctor-pick-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-pick-checks.js +138 -45
- package/dist/src/commands/doctor-pick-checks.js.map +1 -1
- package/dist/src/commands/doctor-project-checks.d.ts +2 -2
- package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-project-checks.js +21 -17
- package/dist/src/commands/doctor-project-checks.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +6 -4
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/hooks-routing-commands.d.ts.map +1 -1
- package/dist/src/commands/hooks-routing-commands.js +4 -3
- package/dist/src/commands/hooks-routing-commands.js.map +1 -1
- package/dist/src/commands/init-upgrade.d.ts.map +1 -1
- package/dist/src/commands/init-upgrade.js +10 -0
- package/dist/src/commands/init-upgrade.js.map +1 -1
- package/dist/src/commands/init-wizard.d.ts.map +1 -1
- package/dist/src/commands/init-wizard.js +7 -2
- package/dist/src/commands/init-wizard.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +27 -27
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/monograph.d.ts.map +1 -1
- package/dist/src/commands/monograph.js +16 -21
- package/dist/src/commands/monograph.js.map +1 -1
- package/dist/src/commands/org.js +1 -1
- package/dist/src/commands/org.js.map +1 -1
- package/dist/src/commands/pick.d.ts.map +1 -1
- package/dist/src/commands/pick.js +4 -3
- package/dist/src/commands/pick.js.map +1 -1
- package/dist/src/decision/jev.d.ts +20 -0
- package/dist/src/decision/jev.d.ts.map +1 -1
- package/dist/src/decision/jev.js +12 -0
- package/dist/src/decision/jev.js.map +1 -1
- package/dist/src/decision/pick-eval.d.ts +23 -0
- package/dist/src/decision/pick-eval.d.ts.map +1 -1
- package/dist/src/decision/pick-eval.js +24 -1
- package/dist/src/decision/pick-eval.js.map +1 -1
- package/dist/src/decision/pick-real.d.ts +93 -0
- package/dist/src/decision/pick-real.d.ts.map +1 -0
- package/dist/src/decision/pick-real.js +253 -0
- package/dist/src/decision/pick-real.js.map +1 -0
- package/dist/src/decision/picks.d.ts +6 -0
- package/dist/src/decision/picks.d.ts.map +1 -1
- package/dist/src/decision/picks.js +34 -11
- package/dist/src/decision/picks.js.map +1 -1
- package/dist/src/init/claudemd-generator.d.ts.map +1 -1
- package/dist/src/init/claudemd-generator.js +1 -0
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/copy-assets.d.ts.map +1 -1
- package/dist/src/init/copy-assets.js +17 -9
- package/dist/src/init/copy-assets.js.map +1 -1
- package/dist/src/init/embeddings-step.d.ts +23 -0
- package/dist/src/init/embeddings-step.d.ts.map +1 -0
- package/dist/src/init/embeddings-step.js +53 -0
- package/dist/src/init/embeddings-step.js.map +1 -0
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +35 -5
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/file-guard.d.ts +93 -0
- package/dist/src/init/file-guard.d.ts.map +1 -0
- package/dist/src/init/file-guard.js +239 -0
- package/dist/src/init/file-guard.js.map +1 -0
- package/dist/src/init/helpers-generator.d.ts +7 -0
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +13 -0
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/init-memory.d.ts +10 -0
- package/dist/src/init/init-memory.d.ts.map +1 -1
- package/dist/src/init/init-memory.js +44 -1
- package/dist/src/init/init-memory.js.map +1 -1
- package/dist/src/init/managed-block.d.ts +3 -1
- package/dist/src/init/managed-block.d.ts.map +1 -1
- package/dist/src/init/managed-block.js +9 -2
- package/dist/src/init/managed-block.js.map +1 -1
- package/dist/src/init/mcp-generator.d.ts +9 -0
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js +28 -0
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/project-indexes.d.ts +19 -0
- package/dist/src/init/project-indexes.d.ts.map +1 -0
- package/dist/src/init/project-indexes.js +44 -0
- package/dist/src/init/project-indexes.js.map +1 -0
- package/dist/src/init/runtime-config-merge.d.ts +21 -0
- package/dist/src/init/runtime-config-merge.d.ts.map +1 -0
- package/dist/src/init/runtime-config-merge.js +88 -0
- package/dist/src/init/runtime-config-merge.js.map +1 -0
- package/dist/src/init/settings-generator.js +1 -1
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/shared-instructions-generator.d.ts +3 -1
- package/dist/src/init/shared-instructions-generator.d.ts.map +1 -1
- package/dist/src/init/shared-instructions-generator.js +14 -39
- package/dist/src/init/shared-instructions-generator.js.map +1 -1
- package/dist/src/init/shared.d.ts +17 -2
- package/dist/src/init/shared.d.ts.map +1 -1
- package/dist/src/init/shared.js +39 -7
- package/dist/src/init/shared.js.map +1 -1
- package/dist/src/init/types.d.ts +22 -2
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +11 -3
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/init/upgrade.d.ts +7 -0
- package/dist/src/init/upgrade.d.ts.map +1 -1
- package/dist/src/init/upgrade.js +60 -48
- package/dist/src/init/upgrade.js.map +1 -1
- package/dist/src/init/write-antigravity.d.ts +1 -0
- package/dist/src/init/write-antigravity.d.ts.map +1 -1
- package/dist/src/init/write-antigravity.js +28 -4
- package/dist/src/init/write-antigravity.js.map +1 -1
- package/dist/src/init/write-claude.d.ts.map +1 -1
- package/dist/src/init/write-claude.js +47 -23
- package/dist/src/init/write-claude.js.map +1 -1
- package/dist/src/init/write-kimicode.d.ts +27 -0
- package/dist/src/init/write-kimicode.d.ts.map +1 -1
- package/dist/src/init/write-kimicode.js +119 -92
- package/dist/src/init/write-kimicode.js.map +1 -1
- package/dist/src/init/write-opencode.d.ts.map +1 -1
- package/dist/src/init/write-opencode.js +45 -6
- package/dist/src/init/write-opencode.js.map +1 -1
- package/dist/src/init/write-runtime-config.d.ts.map +1 -1
- package/dist/src/init/write-runtime-config.js +108 -81
- package/dist/src/init/write-runtime-config.js.map +1 -1
- package/dist/src/knowledge/eval/golden-set.js +0 -15
- package/dist/src/knowledge/eval/golden-set.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +14 -5
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.js +4 -3
- package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
- package/dist/src/mcp-tools/monograph/build-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monograph/build-tools.js +16 -9
- package/dist/src/mcp-tools/monograph/build-tools.js.map +1 -1
- package/dist/src/mcp-tools/org-skill-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/org-skill-tools.js +6 -2
- package/dist/src/mcp-tools/org-skill-tools.js.map +1 -1
- package/dist/src/mcp-tools/pick-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/pick-tools.js +13 -4
- package/dist/src/mcp-tools/pick-tools.js.map +1 -1
- package/dist/src/memory/embedding-operations.d.ts +0 -4
- package/dist/src/memory/embedding-operations.d.ts.map +1 -1
- package/dist/src/memory/embedding-operations.js +11 -85
- package/dist/src/memory/embedding-operations.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts +7 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +15 -0
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/orgrt/bash-timeout.d.ts +17 -0
- package/dist/src/orgrt/bash-timeout.d.ts.map +1 -1
- package/dist/src/orgrt/bash-timeout.js +15 -0
- package/dist/src/orgrt/bash-timeout.js.map +1 -1
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +5 -2
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/src/orgrt/task-match.d.ts +3 -1
- package/dist/src/orgrt/task-match.d.ts.map +1 -1
- package/dist/src/orgrt/task-match.js +12 -4
- package/dist/src/orgrt/task-match.js.map +1 -1
- package/dist/src/platform-adapters/merge.d.ts +4 -3
- package/dist/src/platform-adapters/merge.d.ts.map +1 -1
- package/dist/src/platform-adapters/merge.js +18 -8
- package/dist/src/platform-adapters/merge.js.map +1 -1
- package/dist/src/platform-adapters/mutation.d.ts +6 -1
- package/dist/src/platform-adapters/mutation.d.ts.map +1 -1
- package/dist/src/platform-adapters/mutation.js +9 -3
- package/dist/src/platform-adapters/mutation.js.map +1 -1
- package/dist/src/platform-adapters/operations.d.ts.map +1 -1
- package/dist/src/platform-adapters/operations.js +14 -6
- package/dist/src/platform-adapters/operations.js.map +1 -1
- package/dist/src/platform-adapters/types.d.ts +5 -0
- package/dist/src/platform-adapters/types.d.ts.map +1 -1
- package/dist/src/routing/agent-pick.d.ts +9 -7
- package/dist/src/routing/agent-pick.d.ts.map +1 -1
- package/dist/src/routing/agent-pick.js +17 -17
- package/dist/src/routing/agent-pick.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/.claude/skills/github-issue-triage/SKILL.md +0 -354
- package/.claude/skills/github-repo-recap/SKILL.md +0 -207
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
/**
|
|
4
|
+
* The agent registry (.monomind/registry.json) — ONE implementation shared by
|
|
5
|
+
* the CLI (src/agents/registry-builder.ts and registry-freshness.ts load this
|
|
6
|
+
* file) and the SessionStart hook (handlers/pick-core.cjs), so an agent added
|
|
7
|
+
* to ~/.claude/agents or .claude/agents is indexed at the next session start
|
|
8
|
+
* without running the CLI, and both sides parse frontmatter the same way.
|
|
9
|
+
*
|
|
10
|
+
* Roots, in precedence order (the first definition of a slug wins):
|
|
11
|
+
* extra $MONOMIND_EXTRA_AGENT_PATHS (':'-separated), else a sibling
|
|
12
|
+
* ../agency-agents directory — canonical, wins over the project
|
|
13
|
+
* project <root>/.claude/agents
|
|
14
|
+
* user ~/.claude/agents — Claude Code loads these in every project, so
|
|
15
|
+
* they are valid Task subagent_types. As in Claude Code, a project
|
|
16
|
+
* (or extra) agent wins: a user agent whose slug or frontmatter
|
|
17
|
+
* `name` is already defined is left out (listed under `shadowed`).
|
|
18
|
+
*
|
|
19
|
+
* User entries record `~/.claude/agents/...` as filePath, never the absolute
|
|
20
|
+
* home path. The registry is rebuilt when missing or older than any agent file
|
|
21
|
+
* in those roots (an mtime scan, no parsing) or this builder.
|
|
22
|
+
*
|
|
23
|
+
* Usage: node .claude/helpers/agent-registry.cjs [projectRoot]
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
var fs = require('fs');
|
|
27
|
+
var os = require('os');
|
|
28
|
+
var path = require('path');
|
|
29
|
+
|
|
30
|
+
/** Directories to skip during the scan. `reengineer-squad` is a repo-only
|
|
31
|
+
* squad the package does not ship, and its `tester` would shadow the core
|
|
32
|
+
* tester. */
|
|
33
|
+
var SKIP_DIRS = new Set(['schemas', 'ephemeral', 'reengineer-squad']);
|
|
34
|
+
var MAX_AGENT_BYTES = 512 * 1024;
|
|
35
|
+
var USER_LABEL = '~/.claude/agents';
|
|
36
|
+
|
|
37
|
+
function homeDir(opts) {
|
|
38
|
+
return (opts && opts.home) || os.homedir();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Every `.md` under `root` (recursively), skipping SKIP_DIRS and `._` forks. */
|
|
42
|
+
function collectMdFiles(root) {
|
|
43
|
+
var results = [];
|
|
44
|
+
var entries;
|
|
45
|
+
try {
|
|
46
|
+
entries = fs.readdirSync(root);
|
|
47
|
+
} catch (e) {
|
|
48
|
+
return results;
|
|
49
|
+
}
|
|
50
|
+
for (var i = 0; i < entries.length; i++) {
|
|
51
|
+
var entry = entries[i];
|
|
52
|
+
var full = path.join(root, entry);
|
|
53
|
+
var stat;
|
|
54
|
+
try {
|
|
55
|
+
stat = fs.statSync(full);
|
|
56
|
+
} catch (e) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (stat.isDirectory()) {
|
|
60
|
+
if (SKIP_DIRS.has(entry)) continue;
|
|
61
|
+
results.push.apply(results, collectMdFiles(full));
|
|
62
|
+
} else if (stat.isFile() && path.extname(entry) === '.md' && !entry.startsWith('._')) {
|
|
63
|
+
results.push(full);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return results;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function unquote(v) {
|
|
70
|
+
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) return v.slice(1, -1);
|
|
71
|
+
return v;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Nested YAML list items under a key whose value was empty
|
|
76
|
+
* (`triggers:\n - pattern: ...`): a string array when every item is a plain
|
|
77
|
+
* scalar, an array of objects when items hold `key: value` pairs, null when
|
|
78
|
+
* there are no list items.
|
|
79
|
+
*/
|
|
80
|
+
function parseNestedYamlList(lines, startIdx, parentIndent) {
|
|
81
|
+
var objects = [];
|
|
82
|
+
var simpleItems = [];
|
|
83
|
+
var current = null;
|
|
84
|
+
var consumed = 0;
|
|
85
|
+
var hasObjects = false;
|
|
86
|
+
for (var i = startIdx; i < lines.length; i++) {
|
|
87
|
+
var line = lines[i];
|
|
88
|
+
var trimmed = line.trim();
|
|
89
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
90
|
+
consumed++;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
var indent = line.length - line.trimStart().length;
|
|
94
|
+
if (indent <= parentIndent) break;
|
|
95
|
+
if (trimmed.startsWith('- ')) {
|
|
96
|
+
var itemContent = trimmed.slice(2);
|
|
97
|
+
var colon = itemContent.indexOf(': ');
|
|
98
|
+
if (colon !== -1) {
|
|
99
|
+
hasObjects = true;
|
|
100
|
+
current = {};
|
|
101
|
+
current[itemContent.slice(0, colon).trim()] = unquote(itemContent.slice(colon + 2).trim());
|
|
102
|
+
objects.push(current);
|
|
103
|
+
} else {
|
|
104
|
+
simpleItems.push(unquote(itemContent.trim()));
|
|
105
|
+
}
|
|
106
|
+
consumed++;
|
|
107
|
+
} else if (current && hasObjects) {
|
|
108
|
+
var c = trimmed.indexOf(': ');
|
|
109
|
+
if (c !== -1) current[trimmed.slice(0, c).trim()] = unquote(trimmed.slice(c + 2).trim());
|
|
110
|
+
consumed++;
|
|
111
|
+
} else {
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (hasObjects && objects.length > 0) return { value: objects, consumed: consumed };
|
|
116
|
+
if (simpleItems.length > 0) return { value: simpleItems, consumed: consumed };
|
|
117
|
+
return { value: null, consumed: consumed };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** The leading `---` frontmatter block as a flat key → value map (scalars,
|
|
121
|
+
* booleans, `[a, b]` and nested `- ` lists, `|`/`>` block scalars). */
|
|
122
|
+
function parseFrontmatter(content) {
|
|
123
|
+
var match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(content);
|
|
124
|
+
if (!match) return {};
|
|
125
|
+
var result = {};
|
|
126
|
+
var lines = match[1].split('\n');
|
|
127
|
+
for (var i = 0; i < lines.length; i++) {
|
|
128
|
+
var line = lines[i];
|
|
129
|
+
var trimmed = line.trim();
|
|
130
|
+
if (!trimmed || trimmed.startsWith('#')) continue;
|
|
131
|
+
var colonIdx = trimmed.indexOf(':');
|
|
132
|
+
if (colonIdx === -1) continue;
|
|
133
|
+
var key = trimmed.slice(0, colonIdx).trim();
|
|
134
|
+
var value = trimmed.slice(colonIdx + 1).trim();
|
|
135
|
+
|
|
136
|
+
var blockScalar = /^([|>])[+-]?$/.exec(value);
|
|
137
|
+
if (blockScalar) {
|
|
138
|
+
var blockIndent = line.length - line.trimStart().length;
|
|
139
|
+
var body = [];
|
|
140
|
+
while (i + 1 < lines.length) {
|
|
141
|
+
var next = lines[i + 1];
|
|
142
|
+
if (next.trim() && next.length - next.trimStart().length <= blockIndent) break;
|
|
143
|
+
body.push(next.trim());
|
|
144
|
+
i++;
|
|
145
|
+
}
|
|
146
|
+
result[key] = body.join(blockScalar[1] === '|' ? '\n' : ' ').trim();
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (value === '') {
|
|
151
|
+
var nested = parseNestedYamlList(lines, i + 1, line.length - line.trimStart().length);
|
|
152
|
+
if (nested.value !== null) {
|
|
153
|
+
result[key] = nested.value;
|
|
154
|
+
i += nested.consumed;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (value.startsWith('[') && value.endsWith(']')) {
|
|
160
|
+
value = value
|
|
161
|
+
.slice(1, -1)
|
|
162
|
+
.split(',')
|
|
163
|
+
.map(function (s) { return s.trim().replace(/^["']|["']$/g, ''); })
|
|
164
|
+
.filter(Boolean);
|
|
165
|
+
} else if (value === 'true') value = true;
|
|
166
|
+
else if (value === 'false') value = false;
|
|
167
|
+
else value = unquote(value);
|
|
168
|
+
result[key] = value;
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** The first argument that is not undefined/null (a `??` chain). */
|
|
174
|
+
function first() {
|
|
175
|
+
for (var i = 0; i < arguments.length; i++) if (arguments[i] !== undefined && arguments[i] !== null) return arguments[i];
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function toStringArray(val) {
|
|
180
|
+
if (Array.isArray(val)) return val.map(String);
|
|
181
|
+
if (typeof val === 'string' && val.length > 0) return [val];
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function parseTriggers(val) {
|
|
186
|
+
if (!val) return [];
|
|
187
|
+
var arr = Array.isArray(val) ? val : [val];
|
|
188
|
+
return arr.map(function (t) {
|
|
189
|
+
if (typeof t === 'object' && t !== null && 'pattern' in t) {
|
|
190
|
+
return { pattern: String(t.pattern), mode: String(first(t.mode, 'glob')) };
|
|
191
|
+
}
|
|
192
|
+
return { pattern: String(t), mode: 'glob' };
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function slugFromFilename(file) {
|
|
197
|
+
return path.basename(file, path.extname(file))
|
|
198
|
+
.toLowerCase()
|
|
199
|
+
.replace(/\s+/g, '-')
|
|
200
|
+
.replace(/[^a-z0-9-]/g, '');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function categoryFromPath(file, root) {
|
|
204
|
+
var parts = path.relative(root, file).split(path.sep);
|
|
205
|
+
return parts.length > 1 ? parts[0] : 'default';
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function isDir(p) {
|
|
209
|
+
try { return fs.statSync(p).isDirectory(); } catch (e) { return false; }
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* The agent roots for project `cwd`, in precedence order: extras, the
|
|
214
|
+
* project's .claude/agents, then ~/.claude/agents (opts.user === false leaves
|
|
215
|
+
* it out; opts.home overrides the home directory). When cwd is the home
|
|
216
|
+
* directory the two .claude/agents are one directory, listed once as `user`.
|
|
217
|
+
*/
|
|
218
|
+
function computeAgentRoots(cwd, opts) {
|
|
219
|
+
var env = (opts && opts.env) || process.env;
|
|
220
|
+
var extras = env.MONOMIND_EXTRA_AGENT_PATHS ? env.MONOMIND_EXTRA_AGENT_PATHS.split(':').filter(Boolean) : [];
|
|
221
|
+
var sibling = path.join(cwd, '..', 'agency-agents');
|
|
222
|
+
if (extras.length === 0 && isDir(sibling)) extras.push(sibling);
|
|
223
|
+
var roots = extras.map(function (dir) { return { dir: dir, origin: 'extra' }; });
|
|
224
|
+
var projectDir = path.join(cwd, '.claude', 'agents');
|
|
225
|
+
var userDir = path.join(homeDir(opts), '.claude', 'agents');
|
|
226
|
+
var withUser = !(opts && opts.user === false);
|
|
227
|
+
if (!withUser || path.resolve(projectDir) !== path.resolve(userDir)) roots.push({ dir: projectDir, origin: 'project' });
|
|
228
|
+
if (withUser) roots.push({ dir: userDir, origin: 'user', label: USER_LABEL });
|
|
229
|
+
return roots;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** A root given as a plain path is a project-local definition directory. */
|
|
233
|
+
function asRoot(r) {
|
|
234
|
+
return typeof r === 'string' ? { dir: r, origin: 'project' } : r;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Builds the registry from `roots` (first root wins a slug; a `user` agent
|
|
239
|
+
* also loses to any earlier agent with the same frontmatter `name` or slug),
|
|
240
|
+
* writing it to `outputPath` when given. opts.base: the directory project and
|
|
241
|
+
* extra filePaths are relative to (default cwd).
|
|
242
|
+
*/
|
|
243
|
+
function buildUnifiedRegistry(roots, outputPath, opts) {
|
|
244
|
+
var now = new Date().toISOString();
|
|
245
|
+
var base = (opts && opts.base) || process.cwd();
|
|
246
|
+
var seen = new Map();
|
|
247
|
+
var names = new Set();
|
|
248
|
+
var dupes = new Map();
|
|
249
|
+
var shadowed = [];
|
|
250
|
+
var counts = { project: 0, user: 0, extra: 0 };
|
|
251
|
+
(roots || []).map(asRoot).forEach(function (root) {
|
|
252
|
+
var files = collectMdFiles(root.dir);
|
|
253
|
+
files.forEach(function (file) {
|
|
254
|
+
var content;
|
|
255
|
+
try {
|
|
256
|
+
if (fs.statSync(file).size > MAX_AGENT_BYTES) return;
|
|
257
|
+
content = fs.readFileSync(file, 'utf-8');
|
|
258
|
+
} catch (e) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
var fm = parseFrontmatter(content);
|
|
262
|
+
var slug = (typeof fm.slug === 'string' && fm.slug) || slugFromFilename(file);
|
|
263
|
+
var name = (typeof fm.name === 'string' && fm.name) || slug;
|
|
264
|
+
var filePath = root.label
|
|
265
|
+
? root.label + '/' + path.relative(root.dir, file).split(path.sep).join('/')
|
|
266
|
+
: path.isAbsolute(file) ? path.relative(base, file) : file;
|
|
267
|
+
var prior = seen.get(slug);
|
|
268
|
+
if (root.origin === 'user' && (prior ? prior.origin !== 'user' : names.has(name) || names.has(slug))) {
|
|
269
|
+
shadowed.push({ slug: slug, name: name, filePath: filePath });
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (prior) {
|
|
273
|
+
var d = dupes.get(slug) || { slug: slug, kept: prior.filePath, dropped: [] };
|
|
274
|
+
d.dropped.push(filePath);
|
|
275
|
+
dupes.set(slug, d);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
var str = function (v) { return typeof v === 'string' ? v : undefined; };
|
|
279
|
+
seen.set(slug, {
|
|
280
|
+
slug: slug,
|
|
281
|
+
name: name,
|
|
282
|
+
version: str(fm.version) || '0.0.0',
|
|
283
|
+
category: str(fm.category) || categoryFromPath(file, root.dir),
|
|
284
|
+
description: str(fm.description) || '',
|
|
285
|
+
whenToUse: str(first(fm.when_to_use, fm.whenToUse)),
|
|
286
|
+
tags: toStringArray(fm.tags),
|
|
287
|
+
vibe: str(fm.vibe),
|
|
288
|
+
// A `capability:` block is read flattened, so its `expertise:` list lands top-level
|
|
289
|
+
capabilities: toStringArray(first(fm.capabilities, fm.expertise)),
|
|
290
|
+
taskTypes: toStringArray(first(fm.taskTypes, fm['task-types'], fm.task_types)),
|
|
291
|
+
tools: toStringArray(fm.tools),
|
|
292
|
+
triggers: parseTriggers(fm.triggers),
|
|
293
|
+
deprecated: fm.deprecated === true,
|
|
294
|
+
deprecatedBy: str(fm.deprecatedBy),
|
|
295
|
+
dependencies: toStringArray(fm.dependencies),
|
|
296
|
+
origin: root.origin,
|
|
297
|
+
filePath: filePath,
|
|
298
|
+
registeredAt: now,
|
|
299
|
+
lastUpdated: now,
|
|
300
|
+
});
|
|
301
|
+
names.add(name);
|
|
302
|
+
names.add(slug);
|
|
303
|
+
counts[root.origin] = (counts[root.origin] || 0) + 1;
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
var agents = Array.from(seen.values());
|
|
307
|
+
var registry = {
|
|
308
|
+
version: '1.0.0',
|
|
309
|
+
generatedAt: now,
|
|
310
|
+
totalAgents: agents.length,
|
|
311
|
+
counts: counts,
|
|
312
|
+
agents: agents,
|
|
313
|
+
duplicates: Array.from(dupes.values()),
|
|
314
|
+
shadowed: shadowed,
|
|
315
|
+
};
|
|
316
|
+
if (outputPath) writeRegistryFile(outputPath, registry);
|
|
317
|
+
return registry;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function agentCountOnDisk(file) {
|
|
321
|
+
try {
|
|
322
|
+
var reg = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
323
|
+
return reg && Array.isArray(reg.agents) ? reg.agents.length : 0;
|
|
324
|
+
} catch (e) {
|
|
325
|
+
return 0;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/** Writes `registry` atomically — except an empty registry never replaces a
|
|
330
|
+
* non-empty one. Returns whether the file was written. */
|
|
331
|
+
function writeRegistryFile(file, registry) {
|
|
332
|
+
if (registry.agents.length === 0 && agentCountOnDisk(file) > 0) return false;
|
|
333
|
+
var tmp = file + '.' + process.pid + '.tmp';
|
|
334
|
+
fs.writeFileSync(tmp, JSON.stringify(registry, null, 2), 'utf-8');
|
|
335
|
+
fs.renameSync(tmp, file);
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/** Newest mtime (ms) of any agent `.md` under `dirs`; directories count too,
|
|
340
|
+
* so a deleted file also marks the registry stale. 0 when there are none. */
|
|
341
|
+
function newestAgentMtime(dirs) {
|
|
342
|
+
var newest = 0;
|
|
343
|
+
function walk(dir) {
|
|
344
|
+
var entries;
|
|
345
|
+
try {
|
|
346
|
+
newest = Math.max(newest, fs.statSync(dir).mtimeMs);
|
|
347
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
348
|
+
} catch (e) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
entries.forEach(function (e) {
|
|
352
|
+
var full = path.join(dir, e.name);
|
|
353
|
+
if (e.isDirectory()) walk(full);
|
|
354
|
+
else if (e.isFile() && path.extname(e.name) === '.md') {
|
|
355
|
+
try { newest = Math.max(newest, fs.statSync(full).mtimeMs); } catch (err) { /* vanished */ }
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
(dirs || []).forEach(function (d) { walk(typeof d === 'string' ? d : d.dir); });
|
|
360
|
+
return newest;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function registryPath(root) {
|
|
364
|
+
return path.join(root, '.monomind', 'registry.json');
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function mtime(p) {
|
|
368
|
+
try { return fs.statSync(p).mtimeMs; } catch (e) { return 0; }
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/** True when `root`'s registry is missing or older than an agent definition
|
|
372
|
+
* in any root (project, user, extra) or than this builder. */
|
|
373
|
+
function isStale(root, opts) {
|
|
374
|
+
var at = mtime(registryPath(root));
|
|
375
|
+
if (at === 0) return true;
|
|
376
|
+
return Math.max(newestAgentMtime(computeAgentRoots(root, opts)), mtime(__filename)) > at;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/** Rebuilds `root`'s registry when stale; the built registry, or null when it
|
|
380
|
+
* was fresh or the build failed. Never throws. */
|
|
381
|
+
function ensure(root, opts) {
|
|
382
|
+
try {
|
|
383
|
+
if (!isStale(root, opts)) return null;
|
|
384
|
+
fs.mkdirSync(path.join(root, '.monomind'), { recursive: true });
|
|
385
|
+
return buildUnifiedRegistry(computeAgentRoots(root, opts), registryPath(root), { base: root });
|
|
386
|
+
} catch (e) {
|
|
387
|
+
return null;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* The nearest directory at or above `cwd` holding `.claude/agents` or
|
|
393
|
+
* `.monomind`. The walk stops at the git root (inclusive) and never returns
|
|
394
|
+
* the home directory itself, whose ~/.monomind is the user's global state.
|
|
395
|
+
* Null when no project is found.
|
|
396
|
+
*/
|
|
397
|
+
function findProjectRoot(cwd, home) {
|
|
398
|
+
var stopAt = path.resolve(home || os.homedir());
|
|
399
|
+
var dir = path.resolve(cwd);
|
|
400
|
+
for (;;) {
|
|
401
|
+
if (dir === stopAt) return null;
|
|
402
|
+
if (fs.existsSync(path.join(dir, '.claude', 'agents')) || fs.existsSync(path.join(dir, '.monomind'))) return dir;
|
|
403
|
+
if (fs.existsSync(path.join(dir, '.git'))) return null;
|
|
404
|
+
var parent = path.dirname(dir);
|
|
405
|
+
if (parent === dir) return null;
|
|
406
|
+
dir = parent;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
function main() {
|
|
411
|
+
var root = process.argv[2] || process.env.CLAUDE_PROJECT_DIR || findProjectRoot(process.cwd());
|
|
412
|
+
if (!root) {
|
|
413
|
+
process.stderr.write('registry.json: no project found at or above ' + process.cwd() + '; nothing written\n');
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
fs.mkdirSync(path.join(root, '.monomind'), { recursive: true });
|
|
417
|
+
var reg = buildUnifiedRegistry(computeAgentRoots(root), registryPath(root), { base: root });
|
|
418
|
+
process.stdout.write('registry.json: ' + reg.totalAgents + ' agents (' + reg.counts.user + ' from ' + USER_LABEL + ')\n');
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
if (require.main === module) main();
|
|
422
|
+
|
|
423
|
+
module.exports = {
|
|
424
|
+
USER_LABEL: USER_LABEL,
|
|
425
|
+
parseFrontmatter: parseFrontmatter,
|
|
426
|
+
computeAgentRoots: computeAgentRoots,
|
|
427
|
+
buildUnifiedRegistry: buildUnifiedRegistry,
|
|
428
|
+
writeRegistryFile: writeRegistryFile,
|
|
429
|
+
newestAgentMtime: newestAgentMtime,
|
|
430
|
+
registryPath: registryPath,
|
|
431
|
+
isStale: isStale,
|
|
432
|
+
ensure: ensure,
|
|
433
|
+
findProjectRoot: findProjectRoot,
|
|
434
|
+
};
|
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
* Org skill library (`orgSkills`, via org-skill-index.cjs). The file is
|
|
21
21
|
* generated per machine (init, upgrade, SessionStart, `monomind pick`) and is
|
|
22
22
|
* never committed — a shipped snapshot listed skills a project did not have.
|
|
23
|
-
* README/overview/reference docs, `_`-prefixed
|
|
24
|
-
*
|
|
23
|
+
* README/overview/reference docs, internal includes (any `_`-prefixed file,
|
|
24
|
+
* folder or frontmatter `name`) and helper-only skills (HELPER_ONLY, or
|
|
25
|
+
* frontmatter `type: helper`) are not entries.
|
|
25
26
|
* Frontmatter `pick: low` marks an admin/meta entry (org management pages,
|
|
26
27
|
* examples, the picker itself): it stays in the index, recorded as
|
|
27
28
|
* `pick: 'low'`, and the pickers rank it below equally matching entries so
|
|
@@ -35,10 +36,11 @@ var os = require('os');
|
|
|
35
36
|
var path = require('path');
|
|
36
37
|
var orgIndex = require('./org-skill-index.cjs');
|
|
37
38
|
|
|
38
|
-
/** Protocol pieces other skills include; never invoked on their own.
|
|
39
|
+
/** Protocol pieces other skills include; never invoked on their own.
|
|
40
|
+
* (`_`-prefixed includes need no entry here: isNotACandidate skips them all.) */
|
|
39
41
|
var HELPER_ONLY = new Set([
|
|
40
42
|
'mastermind-agent-select', 'mastermind-delegation', 'mastermind-intake',
|
|
41
|
-
'mastermind-protocol', 'mastermind-repeat',
|
|
43
|
+
'mastermind-protocol', 'mastermind-repeat',
|
|
42
44
|
]);
|
|
43
45
|
/** Documentation pages that live beside commands but are not commands. */
|
|
44
46
|
var DOC_NAMES = new Set(['readme', 'overview', 'reference', 'references']);
|
|
@@ -167,11 +169,13 @@ function isJunk(basename) {
|
|
|
167
169
|
}
|
|
168
170
|
|
|
169
171
|
/** Docs and helper-only pieces: README/overview/reference pages (or anything
|
|
170
|
-
* under a references/ dir),
|
|
172
|
+
* under a references/ dir), internal includes (a `_`-prefixed path segment or
|
|
173
|
+
* frontmatter name), HELPER_ONLY names, and `type: helper` frontmatter. */
|
|
171
174
|
function isNotACandidate(parts, fm) {
|
|
172
175
|
for (var i = 0; i < parts.length; i++) {
|
|
173
|
-
if (DOC_NAMES.has(parts[i].toLowerCase())) return true;
|
|
176
|
+
if (DOC_NAMES.has(parts[i].toLowerCase()) || parts[i].charAt(0) === '_') return true;
|
|
174
177
|
}
|
|
178
|
+
if (String(fm.name || '').trim().charAt(0) === '_') return true;
|
|
175
179
|
if (HELPER_ONLY.has(parts[parts.length - 1])) return true;
|
|
176
180
|
return String(fm.type || '').toLowerCase() === 'helper';
|
|
177
181
|
}
|
|
@@ -18,20 +18,17 @@ try { redaction = require('../redact-secrets.cjs'); } catch (e) { /* preview fal
|
|
|
18
18
|
var pickStats = null;
|
|
19
19
|
try { pickStats = require('../pick-stats.cjs'); } catch (e) { /* no outcome prior: keyword order stands */ }
|
|
20
20
|
var pickRank = null;
|
|
21
|
-
try { pickRank = require('../pick-rank.cjs'); } catch (e) { /* no trivial-prompt check */ }
|
|
22
|
-
|
|
23
|
-
// A keyword pick needs
|
|
24
|
-
// share of task words matched) AND a lead
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
var KEYWORD_MIN_AGENT_SCORE =
|
|
29
|
-
var KEYWORD_AGENT_LEAD =
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
// tests/pick-eval (59 tasks, 514 skills): 34 shown, 31 of them correct (91%).
|
|
33
|
-
var KEYWORD_MIN_SKILL_SCORE = 3;
|
|
34
|
-
var KEYWORD_SKILL_LEAD = 1.25;
|
|
21
|
+
try { pickRank = require('../pick-rank.cjs'); } catch (e) { /* no trivial-prompt check, no keyword pick */ }
|
|
22
|
+
|
|
23
|
+
// A keyword pick needs a minimum score (pick-rank.cjs: idf-weighted BM25 times
|
|
24
|
+
// the share of task words matched) AND a lead over the runner-up: the one
|
|
25
|
+
// gate pick-rank.cjs defines (KEYWORD_GATE, leads) and the CLI's `pick`
|
|
26
|
+
// shares. Without pick-rank nothing clears it.
|
|
27
|
+
var GATE = (pickRank && pickRank.KEYWORD_GATE) || { agents: { min: Infinity, lead: 1 }, skills: { min: Infinity, lead: 1 } };
|
|
28
|
+
var KEYWORD_MIN_AGENT_SCORE = GATE.agents.min;
|
|
29
|
+
var KEYWORD_AGENT_LEAD = GATE.agents.lead;
|
|
30
|
+
var KEYWORD_MIN_SKILL_SCORE = GATE.skills.min;
|
|
31
|
+
var KEYWORD_SKILL_LEAD = GATE.skills.lead;
|
|
35
32
|
var MAX_CANDIDATES = 5;
|
|
36
33
|
var PREVIEW_CHARS = 120;
|
|
37
34
|
// A prompt with fewer content words ("hi", "thanks", "ok, go ahead") is a
|
|
@@ -62,11 +59,12 @@ function isSystemPrompt(prompt) {
|
|
|
62
59
|
}
|
|
63
60
|
|
|
64
61
|
/** True for a prompt with fewer than MIN_PICK_TOKENS content words
|
|
65
|
-
* (pick-rank
|
|
62
|
+
* (pick-rank queryTokens: stopwords and words the prompt rules out dropped,
|
|
63
|
+
* any script), so "anything else pending rather than release" is a reply. */
|
|
66
64
|
function isTrivialPrompt(prompt) {
|
|
67
65
|
if (!pickRank || typeof prompt !== 'string') return false;
|
|
68
66
|
var text = prompt.replace(/<system-reminder>[\s\S]*?<\/system-reminder>/gi, ' ').slice(0, 2000);
|
|
69
|
-
return pickRank.
|
|
67
|
+
return pickRank.queryTokens(text).length < MIN_PICK_TOKENS;
|
|
70
68
|
}
|
|
71
69
|
|
|
72
70
|
function promptHash(prompt) {
|
|
@@ -130,20 +128,18 @@ function rankSkills(jp, prompt, skills) {
|
|
|
130
128
|
});
|
|
131
129
|
}
|
|
132
130
|
|
|
133
|
-
/**
|
|
134
|
-
* floor is on keyword relevance alone (baseScore when a prior re-ranked). */
|
|
131
|
+
/** pick-rank.cjs leads(): the top entry when it clears the gate. */
|
|
135
132
|
function leads(list, min, ratio) {
|
|
136
|
-
|
|
137
|
-
if (!top || !((top.baseScore !== undefined ? top.baseScore : top.score) >= min)) return null;
|
|
138
|
-
var second = list[1];
|
|
139
|
-
if (!second || !(second.score > 0)) return top;
|
|
140
|
-
return top.score >= second.score * (ratio || 1) && top.score > second.score ? top : null;
|
|
133
|
+
return pickRank ? pickRank.leads(list, min, ratio) : null;
|
|
141
134
|
}
|
|
142
135
|
|
|
143
136
|
/**
|
|
144
137
|
* The prompt's pick. A Jev agent answer (already past acceptAgent) wins, else a
|
|
145
138
|
* strong keyword agent; a confident Jev skill answer (including "none fits")
|
|
146
|
-
* wins, else a strong keyword skill.
|
|
139
|
+
* wins, else a strong keyword skill. A question Jev answered below its bar
|
|
140
|
+
* (agentResponded / skillResponded) gets no pick at all: its candidates held
|
|
141
|
+
* the keyword leaders and it did not back them. Agent ids are resolved to
|
|
142
|
+
* registry names.
|
|
147
143
|
*/
|
|
148
144
|
function decide(opts) {
|
|
149
145
|
var agents = opts.agents || [];
|
|
@@ -158,6 +154,8 @@ function decide(opts) {
|
|
|
158
154
|
out.agent = { id: jev.agent, name: byId[jev.agent].name };
|
|
159
155
|
out.confidence = jev.agentConfidence;
|
|
160
156
|
viaJev = true;
|
|
157
|
+
} else if (jev && jev.agentResponded) {
|
|
158
|
+
viaJev = true;
|
|
161
159
|
} else {
|
|
162
160
|
var kw = leads(opts.keywordCands, KEYWORD_MIN_AGENT_SCORE, KEYWORD_AGENT_LEAD);
|
|
163
161
|
if (kw) { out.agent = { id: kw.id, name: kw.name }; viaKeyword = true; }
|
|
@@ -167,6 +165,8 @@ function decide(opts) {
|
|
|
167
165
|
var js = (jev.skills || [])[0];
|
|
168
166
|
if (js) out.skill = { skill: js.id, invoke: js.invoke };
|
|
169
167
|
viaJev = true;
|
|
168
|
+
} else if (jev && jev.skillResponded) {
|
|
169
|
+
viaJev = true;
|
|
170
170
|
} else {
|
|
171
171
|
var ks = leads(opts.skillMatches, KEYWORD_MIN_SKILL_SCORE, KEYWORD_SKILL_LEAD);
|
|
172
172
|
if (ks) { out.skill = { skill: ks.skill, invoke: ks.invoke }; viaKeyword = true; }
|
|
@@ -184,11 +184,23 @@ function decide(opts) {
|
|
|
184
184
|
return out;
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
-
|
|
187
|
+
var ORG_SKILL_INVOKE = 'mcp__monomind__org_skill_show ';
|
|
188
|
+
|
|
189
|
+
/** The one line Claude sees: `[PICK] agent: <name> · skill: <invoke>`, '' when
|
|
190
|
+
* nothing is confident. An Org skill also names its CLI read: Claude Code
|
|
191
|
+
* keeps a running MCP server until restart, and one older than the
|
|
192
|
+
* org_skill_show tool fails the MCP call. */
|
|
188
193
|
function formatPickLine(pick) {
|
|
189
194
|
var parts = [];
|
|
190
195
|
if (pick && pick.agent) parts.push('agent: ' + pick.agent.name);
|
|
191
|
-
if (pick && pick.skill)
|
|
196
|
+
if (pick && pick.skill) {
|
|
197
|
+
var invoke = pick.skill.invoke;
|
|
198
|
+
// Only a plain skill name (the org_skill_show name rule) goes into a command line.
|
|
199
|
+
if (invoke.indexOf(ORG_SKILL_INVOKE) === 0 && /^[a-z0-9][a-z0-9-]{0,63}$/.test(pick.skill.skill || '')) {
|
|
200
|
+
invoke += ' (or: npx -y monomind org skills show ' + pick.skill.skill + ')';
|
|
201
|
+
}
|
|
202
|
+
parts.push('skill: ' + invoke);
|
|
203
|
+
}
|
|
192
204
|
return parts.length ? '[PICK] ' + parts.join(' · ') : '';
|
|
193
205
|
}
|
|
194
206
|
|
|
@@ -422,6 +434,22 @@ function ensureSkillRegistryFresh(root, builder) {
|
|
|
422
434
|
return 'rebuilt';
|
|
423
435
|
}
|
|
424
436
|
|
|
437
|
+
/** Rebuild .monomind/registry.json when agent-registry.cjs says it is stale
|
|
438
|
+
* (missing, or older than an agent in .claude/agents, ~/.claude/agents or an
|
|
439
|
+
* extra root), so a new user agent is routed from the next session on. Only
|
|
440
|
+
* inside a project (findProjectRoot: never the home directory, never a
|
|
441
|
+
* folder without .monomind or .claude/agents). opts.home overrides the home
|
|
442
|
+
* directory. Returns what it did. */
|
|
443
|
+
function ensureAgentRegistryFresh(root, builder, opts) {
|
|
444
|
+
if (builder === undefined) {
|
|
445
|
+
try { builder = require('../agent-registry.cjs'); } catch (e) { builder = null; }
|
|
446
|
+
}
|
|
447
|
+
if (!builder || typeof builder.isStale !== 'function' || typeof builder.ensure !== 'function') return 'no-builder';
|
|
448
|
+
if (builder.findProjectRoot(root, opts && opts.home) !== path.resolve(root)) return 'not-a-project';
|
|
449
|
+
if (!builder.isStale(root, opts)) return 'fresh';
|
|
450
|
+
return builder.ensure(root, opts) ? 'rebuilt' : 'failed';
|
|
451
|
+
}
|
|
452
|
+
|
|
425
453
|
module.exports = {
|
|
426
454
|
KEYWORD_MIN_AGENT_SCORE: KEYWORD_MIN_AGENT_SCORE,
|
|
427
455
|
KEYWORD_AGENT_LEAD: KEYWORD_AGENT_LEAD,
|
|
@@ -442,4 +470,5 @@ module.exports = {
|
|
|
442
470
|
joinOutcome: joinOutcome,
|
|
443
471
|
recordAdherence: recordAdherence,
|
|
444
472
|
ensureSkillRegistryFresh: ensureSkillRegistryFresh,
|
|
473
|
+
ensureAgentRegistryFresh: ensureAgentRegistryFresh,
|
|
445
474
|
};
|
|
@@ -120,9 +120,12 @@ async function _pickWithJev(CWD, prompt, agents, includeAgentId, skills) {
|
|
|
120
120
|
return {
|
|
121
121
|
provider: picked.provider,
|
|
122
122
|
agent: jp.acceptAgent(picked.agent),
|
|
123
|
+
// Jev answered the question (at any confidence): no keyword pick replaces it.
|
|
124
|
+
agentResponded: !!picked.agent,
|
|
123
125
|
agentConfidence: picked.agent ? picked.agent.confidence : 0,
|
|
124
126
|
agentRanked: picked.agent ? picked.agent.ranked : [],
|
|
125
|
-
|
|
127
|
+
skillResponded: !!picked.skill,
|
|
128
|
+
// Only a confident skill answer (including a confident "none fits") names a skill.
|
|
126
129
|
skillAnswered: !!picked.skill && picked.skill.confidence >= jp.resolveMinConfidence(process.env),
|
|
127
130
|
skills: jp.acceptSkills(picked.skill).map(function (id) { return skillById[id]; }).filter(Boolean),
|
|
128
131
|
};
|
|
@@ -134,6 +137,10 @@ async function _pickWithJev(CWD, prompt, agents, includeAgentId, skills) {
|
|
|
134
137
|
// is not a selector (its agent table and matchSkills predate the catalogs).
|
|
135
138
|
async function _decidePick(CWD, prompt) {
|
|
136
139
|
var jp = _loadJevPicker();
|
|
140
|
+
// The skill index is read below: rebuild it first when a skill/command tree
|
|
141
|
+
// is newer (a stat scan, plus a ~30 ms build only when stale). Fails open:
|
|
142
|
+
// the catalog still drops entries whose file is gone.
|
|
143
|
+
try { pickCore.ensureSkillRegistryFresh(CWD); } catch (e) { /* keep the index as it is */ }
|
|
137
144
|
var agents = jp ? jp.loadAgentCatalog(CWD) : [];
|
|
138
145
|
var skills = jp ? jp.loadSkillCatalog(CWD) : [];
|
|
139
146
|
var skillMatches = pickCore.rankSkills(jp, prompt, skills);
|
|
@@ -144,8 +151,9 @@ async function _decidePick(CWD, prompt) {
|
|
|
144
151
|
var keywordCands = pickCore.rankAgents(jp, prompt, agents, stats);
|
|
145
152
|
var jev = await _pickWithJev(CWD, prompt, agents, keywordCands[0] && keywordCands[0].id, skills);
|
|
146
153
|
var pick = pickCore.decide({ agents: agents, keywordCands: keywordCands, skillMatches: skillMatches, jev: jev });
|
|
147
|
-
// Jev's skill answer replaces keyword skill matches, including "none fits"
|
|
148
|
-
|
|
154
|
+
// Jev's skill answer replaces keyword skill matches, including "none fits"
|
|
155
|
+
// and an answer below its bar (no skills then).
|
|
156
|
+
if (jev && jev.skillResponded) {
|
|
149
157
|
skillMatches = jev.skills.map(function (s, i) {
|
|
150
158
|
return { skill: s.id, invoke: s.invoke, description: s.description || '', score: i === 0 ? 2 : 1, source: 'jev' };
|
|
151
159
|
});
|
|
@@ -39,6 +39,9 @@ module.exports = {
|
|
|
39
39
|
// Keep skill-registry.json (the skill catalog routing and Jev read) in
|
|
40
40
|
// step with .claude/skills: rebuilt when missing or older than any skill.
|
|
41
41
|
try { require('./pick-core.cjs').ensureSkillRegistryFresh(CWD); } catch (e) { /* non-fatal */ }
|
|
42
|
+
// Same for .monomind/registry.json (the agent catalog): rebuilt when an
|
|
43
|
+
// agent in .claude/agents or ~/.claude/agents is newer.
|
|
44
|
+
try { require('./pick-core.cjs').ensureAgentRegistryFresh(CWD); } catch (e) { /* non-fatal */ }
|
|
42
45
|
|
|
43
46
|
// ── Non-blocking security scan via @monoes/hooks worker ─────────────
|
|
44
47
|
// The hooks package ships a security worker (worker-security.ts) that scans
|
|
@@ -135,7 +138,7 @@ module.exports = {
|
|
|
135
138
|
if (bundledDir) {
|
|
136
139
|
var healed = [];
|
|
137
140
|
// Top-level critical files — mirrors executor.ts's `criticalHelpers` list.
|
|
138
|
-
var helpersToCheck = ['hook-handler.cjs', 'statusline.cjs', 'router.cjs', 'monograph-freshen.cjs', 'control-start.cjs', 'intelligence.cjs', 'auto-memory-hook.mjs', 'build-skill-registry.cjs', 'org-skill-index.cjs', 'jev-picker.cjs', 'jev-catalog.cjs', 'redact-secrets.cjs', 'pick-rank.cjs', 'pick-stats.cjs'];
|
|
141
|
+
var helpersToCheck = ['hook-handler.cjs', 'statusline.cjs', 'router.cjs', 'monograph-freshen.cjs', 'control-start.cjs', 'intelligence.cjs', 'auto-memory-hook.mjs', 'build-skill-registry.cjs', 'agent-registry.cjs', 'org-skill-index.cjs', 'jev-picker.cjs', 'jev-catalog.cjs', 'redact-secrets.cjs', 'pick-rank.cjs', 'pick-stats.cjs'];
|
|
139
142
|
for (var hi = 0; hi < helpersToCheck.length; hi++) {
|
|
140
143
|
var hName = helpersToCheck[hi];
|
|
141
144
|
var healedName = _healIfStale(
|