@nio-cli/cli 0.1.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.
Files changed (196) hide show
  1. package/README.md +280 -0
  2. package/dist/adapters/supabase/allocation-gateway.js +236 -0
  3. package/dist/adapters/supabase/allocation-gateway.js.map +1 -0
  4. package/dist/adapters/supabase/analytics-gateway.js +18 -0
  5. package/dist/adapters/supabase/analytics-gateway.js.map +1 -0
  6. package/dist/adapters/supabase/client.js +96 -0
  7. package/dist/adapters/supabase/client.js.map +1 -0
  8. package/dist/adapters/supabase/context-gateway.js +23 -0
  9. package/dist/adapters/supabase/context-gateway.js.map +1 -0
  10. package/dist/adapters/supabase/gateway.js +18 -0
  11. package/dist/adapters/supabase/gateway.js.map +1 -0
  12. package/dist/adapters/supabase/task-gateway.js +450 -0
  13. package/dist/adapters/supabase/task-gateway.js.map +1 -0
  14. package/dist/auth.js +118 -0
  15. package/dist/auth.js.map +1 -0
  16. package/dist/brand.js +91 -0
  17. package/dist/brand.js.map +1 -0
  18. package/dist/cli/commands/auth.js +128 -0
  19. package/dist/cli/commands/auth.js.map +1 -0
  20. package/dist/cli/commands/clean.js +120 -0
  21. package/dist/cli/commands/clean.js.map +1 -0
  22. package/dist/cli/commands/completion.js +114 -0
  23. package/dist/cli/commands/completion.js.map +1 -0
  24. package/dist/cli/commands/exec.js +59 -0
  25. package/dist/cli/commands/exec.js.map +1 -0
  26. package/dist/cli/commands/init/auth-step.js +49 -0
  27. package/dist/cli/commands/init/auth-step.js.map +1 -0
  28. package/dist/cli/commands/init/clients-step.js +76 -0
  29. package/dist/cli/commands/init/clients-step.js.map +1 -0
  30. package/dist/cli/commands/init/context-step.js +71 -0
  31. package/dist/cli/commands/init/context-step.js.map +1 -0
  32. package/dist/cli/commands/init/index.js +76 -0
  33. package/dist/cli/commands/init/index.js.map +1 -0
  34. package/dist/cli/commands/init/project-step.js +105 -0
  35. package/dist/cli/commands/init/project-step.js.map +1 -0
  36. package/dist/cli/commands/init/provision-step.js +103 -0
  37. package/dist/cli/commands/init/provision-step.js.map +1 -0
  38. package/dist/cli/commands/plan.js +45 -0
  39. package/dist/cli/commands/plan.js.map +1 -0
  40. package/dist/cli/commands/skills.js +23 -0
  41. package/dist/cli/commands/skills.js.map +1 -0
  42. package/dist/cli/commands/sync.js +296 -0
  43. package/dist/cli/commands/sync.js.map +1 -0
  44. package/dist/cli/commands/validate-plan.js +42 -0
  45. package/dist/cli/commands/validate-plan.js.map +1 -0
  46. package/dist/cli/copy/auth.json +6 -0
  47. package/dist/cli/copy/flows.json +6 -0
  48. package/dist/cli/copy/init.json +19 -0
  49. package/dist/cli/copy/sync.json +3 -0
  50. package/dist/cli/copy.js +23 -0
  51. package/dist/cli/copy.js.map +1 -0
  52. package/dist/cli/flows/clients.js +130 -0
  53. package/dist/cli/flows/clients.js.map +1 -0
  54. package/dist/cli/flows/completion.js +63 -0
  55. package/dist/cli/flows/completion.js.map +1 -0
  56. package/dist/cli/flows/dependencies.js +114 -0
  57. package/dist/cli/flows/dependencies.js.map +1 -0
  58. package/dist/cli/flows/sections.js +85 -0
  59. package/dist/cli/flows/sections.js.map +1 -0
  60. package/dist/cli/flows/user-config.js +37 -0
  61. package/dist/cli/flows/user-config.js.map +1 -0
  62. package/dist/cli/ui/render.js +237 -0
  63. package/dist/cli/ui/render.js.map +1 -0
  64. package/dist/cli/ui/report.js +117 -0
  65. package/dist/cli/ui/report.js.map +1 -0
  66. package/dist/cli.js +36 -0
  67. package/dist/cli.js.map +1 -0
  68. package/dist/config.js +280 -0
  69. package/dist/config.js.map +1 -0
  70. package/dist/constants.js +9 -0
  71. package/dist/constants.js.map +1 -0
  72. package/dist/core/ports.js +2 -0
  73. package/dist/core/ports.js.map +1 -0
  74. package/dist/core/types.js +7 -0
  75. package/dist/core/types.js.map +1 -0
  76. package/dist/database.types.js +11 -0
  77. package/dist/database.types.js.map +1 -0
  78. package/dist/lib/active-project.js +28 -0
  79. package/dist/lib/active-project.js.map +1 -0
  80. package/dist/lib/autopull.js +13 -0
  81. package/dist/lib/autopull.js.map +1 -0
  82. package/dist/lib/client-configs.js +191 -0
  83. package/dist/lib/client-configs.js.map +1 -0
  84. package/dist/lib/client-install.js +40 -0
  85. package/dist/lib/client-install.js.map +1 -0
  86. package/dist/lib/colors.js +93 -0
  87. package/dist/lib/colors.js.map +1 -0
  88. package/dist/lib/cowork-extension.js +143 -0
  89. package/dist/lib/cowork-extension.js.map +1 -0
  90. package/dist/lib/dependencies.js +145 -0
  91. package/dist/lib/dependencies.js.map +1 -0
  92. package/dist/lib/dependency-install.js +163 -0
  93. package/dist/lib/dependency-install.js.map +1 -0
  94. package/dist/lib/duration.js +5 -0
  95. package/dist/lib/duration.js.map +1 -0
  96. package/dist/lib/exec-delegate.js +167 -0
  97. package/dist/lib/exec-delegate.js.map +1 -0
  98. package/dist/lib/exec-engines.js +72 -0
  99. package/dist/lib/exec-engines.js.map +1 -0
  100. package/dist/lib/file-merge.js +33 -0
  101. package/dist/lib/file-merge.js.map +1 -0
  102. package/dist/lib/harness.js +90 -0
  103. package/dist/lib/harness.js.map +1 -0
  104. package/dist/lib/hooks.js +217 -0
  105. package/dist/lib/hooks.js.map +1 -0
  106. package/dist/lib/patterns.js +61 -0
  107. package/dist/lib/patterns.js.map +1 -0
  108. package/dist/lib/plan-delegate.js +106 -0
  109. package/dist/lib/plan-delegate.js.map +1 -0
  110. package/dist/lib/project-context.js +151 -0
  111. package/dist/lib/project-context.js.map +1 -0
  112. package/dist/lib/prompts.js +69 -0
  113. package/dist/lib/prompts.js.map +1 -0
  114. package/dist/lib/provision-apply.js +220 -0
  115. package/dist/lib/provision-apply.js.map +1 -0
  116. package/dist/lib/provision-collect.js +47 -0
  117. package/dist/lib/provision-collect.js.map +1 -0
  118. package/dist/lib/provision.js +45 -0
  119. package/dist/lib/provision.js.map +1 -0
  120. package/dist/lib/require-config.js +32 -0
  121. package/dist/lib/require-config.js.map +1 -0
  122. package/dist/lib/rules.js +99 -0
  123. package/dist/lib/rules.js.map +1 -0
  124. package/dist/lib/sections.js +89 -0
  125. package/dist/lib/sections.js.map +1 -0
  126. package/dist/lib/skill-serve.js +129 -0
  127. package/dist/lib/skill-serve.js.map +1 -0
  128. package/dist/lib/skills-cache.js +99 -0
  129. package/dist/lib/skills-cache.js.map +1 -0
  130. package/dist/lib/skills.js +236 -0
  131. package/dist/lib/skills.js.map +1 -0
  132. package/dist/lib/targets.js +151 -0
  133. package/dist/lib/targets.js.map +1 -0
  134. package/dist/lib/task-history.js +15 -0
  135. package/dist/lib/task-history.js.map +1 -0
  136. package/dist/lib/telemetry.js +51 -0
  137. package/dist/lib/telemetry.js.map +1 -0
  138. package/dist/lib/tool-result.js +12 -0
  139. package/dist/lib/tool-result.js.map +1 -0
  140. package/dist/lib/validate-plan-delegate.js +107 -0
  141. package/dist/lib/validate-plan-delegate.js.map +1 -0
  142. package/dist/lib/version-check.js +89 -0
  143. package/dist/lib/version-check.js.map +1 -0
  144. package/dist/matrix-logo.js +122 -0
  145. package/dist/matrix-logo.js.map +1 -0
  146. package/dist/mcp-server.js +189 -0
  147. package/dist/mcp-server.js.map +1 -0
  148. package/dist/session-factory.js +19 -0
  149. package/dist/session-factory.js.map +1 -0
  150. package/dist/spinner.js +12 -0
  151. package/dist/spinner.js.map +1 -0
  152. package/dist/tools/comment-task.js +72 -0
  153. package/dist/tools/comment-task.js.map +1 -0
  154. package/dist/tools/create-task.js +129 -0
  155. package/dist/tools/create-task.js.map +1 -0
  156. package/dist/tools/delegate-exec.js +63 -0
  157. package/dist/tools/delegate-exec.js.map +1 -0
  158. package/dist/tools/end-allocation.js +38 -0
  159. package/dist/tools/end-allocation.js.map +1 -0
  160. package/dist/tools/end-task-allocation.js +37 -0
  161. package/dist/tools/end-task-allocation.js.map +1 -0
  162. package/dist/tools/exec-status.js +43 -0
  163. package/dist/tools/exec-status.js.map +1 -0
  164. package/dist/tools/get-active-allocation.js +69 -0
  165. package/dist/tools/get-active-allocation.js.map +1 -0
  166. package/dist/tools/get-context.js +48 -0
  167. package/dist/tools/get-context.js.map +1 -0
  168. package/dist/tools/get-task.js +137 -0
  169. package/dist/tools/get-task.js.map +1 -0
  170. package/dist/tools/index.js +44 -0
  171. package/dist/tools/index.js.map +1 -0
  172. package/dist/tools/list-my-allocations.js +71 -0
  173. package/dist/tools/list-my-allocations.js.map +1 -0
  174. package/dist/tools/list-projects.js +38 -0
  175. package/dist/tools/list-projects.js.map +1 -0
  176. package/dist/tools/list-tasks.js +93 -0
  177. package/dist/tools/list-tasks.js.map +1 -0
  178. package/dist/tools/move-task.js +82 -0
  179. package/dist/tools/move-task.js.map +1 -0
  180. package/dist/tools/plan.js +56 -0
  181. package/dist/tools/plan.js.map +1 -0
  182. package/dist/tools/record-delivery.js +71 -0
  183. package/dist/tools/record-delivery.js.map +1 -0
  184. package/dist/tools/set-project.js +52 -0
  185. package/dist/tools/set-project.js.map +1 -0
  186. package/dist/tools/start-allocation.js +32 -0
  187. package/dist/tools/start-allocation.js.map +1 -0
  188. package/dist/tools/start-task-allocation.js +75 -0
  189. package/dist/tools/start-task-allocation.js.map +1 -0
  190. package/dist/tools/update-task.js +139 -0
  191. package/dist/tools/update-task.js.map +1 -0
  192. package/dist/tools/validate-plan.js +58 -0
  193. package/dist/tools/validate-plan.js.map +1 -0
  194. package/dist/version.js +16 -0
  195. package/dist/version.js.map +1 -0
  196. package/package.json +64 -0
@@ -0,0 +1,191 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join, dirname } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { backupFile, readJson, writeJson, readToml, writeToml } from './file-merge.js';
6
+ import { brand, envName } from '../brand.js';
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
+ function readJsonSafe(path) {
13
+ try {
14
+ return readJson(path);
15
+ }
16
+ catch (err) {
17
+ throw new Error(`Arquivo ${path} contém JSON inválido (${err.message}). ` +
18
+ `Conserte ou apague antes de rodar de novo.`);
19
+ }
20
+ }
21
+ function ensureMcpServersJson(path, rootKey) {
22
+ if (!existsSync(path)) {
23
+ writeJson(path, { [rootKey]: { [brand.mcpServerKey]: { command: MCP_COMMAND } } });
24
+ return { status: 'created', path };
25
+ }
26
+ const existing = (readJsonSafe(path) ?? {});
27
+ const root = (existing[rootKey] ?? {});
28
+ const current = root[brand.mcpServerKey];
29
+ if (current && current.command === MCP_COMMAND) {
30
+ return { status: 'already_configured', path };
31
+ }
32
+ const backup = backupFile(path);
33
+ const next = {
34
+ ...existing,
35
+ [rootKey]: {
36
+ ...root,
37
+ [brand.mcpServerKey]: { command: MCP_COMMAND },
38
+ },
39
+ };
40
+ writeJson(path, next);
41
+ return { status: 'updated', path, backup };
42
+ }
43
+ export function installClaudeCodeGlobal() {
44
+ const path = join(homedir(), '.claude', 'settings.json');
45
+ return ensureMcpServersJson(path, 'mcpServers');
46
+ }
47
+ export function installClaudeCodeRepo(cwd) {
48
+ const path = join(cwd, '.mcp.json');
49
+ return ensureMcpServersJson(path, 'mcpServers');
50
+ }
51
+ export function installVSCodeRepo(cwd) {
52
+ const path = join(cwd, '.vscode', 'mcp.json');
53
+ return ensureMcpServersJson(path, 'servers');
54
+ }
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
+ export function coworkConfigDir() {
60
+ if (process.platform === 'darwin') {
61
+ return join(homedir(), 'Library', 'Application Support', 'Claude');
62
+ }
63
+ if (process.platform === 'win32') {
64
+ return join(process.env.APPDATA ?? join(homedir(), 'AppData', 'Roaming'), 'Claude');
65
+ }
66
+ return join(homedir(), '.config', 'Claude');
67
+ }
68
+ export function coworkConfigPath() {
69
+ return join(coworkConfigDir(), 'claude_desktop_config.json');
70
+ }
71
+ /** O app está instalado? Presença do dir de config é o sinal (o app o cria). */
72
+ export function coworkAppInstalled() {
73
+ return existsSync(coworkConfigDir());
74
+ }
75
+ /** O conector nio já está no `claude_desktop_config.json`? */
76
+ export function coworkConfigured() {
77
+ const path = coworkConfigPath();
78
+ if (!existsSync(path))
79
+ return false;
80
+ try {
81
+ const json = (readJsonSafe(path) ?? {});
82
+ return Boolean(json.mcpServers?.[brand.mcpServerKey]);
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ /** Path absoluto do `dist/mcp-server.js` deste pacote (compila pra `dist/lib/`). */
89
+ function mcpServerJsPath() {
90
+ const here = dirname(fileURLToPath(import.meta.url)); // .../dist/lib
91
+ return join(here, '..', 'mcp-server.js'); // .../dist/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
+ */
102
+ export function installCoworkGlobal() {
103
+ const path = coworkConfigPath();
104
+ const entry = {
105
+ command: process.execPath,
106
+ args: [mcpServerJsPath()],
107
+ env: { [envName('CLIENT')]: 'cowork' },
108
+ };
109
+ if (!existsSync(path)) {
110
+ writeJson(path, { mcpServers: { [brand.mcpServerKey]: entry } });
111
+ return { status: 'created', path };
112
+ }
113
+ const existing = (readJsonSafe(path) ?? {});
114
+ const root = (existing.mcpServers ?? {});
115
+ const current = root[brand.mcpServerKey];
116
+ if (current &&
117
+ current.command === entry.command &&
118
+ current.args?.[0] === entry.args?.[0] &&
119
+ current.env?.[envName('CLIENT')] === 'cowork') {
120
+ return { status: 'already_configured', path };
121
+ }
122
+ const backup = backupFile(path);
123
+ writeJson(path, { ...existing, mcpServers: { ...root, [brand.mcpServerKey]: entry } });
124
+ return { status: 'updated', path, backup };
125
+ }
126
+ function claudeSettingsPath() {
127
+ return join(homedir(), '.claude', 'settings.json');
128
+ }
129
+ export function readCoAuthoredBy(path = claudeSettingsPath()) {
130
+ if (!existsSync(path))
131
+ return { path, value: undefined, enabled: true };
132
+ const json = (readJsonSafe(path) ?? {});
133
+ const value = json.includeCoAuthoredBy;
134
+ return { path, value, enabled: value !== false };
135
+ }
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
+ export function disableCoAuthoredBy(path = claudeSettingsPath()) {
139
+ const exists = existsSync(path);
140
+ const existing = exists ? (readJsonSafe(path) ?? {}) : {};
141
+ const backup = exists ? backupFile(path) : undefined;
142
+ writeJson(path, { ...existing, includeCoAuthoredBy: false });
143
+ return { status: exists ? 'updated' : 'created', path, backup };
144
+ }
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
+ export function planCodexUpdate(existing, nioEntry) {
151
+ const servers = (existing.mcp_servers ?? {});
152
+ const current = servers[brand.mcpServerKey];
153
+ const alreadyConfigured = Boolean(current && current.command === MCP_COMMAND && current.env?.[envName('CLIENT')] === 'codex');
154
+ const next = {
155
+ ...existing,
156
+ mcp_servers: {
157
+ ...servers,
158
+ [brand.mcpServerKey]: {
159
+ ...current,
160
+ ...nioEntry,
161
+ env: { ...current?.env, [envName('CLIENT')]: 'codex' },
162
+ },
163
+ },
164
+ };
165
+ return { alreadyConfigured, next };
166
+ }
167
+ export function installCodexGlobal() {
168
+ 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
+ const nioEntry = { command: MCP_COMMAND, env: { [envName('CLIENT')]: 'codex' } };
172
+ if (!existsSync(path)) {
173
+ writeToml(path, { mcp_servers: { [brand.mcpServerKey]: nioEntry } });
174
+ return { status: 'created', path };
175
+ }
176
+ let existing;
177
+ try {
178
+ existing = (readToml(path) ?? {});
179
+ }
180
+ catch (err) {
181
+ throw new Error(`Arquivo ${path} contém TOML inválido (${err.message}). ` +
182
+ `Conserte ou apague antes de rodar de novo.`);
183
+ }
184
+ const { alreadyConfigured, next } = planCodexUpdate(existing, nioEntry);
185
+ if (alreadyConfigured)
186
+ return { status: 'already_configured', path };
187
+ const backup = backupFile(path);
188
+ writeToml(path, next);
189
+ return { status: 'updated', path, backup };
190
+ }
191
+ //# sourceMappingURL=client-configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-configs.js","sourceRoot":"","sources":["../../src/lib/client-configs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ export const CLIENTS = {
3
+ 'claude-code': {
4
+ id: 'claude-code',
5
+ label: 'Claude Code',
6
+ binary: 'claude',
7
+ npm: '@anthropic-ai/claude-code',
8
+ url: 'https://code.claude.com/docs/en/setup',
9
+ },
10
+ codex: {
11
+ id: 'codex',
12
+ label: 'Codex CLI',
13
+ binary: 'codex',
14
+ npm: '@openai/codex',
15
+ url: 'https://developers.openai.com/codex/cli',
16
+ },
17
+ vscode: {
18
+ id: 'vscode',
19
+ label: 'VS Code',
20
+ binary: 'code',
21
+ url: 'https://code.visualstudio.com/download',
22
+ },
23
+ cowork: {
24
+ id: 'cowork',
25
+ label: 'Claude Desktop (Cowork)',
26
+ url: 'https://claude.ai/download',
27
+ },
28
+ };
29
+ /** Detecta se um binário existe no PATH (roda `<bin> --version`). */
30
+ export function isBinaryInstalled(binary) {
31
+ try {
32
+ const res = spawnSync(binary, ['--version'], { stdio: 'ignore', timeout: 5000 });
33
+ // ENOENT → não está no PATH. Qualquer exit code (mesmo != 0) = existe.
34
+ return !res.error;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ //# sourceMappingURL=client-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-install.js","sourceRoot":"","sources":["../../src/lib/client-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAiB/C,MAAM,CAAC,MAAM,OAAO,GAA+B;IACjD,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,2BAA2B;QAChC,GAAG,EAAE,uCAAuC;KAC7C;IACD,KAAK,EAAE;QACL,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,OAAO;QACf,GAAG,EAAE,eAAe;QACpB,GAAG,EAAE,yCAAyC;KAC/C;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,wCAAwC;KAC9C;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,yBAAyB;QAChC,GAAG,EAAE,4BAA4B;KAClC;CACF,CAAC;AAEF,qEAAqE;AACrE,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;QACjF,uEAAuE;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,93 @@
1
+ import chalk from 'chalk';
2
+ import boxen from 'boxen';
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
+ export const c = chalk;
11
+ /** Símbolos usados na saída (unicode). */
12
+ export const sym = {
13
+ ok: '✓',
14
+ err: '✗',
15
+ dot: '●',
16
+ arrow: '→',
17
+ chevron: '›',
18
+ bullet: '·',
19
+ warn: '⚠',
20
+ gear: '↻',
21
+ };
22
+ /** Comando destacado (ciano) — o realce padrão pra qualquer coisa executável. */
23
+ export function cmd(s) {
24
+ return chalk.cyan(s);
25
+ }
26
+ /** Selo com fundo colorido — estado bem visível ao lado de um título. */
27
+ export function badge(label, color = 'gray') {
28
+ const bg = {
29
+ green: chalk.bgGreen,
30
+ yellow: chalk.bgYellow,
31
+ gray: chalk.bgGray,
32
+ cyan: chalk.bgCyan,
33
+ }[color];
34
+ return bg.black(` ${label} `);
35
+ }
36
+ /** Régua horizontal fina. */
37
+ export function rule(width = 58) {
38
+ return chalk.dim('─'.repeat(width));
39
+ }
40
+ /** Realça trechos `entre crases` como comandos (ciano) e remove as crases. */
41
+ export function highlightInlineCode(s) {
42
+ return s.replace(/`([^`]+)`/g, (_m, code) => chalk.cyan(code));
43
+ }
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
+ export function link(url, label = url) {
49
+ if (!process.stdout.isTTY)
50
+ return label === url ? url : `${label} (${url})`;
51
+ const OSC = ']8;;';
52
+ const BEL = '';
53
+ return `${OSC}${url}${BEL}${chalk.cyan.underline(label)}${OSC}${BEL}`;
54
+ }
55
+ /** Caixa (boxen) com defaults do nio; opções sobrescrevíveis. */
56
+ export function box(content, opts = {}) {
57
+ return boxen(content, {
58
+ padding: { top: 0, bottom: 0, left: 1, right: 1 },
59
+ borderStyle: 'round',
60
+ borderColor: 'gray',
61
+ dimBorder: true,
62
+ ...opts,
63
+ });
64
+ }
65
+ /** Indenta cada linha de um bloco multi-linha (ex.: pra alinhar uma caixa). */
66
+ export function indent(block, spaces = 2) {
67
+ const pad = ' '.repeat(spaces);
68
+ return block
69
+ .split('\n')
70
+ .map((l) => (l.length ? pad + l : l))
71
+ .join('\n');
72
+ }
73
+ /** Título de seção proeminente: negrito + sublinhado, com subtítulo dim opcional. */
74
+ export function sectionTitle(title, subtitle) {
75
+ const head = chalk.bold.underline(title);
76
+ return subtitle ? `${head} ${chalk.dim(subtitle)}` : head;
77
+ }
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
+ export function clearScreen() {
84
+ if (!process.stdout.isTTY || process.env[envName('NO_CLEAR')])
85
+ return;
86
+ process.stdout.write("\x1b[2J\x1b[H");
87
+ }
88
+ /** Começa uma seção "em tela nova": limpa (se TTY) e imprime o título. */
89
+ export function section(title, subtitle) {
90
+ clearScreen();
91
+ console.log(sectionTitle(title, subtitle));
92
+ }
93
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/lib/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import AdmZip from "adm-zip";
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { spawn } from "node:child_process";
7
+ import { VERSION } from "../version.js";
8
+ import { toolDefinitions } from "../tools/index.js";
9
+ import { brand, envName } from "../brand.js";
10
+ /**
11
+ * Raiz do pacote instalado (onde ficam `dist/` e `node_modules/`).
12
+ * Este módulo compila para dist/lib/cowork-extension.js, então sobe dois níveis.
13
+ */
14
+ function packageRoot() {
15
+ const here = dirname(fileURLToPath(import.meta.url)); // .../dist/lib
16
+ return join(here, "..", "..");
17
+ }
18
+ /** Nome + descrição normalizada (espaços colapsados, até 160 chars — limite do MCPB). */
19
+ function mapCoworkTools(tools) {
20
+ return tools.map((t) => ({
21
+ name: t.name,
22
+ description: (t.description ?? "")
23
+ .replace(/\s+/g, " ")
24
+ .trim()
25
+ .slice(0, 160),
26
+ }));
27
+ }
28
+ /** Bloco `server` do manifest: como o Claude Desktop sobe o servidor MCP do nio. */
29
+ function buildCoworkServerConfig() {
30
+ return {
31
+ type: "node",
32
+ entry_point: "dist/mcp-server.js",
33
+ mcp_config: {
34
+ command: "node",
35
+ args: ["${__dirname}/dist/mcp-server.js"],
36
+ env: {
37
+ [envName('PAT')]: '${user_config.pat}',
38
+ [envName('PROJECT_ID')]: '${user_config.project_id}',
39
+ [envName('REPOSITORY_ID')]: '${user_config.repository_id}',
40
+ // Cowork ignora ~/.claude → o servidor pula o auto-pull e entrega as skills
41
+ // por resources + prompts.
42
+ [envName('CLIENT')]: 'cowork',
43
+ },
44
+ },
45
+ };
46
+ }
47
+ /** Bloco `user_config` do manifest: campos que o app pede na instalação (o PAT). */
48
+ function buildCoworkUserConfig() {
49
+ return {
50
+ pat: {
51
+ type: "string",
52
+ title: "NOS Personal Access Token (PAT)",
53
+ description: `PAT do ${brand.productName} (formato ${brand.patPrefix}…). O projeto é escolhido por sessão com as tools ${brand.toolPrefix}list_projects / ${brand.toolPrefix}set_project — não há nada de projeto para configurar aqui.`,
54
+ sensitive: true,
55
+ required: true,
56
+ },
57
+ };
58
+ }
59
+ /** Gera o objeto manifest.json (spec MCPB) para a versão atual. */
60
+ export function buildCoworkManifest() {
61
+ return {
62
+ manifest_version: "0.2",
63
+ name: brand.mcpBinName,
64
+ display_name: `${brand.name} (${brand.productName})`,
65
+ version: VERSION,
66
+ description: "MCP server pra controlar o NOS — tarefas, kanban e ponto/cronometragem — a partir do Claude Desktop / Cowork.",
67
+ long_description: `Servidor MCP do NOS. Permite ao assistente ler o contexto do projeto, listar/criar/atualizar/mover/comentar tarefas e gerenciar alocações (bater ponto e cronometrar tempo por task). A autenticação usa um PAT do NOS, fornecido via configuração da extensão (${envName('PAT')}).`,
68
+ author: { name: brand.company, url: `https://github.com/${brand.githubOrg}` },
69
+ homepage: `https://github.com/${brand.githubOrg}/${brand.githubRepo}#readme`,
70
+ documentation: `https://github.com/${brand.githubOrg}/${brand.githubRepo}#readme`,
71
+ support: `https://github.com/${brand.githubOrg}/${brand.githubRepo}/issues`,
72
+ keywords: ["mcp", "nio", "nos", "tasks", "kanban", "time-tracking"],
73
+ server: buildCoworkServerConfig(),
74
+ user_config: buildCoworkUserConfig(),
75
+ tools: mapCoworkTools(toolDefinitions),
76
+ compatibility: {
77
+ platforms: ["darwin", "win32", "linux"],
78
+ runtimes: { node: ">=20.0.0" },
79
+ },
80
+ };
81
+ }
82
+ /**
83
+ * Adiciona recursivamente os arquivos de `localDir` ao zip sob `zipPrefix`,
84
+ * usando separadores POSIX e sem criar entradas de diretório. Pula source maps.
85
+ */
86
+ function addFilesRecursively(zip, localDir, zipPrefix) {
87
+ for (const entry of readdirSync(localDir, { withFileTypes: true })) {
88
+ const localPath = join(localDir, entry.name);
89
+ const zipPath = `${zipPrefix}/${entry.name}`;
90
+ if (entry.isDirectory()) {
91
+ addFilesRecursively(zip, localPath, zipPath);
92
+ }
93
+ else if (entry.isFile() && !entry.name.endsWith(".map")) {
94
+ zip.addFile(zipPath, readFileSync(localPath));
95
+ }
96
+ }
97
+ }
98
+ /** Pasta de destino do .mcpb: ~/Downloads se existir, senão o home. */
99
+ function defaultOutputDir() {
100
+ const downloads = join(homedir(), "Downloads");
101
+ return existsSync(downloads) ? downloads : homedir();
102
+ }
103
+ /**
104
+ * Gera o pacote .mcpb (manifest + dist + node_modules) a partir da instalação atual.
105
+ * Source maps são omitidos pra reduzir o tamanho.
106
+ */
107
+ export function generateCoworkExtension(outputDir = defaultOutputDir()) {
108
+ const root = packageRoot();
109
+ const distDir = join(root, "dist");
110
+ const nodeModulesDir = join(root, "node_modules");
111
+ if (!existsSync(distDir)) {
112
+ throw new Error(`Não encontrei dist/ em ${root}. Reinstale o pacote (npm i -g ${brand.packageName}).`);
113
+ }
114
+ const manifest = buildCoworkManifest();
115
+ const zip = new AdmZip();
116
+ zip.addFile("manifest.json", Buffer.from(JSON.stringify(manifest, null, 2) + "\n", "utf8"));
117
+ // Adiciona só arquivos (sem entradas de diretório), como o `mcpb pack` faz —
118
+ // entradas de pasta quebram o instalador do MCPB. Source maps são omitidos.
119
+ addFilesRecursively(zip, distDir, "dist");
120
+ if (existsSync(nodeModulesDir)) {
121
+ addFilesRecursively(zip, nodeModulesDir, "node_modules");
122
+ }
123
+ const outputPath = join(outputDir, `${brand.mcpBinName}-${VERSION}.mcpb`);
124
+ zip.writeZip(outputPath);
125
+ return { outputPath };
126
+ }
127
+ /** Abre a pasta no explorador de arquivos do SO (best-effort, ignora falhas). */
128
+ export function revealInFileManager(target) {
129
+ const cmd = process.platform === "darwin"
130
+ ? "open"
131
+ : process.platform === "win32"
132
+ ? "explorer"
133
+ : "xdg-open";
134
+ try {
135
+ const child = spawn(cmd, [target], { stdio: "ignore", detached: true });
136
+ child.on("error", () => { });
137
+ child.unref();
138
+ }
139
+ catch {
140
+ // sem file manager disponível — ignora
141
+ }
142
+ }
143
+ //# sourceMappingURL=cowork-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cowork-extension.js","sourceRoot":"","sources":["../../src/lib/cowork-extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { join } from 'node:path';
2
+ import { homePath } from '../brand.js';
3
+ /**
4
+ * Resolve dependências (docs `dependency`) num plano; o IO vive em `dependency-install.ts`
5
+ * (reexportado abaixo). SEGURANÇA: nunca executamos `install:` (só exibição) — lemos campos
6
+ * allowlisted (`npm:`/`skills:`/`git:`), validados por regex, e rodamos via `spawnSync` sem shell.
7
+ */
8
+ /** Nome de pacote npm (com escopo opcional). Sem espaços/metacaracteres de shell. */
9
+ const NPM_NAME_RE = /^(?:@[a-z0-9-][a-z0-9-._]*\/)?[a-z0-9-][a-z0-9-._]*$/i;
10
+ /** Só clones https do GitHub. */
11
+ const GIT_URL_RE = /^https:\/\/github\.com\/[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+(?:\.git)?$/;
12
+ /** Slug pro `npx skills add`: `owner/repo` ou `owner/repo/skill` (skill específica). */
13
+ const SKILLS_REPO_RE = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)?$/;
14
+ /** Id de plugin do Claude Code: `plugin@marketplace`. */
15
+ const PLUGIN_ID_RE = /^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+$/;
16
+ /** Onde clonamos deps do tipo `git` (`~/.nio/deps/<id>`). */
17
+ function depsDir() {
18
+ return homePath('deps');
19
+ }
20
+ /** Plano `skills` (skills.sh) a partir de um slug validado, ou `null` se inválido. */
21
+ export function skillsInstallPlan(slug) {
22
+ const s = slug.trim();
23
+ if (!SKILLS_REPO_RE.test(s))
24
+ return null;
25
+ return {
26
+ kind: 'skills',
27
+ repo: s,
28
+ program: 'npx',
29
+ args: ['--yes', 'skills', 'add', s],
30
+ command: `npx --yes skills add ${s}`,
31
+ };
32
+ }
33
+ function resolveNpmPlan(npm) {
34
+ if (!NPM_NAME_RE.test(npm))
35
+ return { plan: null, reason: `nome de pacote npm inválido: "${npm}"` };
36
+ return {
37
+ plan: { kind: 'npm', pkg: npm, program: 'npm', args: ['install', '-g', npm], command: `npm install -g ${npm}` },
38
+ };
39
+ }
40
+ // `owner/repo/skill` → instala o skill específico com `--skill` (senão o
41
+ // `skills add` clona o monorepo inteiro e não acha o SKILL.md).
42
+ function resolveSkillsPlan(skills) {
43
+ if (!SKILLS_REPO_RE.test(skills)) {
44
+ return { plan: null, reason: `repo de skills inválido (owner/repo[/skill]): "${skills}"` };
45
+ }
46
+ const segs = skills.split('/');
47
+ const repoSlug = segs.slice(0, 2).join('/');
48
+ const skillName = segs.length >= 3 ? segs.slice(2).join('/') : null;
49
+ const args = skillName
50
+ ? ['--yes', 'skills', 'add', repoSlug, '--skill', skillName]
51
+ : ['--yes', 'skills', 'add', repoSlug];
52
+ return { plan: { kind: 'skills', repo: skills, program: 'npx', args, command: `npx ${args.join(' ')}` } };
53
+ }
54
+ function resolveGitPlan(git, id) {
55
+ if (!GIT_URL_RE.test(git)) {
56
+ return { plan: null, reason: `URL git não permitida (só https://github.com/…): "${git}"` };
57
+ }
58
+ const dest = join(depsDir(), id);
59
+ return {
60
+ plan: {
61
+ kind: 'git',
62
+ url: git,
63
+ dest,
64
+ program: 'git',
65
+ args: ['clone', '--depth', '1', git, dest],
66
+ command: `git clone --depth 1 ${git} ${dest}`,
67
+ },
68
+ };
69
+ }
70
+ // Plugin do Claude Code: `claude-plugin: <owner/repo> <plugin@marketplace>`.
71
+ function resolveClaudePluginPlan(claudePlugin) {
72
+ const [marketplace, plugin] = claudePlugin.split(/\s+/);
73
+ if (marketplace && plugin && SKILLS_REPO_RE.test(marketplace) && PLUGIN_ID_RE.test(plugin)) {
74
+ return {
75
+ plan: {
76
+ kind: 'claude-plugin',
77
+ marketplace,
78
+ plugin,
79
+ steps: [
80
+ { program: 'claude', args: ['plugin', 'marketplace', 'add', marketplace] },
81
+ { program: 'claude', args: ['plugin', 'install', plugin] },
82
+ ],
83
+ command: `claude plugin marketplace add ${marketplace} && claude plugin install ${plugin}`,
84
+ },
85
+ };
86
+ }
87
+ return {
88
+ plan: null,
89
+ reason: `claude-plugin inválido (esperado "<owner/repo> <plugin@marketplace>"): "${claudePlugin}"`,
90
+ };
91
+ }
92
+ function applyPlanResult(base, r) {
93
+ return r.plan ? { ...base, plan: r.plan } : { ...base, reason: r.reason };
94
+ }
95
+ /**
96
+ * Resolve um doc `dependency` num plano de instalação a partir de campos
97
+ * estruturados. Precedência: `npm:` > `skills:` > `git:`. Sem campo válido → `plan: null`.
98
+ * Passos manuais ficam disponíveis mesmo com plano automatizável (ex.: um plugin
99
+ * `claude-plugin` que o Claude Code instala sozinho mas o Codex/Desktop não); sem
100
+ * nenhum instalador automatizável, cai pra instrução manual (plugin/marketplace/UI).
101
+ */
102
+ export function resolveDependency(node) {
103
+ const fm = node.frontmatter;
104
+ const base = {
105
+ id: node.id,
106
+ title: node.title,
107
+ description: node.description || fm.description || undefined,
108
+ repo: fm.repo || fm.homepage || undefined,
109
+ displayInstall: fm.install || undefined,
110
+ detect: parseDetect(fm.detect),
111
+ manual: fm.manual?.trim() || undefined,
112
+ plan: null,
113
+ };
114
+ const npm = fm.npm?.trim();
115
+ if (npm)
116
+ return applyPlanResult(base, resolveNpmPlan(npm));
117
+ const skills = fm.skills?.trim();
118
+ if (skills)
119
+ return applyPlanResult(base, resolveSkillsPlan(skills));
120
+ const git = fm.git?.trim();
121
+ if (git)
122
+ return applyPlanResult(base, resolveGitPlan(git, node.id));
123
+ const claudePlugin = fm['claude-plugin']?.trim();
124
+ if (claudePlugin)
125
+ return applyPlanResult(base, resolveClaudePluginPlan(claudePlugin));
126
+ const manual = fm.manual?.trim();
127
+ if (manual)
128
+ return { ...base, manual, reason: 'instalação manual' };
129
+ return { ...base, reason: 'sem instalador estruturado (npm:/skills:/git:/manual:) — instale manualmente' };
130
+ }
131
+ /** `detect:` cru → lista de globs (separados por vírgula/quebra de linha). */
132
+ function parseDetect(value) {
133
+ if (!value)
134
+ return undefined;
135
+ const list = value
136
+ .split(/[\n,]+/)
137
+ .map((s) => s.trim())
138
+ .filter(Boolean);
139
+ return list.length ? list : undefined;
140
+ }
141
+ // Checagem de "já instalado", execução do plano e o marcador de instalações são
142
+ // IO puro — vivem em `dependency-install.ts`. Reexportado daqui pra manter o
143
+ // import único (`from '../lib/dependencies.js'`) pro resto da CLI.
144
+ export { recordDependencyInstalled, isDependencyInstalled, runDependencyInstall, } from './dependency-install.js';
145
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/lib/dependencies.ts"],"names":[],"mappings":"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"}