@luanpdd/kit-mcp 1.33.0 → 1.34.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/LICENSE +21 -21
- package/README.md +168 -168
- package/gates/agent-no-recursive-dispatch.md +84 -84
- package/kit/COMANDOS.md +138 -138
- package/kit/COMPATIBILITY.md +70 -70
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +109 -109
- package/kit/agents/ai-mutation-tester.md +289 -289
- package/kit/agents/assumptions-analyzer.md +110 -110
- package/kit/agents/audit-log-implementer.md +314 -314
- package/kit/agents/auditor-consistencia-isolamento.md +414 -414
- package/kit/agents/b2b-saas-architect.md +157 -157
- package/kit/agents/burn-rate-forecaster.md +153 -153
- package/kit/agents/cascading-failures-auditor.md +299 -299
- package/kit/agents/codebase-mapper.md +769 -769
- package/kit/agents/crm-pipeline-implementer.md +257 -257
- package/kit/agents/debugger.md +814 -814
- package/kit/agents/designer-ui.md +216 -216
- package/kit/agents/detector-tenant-quente.md +338 -338
- package/kit/agents/evolution-go-integrator.md +201 -201
- package/kit/agents/example-reviewer.md +22 -22
- package/kit/agents/executor.md +565 -565
- package/kit/agents/golden-signals-instrumenter.md +232 -232
- package/kit/agents/incident-investigator.md +238 -238
- package/kit/agents/integration-checker.md +203 -203
- package/kit/agents/invite-flow-implementer.md +190 -190
- package/kit/agents/legacy-characterizer.md +369 -369
- package/kit/agents/lgpd-compliance-auditor.md +296 -296
- package/kit/agents/load-shedding-instrumenter.md +290 -290
- package/kit/agents/multi-tenant-isolation-auditor.md +254 -254
- package/kit/agents/multi-tenant-rls-writer.md +341 -341
- package/kit/agents/nyquist-auditor.md +181 -181
- package/kit/agents/observability-coverage-auditor.md +316 -316
- package/kit/agents/observability-instrumenter.md +191 -191
- package/kit/agents/omm-auditor.md +291 -291
- package/kit/agents/org-onboarding-implementer.md +224 -224
- package/kit/agents/payload-capture-instrumenter.md +274 -274
- package/kit/agents/phase-researcher.md +697 -697
- package/kit/agents/plan-checker.md +275 -275
- package/kit/agents/planner.md +923 -923
- package/kit/agents/postmortem-writer.md +273 -273
- package/kit/agents/project-researcher.md +653 -653
- package/kit/agents/prr-conductor.md +287 -287
- package/kit/agents/refactor-safety-auditor.md +405 -405
- package/kit/agents/release-pipeline-auditor.md +364 -364
- package/kit/agents/research-synthesizer.md +246 -246
- package/kit/agents/roadmapper.md +678 -678
- package/kit/agents/schema-checker.md +160 -160
- package/kit/agents/seam-finder.md +360 -360
- package/kit/agents/shotgun-surgery-detector.md +350 -350
- package/kit/agents/slo-engineer.md +217 -217
- package/kit/agents/storytelling-analyst.md +300 -300
- package/kit/agents/supabase-architect.md +249 -249
- package/kit/agents/supabase-auth-bootstrapper.md +400 -400
- package/kit/agents/supabase-auth-hook-writer.md +418 -418
- package/kit/agents/supabase-branching-architect.md +563 -563
- package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -778
- package/kit/agents/supabase-column-privileges-writer.md +400 -400
- package/kit/agents/supabase-edge-fn-tester.md +288 -288
- package/kit/agents/supabase-edge-fn-writer.md +341 -341
- package/kit/agents/supabase-mfa-implementer.md +439 -439
- package/kit/agents/supabase-migration-writer.md +386 -386
- package/kit/agents/supabase-oauth-server-implementer.md +507 -507
- package/kit/agents/supabase-rbac-implementer.md +393 -393
- package/kit/agents/supabase-realtime-implementer.md +364 -364
- package/kit/agents/supabase-rls-hardener.md +522 -522
- package/kit/agents/supabase-rls-writer.md +324 -324
- package/kit/agents/supabase-roles-implementer.md +356 -356
- package/kit/agents/supabase-social-auth-implementer.md +451 -451
- package/kit/agents/supabase-sso-saml-architect.md +549 -549
- package/kit/agents/supabase-storage-implementer.md +407 -407
- package/kit/agents/super-admin-implementer.md +282 -282
- package/kit/agents/toil-auditor.md +268 -268
- package/kit/agents/ui-auditor.md +438 -438
- package/kit/agents/ui-checker.md +305 -305
- package/kit/agents/ui-researcher.md +356 -356
- package/kit/agents/user-profiler.md +176 -176
- package/kit/agents/validador-evolucao-schema.md +336 -336
- package/kit/agents/verifier.md +729 -729
- package/kit/commands/adicionar-backlog.md +75 -75
- package/kit/commands/adicionar-fase.md +42 -42
- package/kit/commands/adicionar-tarefa.md +45 -45
- package/kit/commands/adicionar-testes.md +41 -41
- package/kit/commands/ajuda.md +21 -21
- package/kit/commands/atualizar.md +37 -37
- package/kit/commands/auditar-cascading.md +111 -111
- package/kit/commands/auditar-marco.md +179 -179
- package/kit/commands/auditar-observabilidade-cobertura-workflow.md +121 -0
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
- package/kit/commands/auditar-refactor.md +219 -219
- package/kit/commands/auditar-release.md +109 -109
- package/kit/commands/auditar-uat.md +23 -23
- package/kit/commands/autonomo.md +40 -40
- package/kit/commands/branch-pr.md +24 -24
- package/kit/commands/burn-rate-status.md +408 -408
- package/kit/commands/capturar-payloads.md +193 -193
- package/kit/commands/caracterizar.md +212 -212
- package/kit/commands/concluir-marco.md +247 -247
- package/kit/commands/configuracoes.md +36 -36
- package/kit/commands/dados-distribuidos.md +188 -188
- package/kit/commands/definir-perfil.md +10 -10
- package/kit/commands/depurar.md +190 -190
- package/kit/commands/detectar-duplicacao.md +197 -197
- package/kit/commands/discutir-fase.md +131 -131
- package/kit/commands/encontrar-seams.md +136 -136
- package/kit/commands/entrar-discord.md +17 -17
- package/kit/commands/estatisticas.md +18 -18
- package/kit/commands/example-greeting.md +33 -33
- package/kit/commands/executar-fase.md +58 -58
- package/kit/commands/expresso.md +56 -56
- package/kit/commands/fase-ui.md +34 -34
- package/kit/commands/fazer.md +57 -57
- package/kit/commands/fio.md +125 -125
- package/kit/commands/fluxos-trabalho.md +64 -64
- package/kit/commands/forense.md +176 -176
- package/kit/commands/gerenciador.md +38 -38
- package/kit/commands/inserir-fase.md +31 -31
- package/kit/commands/legacy.md +263 -263
- package/kit/commands/limpeza.md +17 -17
- package/kit/commands/listar-hipoteses-fase.md +45 -45
- package/kit/commands/listar-workspaces.md +18 -18
- package/kit/commands/load-shedding.md +117 -117
- package/kit/commands/mapear-codebase.md +70 -70
- package/kit/commands/multi-tenant.md +163 -163
- package/kit/commands/nota.md +33 -33
- package/kit/commands/novo-marco.md +43 -43
- package/kit/commands/novo-projeto.md +41 -41
- package/kit/commands/novo-workspace.md +43 -43
- package/kit/commands/pausar-trabalho.md +37 -37
- package/kit/commands/perfil-usuario.md +45 -45
- package/kit/commands/pesquisar-fase.md +195 -195
- package/kit/commands/planejar-fase.md +67 -67
- package/kit/commands/planejar-lacunas.md +33 -33
- package/kit/commands/plantar-ideia.md +25 -25
- package/kit/commands/progresso.md +24 -24
- package/kit/commands/proximo.md +30 -30
- package/kit/commands/publicar.md +490 -490
- package/kit/commands/rapido.md +35 -35
- package/kit/commands/reaplicar-patches.md +124 -124
- package/kit/commands/refactor-seguro.md +321 -321
- package/kit/commands/relatorio-sessao.md +19 -19
- package/kit/commands/remover-fase.md +31 -31
- package/kit/commands/remover-workspace.md +26 -26
- package/kit/commands/resumo-marco.md +50 -50
- package/kit/commands/retomar-trabalho.md +40 -40
- package/kit/commands/revisar-backlog.md +60 -60
- package/kit/commands/revisar-ui.md +32 -32
- package/kit/commands/revisar.md +37 -37
- package/kit/commands/saude.md +21 -21
- package/kit/commands/setup-notion.md +93 -93
- package/kit/commands/storytelling.md +179 -179
- package/kit/commands/supabase.md +238 -238
- package/kit/commands/sync-main.md +68 -68
- package/kit/commands/validar-fase.md +35 -35
- package/kit/commands/verificar-tarefas.md +44 -44
- package/kit/commands/verificar-trabalho.md +64 -64
- package/kit/file-manifest.json +13 -11
- package/kit/framework/bin/lib/commands.cjs +959 -959
- package/kit/framework/bin/lib/config.cjs +442 -442
- package/kit/framework/bin/lib/core.cjs +1230 -1230
- package/kit/framework/bin/lib/frontmatter.cjs +336 -336
- package/kit/framework/bin/lib/init.cjs +1442 -1442
- package/kit/framework/bin/lib/milestone.cjs +252 -252
- package/kit/framework/bin/lib/model-profiles.cjs +68 -68
- package/kit/framework/bin/lib/phase.cjs +888 -888
- package/kit/framework/bin/lib/profile-output.cjs +952 -952
- package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
- package/kit/framework/bin/lib/roadmap.cjs +329 -329
- package/kit/framework/bin/lib/security.cjs +382 -382
- package/kit/framework/bin/lib/state.cjs +1031 -1031
- package/kit/framework/bin/lib/template.cjs +222 -222
- package/kit/framework/bin/lib/uat.cjs +282 -282
- package/kit/framework/bin/lib/verify.cjs +888 -888
- package/kit/framework/bin/lib/workstream.cjs +491 -491
- package/kit/framework/bin/tools.cjs +918 -918
- package/kit/framework/commands/workstreams.md +63 -63
- package/kit/framework/references/checkpoints.md +778 -778
- package/kit/framework/references/continuation-format.md +249 -249
- package/kit/framework/references/decimal-phase-calculation.md +64 -64
- package/kit/framework/references/git-integration.md +295 -295
- package/kit/framework/references/git-planning-commit.md +38 -38
- package/kit/framework/references/model-profile-resolution.md +36 -36
- package/kit/framework/references/model-profiles.md +139 -139
- package/kit/framework/references/phase-argument-parsing.md +61 -61
- package/kit/framework/references/planning-config.md +202 -202
- package/kit/framework/references/questioning.md +162 -162
- package/kit/framework/references/tdd.md +263 -263
- package/kit/framework/references/ui-brand.md +160 -160
- package/kit/framework/references/user-profiling.md +657 -657
- package/kit/framework/references/verification-patterns.md +612 -612
- package/kit/framework/references/workstream-flag.md +58 -58
- package/kit/framework/templates/DEBUG.md +164 -164
- package/kit/framework/templates/UAT.md +265 -265
- package/kit/framework/templates/UI-SPEC.md +100 -100
- package/kit/framework/templates/VALIDATION.md +76 -76
- package/kit/framework/templates/claude-md.md +122 -122
- package/kit/framework/templates/codebase/architecture.md +185 -185
- package/kit/framework/templates/codebase/concerns.md +205 -205
- package/kit/framework/templates/codebase/conventions.md +204 -204
- package/kit/framework/templates/codebase/integrations.md +192 -192
- package/kit/framework/templates/codebase/stack.md +158 -158
- package/kit/framework/templates/codebase/structure.md +199 -199
- package/kit/framework/templates/codebase/testing.md +301 -301
- package/kit/framework/templates/config.json +44 -44
- package/kit/framework/templates/context.md +352 -352
- package/kit/framework/templates/continue-here.md +78 -78
- package/kit/framework/templates/copilot-instructions.md +7 -7
- package/kit/framework/templates/debug-subagent-prompt.md +91 -91
- package/kit/framework/templates/dev-preferences.md +20 -20
- package/kit/framework/templates/discovery.md +146 -146
- package/kit/framework/templates/discussion-log.md +63 -63
- package/kit/framework/templates/milestone-archive.md +123 -123
- package/kit/framework/templates/milestone.md +115 -115
- package/kit/framework/templates/phase-prompt.md +610 -610
- package/kit/framework/templates/planner-subagent-prompt.md +117 -117
- package/kit/framework/templates/project.md +186 -186
- package/kit/framework/templates/requirements.md +231 -231
- package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
- package/kit/framework/templates/research-project/FEATURES.md +147 -147
- package/kit/framework/templates/research-project/PITFALLS.md +200 -200
- package/kit/framework/templates/research-project/STACK.md +120 -120
- package/kit/framework/templates/research-project/SUMMARY.md +170 -170
- package/kit/framework/templates/research.md +419 -419
- package/kit/framework/templates/retrospective.md +54 -54
- package/kit/framework/templates/roadmap.md +202 -202
- package/kit/framework/templates/state.md +176 -176
- package/kit/framework/templates/summary-complex.md +59 -59
- package/kit/framework/templates/summary-minimal.md +41 -41
- package/kit/framework/templates/summary-standard.md +48 -48
- package/kit/framework/templates/summary.md +209 -209
- package/kit/framework/templates/user-profile.md +146 -146
- package/kit/framework/templates/user-setup.md +256 -256
- package/kit/framework/templates/verification-report.md +258 -258
- package/kit/framework/workflows/add-phase.md +112 -112
- package/kit/framework/workflows/add-tests.md +351 -351
- package/kit/framework/workflows/add-todo.md +158 -158
- package/kit/framework/workflows/audit-milestone.md +340 -340
- package/kit/framework/workflows/audit-uat.md +109 -109
- package/kit/framework/workflows/autonomous.md +891 -891
- package/kit/framework/workflows/check-todos.md +177 -177
- package/kit/framework/workflows/cleanup.md +152 -152
- package/kit/framework/workflows/complete-milestone.md +696 -696
- package/kit/framework/workflows/diagnose-issues.md +231 -231
- package/kit/framework/workflows/discovery-phase.md +289 -289
- package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
- package/kit/framework/workflows/discuss-phase.md +784 -784
- package/kit/framework/workflows/do.md +104 -104
- package/kit/framework/workflows/execute-phase.md +838 -838
- package/kit/framework/workflows/execute-plan.md +510 -510
- package/kit/framework/workflows/fast.md +102 -102
- package/kit/framework/workflows/forensics.md +265 -265
- package/kit/framework/workflows/health.md +181 -181
- package/kit/framework/workflows/help.md +619 -619
- package/kit/framework/workflows/insert-phase.md +130 -130
- package/kit/framework/workflows/list-phase-assumptions.md +178 -178
- package/kit/framework/workflows/list-workspaces.md +56 -56
- package/kit/framework/workflows/manager.md +362 -362
- package/kit/framework/workflows/map-codebase.md +377 -377
- package/kit/framework/workflows/milestone-summary.md +223 -223
- package/kit/framework/workflows/new-milestone.md +486 -486
- package/kit/framework/workflows/new-project.md +1159 -1159
- package/kit/framework/workflows/new-workspace.md +237 -237
- package/kit/framework/workflows/next.md +97 -97
- package/kit/framework/workflows/node-repair.md +92 -92
- package/kit/framework/workflows/note.md +156 -156
- package/kit/framework/workflows/pause-work.md +176 -176
- package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
- package/kit/framework/workflows/plan-phase.md +765 -765
- package/kit/framework/workflows/plant-seed.md +169 -169
- package/kit/framework/workflows/pr-branch.md +129 -129
- package/kit/framework/workflows/profile-user.md +450 -450
- package/kit/framework/workflows/progress.md +507 -507
- package/kit/framework/workflows/quick.md +757 -757
- package/kit/framework/workflows/remove-phase.md +155 -155
- package/kit/framework/workflows/remove-workspace.md +90 -90
- package/kit/framework/workflows/research-phase.md +82 -82
- package/kit/framework/workflows/resume-project.md +326 -326
- package/kit/framework/workflows/review.md +228 -228
- package/kit/framework/workflows/session-report.md +146 -146
- package/kit/framework/workflows/settings.md +283 -283
- package/kit/framework/workflows/ship.md +228 -228
- package/kit/framework/workflows/stats.md +60 -60
- package/kit/framework/workflows/transition.md +671 -671
- package/kit/framework/workflows/ui-phase.md +302 -302
- package/kit/framework/workflows/ui-review.md +165 -165
- package/kit/framework/workflows/update.md +323 -323
- package/kit/framework/workflows/validate-phase.md +174 -174
- package/kit/framework/workflows/verify-phase.md +252 -252
- package/kit/framework/workflows/verify-work.md +637 -637
- package/kit/hooks/check-update.js +118 -118
- package/kit/hooks/context-monitor.js +163 -163
- package/kit/hooks/kit-attribution-reminder.cjs +92 -92
- package/kit/hooks/kit-router.cjs +137 -137
- package/kit/hooks/prompt-guard.js +103 -103
- package/kit/hooks/statusline.js +125 -125
- package/kit/hooks/workflow-guard.js +101 -101
- package/kit/settings.json +45 -45
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
- package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
- package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
- package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
- package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
- package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
- package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
- package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
- package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
- package/kit/skills/example-skill/SKILL.md +42 -42
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
- package/kit/skills/legacy-extract-class/SKILL.md +203 -203
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
- package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
- package/kit/skills/member-invite-flow/SKILL.md +305 -305
- package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
- package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
- package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
- package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
- package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
- package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
- package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
- package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
- package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
- package/kit/skills/supabase-auth-hardening/SKILL.md +674 -674
- package/kit/skills/supabase-auth-hooks/SKILL.md +875 -875
- package/kit/skills/supabase-auth-methods/SKILL.md +486 -486
- package/kit/skills/supabase-auth-sessions/SKILL.md +579 -579
- package/kit/skills/supabase-auth-ssr/SKILL.md +306 -306
- package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
- package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
- package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
- package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
- package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
- package/kit/skills/supabase-edge-functions/SKILL.md +330 -330
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +309 -309
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +302 -302
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +279 -279
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +277 -277
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +357 -357
- package/kit/skills/supabase-enterprise-sso-saml/SKILL.md +545 -545
- package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -399
- package/kit/skills/supabase-mfa/SKILL.md +488 -488
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-oauth-server/SKILL.md +537 -537
- package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
- package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
- package/kit/skills/supabase-realtime/SKILL.md +460 -460
- package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
- package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
- package/kit/skills/supabase-social-oauth/SKILL.md +480 -480
- package/kit/skills/supabase-third-party-auth/SKILL.md +450 -450
- package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
- package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
- package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
- package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
- package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
- package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
- package/kit/skills/ui-tipografia/SKILL.md +211 -211
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/kit/workflows/auditar-observabilidade-cobertura.workflow.js +250 -0
- package/package.json +65 -63
- package/src/core/kit.js +333 -216
- package/src/core/reflect.js +247 -247
- package/src/core/registry.js +123 -112
- package/src/core/reverse-sync.js +448 -372
- package/src/core/sync.js +477 -437
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +794 -794
package/src/core/kit.js
CHANGED
|
@@ -1,216 +1,333 @@
|
|
|
1
|
-
// Read the canonical kit/ directory and return a structured index.
|
|
2
|
-
// Source of truth: kit/agents/*.md, kit/commands/*.md, kit/skills/*/SKILL.md
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
1
|
+
// Read the canonical kit/ directory and return a structured index.
|
|
2
|
+
// Source of truth: kit/agents/*.md, kit/commands/*.md, kit/skills/*/SKILL.md,
|
|
3
|
+
// kit/workflows/*.workflow.js
|
|
4
|
+
//
|
|
5
|
+
// Frontmatter is parsed loosely (no external dep) — we only need name & description.
|
|
6
|
+
// Workflow `meta` object literals are parsed with a minimal extractor (per the
|
|
7
|
+
// Workflow tool spec, `meta` must be a pure literal — no expressions).
|
|
8
|
+
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import fs from 'node:fs/promises';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = path.dirname(__filename);
|
|
15
|
+
|
|
16
|
+
// PERF-02: Frontmatter regexes compiled once at module load (was being recompiled
|
|
17
|
+
// on every readMdDir / readSkillsDir entry — 60+ times per listKit call).
|
|
18
|
+
const FRONTMATTER_SPLIT_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
|
|
19
|
+
const FRONTMATTER_RAW_RE = /^(---\r?\n[\s\S]*?\r?\n---\r?\n?)/;
|
|
20
|
+
const YAML_KEY_RE = /^([A-Za-z0-9_-]+):\s*(.*)$/;
|
|
21
|
+
|
|
22
|
+
// Resolution order for the kit root (re-evaluated on each call so env-var
|
|
23
|
+
// overrides set after module load — e.g. by the CLI preAction hook — work):
|
|
24
|
+
// 1. explicit `kitRoot` opt passed by caller
|
|
25
|
+
// 2. KIT_MCP_KIT_ROOT env var (per-session override)
|
|
26
|
+
// 3. ./kit relative to this package (the bundled example kit)
|
|
27
|
+
export const BUNDLED_KIT_ROOT = path.resolve(__dirname, '../../kit');
|
|
28
|
+
export function resolveKitRoot(kitRoot) {
|
|
29
|
+
if (kitRoot) return path.resolve(kitRoot);
|
|
30
|
+
if (process.env.KIT_MCP_KIT_ROOT) return path.resolve(process.env.KIT_MCP_KIT_ROOT);
|
|
31
|
+
return BUNDLED_KIT_ROOT;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// PERF-01: TTL cache for listKit output. Repeated calls within KIT_CACHE_TTL_MS
|
|
35
|
+
// return the cached value — sync/reverse-sync/MCP list-* tools used to walk the
|
|
36
|
+
// disk on every invocation. Trade-off: callers that edit kit/ inside the same
|
|
37
|
+
// process may see stale data for up to 30s. Acceptable for MCP/CLI ergonomics.
|
|
38
|
+
const KIT_CACHE_TTL_MS = 30_000;
|
|
39
|
+
const kitCache = new Map(); // `${kitRoot}:${mode}` -> { value, ts }
|
|
40
|
+
|
|
41
|
+
// PERF-S1: when sync runs in mode=reference (default), the body/content of each
|
|
42
|
+
// kit file is never used — only frontmatter (name + description). Reading just
|
|
43
|
+
// the first STUB_READ_BYTES is enough for any frontmatter we'd ever produce and
|
|
44
|
+
// avoids loading 50 KB+ files (planner.md etc) from disk.
|
|
45
|
+
const STUB_READ_BYTES = 4096;
|
|
46
|
+
|
|
47
|
+
export function clearKitCache() { kitCache.clear(); }
|
|
48
|
+
|
|
49
|
+
export async function listKit(kitRoot, opts = {}) {
|
|
50
|
+
kitRoot = resolveKitRoot(kitRoot);
|
|
51
|
+
const stubsOnly = opts.stubsOnly === true;
|
|
52
|
+
const cacheKey = `${kitRoot}:${stubsOnly ? 'stubs' : 'full'}`;
|
|
53
|
+
const cached = kitCache.get(cacheKey);
|
|
54
|
+
if (cached && Date.now() - cached.ts < KIT_CACHE_TTL_MS) {
|
|
55
|
+
return cached.value;
|
|
56
|
+
}
|
|
57
|
+
const [agents, commands, skills, skillsExtras, workflows] = await Promise.all([
|
|
58
|
+
readMdDir(path.join(kitRoot, 'agents'), 'agent', { stubsOnly }),
|
|
59
|
+
readMdDir(path.join(kitRoot, 'commands'), 'command', { stubsOnly }),
|
|
60
|
+
readSkillsDir(path.join(kitRoot, 'skills'), { stubsOnly }),
|
|
61
|
+
readSkillsDir(path.join(kitRoot, 'skills-extras'), { stubsOnly }).catch(() => []),
|
|
62
|
+
readWorkflowsDir(path.join(kitRoot, 'workflows'), { stubsOnly }).catch(() => []),
|
|
63
|
+
]);
|
|
64
|
+
const value = { agents, commands, skills, skillsExtras, workflows, kitRoot, stubsOnly };
|
|
65
|
+
kitCache.set(cacheKey, { value, ts: Date.now() });
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Read just enough bytes from the head of the file to capture the frontmatter.
|
|
70
|
+
// Returns the partial string. fs.open + fd.read avoids the OS pre-fetching the
|
|
71
|
+
// rest of the file (which fs.readFile would force).
|
|
72
|
+
async function readHead(absPath, n) {
|
|
73
|
+
const fd = await fs.open(absPath, 'r');
|
|
74
|
+
try {
|
|
75
|
+
const buf = Buffer.alloc(n);
|
|
76
|
+
const { bytesRead } = await fd.read(buf, 0, n, 0);
|
|
77
|
+
return buf.subarray(0, bytesRead).toString('utf8');
|
|
78
|
+
} finally {
|
|
79
|
+
await fd.close();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function readMdDir(dir, kind, { stubsOnly = false } = {}) {
|
|
84
|
+
let entries;
|
|
85
|
+
try {
|
|
86
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
87
|
+
} catch {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
const out = [];
|
|
91
|
+
for (const e of entries) {
|
|
92
|
+
if (!e.isFile() || !e.name.endsWith('.md')) continue;
|
|
93
|
+
const absPath = path.join(dir, e.name);
|
|
94
|
+
const raw = stubsOnly
|
|
95
|
+
? await readHead(absPath, STUB_READ_BYTES)
|
|
96
|
+
: await fs.readFile(absPath, 'utf8');
|
|
97
|
+
const { frontmatter, body } = splitFrontmatter(raw);
|
|
98
|
+
const item = {
|
|
99
|
+
kind,
|
|
100
|
+
name: e.name.replace(/\.md$/, ''),
|
|
101
|
+
absPath,
|
|
102
|
+
frontmatter,
|
|
103
|
+
frontmatterRaw: matchFrontmatterRaw(raw),
|
|
104
|
+
description: frontmatter?.description ?? firstNonEmptyLine(body),
|
|
105
|
+
};
|
|
106
|
+
if (!stubsOnly) {
|
|
107
|
+
item.body = body;
|
|
108
|
+
item.content = raw;
|
|
109
|
+
}
|
|
110
|
+
out.push(item);
|
|
111
|
+
}
|
|
112
|
+
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function readSkillsDir(dir, { stubsOnly = false } = {}) {
|
|
116
|
+
let entries;
|
|
117
|
+
try {
|
|
118
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
119
|
+
} catch {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
const out = [];
|
|
123
|
+
for (const e of entries) {
|
|
124
|
+
if (!e.isDirectory()) continue;
|
|
125
|
+
const skillPath = path.join(dir, e.name, 'SKILL.md');
|
|
126
|
+
let raw;
|
|
127
|
+
try {
|
|
128
|
+
raw = stubsOnly
|
|
129
|
+
? await readHead(skillPath, STUB_READ_BYTES)
|
|
130
|
+
: await fs.readFile(skillPath, 'utf8');
|
|
131
|
+
} catch { continue; }
|
|
132
|
+
const { frontmatter, body } = splitFrontmatter(raw);
|
|
133
|
+
const item = {
|
|
134
|
+
kind: 'skill',
|
|
135
|
+
name: e.name,
|
|
136
|
+
absPath: skillPath,
|
|
137
|
+
dirPath: path.join(dir, e.name),
|
|
138
|
+
frontmatter,
|
|
139
|
+
frontmatterRaw: matchFrontmatterRaw(raw),
|
|
140
|
+
description: frontmatter?.description ?? firstNonEmptyLine(body),
|
|
141
|
+
};
|
|
142
|
+
if (!stubsOnly) {
|
|
143
|
+
item.body = body;
|
|
144
|
+
item.skillContent = raw;
|
|
145
|
+
}
|
|
146
|
+
out.push(item);
|
|
147
|
+
}
|
|
148
|
+
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// PERF-W1: workflows are listed by name + meta {name, description, whenToUse?}.
|
|
152
|
+
// In stubsOnly mode we read just enough to parse the meta literal; otherwise the
|
|
153
|
+
// full script body is kept on `content` so sync mode='copy' can ship the source.
|
|
154
|
+
// Workflows are ALWAYS read in full — reference-mode sync still ships the entire
|
|
155
|
+
// script body (a stub would not execute). stubsOnly is honored for the head-read
|
|
156
|
+
// optimization in catalog listings, but `content` is always populated so sync
|
|
157
|
+
// has it ready without a second disk pass.
|
|
158
|
+
async function readWorkflowsDir(dir /* , opts */) {
|
|
159
|
+
let entries;
|
|
160
|
+
try {
|
|
161
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
162
|
+
} catch {
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
const out = [];
|
|
166
|
+
for (const e of entries) {
|
|
167
|
+
if (!e.isFile() || !e.name.endsWith('.workflow.js')) continue;
|
|
168
|
+
const absPath = path.join(dir, e.name);
|
|
169
|
+
const raw = await fs.readFile(absPath, 'utf8');
|
|
170
|
+
const meta = parseWorkflowMeta(raw);
|
|
171
|
+
const fileBase = e.name.replace(/\.workflow\.js$/, '');
|
|
172
|
+
out.push({
|
|
173
|
+
kind: 'workflow',
|
|
174
|
+
name: meta?.name ?? fileBase,
|
|
175
|
+
fileBase,
|
|
176
|
+
absPath,
|
|
177
|
+
meta,
|
|
178
|
+
description: meta?.description ?? '',
|
|
179
|
+
content: raw,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Minimal extractor for `export const meta = { ... }`. We don't eval — the spec
|
|
186
|
+
// guarantees `meta` is a pure literal (no calls/spreads/templates), so we only
|
|
187
|
+
// need `name`, `description`, optional `whenToUse`. Tolerant of:
|
|
188
|
+
// - single or double quotes
|
|
189
|
+
// - description spanning multiple physical lines (string concatenation OR
|
|
190
|
+
// a single string ending with `,` on the next line)
|
|
191
|
+
// - extra whitespace and trailing commas
|
|
192
|
+
function parseWorkflowMeta(src) {
|
|
193
|
+
const block = matchMetaBlock(src);
|
|
194
|
+
if (!block) return null;
|
|
195
|
+
return {
|
|
196
|
+
name: extractMetaField(block, 'name'),
|
|
197
|
+
description: extractMetaField(block, 'description'),
|
|
198
|
+
whenToUse: extractMetaField(block, 'whenToUse'),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function matchMetaBlock(src) {
|
|
203
|
+
// Find `export const meta = {` then balance braces to the matching `}`.
|
|
204
|
+
const m = src.match(/export\s+const\s+meta\s*=\s*\{/);
|
|
205
|
+
if (!m) return null;
|
|
206
|
+
const start = m.index + m[0].length - 1; // points at `{`
|
|
207
|
+
let depth = 0;
|
|
208
|
+
for (let i = start; i < src.length; i++) {
|
|
209
|
+
const ch = src[i];
|
|
210
|
+
if (ch === '{') depth++;
|
|
211
|
+
else if (ch === '}') {
|
|
212
|
+
depth--;
|
|
213
|
+
if (depth === 0) return src.slice(start, i + 1);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function extractMetaField(block, field) {
|
|
220
|
+
// Match `field: '…'` or `field: "…"`, plus the concatenation form
|
|
221
|
+
// `field:\n 'part1' +\n 'part2'`.
|
|
222
|
+
const re = new RegExp(`\\b${field}\\s*:\\s*([\\s\\S]*?)(,\\s*\\n|\\n\\s*\\})`);
|
|
223
|
+
const m = block.match(re);
|
|
224
|
+
if (!m) return undefined;
|
|
225
|
+
const rhs = m[1].trim();
|
|
226
|
+
// Fast path: single quoted literal — handles `+` and quotes INSIDE the string,
|
|
227
|
+
// which the concat-split below cannot. Most metas use this form.
|
|
228
|
+
const single = rhs.match(/^(['"])([\s\S]*)\1$/);
|
|
229
|
+
if (single && !containsUnescapedQuote(single[2], single[1])) {
|
|
230
|
+
return single[2];
|
|
231
|
+
}
|
|
232
|
+
// Concat path: split on `+` between literals. Won't handle `+` inside strings;
|
|
233
|
+
// that case is covered by the fast path above.
|
|
234
|
+
const parts = rhs.split(/\s*\+\s*/);
|
|
235
|
+
let acc = '';
|
|
236
|
+
for (const p of parts) {
|
|
237
|
+
const s = p.trim();
|
|
238
|
+
const sm = s.match(/^(['"])([\s\S]*)\1$/);
|
|
239
|
+
if (!sm) return undefined; // not a string literal — bail
|
|
240
|
+
acc += sm[2];
|
|
241
|
+
}
|
|
242
|
+
return acc;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function containsUnescapedQuote(inner, quote) {
|
|
246
|
+
for (let i = 0; i < inner.length; i++) {
|
|
247
|
+
if (inner[i] === '\\') { i++; continue; }
|
|
248
|
+
if (inner[i] === quote) return true;
|
|
249
|
+
}
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// --- minimal YAML-ish frontmatter parser (no deps) ---
|
|
254
|
+
// Handles `key: value`, `key: >` multiline, but NOT nested objects/arrays.
|
|
255
|
+
// Good enough for our SKILL.md / agent.md headers.
|
|
256
|
+
|
|
257
|
+
function splitFrontmatter(raw) {
|
|
258
|
+
const m = raw.match(FRONTMATTER_SPLIT_RE);
|
|
259
|
+
if (!m) return { frontmatter: null, body: raw };
|
|
260
|
+
return { frontmatter: parseLooseYaml(m[1]), body: m[2] };
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function matchFrontmatterRaw(raw) {
|
|
264
|
+
const m = raw.match(FRONTMATTER_RAW_RE);
|
|
265
|
+
return m ? m[1] : '';
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function parseLooseYaml(text) {
|
|
269
|
+
const out = {};
|
|
270
|
+
const lines = text.split(/\r?\n/);
|
|
271
|
+
let i = 0;
|
|
272
|
+
while (i < lines.length) {
|
|
273
|
+
const line = lines[i];
|
|
274
|
+
const m = line.match(YAML_KEY_RE);
|
|
275
|
+
if (!m) { i++; continue; }
|
|
276
|
+
const key = m[1];
|
|
277
|
+
let val = m[2];
|
|
278
|
+
if (val === '>' || val === '|') {
|
|
279
|
+
// Multiline: collect indented lines
|
|
280
|
+
const collected = [];
|
|
281
|
+
i++;
|
|
282
|
+
while (i < lines.length && /^\s+/.test(lines[i])) {
|
|
283
|
+
collected.push(lines[i].replace(/^\s+/, ''));
|
|
284
|
+
i++;
|
|
285
|
+
}
|
|
286
|
+
out[key] = collected.join(' ').trim();
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
out[key] = val.trim().replace(/^["']|["']$/g, '');
|
|
290
|
+
i++;
|
|
291
|
+
}
|
|
292
|
+
return out;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function firstNonEmptyLine(body) {
|
|
296
|
+
for (const line of body.split(/\r?\n/)) {
|
|
297
|
+
const t = line.trim();
|
|
298
|
+
if (!t) continue; // blank
|
|
299
|
+
if (t.startsWith('#')) continue; // markdown heading
|
|
300
|
+
if (t.startsWith('<!--')) continue; // HTML comment (e.g. STUB_MARKER)
|
|
301
|
+
return t.slice(0, 200);
|
|
302
|
+
}
|
|
303
|
+
return '';
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// --- search helpers ---
|
|
307
|
+
|
|
308
|
+
export function searchKit(kit, query) {
|
|
309
|
+
const q = query.toLowerCase();
|
|
310
|
+
const all = [
|
|
311
|
+
...kit.agents,
|
|
312
|
+
...kit.commands,
|
|
313
|
+
...kit.skills,
|
|
314
|
+
...kit.skillsExtras,
|
|
315
|
+
...(kit.workflows ?? []),
|
|
316
|
+
];
|
|
317
|
+
return all.filter(item =>
|
|
318
|
+
item.name.toLowerCase().includes(q) ||
|
|
319
|
+
(item.description ?? '').toLowerCase().includes(q)
|
|
320
|
+
).map(({ kind, name, description, absPath }) => ({ kind, name, description, absPath }));
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export function findItem(kit, kind, name) {
|
|
324
|
+
const buckets = {
|
|
325
|
+
agent: kit.agents,
|
|
326
|
+
command: kit.commands,
|
|
327
|
+
skill: [...kit.skills, ...kit.skillsExtras],
|
|
328
|
+
workflow: kit.workflows ?? [],
|
|
329
|
+
};
|
|
330
|
+
const b = buckets[kind];
|
|
331
|
+
if (!b) throw new Error(`Unknown kind: ${kind}`);
|
|
332
|
+
return b.find(x => x.name === name) ?? null;
|
|
333
|
+
}
|