@nio-cli/cli 0.1.0 → 0.2.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 +332 -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/dependency-watcher.js +87 -0
- package/dist/app/dependency-watcher.js.map +1 -0
- package/dist/app/docker-manager.js +110 -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/auth.js +122 -90
- 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 +41 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/debug.js +93 -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 +360 -0
- package/dist/cli/commands/docker.js.map +1 -0
- package/dist/cli/commands/docs/content.js +199 -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 +9 -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/index.js +177 -33
- 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 +51 -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/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/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/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 +23 -0
- 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 +14 -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 +106 -0
- package/dist/lib/auth/gateway-client.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 +138 -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} +99 -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/{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/load-env.js +15 -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 +0 -10
- 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/docker/docker-compose.yml +44 -0
- package/package.json +30 -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
|
@@ -2,13 +2,9 @@ import { existsSync } from 'node:fs';
|
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join, dirname } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
|
-
import { backupFile, readJson, writeJson, readToml, writeToml } from '
|
|
6
|
-
import { brand, envName } from '
|
|
5
|
+
import { backupFile, readJson, writeJson, readToml, writeToml } from '../file-merge.js';
|
|
6
|
+
import { brand, envName } from '../../brand.js';
|
|
7
7
|
const MCP_COMMAND = brand.mcpBinName;
|
|
8
|
-
/**
|
|
9
|
-
* Lê o JSON do path; se for malformado, lança erro com mensagem clara
|
|
10
|
-
* apontando que o user deve consertar à mão.
|
|
11
|
-
*/
|
|
12
8
|
function readJsonSafe(path) {
|
|
13
9
|
try {
|
|
14
10
|
return readJson(path);
|
|
@@ -52,10 +48,6 @@ export function installVSCodeRepo(cwd) {
|
|
|
52
48
|
const path = join(cwd, '.vscode', 'mcp.json');
|
|
53
49
|
return ensureMcpServersJson(path, 'servers');
|
|
54
50
|
}
|
|
55
|
-
// ---------------------------------------------------------------------------
|
|
56
|
-
// Claude Desktop / Cowork — ativa o conector direto no config, sem `.mcpb`.
|
|
57
|
-
// ---------------------------------------------------------------------------
|
|
58
|
-
/** Diretório de config do Claude Desktop por SO (criado pelo app quando instalado). */
|
|
59
51
|
export function coworkConfigDir() {
|
|
60
52
|
if (process.platform === 'darwin') {
|
|
61
53
|
return join(homedir(), 'Library', 'Application Support', 'Claude');
|
|
@@ -68,11 +60,9 @@ export function coworkConfigDir() {
|
|
|
68
60
|
export function coworkConfigPath() {
|
|
69
61
|
return join(coworkConfigDir(), 'claude_desktop_config.json');
|
|
70
62
|
}
|
|
71
|
-
/** O app está instalado? Presença do dir de config é o sinal (o app o cria). */
|
|
72
63
|
export function coworkAppInstalled() {
|
|
73
64
|
return existsSync(coworkConfigDir());
|
|
74
65
|
}
|
|
75
|
-
/** O conector nio já está no `claude_desktop_config.json`? */
|
|
76
66
|
export function coworkConfigured() {
|
|
77
67
|
const path = coworkConfigPath();
|
|
78
68
|
if (!existsSync(path))
|
|
@@ -85,20 +75,10 @@ export function coworkConfigured() {
|
|
|
85
75
|
return false;
|
|
86
76
|
}
|
|
87
77
|
}
|
|
88
|
-
/** Path absoluto do `dist/mcp-server.js` deste pacote (compila pra `dist/lib/`). */
|
|
89
78
|
function mcpServerJsPath() {
|
|
90
|
-
const here = dirname(fileURLToPath(import.meta.url));
|
|
91
|
-
return join(here, '..', 'mcp-server.js');
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Ativa o conector nio direto no `claude_desktop_config.json` do Claude Desktop.
|
|
95
|
-
*
|
|
96
|
-
* Usa caminhos ABSOLUTOS (`process.execPath` + `dist/mcp-server.js`) porque o app é
|
|
97
|
-
* GUI e tem PATH mínimo — `nio-cli`/`node` via nvm não seriam encontrados. O PAT
|
|
98
|
-
* vem do `~/.nio/credentials.json` (via `nio login`); `NIO_CLIENT=cowork`
|
|
99
|
-
* faz o server servir as skills por prompts/resources e escolher projeto por sessão.
|
|
100
|
-
* Não-destrutivo: faz merge + backup do config existente.
|
|
101
|
-
*/
|
|
79
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
80
|
+
return join(here, '..', 'mcp-server.js');
|
|
81
|
+
}
|
|
102
82
|
export function installCoworkGlobal() {
|
|
103
83
|
const path = coworkConfigPath();
|
|
104
84
|
const entry = {
|
|
@@ -133,8 +113,6 @@ export function readCoAuthoredBy(path = claudeSettingsPath()) {
|
|
|
133
113
|
const value = json.includeCoAuthoredBy;
|
|
134
114
|
return { path, value, enabled: value !== false };
|
|
135
115
|
}
|
|
136
|
-
// ponytail: setamos só includeCoAuthoredBy=false (knob simples, ainda honrado).
|
|
137
|
-
// Se o Claude Code um dia remover em favor do `attribution`, migra aqui.
|
|
138
116
|
export function disableCoAuthoredBy(path = claudeSettingsPath()) {
|
|
139
117
|
const exists = existsSync(path);
|
|
140
118
|
const existing = exists ? (readJsonSafe(path) ?? {}) : {};
|
|
@@ -142,11 +120,6 @@ export function disableCoAuthoredBy(path = claudeSettingsPath()) {
|
|
|
142
120
|
writeJson(path, { ...existing, includeCoAuthoredBy: false });
|
|
143
121
|
return { status: exists ? 'updated' : 'created', path, backup };
|
|
144
122
|
}
|
|
145
|
-
/**
|
|
146
|
-
* Decide se o `nio` já está OK no TOML e monta o próximo objeto se precisar
|
|
147
|
-
* atualizar (pura, sem IO). Já-OK só se command bate E env NIO_CLIENT=codex já
|
|
148
|
-
* existe — senão atualiza (instalações antigas ganham o env no próximo run).
|
|
149
|
-
*/
|
|
150
123
|
export function planCodexUpdate(existing, nioEntry) {
|
|
151
124
|
const servers = (existing.mcp_servers ?? {});
|
|
152
125
|
const current = servers[brand.mcpServerKey];
|
|
@@ -164,10 +137,102 @@ export function planCodexUpdate(existing, nioEntry) {
|
|
|
164
137
|
};
|
|
165
138
|
return { alreadyConfigured, next };
|
|
166
139
|
}
|
|
140
|
+
export const NIO_OPERATOR_MODEL = 'opencode/big-pickle';
|
|
141
|
+
function opencodeMcpEntry(spec, current) {
|
|
142
|
+
if (spec.url) {
|
|
143
|
+
return { type: 'remote', ...current, url: spec.url, enabled: true };
|
|
144
|
+
}
|
|
145
|
+
const entry = {
|
|
146
|
+
type: 'local',
|
|
147
|
+
...current,
|
|
148
|
+
command: spec.command,
|
|
149
|
+
enabled: true,
|
|
150
|
+
};
|
|
151
|
+
if (spec.environment) {
|
|
152
|
+
entry.environment = { ...current?.environment, ...spec.environment };
|
|
153
|
+
}
|
|
154
|
+
return entry;
|
|
155
|
+
}
|
|
156
|
+
function opencodeMcpOk(spec, cur) {
|
|
157
|
+
if (!cur || cur.enabled === false)
|
|
158
|
+
return false;
|
|
159
|
+
return spec.url ? cur.url === spec.url : cur.command?.[0] === spec.command?.[0];
|
|
160
|
+
}
|
|
161
|
+
export function planOpencodeUpdate(existing, nioEntry, profileMcps = []) {
|
|
162
|
+
const servers = (existing.mcp ?? {});
|
|
163
|
+
const current = servers[brand.mcpServerKey];
|
|
164
|
+
const nioOk = Boolean(current &&
|
|
165
|
+
current.command?.[0] === nioEntry.command[0] &&
|
|
166
|
+
current.environment?.[envName('CLIENT')] === 'opencode' &&
|
|
167
|
+
current.enabled !== false);
|
|
168
|
+
const mcpsOk = profileMcps.every((spec) => opencodeMcpOk(spec, servers[spec.id]));
|
|
169
|
+
const alreadyConfigured = nioOk && existing.model === NIO_OPERATOR_MODEL && mcpsOk;
|
|
170
|
+
const nextMcp = {
|
|
171
|
+
...servers,
|
|
172
|
+
[brand.mcpServerKey]: {
|
|
173
|
+
type: 'local',
|
|
174
|
+
...current,
|
|
175
|
+
command: nioEntry.command,
|
|
176
|
+
environment: { ...current?.environment, [envName('CLIENT')]: 'opencode' },
|
|
177
|
+
enabled: true,
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
for (const spec of profileMcps) {
|
|
181
|
+
nextMcp[spec.id] = opencodeMcpEntry(spec, servers[spec.id]);
|
|
182
|
+
}
|
|
183
|
+
const next = {
|
|
184
|
+
...existing,
|
|
185
|
+
model: NIO_OPERATOR_MODEL,
|
|
186
|
+
mcp: nextMcp,
|
|
187
|
+
};
|
|
188
|
+
return { alreadyConfigured, next };
|
|
189
|
+
}
|
|
190
|
+
export function opencodeGlobalPath() {
|
|
191
|
+
return join(homedir(), '.config', 'opencode', 'opencode.json');
|
|
192
|
+
}
|
|
193
|
+
export function installOpencodeGlobal(profileMcps = [], path = opencodeGlobalPath()) {
|
|
194
|
+
const nioEntry = { command: [MCP_COMMAND], environment: { [envName('CLIENT')]: 'opencode' } };
|
|
195
|
+
if (!existsSync(path)) {
|
|
196
|
+
const { next } = planOpencodeUpdate({}, nioEntry, profileMcps);
|
|
197
|
+
writeJson(path, next);
|
|
198
|
+
return { status: 'created', path };
|
|
199
|
+
}
|
|
200
|
+
const existing = readJsonSafe(path) ?? {};
|
|
201
|
+
const { alreadyConfigured, next } = planOpencodeUpdate(existing, nioEntry, profileMcps);
|
|
202
|
+
if (alreadyConfigured)
|
|
203
|
+
return { status: 'already_configured', path };
|
|
204
|
+
const backup = backupFile(path);
|
|
205
|
+
writeJson(path, next);
|
|
206
|
+
return { status: 'updated', path, backup };
|
|
207
|
+
}
|
|
208
|
+
export function upsertOpencodeMcp(spec, opts = {}) {
|
|
209
|
+
const path = opts.path ?? opencodeGlobalPath();
|
|
210
|
+
if (!existsSync(path)) {
|
|
211
|
+
if (opts.remove)
|
|
212
|
+
return { status: 'already_configured', path };
|
|
213
|
+
const servers = { [spec.id]: opencodeMcpEntry(spec) };
|
|
214
|
+
writeJson(path, { mcp: servers });
|
|
215
|
+
return { status: 'created', path };
|
|
216
|
+
}
|
|
217
|
+
const existing = readJsonSafe(path) ?? {};
|
|
218
|
+
const servers = { ...(existing.mcp ?? {}) };
|
|
219
|
+
const cur = servers[spec.id];
|
|
220
|
+
if (opts.remove) {
|
|
221
|
+
if (!cur || cur.enabled === false)
|
|
222
|
+
return { status: 'already_configured', path };
|
|
223
|
+
servers[spec.id] = { ...cur, enabled: false };
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
if (opencodeMcpOk(spec, cur))
|
|
227
|
+
return { status: 'already_configured', path };
|
|
228
|
+
servers[spec.id] = opencodeMcpEntry(spec, cur);
|
|
229
|
+
}
|
|
230
|
+
const backup = backupFile(path);
|
|
231
|
+
writeJson(path, { ...existing, mcp: servers });
|
|
232
|
+
return { status: 'updated', path, backup };
|
|
233
|
+
}
|
|
167
234
|
export function installCodexGlobal() {
|
|
168
235
|
const path = join(homedir(), '.codex', 'config.toml');
|
|
169
|
-
// `NIO_CLIENT=codex` avisa o servidor MCP a (1) provisionar/auto-pull pra
|
|
170
|
-
// `~/.codex` (skills + prompts) e (2) filtrar os docs pelo surface `codex`.
|
|
171
236
|
const nioEntry = { command: MCP_COMMAND, env: { [envName('CLIENT')]: 'codex' } };
|
|
172
237
|
if (!existsSync(path)) {
|
|
173
238
|
writeToml(path, { mcp_servers: { [brand.mcpServerKey]: nioEntry } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-configs.js","sourceRoot":"","sources":["../../../src/lib/clients/client-configs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
export const CLIENTS = {
|
|
3
|
+
opencode: {
|
|
4
|
+
id: 'opencode',
|
|
5
|
+
label: 'OpenCode',
|
|
6
|
+
binary: 'opencode',
|
|
7
|
+
npm: 'opencode-ai',
|
|
8
|
+
url: 'https://opencode.ai/docs',
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
export function isBinaryInstalled(binary) {
|
|
12
|
+
try {
|
|
13
|
+
const res = spawnSync(binary, ['--version'], { stdio: 'ignore', timeout: 5000 });
|
|
14
|
+
return !res.error;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=client-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-install.js","sourceRoot":"","sources":["../../../src/lib/clients/client-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoB/C,MAAM,CAAC,MAAM,OAAO,GAA+B;IACjD,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,UAAU;QAClB,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,0BAA0B;KAChC;CACF,CAAC;AAGF,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
-
import { brand } from '
|
|
2
|
+
import { brand } from '../../brand.js';
|
|
3
3
|
import { dirname, join } from 'node:path';
|
|
4
|
-
/**
|
|
5
|
-
* Grava o **harness** de código no repo (versionado, do time): o arquivo de rules
|
|
6
|
-
* concatenadas + as âncoras no `AGENTS.md` (com o bloco de overview do NOS) + um
|
|
7
|
-
* `CLAUDE.md` fino. Idempotente e não-destrutivo: só reescreve o que é do nio; o
|
|
8
|
-
* texto do time no `AGENTS.md` (fora do bloco marcado) é preservado.
|
|
9
|
-
*/
|
|
10
4
|
export const HARNESS_RULES_REL = `docs/_rules/${brand.name}.md`;
|
|
11
5
|
export const HARNESS_PATTERNS_REL = 'docs/_patterns.md';
|
|
12
6
|
const AGENTS_REL = 'AGENTS.md';
|
|
@@ -27,7 +21,6 @@ function writeIfChanged(path, content) {
|
|
|
27
21
|
writeFileSync(path, content, 'utf8');
|
|
28
22
|
return 'updated';
|
|
29
23
|
}
|
|
30
|
-
/** Insere um bloco logo após o primeiro heading `# …`, ou no topo se não houver. */
|
|
31
24
|
function insertAfterTitle(text, block) {
|
|
32
25
|
const lines = text.split('\n');
|
|
33
26
|
const i = lines.findIndex((l) => /^#\s/.test(l));
|
|
@@ -36,7 +29,6 @@ function insertAfterTitle(text, block) {
|
|
|
36
29
|
lines.splice(i + 1, 0, '', block);
|
|
37
30
|
return lines.join('\n');
|
|
38
31
|
}
|
|
39
|
-
/** Garante o bloco de overview (marcado) + as âncoras `@` no `AGENTS.md`. */
|
|
40
32
|
function ensureAgents(path, overview) {
|
|
41
33
|
const anchors = [`@${HARNESS_RULES_REL}`, `@${HARNESS_PATTERNS_REL}`];
|
|
42
34
|
const ovBlock = overview
|
|
@@ -65,21 +57,14 @@ function ensureAgents(path, overview) {
|
|
|
65
57
|
writeFileSync(path, text, 'utf8');
|
|
66
58
|
return 'updated';
|
|
67
59
|
}
|
|
68
|
-
/**
|
|
69
|
-
* Escreve o harness no repo (`cwd`). `rulesMarkdown` vem do concatenador; `overview` é
|
|
70
|
-
* o texto do NOS (opcional — quando ausente, o bloco de overview não é tocado).
|
|
71
|
-
*/
|
|
72
60
|
export function writeRepoHarness(cwd, opts) {
|
|
73
61
|
const result = { rules: 'empty', agents: 'unchanged', claude: 'unchanged' };
|
|
74
|
-
// 1. docs/_rules/<nome-da-marca>.md — totalmente do nio.
|
|
75
62
|
if (opts.rulesMarkdown.trim()) {
|
|
76
63
|
const header = `# Harness de código — ${brand.name}\n\n` +
|
|
77
64
|
`<!-- Gerado por \`${brand.name} sync\`. Não edite à mão — rode \`${brand.name} sync\`. -->\n\n`;
|
|
78
65
|
result.rules = writeIfChanged(join(cwd, HARNESS_RULES_REL), `${header}${opts.rulesMarkdown.trim()}\n`);
|
|
79
66
|
}
|
|
80
|
-
// 2. AGENTS.md — overview (bloco marcado) + âncoras.
|
|
81
67
|
result.agents = ensureAgents(join(cwd, AGENTS_REL), opts.overview ?? null);
|
|
82
|
-
// 3. CLAUDE.md fino — scaffold-if-missing.
|
|
83
68
|
const claudePath = join(cwd, CLAUDE_REL);
|
|
84
69
|
if (!existsSync(claudePath)) {
|
|
85
70
|
writeFileSync(claudePath, `@${AGENTS_REL}\n`, 'utf8');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../src/lib/clients/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
import { existsSync, readFileSync, readdirSync, copyFileSync, rmSync, } from 'node:fs';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
-
import { readJson, writeJson } from '
|
|
5
|
-
import { skillsDir } from '
|
|
6
|
-
import { ensureDir } from '
|
|
7
|
-
import { DEV_ROLE } from '
|
|
8
|
-
import { brand } from '
|
|
9
|
-
/**
|
|
10
|
-
* Provisionamento de hooks (só Claude Code). Um hook é um script + um gatilho que
|
|
11
|
-
* precisa estar registrado no `settings.json` — então, além de copiar o script pro
|
|
12
|
-
* namespace `hooks/nio/`, o CLI faz merge não-destrutivo do binding. Fonte:
|
|
13
|
-
* `@nio-cli/skills/hooks/hooks.json` (flat — hooks são sempre de dev).
|
|
14
|
-
*/
|
|
15
|
-
/** Namespace sob o targetDir onde os scripts do nio vivem. Marca "nossa" entrada. */
|
|
4
|
+
import { readJson, writeJson } from '../file-merge.js';
|
|
5
|
+
import { skillsDir } from '../skills/skills.js';
|
|
6
|
+
import { ensureDir } from '../provision/provision.js';
|
|
7
|
+
import { DEV_ROLE } from '../skills/sections.js';
|
|
8
|
+
import { brand } from '../../brand.js';
|
|
16
9
|
const HOOKS_NS = `hooks/${brand.name}`;
|
|
17
10
|
function defaultTargetDir() {
|
|
18
11
|
return join(homedir(), '.claude');
|
|
19
12
|
}
|
|
20
|
-
/** Lê e valida um `hooks.json`, devolvendo as entradas bem-formadas. */
|
|
21
13
|
function readManifest(path) {
|
|
22
14
|
let parsed;
|
|
23
15
|
try {
|
|
@@ -49,11 +41,6 @@ function readManifest(path) {
|
|
|
49
41
|
}
|
|
50
42
|
return out;
|
|
51
43
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Descobre e resolve os hooks aplicáveis: lê `hooks/hooks.json` (flat), filtra por
|
|
54
|
-
* cliente (`clients`), e devolve as entradas com o script de origem. Hooks são de
|
|
55
|
-
* código → só entram se a seleção incluir o role `dev` (ou sem seleção).
|
|
56
|
-
*/
|
|
57
44
|
function collectHooks(dir, surface, selection) {
|
|
58
45
|
if (selection && !selection.roles.includes(DEV_ROLE))
|
|
59
46
|
return [];
|
|
@@ -79,15 +66,10 @@ function collectHooks(dir, surface, selection) {
|
|
|
79
66
|
}
|
|
80
67
|
return out;
|
|
81
68
|
}
|
|
82
|
-
/** Uma entrada de comando é "nossa" se aponta pro namespace `hooks/nio/`. */
|
|
83
69
|
function isOurs(hook) {
|
|
84
70
|
const cmd = hook?.command;
|
|
85
71
|
return typeof cmd === 'string' && cmd.includes(`${HOOKS_NS}/`);
|
|
86
72
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Remove todas as entradas do nio de um bloco de `hooks` do settings, deixando
|
|
89
|
-
* intactas as do usuário. Devolve o bloco limpo (eventos/grupos vazios removidos).
|
|
90
|
-
*/
|
|
91
73
|
function stripOurs(hooksCfg) {
|
|
92
74
|
const clean = {};
|
|
93
75
|
for (const [event, groups] of Object.entries(hooksCfg)) {
|
|
@@ -105,7 +87,6 @@ function stripOurs(hooksCfg) {
|
|
|
105
87
|
}
|
|
106
88
|
return clean;
|
|
107
89
|
}
|
|
108
|
-
/** Remove recursivamente arquivos órfãos sob o namespace, exceto os recém-escritos. */
|
|
109
90
|
function pruneScripts(scriptsDir, keep, dryRun, pruned) {
|
|
110
91
|
if (!existsSync(scriptsDir))
|
|
111
92
|
return;
|
|
@@ -119,7 +100,6 @@ function pruneScripts(scriptsDir, keep, dryRun, pruned) {
|
|
|
119
100
|
rmSync(childAbs, { recursive: true });
|
|
120
101
|
}
|
|
121
102
|
catch {
|
|
122
|
-
/* ignore */
|
|
123
103
|
}
|
|
124
104
|
}
|
|
125
105
|
else if (entry.isFile()) {
|
|
@@ -133,10 +113,6 @@ function pruneScripts(scriptsDir, keep, dryRun, pruned) {
|
|
|
133
113
|
};
|
|
134
114
|
walk(scriptsDir);
|
|
135
115
|
}
|
|
136
|
-
/**
|
|
137
|
-
* Provisiona os hooks do nio no Claude Code. Idempotente e não-destrutivo.
|
|
138
|
-
* No-op (installed vazio) se o pacote não tem `hooks/` ou nada casa a seleção.
|
|
139
|
-
*/
|
|
140
116
|
export function provisionHooks(options = {}) {
|
|
141
117
|
const dryRun = options.dryRun ?? false;
|
|
142
118
|
const dir = options.skillsDir ?? skillsDir();
|
|
@@ -163,7 +139,6 @@ export function provisionHooks(options = {}) {
|
|
|
163
139
|
}
|
|
164
140
|
const prunedScripts = [];
|
|
165
141
|
pruneScripts(scriptsDir, writtenScripts, dryRun, prunedScripts);
|
|
166
|
-
// Merge no settings.json: tira as nossas entradas antigas, re-adiciona as atuais.
|
|
167
142
|
const settings = readJson(settingsPath) ?? {};
|
|
168
143
|
const currentHooks = settings.hooks ?? {};
|
|
169
144
|
const merged = stripOurs(currentHooks);
|
|
@@ -189,7 +164,6 @@ export function provisionHooks(options = {}) {
|
|
|
189
164
|
}
|
|
190
165
|
return { settingsPath, scriptsDir, dryRun, installed, prunedScripts };
|
|
191
166
|
}
|
|
192
|
-
/** Remove tudo que o nio instalou de hooks (scripts + entradas do settings). */
|
|
193
167
|
export function uninstallHooks(options = {}) {
|
|
194
168
|
const dryRun = options.dryRun ?? false;
|
|
195
169
|
const targetDir = options.targetDir ?? defaultTargetDir();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/lib/clients/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
-
import { toSkillDocs } from '
|
|
5
|
-
import { readJson
|
|
6
|
-
import { brand } from '
|
|
4
|
+
import { toSkillDocs } from '../skills/skills.js';
|
|
5
|
+
import { readJson } from '../file-merge.js';
|
|
6
|
+
import { brand } from '../../brand.js';
|
|
7
7
|
export const claudeTarget = {
|
|
8
8
|
id: 'claude',
|
|
9
9
|
label: 'Claude Code (~/.claude)',
|
|
@@ -11,18 +11,11 @@ export const claudeTarget = {
|
|
|
11
11
|
targetDir: () => join(homedir(), '.claude'),
|
|
12
12
|
mapDocs: (docs) => docs,
|
|
13
13
|
};
|
|
14
|
-
/**
|
|
15
|
-
* Texto que substitui `$ARGUMENTS` na tradução pro Codex. Skills do Codex são
|
|
16
|
-
* selecionadas por descrição e dirigidas por linguagem natural — não há
|
|
17
|
-
* substituição de slash-args como no caminho de command/prompt do Claude.
|
|
18
|
-
*/
|
|
19
14
|
const ARGS_REWORD = 'the arguments the user provided';
|
|
20
|
-
/** Escapa uma descrição pra uma linha de YAML entre aspas duplas. */
|
|
21
15
|
function yamlQuote(value) {
|
|
22
16
|
const oneLine = value.replace(/\r?\n/g, ' ').replace(/\s+/g, ' ').trim();
|
|
23
17
|
return `"${oneLine.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
24
18
|
}
|
|
25
|
-
/** Renderiza o SKILL.md de um node no formato Agent Skills (name + description). */
|
|
26
19
|
export function toCodexSkillContent(node) {
|
|
27
20
|
const description = node.frontmatter.description || node.description || node.title;
|
|
28
21
|
const frontmatter = `---\nname: ${node.id}\ndescription: ${yamlQuote(description)}\n---\n`;
|
|
@@ -30,15 +23,10 @@ export function toCodexSkillContent(node) {
|
|
|
30
23
|
if (body.includes('$ARGUMENTS')) {
|
|
31
24
|
body = body.split('$ARGUMENTS').join(ARGS_REWORD);
|
|
32
25
|
}
|
|
33
|
-
// `argument-hint` não existe em skills — dobra num aviso de entrada esperada.
|
|
34
26
|
const hint = node.frontmatter['argument-hint'];
|
|
35
27
|
const inputLine = hint ? `**Expected input:** ${hint}\n\n` : '';
|
|
36
28
|
return `${frontmatter}\n${inputLine}${body.trim()}\n`;
|
|
37
29
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Renderiza um custom prompt do Codex (`~/.codex/prompts/<id>.md`). Diferente da skill,
|
|
40
|
-
* o Codex expande `$ARGUMENTS`/`$1..$9` aqui, então preservamos os placeholders.
|
|
41
|
-
*/
|
|
42
30
|
export function toCodexPromptContent(node) {
|
|
43
31
|
const description = node.frontmatter.description || node.description || node.title;
|
|
44
32
|
const hint = node.frontmatter['argument-hint'];
|
|
@@ -46,21 +34,11 @@ export function toCodexPromptContent(node) {
|
|
|
46
34
|
if (hint)
|
|
47
35
|
fmLines.push(`argument-hint: ${yamlQuote(hint)}`);
|
|
48
36
|
const frontmatter = `---\n${fmLines.join('\n')}\n---\n`;
|
|
49
|
-
// Corpo original, com `$ARGUMENTS`/`$1` intactos (o Codex substitui na invocação).
|
|
50
37
|
return `${frontmatter}\n${node.content.trim()}\n`;
|
|
51
38
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Traduz os docs crus pro layout do Codex em dual-write: cada `command`/`skill` vira
|
|
54
|
-
* uma skill (`skills/<id>/SKILL.md`) E um custom prompt (`prompts/<id>.md`). Os
|
|
55
|
-
* arquivos de apoio de uma skill (`templates/*.md`, `*-PATTERN.md`, `STANDARDS.md` —
|
|
56
|
-
* type `doc`, vizinhos do `SKILL.md`) são carregados pra dentro de `skills/<id>/`
|
|
57
|
-
* preservando o path relativo, pra que o SKILL.md traduzido consiga referenciá-los
|
|
58
|
-
* exatamente como no Claude. `agent` e `doc` fora de uma skill são ignorados.
|
|
59
|
-
*/
|
|
60
39
|
export function toCodexDocs(docs) {
|
|
61
40
|
const nodes = toSkillDocs(docs.map((d) => ({ path: d.relPath, raw: d.content.toString('utf8') })));
|
|
62
41
|
const rawByPath = new Map(docs.map((d) => [d.relPath, d.content]));
|
|
63
|
-
// Pasta da skill (dir do SKILL.md) -> id, pra rotear os arquivos de apoio.
|
|
64
42
|
const skillFolders = new Map();
|
|
65
43
|
for (const node of nodes) {
|
|
66
44
|
if (node.type === 'skill') {
|
|
@@ -68,7 +46,7 @@ export function toCodexDocs(docs) {
|
|
|
68
46
|
}
|
|
69
47
|
}
|
|
70
48
|
const out = [];
|
|
71
|
-
const seen = new Map();
|
|
49
|
+
const seen = new Map();
|
|
72
50
|
for (const node of nodes) {
|
|
73
51
|
if (node.type === 'command' || node.type === 'skill') {
|
|
74
52
|
const prev = seen.get(node.id);
|
|
@@ -87,8 +65,6 @@ export function toCodexDocs(docs) {
|
|
|
87
65
|
});
|
|
88
66
|
continue;
|
|
89
67
|
}
|
|
90
|
-
// Arquivo de apoio de uma skill: carrega verbatim pro dir da skill traduzida,
|
|
91
|
-
// mantendo o path relativo (ex.: `templates/spec.md`, `SPEC-PATTERN.md`).
|
|
92
68
|
if (node.type === 'doc') {
|
|
93
69
|
for (const [folder, id] of skillFolders) {
|
|
94
70
|
if (!node.path.startsWith(`${folder}/`))
|
|
@@ -110,42 +86,30 @@ export const codexTarget = {
|
|
|
110
86
|
targetDir: () => join(homedir(), '.codex'),
|
|
111
87
|
mapDocs: (docs) => toCodexDocs(docs),
|
|
112
88
|
};
|
|
113
|
-
export const
|
|
114
|
-
|
|
115
|
-
|
|
89
|
+
export const opencodeTarget = {
|
|
90
|
+
id: 'opencode',
|
|
91
|
+
label: 'OpenCode (~/.config/opencode)',
|
|
92
|
+
surface: 'opencode',
|
|
93
|
+
targetDir: () => join(homedir(), '.config', 'opencode'),
|
|
94
|
+
mapDocs: (docs) => docs,
|
|
95
|
+
};
|
|
96
|
+
export const ALL_TARGETS = [opencodeTarget];
|
|
97
|
+
function opencodeConfigured() {
|
|
98
|
+
const path = join(homedir(), '.config', 'opencode', 'opencode.json');
|
|
116
99
|
if (!existsSync(path))
|
|
117
100
|
return false;
|
|
118
101
|
try {
|
|
119
102
|
const json = (readJson(path) ?? {});
|
|
120
|
-
return Boolean(json.
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
function codexConfigured() {
|
|
127
|
-
const path = join(homedir(), '.codex', 'config.toml');
|
|
128
|
-
if (!existsSync(path))
|
|
129
|
-
return false;
|
|
130
|
-
try {
|
|
131
|
-
const toml = (readToml(path) ?? {});
|
|
132
|
-
return Boolean(toml.mcp_servers?.[brand.mcpServerKey]);
|
|
103
|
+
return Boolean(json.mcp?.[brand.mcpServerKey]);
|
|
133
104
|
}
|
|
134
105
|
catch {
|
|
135
106
|
return false;
|
|
136
107
|
}
|
|
137
108
|
}
|
|
138
|
-
/**
|
|
139
|
-
* Alvos que já têm o servidor `nio` configurado (~/.claude/settings.json,
|
|
140
|
-
* ~/.codex/config.toml). Base do auto-detect de `sync`: provisiona pra cada
|
|
141
|
-
* cliente que o worker de fato usa, sem flags.
|
|
142
|
-
*/
|
|
143
109
|
export function detectConfiguredTargets() {
|
|
144
110
|
const targets = [];
|
|
145
|
-
if (
|
|
146
|
-
targets.push(
|
|
147
|
-
if (codexConfigured())
|
|
148
|
-
targets.push(codexTarget);
|
|
111
|
+
if (opencodeConfigured())
|
|
112
|
+
targets.push(opencodeTarget);
|
|
149
113
|
return targets;
|
|
150
114
|
}
|
|
151
115
|
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../../src/lib/clients/targets.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/colors.js
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import boxen from 'boxen';
|
|
3
3
|
import { envName } from '../brand.js';
|
|
4
|
-
/**
|
|
5
|
-
* Camada de estilo do CLI. `chalk` cuida de cor (respeita TTY / `NO_COLOR` /
|
|
6
|
-
* `FORCE_COLOR` sozinho) e `boxen` desenha caixas. Helpers extras: links
|
|
7
|
-
* clicáveis (OSC 8), régua, símbolos e realce de comandos.
|
|
8
|
-
*/
|
|
9
|
-
/** Paleta — `chalk` já é um objeto com `.bold/.dim/.cyan/...`, reexpomos como `c`. */
|
|
10
4
|
export const c = chalk;
|
|
11
|
-
/** Símbolos usados na saída (unicode). */
|
|
12
5
|
export const sym = {
|
|
13
6
|
ok: '✓',
|
|
14
7
|
err: '✗',
|
|
@@ -19,11 +12,9 @@ export const sym = {
|
|
|
19
12
|
warn: '⚠',
|
|
20
13
|
gear: '↻',
|
|
21
14
|
};
|
|
22
|
-
/** Comando destacado (ciano) — o realce padrão pra qualquer coisa executável. */
|
|
23
15
|
export function cmd(s) {
|
|
24
16
|
return chalk.cyan(s);
|
|
25
17
|
}
|
|
26
|
-
/** Selo com fundo colorido — estado bem visível ao lado de um título. */
|
|
27
18
|
export function badge(label, color = 'gray') {
|
|
28
19
|
const bg = {
|
|
29
20
|
green: chalk.bgGreen,
|
|
@@ -33,18 +24,12 @@ export function badge(label, color = 'gray') {
|
|
|
33
24
|
}[color];
|
|
34
25
|
return bg.black(` ${label} `);
|
|
35
26
|
}
|
|
36
|
-
/** Régua horizontal fina. */
|
|
37
27
|
export function rule(width = 58) {
|
|
38
28
|
return chalk.dim('─'.repeat(width));
|
|
39
29
|
}
|
|
40
|
-
/** Realça trechos `entre crases` como comandos (ciano) e remove as crases. */
|
|
41
30
|
export function highlightInlineCode(s) {
|
|
42
31
|
return s.replace(/`([^`]+)`/g, (_m, code) => chalk.cyan(code));
|
|
43
32
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Link clicável via OSC 8 (terminais modernos). Fora de TTY, cai pra
|
|
46
|
-
* `label (url)` em texto plano. Sublinhado em ciano pra parecer link.
|
|
47
|
-
*/
|
|
48
33
|
export function link(url, label = url) {
|
|
49
34
|
if (!process.stdout.isTTY)
|
|
50
35
|
return label === url ? url : `${label} (${url})`;
|
|
@@ -52,7 +37,6 @@ export function link(url, label = url) {
|
|
|
52
37
|
const BEL = '';
|
|
53
38
|
return `${OSC}${url}${BEL}${chalk.cyan.underline(label)}${OSC}${BEL}`;
|
|
54
39
|
}
|
|
55
|
-
/** Caixa (boxen) com defaults do nio; opções sobrescrevíveis. */
|
|
56
40
|
export function box(content, opts = {}) {
|
|
57
41
|
return boxen(content, {
|
|
58
42
|
padding: { top: 0, bottom: 0, left: 1, right: 1 },
|
|
@@ -62,7 +46,6 @@ export function box(content, opts = {}) {
|
|
|
62
46
|
...opts,
|
|
63
47
|
});
|
|
64
48
|
}
|
|
65
|
-
/** Indenta cada linha de um bloco multi-linha (ex.: pra alinhar uma caixa). */
|
|
66
49
|
export function indent(block, spaces = 2) {
|
|
67
50
|
const pad = ' '.repeat(spaces);
|
|
68
51
|
return block
|
|
@@ -70,22 +53,15 @@ export function indent(block, spaces = 2) {
|
|
|
70
53
|
.map((l) => (l.length ? pad + l : l))
|
|
71
54
|
.join('\n');
|
|
72
55
|
}
|
|
73
|
-
/** Título de seção proeminente: negrito + sublinhado, com subtítulo dim opcional. */
|
|
74
56
|
export function sectionTitle(title, subtitle) {
|
|
75
57
|
const head = chalk.bold.underline(title);
|
|
76
58
|
return subtitle ? `${head} ${chalk.dim(subtitle)}` : head;
|
|
77
59
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Limpa a **tela visível** e volta o cursor pro topo — sem apagar o histórico de
|
|
80
|
-
* rolagem (`\x1b[2J\x1b[H`, não `\x1b[3J`), então dá pra rolar pra cima e revisar.
|
|
81
|
-
* Só em TTY; desliga com a env `NO_CLEAR` prefixada da marca (ex.: `NIO_NO_CLEAR=1`).
|
|
82
|
-
*/
|
|
83
60
|
export function clearScreen() {
|
|
84
61
|
if (!process.stdout.isTTY || process.env[envName('NO_CLEAR')])
|
|
85
62
|
return;
|
|
86
63
|
process.stdout.write("\x1b[2J\x1b[H");
|
|
87
64
|
}
|
|
88
|
-
/** Começa uma seção "em tela nova": limpa (se TTY) e imprime o título. */
|
|
89
65
|
export function section(title, subtitle) {
|
|
90
66
|
clearScreen();
|
|
91
67
|
console.log(sectionTitle(title, subtitle));
|