@nio-cli/cli 0.1.0 → 0.3.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/README.md +374 -139
- package/dist/adapters/docker/docker-gateway.js +100 -0
- package/dist/adapters/docker/docker-gateway.js.map +1 -0
- package/dist/adapters/ide/ide-gateway.js +50 -0
- package/dist/adapters/ide/ide-gateway.js.map +1 -0
- package/dist/adapters/lang/knowledge-store.js +97 -0
- package/dist/adapters/lang/knowledge-store.js.map +1 -0
- package/dist/adapters/lang/language-catalog.js +86 -0
- package/dist/adapters/lang/language-catalog.js.map +1 -0
- package/dist/adapters/lang/package-map.js +98 -0
- package/dist/adapters/lang/package-map.js.map +1 -0
- package/dist/adapters/lang/project-detector.js +40 -0
- package/dist/adapters/lang/project-detector.js.map +1 -0
- package/dist/adapters/lang/repos.js +8 -0
- package/dist/adapters/lang/repos.js.map +1 -0
- package/dist/adapters/lang/scaffold-gateway.js +135 -0
- package/dist/adapters/lang/scaffold-gateway.js.map +1 -0
- package/dist/adapters/lang/vendor.js +52 -0
- package/dist/adapters/lang/vendor.js.map +1 -0
- package/dist/adapters/pg/auth-session-repository.js +41 -0
- package/dist/adapters/pg/auth-session-repository.js.map +1 -0
- package/dist/adapters/pg/client.js +74 -0
- package/dist/adapters/pg/client.js.map +1 -0
- package/dist/adapters/pg/dependency-event-repository.js +40 -0
- package/dist/adapters/pg/dependency-event-repository.js.map +1 -0
- package/dist/adapters/pg/login-challenge-repository.js +54 -0
- package/dist/adapters/pg/login-challenge-repository.js.map +1 -0
- package/dist/adapters/pg/session-repository.js +70 -0
- package/dist/adapters/pg/session-repository.js.map +1 -0
- package/dist/adapters/pg/user-repository.js +71 -0
- package/dist/adapters/pg/user-repository.js.map +1 -0
- package/dist/adapters/pkg/toolchain-gateway.js +35 -0
- package/dist/adapters/pkg/toolchain-gateway.js.map +1 -0
- package/dist/adapters/skills/recipe-catalog.js +84 -0
- package/dist/adapters/skills/recipe-catalog.js.map +1 -0
- package/dist/adapters/sms/http-generic.js +50 -0
- package/dist/adapters/sms/http-generic.js.map +1 -0
- package/dist/app/ai-client.js +44 -0
- package/dist/app/ai-client.js.map +1 -0
- package/dist/app/dependency-watcher.js +87 -0
- package/dist/app/dependency-watcher.js.map +1 -0
- package/dist/app/docker-manager.js +113 -0
- package/dist/app/docker-manager.js.map +1 -0
- package/dist/app/environment-builder.js +73 -0
- package/dist/app/environment-builder.js.map +1 -0
- package/dist/app/language-configurator.js +30 -0
- package/dist/app/language-configurator.js.map +1 -0
- package/dist/app/session-manager.js +124 -0
- package/dist/app/session-manager.js.map +1 -0
- package/dist/brand.js +3 -61
- package/dist/brand.js.map +1 -1
- package/dist/cli/commands/agents.js +30 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/ai.js +61 -0
- package/dist/cli/commands/ai.js.map +1 -0
- package/dist/cli/commands/auth.js +149 -96
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/clean.js +1 -13
- package/dist/cli/commands/clean.js.map +1 -1
- package/dist/cli/commands/command.js +58 -0
- package/dist/cli/commands/command.js.map +1 -0
- package/dist/cli/commands/completion.js +0 -3
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.js +43 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/debug.js +102 -0
- package/dist/cli/commands/debug.js.map +1 -0
- package/dist/cli/commands/deps.js +94 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/docker.js +385 -0
- package/dist/cli/commands/docker.js.map +1 -0
- package/dist/cli/commands/docs/content.js +219 -0
- package/dist/cli/commands/docs/content.js.map +1 -0
- package/dist/cli/commands/docs/dynamic.js +42 -0
- package/dist/cli/commands/docs/dynamic.js.map +1 -0
- package/dist/cli/commands/docs/html.js +108 -0
- package/dist/cli/commands/docs/html.js.map +1 -0
- package/dist/cli/commands/docs/terminal.js +42 -0
- package/dist/cli/commands/docs/terminal.js.map +1 -0
- package/dist/cli/commands/docs.js +34 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/exec.js +2 -7
- package/dist/cli/commands/exec.js.map +1 -1
- package/dist/cli/commands/init/auth-step.js +10 -45
- package/dist/cli/commands/init/auth-step.js.map +1 -1
- package/dist/cli/commands/init/clients-step.js +12 -39
- package/dist/cli/commands/init/clients-step.js.map +1 -1
- package/dist/cli/commands/init/context-step.js +7 -33
- package/dist/cli/commands/init/context-step.js.map +1 -1
- package/dist/cli/commands/init/handoff.js +20 -0
- package/dist/cli/commands/init/handoff.js.map +1 -0
- package/dist/cli/commands/init/index.js +164 -34
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/init/lang-step.js +40 -0
- package/dist/cli/commands/init/lang-step.js.map +1 -0
- package/dist/cli/commands/init/profile-step.js +43 -0
- package/dist/cli/commands/init/profile-step.js.map +1 -0
- package/dist/cli/commands/init/provision-step.js +8 -23
- package/dist/cli/commands/init/provision-step.js.map +1 -1
- package/dist/cli/commands/init/recipe-step.js +18 -0
- package/dist/cli/commands/init/recipe-step.js.map +1 -0
- package/dist/cli/commands/lang.js +27 -0
- package/dist/cli/commands/lang.js.map +1 -0
- package/dist/cli/commands/open.js +59 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/plan.js +2 -6
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/security.js +143 -0
- package/dist/cli/commands/security.js.map +1 -0
- package/dist/cli/commands/sessions.js +92 -0
- package/dist/cli/commands/sessions.js.map +1 -0
- package/dist/cli/commands/skills.js +1 -1
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/start.js +8 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/sync.js +52 -58
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/validate-plan.js +2 -6
- package/dist/cli/commands/validate-plan.js.map +1 -1
- package/dist/cli/copy/auth.json +9 -2
- package/dist/cli/copy/init.json +2 -6
- package/dist/cli/copy.js +0 -8
- package/dist/cli/copy.js.map +1 -1
- package/dist/cli/flows/clients.js +3 -94
- package/dist/cli/flows/clients.js.map +1 -1
- package/dist/cli/flows/completion.js +1 -6
- package/dist/cli/flows/completion.js.map +1 -1
- package/dist/cli/flows/dependencies.js +1 -18
- package/dist/cli/flows/dependencies.js.map +1 -1
- package/dist/cli/flows/onboarding.js +116 -0
- package/dist/cli/flows/onboarding.js.map +1 -0
- package/dist/cli/flows/sections.js +2 -10
- package/dist/cli/flows/sections.js.map +1 -1
- package/dist/cli/flows/user-config.js +5 -10
- package/dist/cli/flows/user-config.js.map +1 -1
- package/dist/cli/program.js +58 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/ui/render.js +2 -53
- package/dist/cli/ui/render.js.map +1 -1
- package/dist/cli/ui/report.js +0 -13
- package/dist/cli/ui/report.js.map +1 -1
- package/dist/cli.js +27 -31
- package/dist/cli.js.map +1 -1
- package/dist/config.js +27 -56
- package/dist/config.js.map +1 -1
- package/dist/core/docker.js +2 -0
- package/dist/core/docker.js.map +1 -0
- package/dist/core/environment.js +2 -0
- package/dist/core/environment.js.map +1 -0
- package/dist/core/lang.js +11 -0
- package/dist/core/lang.js.map +1 -0
- package/dist/core/messaging.js +2 -0
- package/dist/core/messaging.js.map +1 -0
- package/dist/core/repositories.js +2 -0
- package/dist/core/repositories.js.map +1 -0
- package/dist/core/types.js +0 -5
- package/dist/core/types.js.map +1 -1
- package/dist/gateway/config.js +13 -0
- package/dist/gateway/config.js.map +1 -0
- package/dist/gateway/edge-filter.js +55 -0
- package/dist/gateway/edge-filter.js.map +1 -0
- package/dist/gateway/index.js +176 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/middleware/auth.js +34 -0
- package/dist/gateway/middleware/auth.js.map +1 -0
- package/dist/gateway/services/login.js +112 -0
- package/dist/gateway/services/login.js.map +1 -0
- package/dist/gateway/services/security.js +99 -0
- package/dist/gateway/services/security.js.map +1 -0
- package/dist/lib/auth/backup-codes.js +46 -0
- package/dist/lib/auth/backup-codes.js.map +1 -0
- package/dist/lib/auth/gateway-client.js +86 -0
- package/dist/lib/auth/gateway-client.js.map +1 -0
- package/dist/lib/auth/gateway-process.js +54 -0
- package/dist/lib/auth/gateway-process.js.map +1 -0
- package/dist/lib/auth/gateway-token.js +26 -0
- package/dist/lib/auth/gateway-token.js.map +1 -0
- package/dist/lib/auth/nio-config.js +147 -0
- package/dist/lib/auth/nio-config.js.map +1 -0
- package/dist/lib/auth/otp.js +23 -0
- package/dist/lib/auth/otp.js.map +1 -0
- package/dist/lib/auth/password.js +23 -0
- package/dist/lib/auth/password.js.map +1 -0
- package/dist/lib/auth/session-store.js +49 -0
- package/dist/lib/auth/session-store.js.map +1 -0
- package/dist/lib/clients/autopull.js +8 -0
- package/dist/lib/clients/autopull.js.map +1 -0
- package/dist/lib/{client-configs.js → clients/client-configs.js} +113 -34
- package/dist/lib/clients/client-configs.js.map +1 -0
- package/dist/lib/clients/client-install.js +20 -0
- package/dist/lib/clients/client-install.js.map +1 -0
- package/dist/lib/{harness.js → clients/harness.js} +1 -16
- package/dist/lib/clients/harness.js.map +1 -0
- package/dist/lib/{hooks.js → clients/hooks.js} +5 -31
- package/dist/lib/clients/hooks.js.map +1 -0
- package/dist/lib/{targets.js → clients/targets.js} +17 -53
- package/dist/lib/clients/targets.js.map +1 -0
- package/dist/lib/colors.js +0 -24
- package/dist/lib/colors.js.map +1 -1
- package/dist/lib/cowork-extension.js +2 -25
- package/dist/lib/cowork-extension.js.map +1 -1
- package/dist/lib/debug.js +6 -0
- package/dist/lib/debug.js.map +1 -0
- package/dist/lib/{dependencies.js → deps/dependencies.js} +1 -26
- package/dist/lib/deps/dependencies.js.map +1 -0
- package/dist/lib/deps/dependency-install-project.js +27 -0
- package/dist/lib/deps/dependency-install-project.js.map +1 -0
- package/dist/lib/{dependency-install.js → deps/dependency-install.js} +10 -35
- package/dist/lib/deps/dependency-install.js.map +1 -0
- package/dist/lib/deps/dependency-installed.js +64 -0
- package/dist/lib/deps/dependency-installed.js.map +1 -0
- package/dist/lib/deps/dependency-scan.js +100 -0
- package/dist/lib/deps/dependency-scan.js.map +1 -0
- package/dist/lib/docker.js +50 -0
- package/dist/lib/docker.js.map +1 -0
- package/dist/lib/dotfiles.js +57 -0
- package/dist/lib/dotfiles.js.map +1 -0
- package/dist/lib/{exec-delegate.js → exec/exec-delegate.js} +4 -13
- package/dist/lib/exec/exec-delegate.js.map +1 -0
- package/dist/lib/{exec-engines.js → exec/exec-engines.js} +1 -10
- package/dist/lib/exec/exec-engines.js.map +1 -0
- package/dist/lib/{plan-delegate.js → exec/plan-delegate.js} +1 -7
- package/dist/lib/exec/plan-delegate.js.map +1 -0
- package/dist/lib/{validate-plan-delegate.js → exec/validate-plan-delegate.js} +2 -7
- package/dist/lib/exec/validate-plan-delegate.js.map +1 -0
- package/dist/lib/headroom.js +44 -0
- package/dist/lib/headroom.js.map +1 -0
- package/dist/lib/ide-tasks.js +54 -0
- package/dist/lib/ide-tasks.js.map +1 -0
- package/dist/lib/load-env.js +44 -0
- package/dist/lib/load-env.js.map +1 -0
- package/dist/lib/open-url.js +9 -0
- package/dist/lib/open-url.js.map +1 -0
- package/dist/lib/prompts.js +0 -13
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/{provision-apply.js → provision/provision-apply.js} +4 -30
- package/dist/lib/provision/provision-apply.js.map +1 -0
- package/dist/lib/{provision-collect.js → provision/provision-collect.js} +0 -9
- package/dist/lib/provision/provision-collect.js.map +1 -0
- package/dist/lib/{provision.js → provision/provision.js} +4 -17
- package/dist/lib/provision/provision.js.map +1 -0
- package/dist/lib/{patterns.js → skills/patterns.js} +0 -13
- package/dist/lib/skills/patterns.js.map +1 -0
- package/dist/lib/{rules.js → skills/rules.js} +0 -22
- package/dist/lib/skills/rules.js.map +1 -0
- package/dist/lib/skills/sections.js +58 -0
- package/dist/lib/skills/sections.js.map +1 -0
- package/dist/lib/{skill-serve.js → skills/skill-serve.js} +1 -26
- package/dist/lib/skills/skill-serve.js.map +1 -0
- package/dist/lib/{skills-cache.js → skills/skills-cache.js} +15 -21
- package/dist/lib/skills/skills-cache.js.map +1 -0
- package/dist/lib/{skills.js → skills/skills.js} +3 -49
- package/dist/lib/skills/skills.js.map +1 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/telemetry.js +3 -20
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/version-check.js +0 -20
- package/dist/lib/version-check.js.map +1 -1
- package/dist/matrix-logo.js +43 -21
- package/dist/matrix-logo.js.map +1 -1
- package/dist/mcp-server-lang.js +39 -0
- package/dist/mcp-server-lang.js.map +1 -0
- package/dist/mcp-server.js +37 -41
- package/dist/mcp-server.js.map +1 -1
- package/dist/profiles/analyst.js +10 -0
- package/dist/profiles/analyst.js.map +1 -0
- package/dist/profiles/bi.js +9 -0
- package/dist/profiles/bi.js.map +1 -0
- package/dist/profiles/dba.js +21 -0
- package/dist/profiles/dba.js.map +1 -0
- package/dist/profiles/fullstack.js +9 -0
- package/dist/profiles/fullstack.js.map +1 -0
- package/dist/profiles/index.js +39 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/mcps.js +23 -0
- package/dist/profiles/mcps.js.map +1 -0
- package/dist/profiles/qa.js +10 -0
- package/dist/profiles/qa.js.map +1 -0
- package/dist/profiles/scientist.js +9 -0
- package/dist/profiles/scientist.js.map +1 -0
- package/dist/profiles/toolchains.js +9 -0
- package/dist/profiles/toolchains.js.map +1 -0
- package/dist/tools/delegate-exec.js +2 -2
- package/dist/tools/delegate-exec.js.map +1 -1
- package/dist/tools/env-detect-deps.js +54 -0
- package/dist/tools/env-detect-deps.js.map +1 -0
- package/dist/tools/env-materialize.js +43 -0
- package/dist/tools/env-materialize.js.map +1 -0
- package/dist/tools/exec-status.js +1 -1
- package/dist/tools/exec-status.js.map +1 -1
- package/dist/tools/index.js +12 -32
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lang-recipe.js +31 -0
- package/dist/tools/lang-recipe.js.map +1 -0
- package/dist/tools/lang-reference.js +34 -0
- package/dist/tools/lang-reference.js.map +1 -0
- package/dist/tools/plan.js +2 -2
- package/dist/tools/plan.js.map +1 -1
- package/dist/tools/profile-get.js +57 -0
- package/dist/tools/profile-get.js.map +1 -0
- package/dist/tools/session-activate.js +35 -0
- package/dist/tools/session-activate.js.map +1 -0
- package/dist/tools/session-create.js +83 -0
- package/dist/tools/session-create.js.map +1 -0
- package/dist/tools/session-list.js +29 -0
- package/dist/tools/session-list.js.map +1 -0
- package/dist/tools/session-shared.js +25 -0
- package/dist/tools/session-shared.js.map +1 -0
- package/dist/tools/validate-plan.js +2 -2
- package/dist/tools/validate-plan.js.map +1 -1
- package/dist/tui/app.js +116 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/components.js +0 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/debug.js +17 -0
- package/dist/tui/debug.js.map +1 -0
- package/dist/tui/index.js +2 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/launch.js +64 -0
- package/dist/tui/launch.js.map +1 -0
- package/dist/tui/markdown.js +40 -0
- package/dist/tui/markdown.js.map +1 -0
- package/dist/tui/opencode.js +28 -0
- package/dist/tui/opencode.js.map +1 -0
- package/dist/tui/palette-source.js +71 -0
- package/dist/tui/palette-source.js.map +1 -0
- package/dist/tui/palette.js +100 -0
- package/dist/tui/palette.js.map +1 -0
- package/dist/tui/state.js +105 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/theme.js +14 -0
- package/dist/tui/theme.js.map +1 -0
- package/docker/docker-compose.yml +44 -0
- package/headroom/docker-compose.yml +27 -0
- package/package.json +40 -16
- package/dist/adapters/supabase/allocation-gateway.js +0 -236
- package/dist/adapters/supabase/allocation-gateway.js.map +0 -1
- package/dist/adapters/supabase/analytics-gateway.js +0 -18
- package/dist/adapters/supabase/analytics-gateway.js.map +0 -1
- package/dist/adapters/supabase/client.js +0 -96
- package/dist/adapters/supabase/client.js.map +0 -1
- package/dist/adapters/supabase/context-gateway.js +0 -23
- package/dist/adapters/supabase/context-gateway.js.map +0 -1
- package/dist/adapters/supabase/gateway.js +0 -18
- package/dist/adapters/supabase/gateway.js.map +0 -1
- package/dist/adapters/supabase/task-gateway.js +0 -450
- package/dist/adapters/supabase/task-gateway.js.map +0 -1
- package/dist/auth.js +0 -118
- package/dist/auth.js.map +0 -1
- package/dist/cli/commands/init/project-step.js +0 -105
- package/dist/cli/commands/init/project-step.js.map +0 -1
- package/dist/constants.js +0 -9
- package/dist/constants.js.map +0 -1
- package/dist/core/ports.js +0 -2
- package/dist/core/ports.js.map +0 -1
- package/dist/database.types.js +0 -11
- package/dist/database.types.js.map +0 -1
- package/dist/lib/active-project.js +0 -28
- package/dist/lib/active-project.js.map +0 -1
- package/dist/lib/autopull.js +0 -13
- package/dist/lib/autopull.js.map +0 -1
- package/dist/lib/client-configs.js.map +0 -1
- package/dist/lib/client-install.js +0 -40
- package/dist/lib/client-install.js.map +0 -1
- package/dist/lib/dependencies.js.map +0 -1
- package/dist/lib/dependency-install.js.map +0 -1
- package/dist/lib/exec-delegate.js.map +0 -1
- package/dist/lib/exec-engines.js.map +0 -1
- package/dist/lib/harness.js.map +0 -1
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/patterns.js.map +0 -1
- package/dist/lib/plan-delegate.js.map +0 -1
- package/dist/lib/project-context.js +0 -151
- package/dist/lib/project-context.js.map +0 -1
- package/dist/lib/provision-apply.js.map +0 -1
- package/dist/lib/provision-collect.js.map +0 -1
- package/dist/lib/provision.js.map +0 -1
- package/dist/lib/require-config.js +0 -32
- package/dist/lib/require-config.js.map +0 -1
- package/dist/lib/rules.js.map +0 -1
- package/dist/lib/sections.js +0 -89
- package/dist/lib/sections.js.map +0 -1
- package/dist/lib/skill-serve.js.map +0 -1
- package/dist/lib/skills-cache.js.map +0 -1
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/targets.js.map +0 -1
- package/dist/lib/task-history.js +0 -15
- package/dist/lib/task-history.js.map +0 -1
- package/dist/lib/validate-plan-delegate.js.map +0 -1
- package/dist/session-factory.js +0 -19
- package/dist/session-factory.js.map +0 -1
- package/dist/spinner.js.map +0 -1
- package/dist/tools/comment-task.js +0 -72
- package/dist/tools/comment-task.js.map +0 -1
- package/dist/tools/create-task.js +0 -129
- package/dist/tools/create-task.js.map +0 -1
- package/dist/tools/end-allocation.js +0 -38
- package/dist/tools/end-allocation.js.map +0 -1
- package/dist/tools/end-task-allocation.js +0 -37
- package/dist/tools/end-task-allocation.js.map +0 -1
- package/dist/tools/get-active-allocation.js +0 -69
- package/dist/tools/get-active-allocation.js.map +0 -1
- package/dist/tools/get-context.js +0 -48
- package/dist/tools/get-context.js.map +0 -1
- package/dist/tools/get-task.js +0 -137
- package/dist/tools/get-task.js.map +0 -1
- package/dist/tools/list-my-allocations.js +0 -71
- package/dist/tools/list-my-allocations.js.map +0 -1
- package/dist/tools/list-projects.js +0 -38
- package/dist/tools/list-projects.js.map +0 -1
- package/dist/tools/list-tasks.js +0 -93
- package/dist/tools/list-tasks.js.map +0 -1
- package/dist/tools/move-task.js +0 -82
- package/dist/tools/move-task.js.map +0 -1
- package/dist/tools/record-delivery.js +0 -71
- package/dist/tools/record-delivery.js.map +0 -1
- package/dist/tools/set-project.js +0 -52
- package/dist/tools/set-project.js.map +0 -1
- package/dist/tools/start-allocation.js +0 -32
- package/dist/tools/start-allocation.js.map +0 -1
- package/dist/tools/start-task-allocation.js +0 -75
- package/dist/tools/start-task-allocation.js.map +0 -1
- package/dist/tools/update-task.js +0 -139
- package/dist/tools/update-task.js.map +0 -1
- /package/dist/{spinner.js → lib/spinner.js} +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
+
const debug = /^(1|true|yes|on)$/i.test((process.env.NIO_DEBUG ?? '').trim());
|
|
5
|
+
const nodeLoad = process.loadEnvFile;
|
|
6
|
+
function parseAndApply(text) {
|
|
7
|
+
for (const raw of text.split('\n')) {
|
|
8
|
+
const line = raw.trim();
|
|
9
|
+
if (!line || line.startsWith('#'))
|
|
10
|
+
continue;
|
|
11
|
+
const eq = line.indexOf('=');
|
|
12
|
+
if (eq < 1)
|
|
13
|
+
continue;
|
|
14
|
+
const key = line.slice(0, eq).trim();
|
|
15
|
+
if (process.env[key] === undefined) {
|
|
16
|
+
process.env[key] = line.slice(eq + 1).trim();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function tryLoad(path) {
|
|
21
|
+
if (!existsSync(path)) {
|
|
22
|
+
if (debug)
|
|
23
|
+
console.error(`[nio:debug] env ausente: ${path}`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
if (nodeLoad)
|
|
28
|
+
nodeLoad(path);
|
|
29
|
+
else
|
|
30
|
+
parseAndApply(readFileSync(path, 'utf8'));
|
|
31
|
+
if (debug)
|
|
32
|
+
console.error(`[nio:debug] env carregado: ${path}`);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (debug)
|
|
36
|
+
console.error(`[nio:debug] env falhou (${err.message}): ${path}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const explicit = process.env.NIO_ENV_FILE?.trim();
|
|
40
|
+
if (explicit)
|
|
41
|
+
tryLoad(explicit);
|
|
42
|
+
tryLoad(join(process.cwd(), '.env'));
|
|
43
|
+
tryLoad(join(homedir(), '.nio', 'config.env'));
|
|
44
|
+
//# sourceMappingURL=load-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/lib/load-env.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAG9E,MAAM,QAAQ,GAAI,OAAiD,CAAC,WAAW,CAAC;AAGhF,SAAS,aAAa,CAAC,IAAY;IACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,GAAG,CAAC;YAAE,SAAS;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,IAAI,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;;YACxB,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/C,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,2BAA4B,GAAa,CAAC,OAAO,MAAM,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;AAClD,IAAI,QAAQ;IAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AACrC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
export function openUrl(target) {
|
|
3
|
+
const bin = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
|
|
4
|
+
const args = process.platform === 'win32' ? ['/c', 'start', '', target] : [target];
|
|
5
|
+
const child = spawn(bin, args, { detached: true, stdio: 'ignore' });
|
|
6
|
+
child.on('error', () => { });
|
|
7
|
+
child.unref();
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=open-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-url.js","sourceRoot":"","sources":["../../src/lib/open-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7F,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/lib/prompts.js
CHANGED
|
@@ -1,12 +1,4 @@
|
|
|
1
1
|
import { text, password as clackPassword, confirm as clackConfirm, select as clackSelect, multiselect, isCancel, cancel, } from '@clack/prompts';
|
|
2
|
-
/**
|
|
3
|
-
* Wrapper drop-in do `@clack/prompts` com a MESMA assinatura que o CLI já usava
|
|
4
|
-
* do `@inquirer/prompts` — então trocar o cliente de prompts é só mudar o import.
|
|
5
|
-
*
|
|
6
|
-
* Extras que o clack traz de graça: gutter `│`, símbolos `◇/◆/✓`, e cancelamento
|
|
7
|
-
* (Ctrl-C) tratado de forma central por `unwrap()` (encerra limpo em vez de stack).
|
|
8
|
-
*/
|
|
9
|
-
/** Encerra limpo se o usuário cancelar (Ctrl-C) qualquer prompt. */
|
|
10
2
|
function unwrap(value) {
|
|
11
3
|
if (isCancel(value)) {
|
|
12
4
|
cancel('Operação cancelada.');
|
|
@@ -14,10 +6,6 @@ function unwrap(value) {
|
|
|
14
6
|
}
|
|
15
7
|
return value;
|
|
16
8
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Converte o `validate` do inquirer (`(v: string) => true | string`) pro do clack
|
|
19
|
-
* (`Validate<string>` = `(v: string | undefined) => string | undefined`).
|
|
20
|
-
*/
|
|
21
9
|
function adaptValidate(validate) {
|
|
22
10
|
if (!validate)
|
|
23
11
|
return undefined;
|
|
@@ -51,7 +39,6 @@ export async function select(opts) {
|
|
|
51
39
|
}));
|
|
52
40
|
return unwrap(await clackSelect({ message: opts.message, options: options, initialValue: opts.default }));
|
|
53
41
|
}
|
|
54
|
-
/** Sentinela da opção "Todos" — `Symbol` não colide com nenhum valor real de `T`. */
|
|
55
42
|
const SELECT_ALL = Symbol("select-all");
|
|
56
43
|
export async function checkbox(opts) {
|
|
57
44
|
const withAll = Boolean(opts.all) && opts.choices.length > 1;
|
package/dist/lib/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,QAAQ,IAAI,aAAa,EACzB,OAAO,IAAI,YAAY,EACvB,MAAM,IAAI,WAAW,EACrB,WAAW,EACX,QAAQ,EACR,MAAM,GACP,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,8 @@ import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, lstatSync,
|
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { dirname, join, resolve } from "node:path";
|
|
5
|
-
import { VERSION } from "
|
|
6
|
-
import { brand } from "
|
|
7
|
-
/**
|
|
8
|
-
* Motor do provisionamento: hash/manifesto (`.<marca>-provision.json`), escrita
|
|
9
|
-
* idempotente e poda do que o nio gravou. `provision.ts` monta a lista e chama
|
|
10
|
-
* `applyProvision`; `uninstallProvision` desfaz pelo mesmo manifesto.
|
|
11
|
-
*/
|
|
5
|
+
import { VERSION } from "../../version.js";
|
|
6
|
+
import { brand } from "../../brand.js";
|
|
12
7
|
export const MANIFEST_NAME = `.${brand.name}-provision.json`;
|
|
13
8
|
export function defaultTargetDir() {
|
|
14
9
|
return join(homedir(), ".claude");
|
|
@@ -25,15 +20,9 @@ function readManifest(path) {
|
|
|
25
20
|
return parsed;
|
|
26
21
|
}
|
|
27
22
|
catch {
|
|
28
|
-
// manifesto corrompido → trata como ausente e reconstrói
|
|
29
23
|
}
|
|
30
24
|
return null;
|
|
31
25
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Se um componente de `dir` é symlink com alvo inexistente (dotfiles gerenciando
|
|
34
|
-
* `~/.claude`), materializa o alvo em vez de deixar o `mkdir -p` estourar ENOENT.
|
|
35
|
-
* Retorna `true` se materializou algo. Escrever depois grava através do link.
|
|
36
|
-
*/
|
|
37
26
|
function materializeDanglingLink(dir) {
|
|
38
27
|
let cursor = dir;
|
|
39
28
|
for (;;) {
|
|
@@ -42,7 +31,6 @@ function materializeDanglingLink(dir) {
|
|
|
42
31
|
info = lstatSync(cursor);
|
|
43
32
|
}
|
|
44
33
|
catch {
|
|
45
|
-
// cursor não existe (parent pendurado) → sobe um nível.
|
|
46
34
|
const parent = dirname(cursor);
|
|
47
35
|
if (parent === cursor)
|
|
48
36
|
return false;
|
|
@@ -52,14 +40,13 @@ function materializeDanglingLink(dir) {
|
|
|
52
40
|
if (info.isSymbolicLink()) {
|
|
53
41
|
const target = resolve(dirname(cursor), readlinkSync(cursor));
|
|
54
42
|
if (existsSync(target))
|
|
55
|
-
return false;
|
|
43
|
+
return false;
|
|
56
44
|
mkdirSync(target, { recursive: true });
|
|
57
45
|
return true;
|
|
58
46
|
}
|
|
59
|
-
return false;
|
|
47
|
+
return false;
|
|
60
48
|
}
|
|
61
49
|
}
|
|
62
|
-
/** `mkdir -p` tolerante a symlinks pendurados de dotfiles (ver acima). */
|
|
63
50
|
export function ensureDir(dir) {
|
|
64
51
|
for (let attempt = 0; attempt < 40; attempt++) {
|
|
65
52
|
try {
|
|
@@ -79,10 +66,6 @@ function writeFile(targetAbs, content) {
|
|
|
79
66
|
ensureDir(dirname(targetAbs));
|
|
80
67
|
writeFileSync(targetAbs, content);
|
|
81
68
|
}
|
|
82
|
-
/**
|
|
83
|
-
* Núcleo do provisionamento: aplica `docs` no destino, idempotente e não-destrutivo
|
|
84
|
-
* via manifesto. Retorna o plano por arquivo.
|
|
85
|
-
*/
|
|
86
69
|
export function applyProvision(docs, options = {}) {
|
|
87
70
|
const dryRun = options.dryRun ?? false;
|
|
88
71
|
const force = options.force ?? false;
|
|
@@ -100,8 +83,6 @@ export function applyProvision(docs, options = {}) {
|
|
|
100
83
|
const newFiles = {};
|
|
101
84
|
for (const f of files) {
|
|
102
85
|
const targetAbs = join(targetDir, f.relPath);
|
|
103
|
-
// Um arquivo problemático (ex.: symlink de dotfiles quebrado) vira um resultado
|
|
104
|
-
// `write-error` e a sincronização segue — nunca aborta o resto por causa de um.
|
|
105
86
|
try {
|
|
106
87
|
if (!existsSync(targetAbs)) {
|
|
107
88
|
if (!dryRun)
|
|
@@ -116,8 +97,6 @@ export function applyProvision(docs, options = {}) {
|
|
|
116
97
|
newFiles[f.relPath] = f.hash;
|
|
117
98
|
continue;
|
|
118
99
|
}
|
|
119
|
-
// Divergente. Só atualizamos se o arquivo era nosso e o worker não mexeu,
|
|
120
|
-
// ou se ele pediu --force.
|
|
121
100
|
const wasOursUntouched = oldFiles[f.relPath] === existingHash;
|
|
122
101
|
if (wasOursUntouched || force) {
|
|
123
102
|
if (!dryRun)
|
|
@@ -139,7 +118,6 @@ export function applyProvision(docs, options = {}) {
|
|
|
139
118
|
? "editado localmente"
|
|
140
119
|
: "arquivo de terceiros",
|
|
141
120
|
});
|
|
142
|
-
// Não reivindica propriedade: fica de fora do novo manifesto.
|
|
143
121
|
}
|
|
144
122
|
}
|
|
145
123
|
catch (err) {
|
|
@@ -150,13 +128,10 @@ export function applyProvision(docs, options = {}) {
|
|
|
150
128
|
});
|
|
151
129
|
}
|
|
152
130
|
}
|
|
153
|
-
// Prune: o que era nosso mas não veio nesta fonte.
|
|
154
131
|
if (prune) {
|
|
155
132
|
for (const [relPath, oldHash] of Object.entries(oldFiles)) {
|
|
156
133
|
if (incomingSet.has(relPath))
|
|
157
134
|
continue;
|
|
158
|
-
// Ainda existe no bundle (só foi filtrado pela seleção neste run) → NÃO poda;
|
|
159
|
-
// mantém no manifesto pra não perder a propriedade em runs futuros.
|
|
160
135
|
if (options.keep?.has(relPath)) {
|
|
161
136
|
newFiles[relPath] = oldHash;
|
|
162
137
|
continue;
|
|
@@ -190,7 +165,6 @@ export function applyProvision(docs, options = {}) {
|
|
|
190
165
|
}
|
|
191
166
|
return { targetDir, version: VERSION, dryRun, files: results };
|
|
192
167
|
}
|
|
193
|
-
/** Remove só o que o nio instalou (conforme o manifesto), preservando edições locais. */
|
|
194
168
|
export function uninstallProvision(options = {}) {
|
|
195
169
|
const dryRun = options.dryRun ?? false;
|
|
196
170
|
const targetDir = options.targetDir ?? defaultTargetDir();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision-apply.js","sourceRoot":"","sources":["../../../src/lib/provision/provision-apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
2
2
|
import { join, relative, sep } from "node:path";
|
|
3
|
-
/**
|
|
4
|
-
* Coleta os arquivos sincronizáveis do pacote `@nio-cli/skills` (commands/skills/
|
|
5
|
-
* agents) como uma lista em memória — a fonte que `provision()` filtra/achata
|
|
6
|
-
* (via `sections.ts`) e passa pro motor de aplicação (`provision-apply.ts`).
|
|
7
|
-
*/
|
|
8
|
-
/** Subpastas do pacote `@nio-cli/skills` espelhadas em `~/.claude`. */
|
|
9
3
|
const SYNCED_SUBDIRS = ["commands", "skills", "agents"];
|
|
10
|
-
/** Basenames que nunca são copiados pro destino (READMEs são só do repo). */
|
|
11
4
|
const IGNORED_BASENAMES = new Set([".gitkeep", ".DS_Store", "README.md"]);
|
|
12
|
-
/** Lista arquivos sob `dir` recursivamente, paths relativos a `dir` em estilo POSIX. */
|
|
13
5
|
function listFilesRecursive(dir) {
|
|
14
6
|
const out = [];
|
|
15
7
|
const walk = (abs) => {
|
|
@@ -26,7 +18,6 @@ function listFilesRecursive(dir) {
|
|
|
26
18
|
walk(dir);
|
|
27
19
|
return out;
|
|
28
20
|
}
|
|
29
|
-
/** Coleta os arquivos sincronizáveis do pacote (só as subpastas conhecidas). */
|
|
30
21
|
export function collectSkillFiles(dir) {
|
|
31
22
|
const files = [];
|
|
32
23
|
for (const sub of SYNCED_SUBDIRS) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision-collect.js","sourceRoot":"","sources":["../../../src/lib/provision/provision-collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAShD,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAGjE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAQ1E,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAS;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACnC,IAAI,KAAK,CAAC,MAAM,EAAE;gBACrB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,GAAG,CAAC;AACb,CAAC;AAGD,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAClC,KAAK,MAAM,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC;YACzC,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { brand } from "
|
|
3
|
-
import { claudeTarget } from "
|
|
4
|
-
import { filterDocsForSurface, skillsDir } from "
|
|
5
|
-
import { filterForSelection, flattenSelection } from "
|
|
2
|
+
import { brand } from "../../brand.js";
|
|
3
|
+
import { claudeTarget } from "../clients/targets.js";
|
|
4
|
+
import { filterDocsForSurface, skillsDir } from "../skills/skills.js";
|
|
5
|
+
import { filterForSelection, flattenSelection } from "../skills/sections.js";
|
|
6
6
|
import { collectSkillFiles } from "./provision-collect.js";
|
|
7
7
|
import { applyProvision } from "./provision-apply.js";
|
|
8
|
-
/**
|
|
9
|
-
* Provisiona skills/commands/agents do nio (o MCP não grava em `~/.claude`; a CLI
|
|
10
|
-
* `sync`/`init` chama `provision()`). Idempotente via manifesto. Coleta em
|
|
11
|
-
* `provision-collect.ts`, motor em `provision-apply.ts` — ambos reexportados daqui.
|
|
12
|
-
*/
|
|
13
|
-
/**
|
|
14
|
-
* Copia/atualiza o conteúdo do pacote `@nio-cli/skills` no destino.
|
|
15
|
-
* (`nio sync` / `nio init`.)
|
|
16
|
-
*/
|
|
17
8
|
export function provision(options = {}) {
|
|
18
9
|
const target = options.target ?? claudeTarget;
|
|
19
10
|
const dir = options.skillsDir ?? skillsDir();
|
|
@@ -24,10 +15,6 @@ export function provision(options = {}) {
|
|
|
24
15
|
relPath: f.relPath,
|
|
25
16
|
content: f.content,
|
|
26
17
|
}));
|
|
27
|
-
// Todos os paths on-disk possíveis do bundle (sem o filtro de seleção). O prune só
|
|
28
|
-
// remove o que NÃO está aqui — o que saiu do bundle de verdade —, nunca o que foi só
|
|
29
|
-
// filtrado pela seleção deste run. Sem isso o auto-pull de um repo com seleção estreita
|
|
30
|
-
// apagava `/implement` & cia. do `~/.claude` global.
|
|
31
18
|
const keep = new Set(target
|
|
32
19
|
.mapDocs(filterDocsForSurface(flattenSelection(rawDocs), target.surface))
|
|
33
20
|
.map((d) => d.relPath));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../../src/lib/provision/provision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAwB,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAkB,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAA+C,MAAM,sBAAsB,CAAC;AAYnG,MAAM,UAAU,SAAS,CACvB,UAAkF,EAAE;IAEpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,sCAAsC,GAAG,sBAAsB,KAAK,CAAC,aAAa,GAAG,CACtF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC,CAAC,CAAC;IAMJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,MAAM;SACH,OAAO,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;SACxE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CACzB,CAAC;IAEF,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,cAAc,CAAC,IAAI,EAAE;QAC1B,GAAG,OAAO;QACV,IAAI;QACJ,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE;KACnD,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,kBAAkB,GAOnB,MAAM,sBAAsB,CAAC"}
|
|
@@ -2,11 +2,6 @@ import { spawnSync } from 'node:child_process';
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { readSkillDocs } from './skills.js';
|
|
5
|
-
/**
|
|
6
|
-
* Patterns do harness — a parte que **precisa de IA**. O CLI não raciocina sobre o
|
|
7
|
-
* código, então dispara um agente **headless** (`claude -p` / `codex exec`), com
|
|
8
|
-
* consentimento, pra analisar o repo e escrever `docs/_patterns.md`. Best-effort.
|
|
9
|
-
*/
|
|
10
5
|
export const PATTERNS_REL = 'docs/_patterns.md';
|
|
11
6
|
export function patternsPath(cwd) {
|
|
12
7
|
return join(cwd, PATTERNS_REL);
|
|
@@ -14,7 +9,6 @@ export function patternsPath(cwd) {
|
|
|
14
9
|
export function patternsExist(cwd) {
|
|
15
10
|
return existsSync(patternsPath(cwd));
|
|
16
11
|
}
|
|
17
|
-
/** Prompt da análise: corpo da skill `detect-patterns` (fonte única) ou fallback embutido. */
|
|
18
12
|
const FALLBACK_PROMPT = `Analise ESTE repositório e escreva \`${PATTERNS_REL}\` (arquivo único, sobrescreva se existir) com os PADRÕES REAIS já usados no código: estrutura de pastas/camadas, convenções de naming, stack/libs e como são usadas, e padrões de estado/dados/erros/testes. Baseie-se SÓ no que existe — não invente nem recomende. Seja conciso (poucas dezenas de linhas): é contexto pra outros agentes, não pode inflar. Não toque em nenhum outro arquivo.`;
|
|
19
13
|
function analysisPrompt() {
|
|
20
14
|
try {
|
|
@@ -23,11 +17,9 @@ function analysisPrompt() {
|
|
|
23
17
|
return doc.content.trim();
|
|
24
18
|
}
|
|
25
19
|
catch {
|
|
26
|
-
/* skill ausente do cache → fallback */
|
|
27
20
|
}
|
|
28
21
|
return FALLBACK_PROMPT;
|
|
29
22
|
}
|
|
30
|
-
/** Existe um binário no PATH (via `--version`)? */
|
|
31
23
|
function hasBin(bin) {
|
|
32
24
|
try {
|
|
33
25
|
const r = spawnSync(bin, ['--version'], { stdio: 'ignore' });
|
|
@@ -37,13 +29,8 @@ function hasBin(bin) {
|
|
|
37
29
|
return false;
|
|
38
30
|
}
|
|
39
31
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Roda a análise de patterns headless no `cwd`. Prefere `claude`, cai pro `codex`;
|
|
42
|
-
* sem nenhum no PATH, não roda (retorna `ran:false`). Nunca lança.
|
|
43
|
-
*/
|
|
44
32
|
export function runPatternsAnalysis(cwd) {
|
|
45
33
|
const prompt = analysisPrompt();
|
|
46
|
-
// stdin ignorado (o prompt vai por arg) — evita o agente ficar esperando stdin.
|
|
47
34
|
const stdio = ['ignore', 'inherit', 'inherit'];
|
|
48
35
|
if (hasBin('claude')) {
|
|
49
36
|
const r = spawnSync('claude', ['-p', prompt, '--permission-mode', 'acceptEdits'], {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/lib/skills/patterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEhD,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAGD,MAAM,eAAe,GAAG,wCAAwC,YAAY,mYAAmY,CAAC;AAEhd,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAC1F,IAAI,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAGD,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAaD,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAGhC,MAAM,KAAK,GAAqC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAEjF,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,aAAa,CAAC,EAAE;YAChF,GAAG;YACH,KAAK;SACN,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAC;AACxF,CAAC"}
|
|
@@ -2,19 +2,10 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { skillsDir } from './skills.js';
|
|
4
4
|
import { DEV_ROLE, GENERAL } from './sections.js';
|
|
5
|
-
/**
|
|
6
|
-
* Rules do harness — convenções versionadas no `nio-skills`, na mesma taxonomia
|
|
7
|
-
* da seleção: `rules/<role>/<área|general>/<stack|general>/rules.md`. O geral do role
|
|
8
|
-
* fica em `rules/<role>/general/general-rules.md`.
|
|
9
|
-
*
|
|
10
|
-
* Este módulo lê + concatena (determinístico) pela `Selection`, e o CLI grava o
|
|
11
|
-
* resultado no repo (`docs/_rules`). Rules são de código → só o role `dev`.
|
|
12
|
-
*/
|
|
13
5
|
const RULES_ROOT = 'rules';
|
|
14
6
|
function rulePath(dir, ...seg) {
|
|
15
7
|
return join(dir, RULES_ROOT, ...seg);
|
|
16
8
|
}
|
|
17
|
-
/** Separa o frontmatter (`--- … ---`) do corpo. */
|
|
18
9
|
function splitFrontmatter(raw) {
|
|
19
10
|
const m = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(raw);
|
|
20
11
|
if (!m)
|
|
@@ -27,18 +18,15 @@ function splitFrontmatter(raw) {
|
|
|
27
18
|
}
|
|
28
19
|
return { fm, body: raw.slice(m[0].length) };
|
|
29
20
|
}
|
|
30
|
-
/** Rebaixa headings um nível (`##` → `###`) pra aninharem sob o cabeçalho do bloco. */
|
|
31
21
|
function demoteHeadings(md) {
|
|
32
22
|
return md.replace(/^(#{1,5})(\s)/gm, '#$1$2');
|
|
33
23
|
}
|
|
34
|
-
/** Corpo (sem frontmatter, headings rebaixados) de um arquivo de regra, ou `null`. */
|
|
35
24
|
function readRuleBody(path) {
|
|
36
25
|
if (!existsSync(path))
|
|
37
26
|
return null;
|
|
38
27
|
const body = splitFrontmatter(readFileSync(path, 'utf8')).body.trim();
|
|
39
28
|
return body.length > 0 ? demoteHeadings(body) : null;
|
|
40
29
|
}
|
|
41
|
-
/** Skills recomendadas (frontmatter `skills:`) de um arquivo de regra. */
|
|
42
30
|
function ruleSkillsAt(path) {
|
|
43
31
|
if (!existsSync(path))
|
|
44
32
|
return [];
|
|
@@ -47,16 +35,10 @@ function ruleSkillsAt(path) {
|
|
|
47
35
|
.map((s) => s.trim())
|
|
48
36
|
.filter(Boolean);
|
|
49
37
|
}
|
|
50
|
-
/** Arquivo de regra geral do role (`rules/<role>/general/general-rules.md`, ou `rules.md`). */
|
|
51
38
|
function generalRule(dir) {
|
|
52
39
|
const named = rulePath(dir, DEV_ROLE, GENERAL, 'general-rules.md');
|
|
53
40
|
return existsSync(named) ? named : rulePath(dir, DEV_ROLE, GENERAL, 'rules.md');
|
|
54
41
|
}
|
|
55
|
-
/**
|
|
56
|
-
* Concatena o harness pela seleção: geral do role + (por área selecionada) o geral da
|
|
57
|
-
* área + o **stack** escolhido. Ordenado (general → áreas alfabéticas). String vazia se
|
|
58
|
-
* nada aplicável. Só o role `dev` tem rules.
|
|
59
|
-
*/
|
|
60
42
|
export function concatenateRules(sel, dir = skillsDir()) {
|
|
61
43
|
if (!sel.roles.includes(DEV_ROLE))
|
|
62
44
|
return '';
|
|
@@ -77,10 +59,6 @@ export function concatenateRules(sel, dir = skillsDir()) {
|
|
|
77
59
|
}
|
|
78
60
|
return blocks.join('\n\n');
|
|
79
61
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Skills recomendadas (skills.sh, do frontmatter `skills:`) das áreas/stacks
|
|
82
|
-
* selecionadas — do `rules.md` da área + do stack escolhido. Deduplicado.
|
|
83
|
-
*/
|
|
84
62
|
export function collectRuleSkills(sel, dir = skillsDir()) {
|
|
85
63
|
if (!sel.roles.includes(DEV_ROLE))
|
|
86
64
|
return [];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/lib/skills/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export const GENERAL = 'general';
|
|
4
|
+
export const DEV_ROLE = 'dev';
|
|
5
|
+
export function discoverRoles(dir) {
|
|
6
|
+
return subdirs(join(dir, 'skills'));
|
|
7
|
+
}
|
|
8
|
+
export function discoverAreas(dir, role) {
|
|
9
|
+
return subdirs(join(dir, 'skills', role)).filter((a) => a !== GENERAL);
|
|
10
|
+
}
|
|
11
|
+
export function discoverStacks(dir, role, area) {
|
|
12
|
+
return subdirs(join(dir, 'skills', role, area)).filter((s) => s !== GENERAL);
|
|
13
|
+
}
|
|
14
|
+
function subdirs(root) {
|
|
15
|
+
if (!existsSync(root))
|
|
16
|
+
return [];
|
|
17
|
+
return readdirSync(root, { withFileTypes: true })
|
|
18
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith('.'))
|
|
19
|
+
.map((e) => e.name)
|
|
20
|
+
.sort();
|
|
21
|
+
}
|
|
22
|
+
export function includePath(relPath, sel) {
|
|
23
|
+
const parts = relPath.split('/');
|
|
24
|
+
const kind = parts[0];
|
|
25
|
+
if (kind === 'commands' || kind === 'hooks')
|
|
26
|
+
return sel.roles.includes(DEV_ROLE);
|
|
27
|
+
const role = parts[1];
|
|
28
|
+
if (!sel.roles.includes(role))
|
|
29
|
+
return false;
|
|
30
|
+
if (kind === 'agents')
|
|
31
|
+
return true;
|
|
32
|
+
const seg2 = parts[2];
|
|
33
|
+
if (seg2 === undefined || seg2 === GENERAL)
|
|
34
|
+
return true;
|
|
35
|
+
if (!(seg2 in sel.stacks))
|
|
36
|
+
return false;
|
|
37
|
+
const seg3 = parts[3];
|
|
38
|
+
return seg3 === GENERAL || seg3 === sel.stacks[seg2];
|
|
39
|
+
}
|
|
40
|
+
export function filterForSelection(docs, sel) {
|
|
41
|
+
if (!sel)
|
|
42
|
+
return docs;
|
|
43
|
+
return docs.filter((d) => includePath(d.relPath, sel));
|
|
44
|
+
}
|
|
45
|
+
export function flattenSelection(docs) {
|
|
46
|
+
return docs.map((d) => {
|
|
47
|
+
const parts = d.relPath.split('/');
|
|
48
|
+
const kind = parts[0];
|
|
49
|
+
if (kind === 'agents')
|
|
50
|
+
return { ...d, relPath: `agents/${parts.slice(2).join('/')}` };
|
|
51
|
+
if (kind === 'skills') {
|
|
52
|
+
const rest = parts[2] === GENERAL ? parts.slice(3) : parts.slice(4);
|
|
53
|
+
return { ...d, relPath: `skills/${rest.join('/')}` };
|
|
54
|
+
}
|
|
55
|
+
return d;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../src/lib/skills/sections.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import { readSkillFiles, toSkillDocs } from './skills.js';
|
|
2
|
-
import { brand } from '
|
|
3
|
-
/**
|
|
4
|
-
* Camada de **serviço** do pacote de skills pro servidor MCP: expõe os docs como
|
|
5
|
-
* resources (leitura sob demanda) e como prompts (slash/commands no Cowork e Codex).
|
|
6
|
-
* Só o `mcp-server.ts` importa isto — o CLI nunca precisa.
|
|
7
|
-
*/
|
|
2
|
+
import { brand } from '../../brand.js';
|
|
8
3
|
export const SKILLS_URI_PREFIX = `${brand.name}://skills/`;
|
|
9
4
|
let cache = null;
|
|
10
|
-
/** Carrega o pacote de skills, memoizado (não muda enquanto o processo roda). */
|
|
11
5
|
export function loadSkills(dir) {
|
|
12
6
|
if (cache && !dir)
|
|
13
7
|
return cache;
|
|
@@ -20,16 +14,9 @@ export function loadSkills(dir) {
|
|
|
20
14
|
cache = loaded;
|
|
21
15
|
return loaded;
|
|
22
16
|
}
|
|
23
|
-
/** Limpa o cache (testes / dir custom). */
|
|
24
17
|
export function clearSkillsCache() {
|
|
25
18
|
cache = null;
|
|
26
19
|
}
|
|
27
|
-
/**
|
|
28
|
-
* Nome do resource em estilo caminho — agrupa a listagem por tipo/skill (como o
|
|
29
|
-
* conector do Figma), em vez de despejar títulos soltos. Skills e commands viram
|
|
30
|
-
* `skill/<id>` / `command/<id>`; arquivos de apoio (templates, *-PATTERN) aninham
|
|
31
|
-
* sob a skill dona (`skill/init-sdd/templates/spec`); docs soltos viram `doc/<path>`.
|
|
32
|
-
*/
|
|
33
20
|
function resourceName(doc, skillFolders) {
|
|
34
21
|
if (doc.type === 'command')
|
|
35
22
|
return `command/${doc.id}`;
|
|
@@ -39,7 +26,6 @@ function resourceName(doc, skillFolders) {
|
|
|
39
26
|
return `dependency/${doc.id}`;
|
|
40
27
|
if (doc.type === 'skill')
|
|
41
28
|
return `skill/${doc.id}`;
|
|
42
|
-
// doc: aninha sob a skill dona, se estiver dentro da pasta de uma.
|
|
43
29
|
for (const [folder, id] of skillFolders) {
|
|
44
30
|
if (doc.path.startsWith(`${folder}/`)) {
|
|
45
31
|
const sub = doc.path.slice(folder.length + 1).replace(/\.md$/i, '');
|
|
@@ -49,16 +35,12 @@ function resourceName(doc, skillFolders) {
|
|
|
49
35
|
return `doc/${doc.path.replace(/\.md$/i, '')}`;
|
|
50
36
|
}
|
|
51
37
|
export function skillResourceDescriptors(docs) {
|
|
52
|
-
// Pasta (dir do SKILL.md) → id, pra aninhar os arquivos de apoio sob a skill.
|
|
53
38
|
const skillFolders = new Map();
|
|
54
39
|
for (const d of docs) {
|
|
55
40
|
if (d.type === 'skill')
|
|
56
41
|
skillFolders.set(d.path.slice(0, d.path.lastIndexOf('/')), d.id);
|
|
57
42
|
}
|
|
58
43
|
return docs
|
|
59
|
-
// `command`/`skill` já são servidos como **prompts** — não repetir como resource
|
|
60
|
-
// (senão o Cowork lista cada um duas vezes). Aqui ficam só os arquivos de apoio
|
|
61
|
-
// (templates/patterns), agents e dependencies.
|
|
62
44
|
.filter((d) => d.type !== 'command' && d.type !== 'skill')
|
|
63
45
|
.map((d) => ({
|
|
64
46
|
uri: `${SKILLS_URI_PREFIX}${d.path}`,
|
|
@@ -68,7 +50,6 @@ export function skillResourceDescriptors(docs) {
|
|
|
68
50
|
}))
|
|
69
51
|
.sort((a, b) => a.name.localeCompare(b.name));
|
|
70
52
|
}
|
|
71
|
-
/** Lê um resource pela URI, a partir dos docs + os markdowns crus por path. */
|
|
72
53
|
export function readSkillResource(uri, docs, rawByPath) {
|
|
73
54
|
if (!uri.startsWith(SKILLS_URI_PREFIX))
|
|
74
55
|
throw new Error(`URI fora do pacote de skills: ${uri}`);
|
|
@@ -78,7 +59,6 @@ export function readSkillResource(uri, docs, rawByPath) {
|
|
|
78
59
|
throw new Error(`Recurso não encontrado: ${uri}`);
|
|
79
60
|
return { uri, mimeType: 'text/markdown', text: rawByPath.get(rel) ?? doc.content };
|
|
80
61
|
}
|
|
81
|
-
/** Só `command` e `skill` viram prompts (docs/agents/dependencies não). */
|
|
82
62
|
function isPromptable(type) {
|
|
83
63
|
return type === 'command' || type === 'skill';
|
|
84
64
|
}
|
|
@@ -97,16 +77,11 @@ export function skillPromptDescriptors(docs) {
|
|
|
97
77
|
],
|
|
98
78
|
}));
|
|
99
79
|
}
|
|
100
|
-
/** Monta o texto de um prompt: corpo do doc com `$ARGUMENTS` substituído. */
|
|
101
80
|
export function buildSkillPrompt(name, args, docs) {
|
|
102
81
|
const doc = docs.find((d) => d.id === name && isPromptable(d.type));
|
|
103
82
|
if (!doc)
|
|
104
83
|
throw new Error(`Prompt desconhecido: ${name}`);
|
|
105
84
|
let text = doc.content.split('$ARGUMENTS').join(args?.args ?? '');
|
|
106
|
-
// Cowork/Codex servem a skill como **prompt** — não têm o filesystem dela. Então os
|
|
107
|
-
// arquivos de apoio (`templates/*`, `*-PATTERN.md`, `STANDARDS.md`) que o corpo
|
|
108
|
-
// referencia por path relativo não existem lá. Inline-os pra a skill ficar
|
|
109
|
-
// auto-contida (no Claude Code isso não roda — lá os arquivos são nativos).
|
|
110
85
|
if (doc.type === 'skill') {
|
|
111
86
|
const folder = doc.path.slice(0, doc.path.lastIndexOf('/'));
|
|
112
87
|
const companions = docs
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-serve.js","sourceRoot":"","sources":["../../../src/lib/skills/skill-serve.ts"],"names":[],"mappings":"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"}
|