@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 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/lib/targets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { brand } from '../brand.js';
2
+ export async function insertTaskHistory(supabase, entry) {
3
+ const { error } = await supabase.from('task_history').insert({
4
+ task_id: entry.task_id,
5
+ user_id: entry.user_id,
6
+ action: entry.action,
7
+ field: entry.field ?? null,
8
+ old_value: entry.old_value ?? null,
9
+ new_value: entry.new_value ?? null,
10
+ });
11
+ if (error) {
12
+ console.error(`[${brand.mcpBinName}] falha ao gravar task_history: ${error.message}`);
13
+ }
14
+ }
15
+ //# sourceMappingURL=task-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-history.js","sourceRoot":"","sources":["../../src/lib/task-history.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAWpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAkB,EAClB,KAAmB;IAEnB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;QAC3D,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;KACnC,CAAC,CAAC;IACH,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { env } from "../brand.js";
2
+ function enabled() {
3
+ return env("TELEMETRY") !== "0" && !env("NO_TELEMETRY");
4
+ }
5
+ /**
6
+ * Items (skills/commands/agents) provisionados a partir do plano do `provision`,
7
+ * já resolvidos pro id sequencial estável (via `uidByName`).
8
+ */
9
+ export function provisionedItems(files, uidByName) {
10
+ const seen = new Set();
11
+ const items = [];
12
+ for (const f of files) {
13
+ const m = /^skills\/([^/]+)\/SKILL\.md$/.exec(f.relPath) ??
14
+ /^commands\/([^/]+)\.md$/.exec(f.relPath) ??
15
+ /^agents\/([^/]+)\.md$/.exec(f.relPath);
16
+ if (m && !seen.has(m[1])) {
17
+ seen.add(m[1]);
18
+ items.push({ name: m[1], id: uidByName.get(m[1]) ?? null });
19
+ }
20
+ }
21
+ return items.sort((a, b) => a.name.localeCompare(b.name));
22
+ }
23
+ // Requisições em voo — o CLI é curto e pode encerrar antes do POST completar,
24
+ // então guardamos as promises pra dar flush (`flushTelemetry`) antes de sair.
25
+ const pending = [];
26
+ /** Envia um evento de uso pro NOS. Best-effort, nunca lança. */
27
+ export function track(supabase, event) {
28
+ if (!supabase || !enabled())
29
+ return;
30
+ const p = supabase.functions
31
+ .invoke("track-usage", { body: { ...event, at: new Date().toISOString() } })
32
+ .then(() => undefined)
33
+ .catch(() => {
34
+ /* telemetria nunca quebra o fluxo */
35
+ });
36
+ pending.push(p);
37
+ }
38
+ /**
39
+ * Espera as requisições de telemetria em voo (com teto de tempo) antes do CLI sair.
40
+ * No servidor MCP (long-lived) não é necessário — o loop já mantém o processo vivo.
41
+ */
42
+ export async function flushTelemetry(timeoutMs = 4000) {
43
+ if (pending.length === 0)
44
+ return;
45
+ const inflight = Promise.allSettled(pending.splice(0));
46
+ await Promise.race([
47
+ inflight,
48
+ new Promise((resolve) => setTimeout(resolve, timeoutMs)),
49
+ ]);
50
+ }
51
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/lib/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAgClC,SAAS,OAAO;IACd,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAA4B,EAC5B,SAAqC;IAErC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GACL,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9C,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACzC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,MAAM,OAAO,GAAuB,EAAE,CAAC;AAEvC,gEAAgE;AAChE,MAAM,UAAU,KAAK,CAAC,QAAyB,EAAE,KAAiB;IAChE,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO;IACpC,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS;SACzB,MAAM,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;SAC3E,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;SACrB,KAAK,CAAC,GAAG,EAAE;QACV,qCAAqC;IACvC,CAAC,CAAC,CAAC;IACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAS,GAAG,IAAI;IACnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,CAAC,IAAI,CAAC;QACjB,QAAQ;QACR,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;KAC/D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ export function jsonResult(data) {
2
+ return {
3
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
4
+ };
5
+ }
6
+ export function errorResult(message) {
7
+ return {
8
+ content: [{ type: 'text', text: message }],
9
+ isError: true,
10
+ };
11
+ }
12
+ //# sourceMappingURL=tool-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result.js","sourceRoot":"","sources":["../../src/lib/tool-result.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { brand } from '../brand.js';
3
+ import { readFileSync } from 'node:fs';
4
+ import { planPath, stripFence } from './plan-delegate.js';
5
+ import { PLAN_ENGINE, engineArgs, engineMissingError, resolveEngineBin, } from './exec-engines.js';
6
+ import { HARNESS_RULES_REL } from './harness.js';
7
+ const SLUG_MAX = 50;
8
+ const SLUG_FALLBACK = 'plan';
9
+ /** Slug git-safe do título do plano p/ o Studio nomear o worktree; degenerado → fallback. Puro. */
10
+ export function suggestSlug(plan) {
11
+ const heading = /^#{1,6}\s+(.+?)\s*$/m.exec(plan)?.[1];
12
+ const title = (heading ?? plan.split('\n').find((l) => l.trim()) ?? '').trim();
13
+ const slug = title
14
+ .normalize('NFD')
15
+ .replace(/\p{Diacritic}/gu, '')
16
+ .toLowerCase()
17
+ .replace(/[^a-z0-9]+/g, '-')
18
+ .replace(/^-+|-+$/g, '')
19
+ .slice(0, SLUG_MAX)
20
+ .replace(/-+$/g, '');
21
+ return slug || SLUG_FALLBACK;
22
+ }
23
+ export function planMissingError(project) {
24
+ return `plan.md não encontrado em ${project} — rode \`${brand.name} plan\` antes de validar`;
25
+ }
26
+ /** Lê o `plan.md` da raiz; ausente/vazio dispara — o caller vira em erro tratado. */
27
+ export function readPlan(project) {
28
+ const content = readFileSync(planPath(project), 'utf8');
29
+ if (!content.trim())
30
+ throw new Error('plan.md vazio');
31
+ return content;
32
+ }
33
+ /** Preâmbulo de triagem: ancora no harness e pede veredito + justificativa parseáveis. */
34
+ export function buildValidatePrompt(plan) {
35
+ return [
36
+ 'Você está TRIANDO um plano — não implemente nada, não escreva código, não edite arquivos.',
37
+ `Antes: leia AGENTS.md e ${HARNESS_RULES_REL} deste projeto e respeite o harness.`,
38
+ 'Julgue a COMPLEXIDADE do plano frente ao IMPACTO REAL no código deste repositório:',
39
+ 'plano amplo/abrangente (muitos módulos, decisões de arquitetura, risco) MERECE uma spec SDD antes;',
40
+ 'plano pequeno/localizado pode ir direto para a implementação.',
41
+ 'Responda APENAS neste formato, sem cercas de código:',
42
+ 'VERDICT: yes|no',
43
+ 'REASON: <uma ou duas frases legíveis explicando o porquê>',
44
+ 'yes = precisa de spec antes; no = pode implementar direto.',
45
+ '',
46
+ '## Plano (plan.md)',
47
+ plan,
48
+ ].join('\n');
49
+ }
50
+ /** Normaliza a resposta do engine em `{ needsSpec, reason }`; ambíguo → dispara. */
51
+ export function parseVerdict(text) {
52
+ const clean = stripFence(text);
53
+ const m = /^[ \t]*VERDICT:[ \t]*(yes|no)\b[ \t]*(.*)$/im.exec(clean);
54
+ if (!m)
55
+ throw new Error('veredito ambíguo: falta a linha `VERDICT: yes|no`');
56
+ const needsSpec = m[1].toLowerCase() === 'yes';
57
+ const rest = clean.replace(m[0], '').trim();
58
+ const reason = (rest || m[2].trim())
59
+ .replace(/^[ \t]*REASON:[ \t]*/i, '')
60
+ .replace(/^[\s—:-]+/, '')
61
+ .trim();
62
+ if (!reason)
63
+ throw new Error('veredito ambíguo: sem justificativa (reason vazio)');
64
+ return { needsSpec, reason };
65
+ }
66
+ function spawnValidate(bin, engine, prompt, project, echo) {
67
+ return new Promise((resolve) => {
68
+ const child = spawn(bin, engineArgs(engine, prompt), {
69
+ cwd: project,
70
+ stdio: ['ignore', 'pipe', 'pipe'],
71
+ });
72
+ let out = '';
73
+ child.stdout.on('data', (d) => (out += d.toString()));
74
+ child.stderr.on('data', (d) => echo && process.stderr.write(d.toString()));
75
+ const fail = (error) => resolve({ ok: false, engine, error });
76
+ child.on('error', (e) => fail(e.message));
77
+ child.on('close', (code) => {
78
+ if (code !== 0)
79
+ return fail(`engine ${engine} falhou (exit ${code})`);
80
+ try {
81
+ resolve({ ok: true, engine, ...parseVerdict(out) });
82
+ }
83
+ catch (e) {
84
+ fail(e.message);
85
+ }
86
+ });
87
+ });
88
+ }
89
+ /** Bloqueante: lê o plano, roda o engine pensante e devolve o veredito. `echo` streama log. */
90
+ export async function runValidatePlan(opts) {
91
+ const engine = opts.engine ?? PLAN_ENGINE;
92
+ let plan;
93
+ try {
94
+ plan = readPlan(opts.project);
95
+ }
96
+ catch {
97
+ return { ok: false, engine, error: planMissingError(opts.project) };
98
+ }
99
+ const bin = resolveEngineBin(engine);
100
+ if (!bin)
101
+ return { ok: false, engine, error: engineMissingError(engine) };
102
+ const result = await spawnValidate(bin, engine, buildValidatePrompt(plan), opts.project, opts.echo === true);
103
+ if (result.ok && result.needsSpec)
104
+ result.suggestedSlug = suggestSlug(plan);
105
+ return result;
106
+ }
107
+ //# sourceMappingURL=validate-plan-delegate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-plan-delegate.js","sourceRoot":"","sources":["../../src/lib/validate-plan-delegate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import updateNotifier from 'update-notifier';
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname, join } from 'node:path';
5
+ import { brand } from '../brand.js';
6
+ function loadPkg() {
7
+ // Este módulo compila pra `dist/lib/version-check.js`, então o package.json fica
8
+ // dois níveis acima (raiz do pacote). Mesmo truque do `packageRoot()` do cowork-extension.
9
+ const here = dirname(fileURLToPath(import.meta.url));
10
+ const pkgPath = join(here, '..', '..', 'package.json');
11
+ return JSON.parse(readFileSync(pkgPath, 'utf-8'));
12
+ }
13
+ const ONE_DAY_MS = 1000 * 60 * 60 * 24;
14
+ /**
15
+ * Inicia checagem em background (cacheada). Retorna o objeto pra inspeção.
16
+ */
17
+ export function startVersionCheck() {
18
+ const pkg = loadPkg();
19
+ return updateNotifier({ pkg, updateCheckInterval: ONE_DAY_MS });
20
+ }
21
+ /**
22
+ * Pro CLI interativo: chama .notify() com banner padrão no stdout.
23
+ */
24
+ export function notifyCliIfUpdate() {
25
+ try {
26
+ const notifier = startVersionCheck();
27
+ notifier.notify({ defer: false, isGlobal: true });
28
+ }
29
+ catch {
30
+ // Best-effort. Nunca quebrar o CLI por causa de checagem de versão.
31
+ }
32
+ }
33
+ /** `a > b` em semver simples (major.minor.patch; ignora pré-release). */
34
+ function semverGt(a, b) {
35
+ const pa = a.split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
36
+ const pb = b.split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
37
+ for (let i = 0; i < 3; i++) {
38
+ if ((pa[i] ?? 0) > (pb[i] ?? 0))
39
+ return true;
40
+ if ((pa[i] ?? 0) < (pb[i] ?? 0))
41
+ return false;
42
+ }
43
+ return false;
44
+ }
45
+ /**
46
+ * Consulta o registro npm pela última versão publicada e compara com a instalada.
47
+ * Retorna `null` em qualquer falha (offline, timeout, registro bloqueado) — nunca
48
+ * quebra o fluxo do CLI. Usado pelo `nio sync` pra oferecer atualizar.
49
+ */
50
+ export async function checkForUpdate(timeoutMs = 3000) {
51
+ try {
52
+ const pkg = loadPkg();
53
+ const controller = new AbortController();
54
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
55
+ const res = await fetch(`https://registry.npmjs.org/${pkg.name}/latest`, {
56
+ signal: controller.signal,
57
+ headers: { accept: 'application/json' },
58
+ });
59
+ clearTimeout(timer);
60
+ if (!res.ok)
61
+ return null;
62
+ const data = (await res.json());
63
+ const latest = data.version;
64
+ if (!latest)
65
+ return null;
66
+ return { name: pkg.name, current: pkg.version, latest, hasUpdate: semverGt(latest, pkg.version) };
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ /**
73
+ * Pro MCP server: SEM banner em stdout (corromperia JSON-RPC).
74
+ * Loga em stderr só se houver update — o Claude Code captura stderr.
75
+ */
76
+ export function notifyMcpServerIfUpdate() {
77
+ try {
78
+ const notifier = startVersionCheck();
79
+ const update = notifier.update;
80
+ if (update && update.latest !== update.current) {
81
+ console.error(`[${brand.mcpBinName}] nova versão disponível: ${update.current} → ${update.latest}. ` +
82
+ `Atualize com: npm i -g ${brand.packageName}`);
83
+ }
84
+ }
85
+ catch {
86
+ // idem: best-effort.
87
+ }
88
+ }
89
+ //# sourceMappingURL=version-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/lib/version-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Logo NIO com efeito Matrix (chuva de katakana) — decorativo, mostrado no
3
+ * `--help` e na tela de login. Determinístico (seed fixa): a mesma "chuva"
4
+ * sempre, sem piscar diferente a cada execução.
5
+ */
6
+ const MATRIX_CHARS = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレワン0123456789';
7
+ const TRAIL_CHARS = '・。';
8
+ const NIO_LOGO = [
9
+ '███╗ ██╗██╗ ██████╗ ',
10
+ '████╗ ██║██║██╔═══██╗',
11
+ '██╔██╗ ██║██║██║ ██║',
12
+ '██║╚██╗██║██║██║ ██║',
13
+ '██║ ╚████║██║╚██████╔╝',
14
+ '╚═╝ ╚═══╝╚═╝ ╚═════╝ ',
15
+ ];
16
+ const RESET = '\x1b[0m';
17
+ const LOGO_COLOR = '\x1b[1;32m';
18
+ const BRIGHT = '\x1b[92m';
19
+ const GREEN = '\x1b[32m';
20
+ const DIM = '\x1b[90m';
21
+ /** PRNG determinístico (mulberry32) — mesma seed, mesma saída sempre. */
22
+ function mulberry32(seed) {
23
+ let a = seed;
24
+ return () => {
25
+ a = (a + 0x6d2b79f5) | 0;
26
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
27
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
28
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
29
+ };
30
+ }
31
+ function randInt(rand, min, max) {
32
+ return Math.floor(rand() * (max - min + 1)) + min;
33
+ }
34
+ function pickChar(rand, s) {
35
+ return s[Math.floor(rand() * s.length)] ?? ' ';
36
+ }
37
+ /** Desenha o logo centralizado e devolve o retângulo ocupado (a chuva não pisa nele). */
38
+ function placeLogo(width, height) {
39
+ const cells = Array.from({ length: height }, () => Array(width).fill(' '));
40
+ const logoH = NIO_LOGO.length;
41
+ const logoW = NIO_LOGO[0].length;
42
+ const logoR = Math.floor((height - logoH) / 2);
43
+ const logoC = Math.floor((width - logoW) / 2);
44
+ const logoArea = new Set();
45
+ for (let i = 0; i < logoH; i++) {
46
+ for (let j = 0; j < logoW; j++) {
47
+ cells[logoR + i][logoC + j] = NIO_LOGO[i][j];
48
+ logoArea.add(`${logoR + i},${logoC + j}`);
49
+ }
50
+ }
51
+ return { cells, logoArea, logoR, logoC };
52
+ }
53
+ /** Colunas de chuva caindo (cabeça brilhante + rastro de pontos), evitando a área do logo. */
54
+ function scatterRain(rand, canvas, width, height, logoC, logoW) {
55
+ const cols = [];
56
+ for (let n = 0; n < 35; n++) {
57
+ const col = randInt(rand, 0, width - 1);
58
+ if (!(col >= logoC - 1 && col <= logoC + logoW))
59
+ cols.push(col);
60
+ }
61
+ for (const col of cols) {
62
+ const start = randInt(rand, -10, 3);
63
+ const trail = randInt(rand, 6, 18);
64
+ for (let i = 0; i < trail; i++) {
65
+ const row = start + i;
66
+ const key = `${row},${col}`;
67
+ if (row < 0 || row >= height || canvas.logoArea.has(key))
68
+ continue;
69
+ canvas.cells[row][col] = i >= trail - 4 ? pickChar(rand, MATRIX_CHARS) : pickChar(rand, TRAIL_CHARS);
70
+ }
71
+ }
72
+ }
73
+ /** Pixels soltos, pra preencher o fundo sem ficar tão vazio. */
74
+ function scatterLoosePixels(rand, canvas, width, height) {
75
+ for (let n = 0; n < 50; n++) {
76
+ const row = randInt(rand, 0, height - 1);
77
+ const col = randInt(rand, 0, width - 1);
78
+ const key = `${row},${col}`;
79
+ if (!canvas.logoArea.has(key) && canvas.cells[row][col] === ' ') {
80
+ canvas.cells[row][col] = pickChar(rand, MATRIX_CHARS);
81
+ }
82
+ }
83
+ }
84
+ /** Colore: logo em verde sólido, chuva/pixels em tons variados de verde (ou sem cor). */
85
+ function colorize(rand, canvas, width, height, colored) {
86
+ const lines = [];
87
+ for (let r = 0; r < height; r++) {
88
+ let line = '';
89
+ for (let c = 0; c < width; c++) {
90
+ const ch = canvas.cells[r][c];
91
+ if (ch === ' ') {
92
+ line += ' ';
93
+ }
94
+ else if (canvas.logoArea.has(`${r},${c}`)) {
95
+ line += colored ? `${LOGO_COLOR}${ch}${RESET}` : ch;
96
+ }
97
+ else if (colored) {
98
+ const roll = rand();
99
+ const color = roll < 0.25 ? BRIGHT : roll < 0.6 ? GREEN : DIM;
100
+ line += `${color}${ch}${RESET}`;
101
+ }
102
+ else {
103
+ line += ch;
104
+ }
105
+ }
106
+ lines.push(line);
107
+ }
108
+ return lines.join('\n');
109
+ }
110
+ export function renderMatrixLogo(opts = {}) {
111
+ const width = opts.width ?? 70;
112
+ const height = opts.height ?? 24;
113
+ const seed = opts.seed ?? 42;
114
+ const colored = opts.colored ?? Boolean(process.stdout.isTTY);
115
+ const rand = mulberry32(seed);
116
+ const { cells, logoArea, logoC } = placeLogo(width, height);
117
+ const canvas = { cells, logoArea };
118
+ scatterRain(rand, canvas, width, height, logoC, NIO_LOGO[0].length);
119
+ scatterLoosePixels(rand, canvas, width, height);
120
+ return colorize(rand, canvas, width, height, colored);
121
+ }
122
+ //# sourceMappingURL=matrix-logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix-logo.js","sourceRoot":"","sources":["../src/matrix-logo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { VERSION } from './version.js';
6
+ import { loadProjectConfig } from './config.js';
7
+ import { createSession } from './session-factory.js';
8
+ import { tools, toolDefinitions } from './tools/index.js';
9
+ import { errorResult } from './lib/tool-result.js';
10
+ import { notifyMcpServerIfUpdate } from './lib/version-check.js';
11
+ import { filterSkillsForSurface } from './lib/skills.js';
12
+ import { loadSkills, skillResourceDescriptors, readSkillResource, skillPromptDescriptors, buildSkillPrompt, } from './lib/skill-serve.js';
13
+ import { provision } from './lib/provision.js';
14
+ import { provisionHooks } from './lib/hooks.js';
15
+ import { claudeTarget } from './lib/targets.js';
16
+ import { ensureSkillsCache } from './lib/skills-cache.js';
17
+ import { shouldRunAutoPull, pickProvisionTarget } from './lib/autopull.js';
18
+ import { brand, env } from './brand.js';
19
+ /** Carrega o config do projeto; erro de parse é degradado (log + null), nunca fatal. */
20
+ function loadConfigStep() {
21
+ try {
22
+ return loadProjectConfig();
23
+ }
24
+ catch (err) {
25
+ console.error(`[${brand.mcpBinName}] ${brand.projectConfigFile} inválido: ${err.message}`);
26
+ return null;
27
+ }
28
+ }
29
+ // Skills vêm de um repo aberto → garante o cache local (~/.nio/skills) antes
30
+ // de servir/auto-pull. Baixa só se ausente; best-effort (offline → degrada).
31
+ async function initSkillsCache() {
32
+ try {
33
+ const r = await ensureSkillsCache();
34
+ if (r.status === 'fetched') {
35
+ console.error(`[${brand.mcpBinName}] skills baixadas (${r.repo}@${r.ref})`);
36
+ }
37
+ else if (r.status === 'failed') {
38
+ console.error(`[${brand.mcpBinName}] aviso: skills indisponíveis: ${r.error}`);
39
+ }
40
+ }
41
+ catch (err) {
42
+ console.error(`[${brand.mcpBinName}] aviso: cache de skills pulado: ${err.message}`);
43
+ }
44
+ }
45
+ async function authenticateSession() {
46
+ try {
47
+ const session = await createSession();
48
+ console.error(`[${brand.mcpBinName}] autenticado como ${session.user.email}`);
49
+ return session;
50
+ }
51
+ catch (err) {
52
+ console.error(`[${brand.mcpBinName}] aviso: ${err.message}`);
53
+ return null;
54
+ }
55
+ }
56
+ /** Surface deste worker (pra filtro de visibilidade `clients:`). Cowork seta
57
+ * NIO_CLIENT=cowork; Claude Code costuma deixar vazio → sem filtro (mostra tudo). */
58
+ function resolveSurface() {
59
+ return env('CLIENT') || null;
60
+ }
61
+ function registerToolHandlers(server, session, projectConfig) {
62
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
63
+ tools: toolDefinitions,
64
+ }));
65
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
66
+ const tool = tools[request.params.name];
67
+ if (!tool) {
68
+ return errorResult(`Tool desconhecida: ${request.params.name}`);
69
+ }
70
+ if (!session) {
71
+ return errorResult(`Não autenticado. Rode \`${brand.name} login\` antes de iniciar o Claude Code.`);
72
+ }
73
+ const ctx = {
74
+ gateway: session.gateway,
75
+ user: session.user,
76
+ config: projectConfig,
77
+ };
78
+ try {
79
+ return await tool.handler(request.params.arguments ?? {}, ctx);
80
+ }
81
+ catch (err) {
82
+ return errorResult(`Erro inesperado em ${request.params.name}: ${err.message}`);
83
+ }
84
+ });
85
+ }
86
+ // Resources: o conhecimento (skills/commands/agents) do pacote @nio-cli/skills.
87
+ // Deixa o worker de IA ler os artefatos sob demanda, mesmo sem rodar `nio sync`.
88
+ function registerResourceHandlers(server, surface) {
89
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
90
+ try {
91
+ const { docs } = loadSkills();
92
+ return { resources: skillResourceDescriptors(filterSkillsForSurface(docs, surface)) };
93
+ }
94
+ catch (err) {
95
+ console.error(`[${brand.mcpBinName}] aviso: skills indisponíveis: ${err.message}`);
96
+ return { resources: [] };
97
+ }
98
+ });
99
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
100
+ const { docs, rawByPath } = loadSkills();
101
+ const r = readSkillResource(request.params.uri, filterSkillsForSurface(docs, surface), rawByPath);
102
+ return { contents: [{ uri: r.uri, mimeType: r.mimeType, text: r.text }] };
103
+ });
104
+ }
105
+ // Prompts: commands/skills como prompts invocáveis. Funciona no Claude Code E no
106
+ // Cowork (que não lê `~/.claude`) — é o caminho de slash-command lá.
107
+ function registerPromptHandlers(server, surface, session) {
108
+ server.setRequestHandler(ListPromptsRequestSchema, async () => {
109
+ try {
110
+ const { docs } = loadSkills();
111
+ return { prompts: skillPromptDescriptors(filterSkillsForSurface(docs, surface)) };
112
+ }
113
+ catch (err) {
114
+ console.error(`[${brand.mcpBinName}] aviso: prompts indisponíveis: ${err.message}`);
115
+ return { prompts: [] };
116
+ }
117
+ });
118
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
119
+ const visible = filterSkillsForSurface(loadSkills().docs, surface);
120
+ const { description, text } = buildSkillPrompt(request.params.name, request.params.arguments, visible);
121
+ // Telemetria de uso (Cowork): qual skill/command foi invocado (id estável + nome).
122
+ session?.gateway.track({
123
+ type: 'prompt',
124
+ client: surface ?? 'unknown',
125
+ id: visible.find((d) => d.id === request.params.name)?.uid ?? null,
126
+ name: request.params.name,
127
+ });
128
+ return {
129
+ description,
130
+ messages: [{ role: 'user', content: { type: 'text', text } }],
131
+ };
132
+ });
133
+ }
134
+ // Hooks (só Claude Code): re-registra os gatilhos no settings.json.
135
+ function reinstallHooksIfClaude(target, projectConfig) {
136
+ if (target !== claudeTarget)
137
+ return;
138
+ const h = provisionHooks({
139
+ surface: claudeTarget.surface,
140
+ selection: projectConfig?.selection,
141
+ });
142
+ if (h.installed.length > 0 || h.prunedScripts.length > 0) {
143
+ console.error(`[${brand.mcpBinName}] auto-pull: ${h.installed.length} hooks, ` +
144
+ `${h.prunedScripts.length} removidos em ${h.settingsPath}.`);
145
+ }
146
+ }
147
+ // Auto-pull: a cada start, refresca os arquivos nativos (idempotente via manifesto;
148
+ // desliga com NIO_AUTO_PULL=0). No Cowork as skills chegam por resources/prompts,
149
+ // não por arquivo nativo — então pulamos.
150
+ async function runAutoPull(projectConfig) {
151
+ const client = env('CLIENT');
152
+ const autoPull = env('AUTO_PULL');
153
+ if (!shouldRunAutoPull(client, autoPull))
154
+ return;
155
+ const target = pickProvisionTarget(client);
156
+ try {
157
+ const result = provision({ target, selection: projectConfig?.selection });
158
+ const changed = result.files.filter((f) => f.action === 'create' || f.action === 'update');
159
+ const pruned = result.files.filter((f) => f.action === 'prune');
160
+ if (changed.length > 0 || pruned.length > 0) {
161
+ console.error(`[${brand.mcpBinName}] auto-pull: ${changed.length} atualizados, ` +
162
+ `${pruned.length} removidos em ${result.targetDir}. Reinicie o cliente pra carregar.`);
163
+ }
164
+ reinstallHooksIfClaude(target, projectConfig);
165
+ }
166
+ catch (err) {
167
+ console.error(`[${brand.mcpBinName}] auto-pull pulou: ${err.message}`);
168
+ }
169
+ }
170
+ async function main() {
171
+ const projectConfig = loadConfigStep();
172
+ await initSkillsCache();
173
+ const session = await authenticateSession();
174
+ const server = new Server({ name: brand.mcpBinName, version: VERSION }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
175
+ const surface = resolveSurface();
176
+ registerToolHandlers(server, session, projectConfig);
177
+ registerResourceHandlers(server, surface);
178
+ registerPromptHandlers(server, surface, session);
179
+ notifyMcpServerIfUpdate();
180
+ const transport = new StdioServerTransport();
181
+ await server.connect(transport);
182
+ console.error(`[${brand.mcpBinName}] servidor iniciado (stdio)`);
183
+ await runAutoPull(projectConfig);
184
+ }
185
+ main().catch((err) => {
186
+ console.error(`[${brand.mcpBinName}] erro fatal: ${err.message}`);
187
+ process.exit(1);
188
+ });
189
+ //# sourceMappingURL=mcp-server.js.map