@nio-cli/cli 0.4.0 → 0.7.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 (111) hide show
  1. package/.env.example +24 -9
  2. package/README.md +186 -78
  3. package/dist/adapters/pg/client.js +2 -0
  4. package/dist/adapters/pg/client.js.map +1 -1
  5. package/dist/adapters/pg/login-challenge-repository.js.map +1 -1
  6. package/dist/adapters/sms/whatsapp.js +83 -0
  7. package/dist/adapters/sms/whatsapp.js.map +1 -0
  8. package/dist/app/ai-client.js +2 -2
  9. package/dist/app/ai-client.js.map +1 -1
  10. package/dist/cli/commands/ai.js +2 -2
  11. package/dist/cli/commands/ai.js.map +1 -1
  12. package/dist/cli/commands/auth.js +5 -5
  13. package/dist/cli/commands/auth.js.map +1 -1
  14. package/dist/cli/commands/config.js +17 -7
  15. package/dist/cli/commands/config.js.map +1 -1
  16. package/dist/cli/commands/docs/content.js +80 -11
  17. package/dist/cli/commands/docs/content.js.map +1 -1
  18. package/dist/cli/commands/exec.js +1 -12
  19. package/dist/cli/commands/exec.js.map +1 -1
  20. package/dist/cli/commands/init/index.js +1 -2
  21. package/dist/cli/commands/init/index.js.map +1 -1
  22. package/dist/cli/commands/init/provision-step.js +2 -20
  23. package/dist/cli/commands/init/provision-step.js.map +1 -1
  24. package/dist/cli/commands/plan.js +1 -12
  25. package/dist/cli/commands/plan.js.map +1 -1
  26. package/dist/cli/commands/security.js +15 -15
  27. package/dist/cli/commands/security.js.map +1 -1
  28. package/dist/cli/commands/sync.js +4 -18
  29. package/dist/cli/commands/sync.js.map +1 -1
  30. package/dist/cli/commands/validate-plan.js +1 -10
  31. package/dist/cli/commands/validate-plan.js.map +1 -1
  32. package/dist/cli/copy/flows.json +1 -2
  33. package/dist/cli/copy.js.map +1 -1
  34. package/dist/cli/flows/dependencies.js +0 -4
  35. package/dist/cli/flows/dependencies.js.map +1 -1
  36. package/dist/cli/help-guide.js +69 -0
  37. package/dist/cli/help-guide.js.map +1 -0
  38. package/dist/cli/program.js +3 -3
  39. package/dist/cli/program.js.map +1 -1
  40. package/dist/cli/ui/render.js +0 -27
  41. package/dist/cli/ui/render.js.map +1 -1
  42. package/dist/cli.js +10 -2
  43. package/dist/cli.js.map +1 -1
  44. package/dist/gateway/services/login.js +6 -7
  45. package/dist/gateway/services/login.js.map +1 -1
  46. package/dist/gateway/services/security.js +6 -6
  47. package/dist/gateway/services/security.js.map +1 -1
  48. package/dist/lib/auth/gateway-token.js +3 -0
  49. package/dist/lib/auth/gateway-token.js.map +1 -1
  50. package/dist/lib/auth/nio-config.js +28 -0
  51. package/dist/lib/auth/nio-config.js.map +1 -1
  52. package/dist/lib/clients/client-configs.js +81 -86
  53. package/dist/lib/clients/client-configs.js.map +1 -1
  54. package/dist/lib/deps/dependencies.js +0 -25
  55. package/dist/lib/deps/dependencies.js.map +1 -1
  56. package/dist/lib/deps/dependency-install.js +3 -23
  57. package/dist/lib/deps/dependency-install.js.map +1 -1
  58. package/dist/lib/exec/exec-delegate.js +69 -48
  59. package/dist/lib/exec/exec-delegate.js.map +1 -1
  60. package/dist/lib/exec/plan-delegate.js +25 -34
  61. package/dist/lib/exec/plan-delegate.js.map +1 -1
  62. package/dist/lib/exec/qwen-client.js +74 -0
  63. package/dist/lib/exec/qwen-client.js.map +1 -0
  64. package/dist/lib/exec/validate-plan-delegate.js +13 -30
  65. package/dist/lib/exec/validate-plan-delegate.js.map +1 -1
  66. package/dist/lib/provision/provision.js +2 -2
  67. package/dist/lib/provision/provision.js.map +1 -1
  68. package/dist/lib/skills/patterns.js +15 -24
  69. package/dist/lib/skills/patterns.js.map +1 -1
  70. package/dist/lib/skills/skill-serve.js +46 -13
  71. package/dist/lib/skills/skill-serve.js.map +1 -1
  72. package/dist/lib/skills/skills.js +1 -1
  73. package/dist/lib/skills/skills.js.map +1 -1
  74. package/dist/mcp-server.js +0 -15
  75. package/dist/mcp-server.js.map +1 -1
  76. package/dist/profiles/bi.js +2 -1
  77. package/dist/profiles/bi.js.map +1 -1
  78. package/dist/profiles/dba.js +2 -11
  79. package/dist/profiles/dba.js.map +1 -1
  80. package/dist/profiles/toolchains.js +49 -2
  81. package/dist/profiles/toolchains.js.map +1 -1
  82. package/dist/tools/delegate-exec.js +3 -10
  83. package/dist/tools/delegate-exec.js.map +1 -1
  84. package/dist/tools/plan.js +6 -13
  85. package/dist/tools/plan.js.map +1 -1
  86. package/dist/tools/validate-plan.js +6 -14
  87. package/dist/tools/validate-plan.js.map +1 -1
  88. package/dist/tui/app.js +102 -18
  89. package/dist/tui/app.js.map +1 -1
  90. package/dist/tui/components.js +161 -88
  91. package/dist/tui/components.js.map +1 -1
  92. package/dist/tui/launch.js.map +1 -1
  93. package/dist/tui/opencode.js +27 -0
  94. package/dist/tui/opencode.js.map +1 -1
  95. package/dist/tui/palette.js +12 -5
  96. package/dist/tui/palette.js.map +1 -1
  97. package/dist/tui/prompt-input.js +168 -0
  98. package/dist/tui/prompt-input.js.map +1 -0
  99. package/dist/tui/state.js +252 -20
  100. package/dist/tui/state.js.map +1 -1
  101. package/dist/tui/test-utils.js +24 -0
  102. package/dist/tui/test-utils.js.map +1 -0
  103. package/package.json +2 -2
  104. package/dist/adapters/sms/http-generic.js +0 -71
  105. package/dist/adapters/sms/http-generic.js.map +0 -1
  106. package/dist/cli/commands/clean.js +0 -108
  107. package/dist/cli/commands/clean.js.map +0 -1
  108. package/dist/lib/clients/hooks.js +0 -191
  109. package/dist/lib/clients/hooks.js.map +0 -1
  110. package/dist/lib/exec/exec-engines.js +0 -63
  111. package/dist/lib/exec/exec-engines.js.map +0 -1
package/dist/tui/state.js CHANGED
@@ -1,11 +1,83 @@
1
1
  import { tlog } from './debug.js';
2
- export const emptyChat = { messages: [], busy: false, permission: null };
2
+ export function permGroupLabel(kind) {
3
+ const g = {
4
+ bash: 'shell',
5
+ edit: 'editar arquivo',
6
+ read: 'ler arquivo',
7
+ glob: 'listar arquivos',
8
+ grep: 'buscar no código',
9
+ webfetch: 'baixar URL',
10
+ websearch: 'buscar na web',
11
+ external_directory: 'acessar fora do projeto',
12
+ doom_loop: 'continuar (possível loop)',
13
+ task: 'sub-agente',
14
+ skill: 'rodar skill',
15
+ todowrite: 'atualizar checklist',
16
+ };
17
+ return g[kind] ?? (kind.includes('_') ? `MCP · ${kind}` : kind);
18
+ }
19
+ export function toPermissionReq(raw) {
20
+ const perm = raw;
21
+ if (!perm.id || !perm.sessionID)
22
+ return null;
23
+ const kind = perm.permission ?? perm.type ?? perm.tool?.name ?? 'ação';
24
+ const patterns = perm.patterns ??
25
+ (Array.isArray(perm.pattern) ? perm.pattern : perm.pattern ? [perm.pattern] : []);
26
+ return {
27
+ id: perm.id,
28
+ sessionId: perm.sessionID,
29
+ kind,
30
+ patterns,
31
+ command: perm.metadata?.command,
32
+ always: perm.always ?? [],
33
+ title: perm.title ?? permGroupLabel(kind),
34
+ };
35
+ }
36
+ export function reconcilePendingPermissions(prev, rawList) {
37
+ const live = rawList.map(toPermissionReq).filter((r) => r !== null);
38
+ const liveIds = new Set(live.map((r) => r.id));
39
+ const kept = prev.permissions.filter((r) => liveIds.has(r.id));
40
+ const known = new Set(kept.map((r) => r.id));
41
+ const added = live.filter((r) => !known.has(r.id));
42
+ if (added.length === 0 && kept.length === prev.permissions.length)
43
+ return prev;
44
+ return { ...prev, permissions: [...kept, ...added] };
45
+ }
46
+ function errorHint(name) {
47
+ switch (name) {
48
+ case 'ProviderAuthError':
49
+ return 'credencial do provedor inválida — rode `opencode auth login`';
50
+ case 'MessageOutputLengthError':
51
+ return 'a resposta ficou longa demais — peça em partes menores';
52
+ case 'APIError':
53
+ return 'erro na API do provedor';
54
+ default:
55
+ return 'erro no motor';
56
+ }
57
+ }
58
+ export const emptyChat = {
59
+ messages: [],
60
+ busy: false,
61
+ permissions: [],
62
+ toasts: [],
63
+ todos: [],
64
+ files: [],
65
+ retry: null,
66
+ error: null,
67
+ diff: [],
68
+ };
3
69
  const PENDING_USER = 'pending-user';
4
70
  function clone(prev) {
5
71
  return {
6
72
  messages: prev.messages.map((m) => ({ ...m, parts: m.parts.map((p) => ({ ...p })) })),
7
73
  busy: prev.busy,
8
- permission: prev.permission,
74
+ permissions: prev.permissions,
75
+ toasts: prev.toasts,
76
+ todos: prev.todos,
77
+ files: prev.files,
78
+ retry: prev.retry,
79
+ error: prev.error,
80
+ diff: prev.diff,
9
81
  };
10
82
  }
11
83
  function upsertMessage(state, id, role) {
@@ -45,14 +117,9 @@ export function applyEvent(prev, evt) {
45
117
  tlog('event', evt.type, JSON.stringify(p).slice(0, 200));
46
118
  const etype = evt.type;
47
119
  if (etype === 'permission.asked' || etype === 'permission.updated') {
48
- const perm = p;
49
- if (perm.id && perm.sessionID) {
50
- const what = perm.patterns?.length ? ` ${perm.patterns.join(', ')}` : '';
51
- state.permission = {
52
- id: perm.id,
53
- sessionId: perm.sessionID,
54
- title: perm.title ?? `${perm.permission ?? perm.tool?.name ?? 'ação'}${what}`,
55
- };
120
+ const req = toPermissionReq(p);
121
+ if (req && !state.permissions.some((x) => x.id === req.id)) {
122
+ state.permissions = [...state.permissions, req];
56
123
  }
57
124
  return state;
58
125
  }
@@ -68,24 +135,111 @@ export function applyEvent(prev, evt) {
68
135
  case 'message.part.updated':
69
136
  applyPart(state, (p.part ?? p));
70
137
  break;
71
- case 'permission.replied':
72
- state.permission = null;
138
+ case 'permission.replied': {
139
+ const id = p.permissionID;
140
+ state.permissions = id ? state.permissions.filter((x) => x.id !== id) : [];
141
+ break;
142
+ }
143
+ case 'todo.updated': {
144
+ const todos = (p.todos ?? []).map((t) => ({
145
+ content: String(t.content ?? ''),
146
+ status: String(t.status ?? 'pending'),
147
+ }));
148
+ state.todos = todos;
149
+ break;
150
+ }
151
+ case 'file.edited': {
152
+ const f = p.file;
153
+ if (f && !state.files.includes(f))
154
+ state.files = [...state.files, f];
155
+ break;
156
+ }
157
+ case 'tui.toast.show': {
158
+ const t = p;
159
+ const message = [t.title, t.message].filter(Boolean).join(' — ') || 'aviso';
160
+ const variant = (['info', 'success', 'warning', 'error'].includes(t.variant ?? '')
161
+ ? t.variant
162
+ : 'info');
163
+ state.toasts = [
164
+ ...state.toasts.slice(-4),
165
+ { id: `toast-${Date.now()}-${state.toasts.length}`, message, variant, until: Date.now() + Math.max(1500, t.duration ?? 4000) },
166
+ ];
73
167
  break;
168
+ }
74
169
  case 'session.idle':
75
- case 'session.error':
76
170
  state.busy = false;
171
+ state.retry = null;
77
172
  break;
78
- case 'session.status':
79
- if (p.status?.type === 'idle')
173
+ case 'session.error': {
174
+ state.busy = false;
175
+ state.retry = null;
176
+ const err = p.error;
177
+ if (err?.name && err.name !== 'MessageAbortedError') {
178
+ const data = err.data ?? {};
179
+ const raw = typeof data.message === 'string' ? data.message : '';
180
+ const hint = errorHint(err.name);
181
+ const useHint = err.name === 'ProviderAuthError' || err.name === 'MessageOutputLengthError' || !raw;
182
+ state.error = {
183
+ name: err.name,
184
+ message: useHint ? hint : raw,
185
+ retryable: err.name === 'APIError' && Boolean(data.isRetryable),
186
+ };
187
+ }
188
+ break;
189
+ }
190
+ case 'session.diff': {
191
+ const files = p.diff ?? [];
192
+ state.diff = files
193
+ .filter((d) => d.file)
194
+ .map((d) => ({ file: String(d.file), added: d.additions ?? 0, removed: d.deletions ?? 0 }));
195
+ break;
196
+ }
197
+ case 'session.compacted':
198
+ state.toasts = [
199
+ ...state.toasts.slice(-4),
200
+ { id: `toast-${Date.now()}`, message: '✂ contexto compactado', variant: 'info', until: Date.now() + 4000 },
201
+ ];
202
+ break;
203
+ case 'installation.update-available': {
204
+ const v = p.version;
205
+ state.toasts = [
206
+ ...state.toasts.slice(-4),
207
+ { id: `toast-${Date.now()}`, message: `nova versão do opencode: ${v ?? '?'}`, variant: 'info', until: Date.now() + 6000 },
208
+ ];
209
+ break;
210
+ }
211
+ case 'session.status': {
212
+ const st = p.status;
213
+ if (st?.type === 'idle') {
80
214
  state.busy = false;
215
+ state.retry = null;
216
+ }
217
+ else if (st?.type === 'busy') {
218
+ state.busy = true;
219
+ }
220
+ else if (st?.type === 'retry') {
221
+ state.busy = true;
222
+ state.retry = { attempt: st.attempt ?? 1, note: st.message ?? 'tentando de novo' };
223
+ }
81
224
  break;
225
+ }
82
226
  default:
83
227
  break;
84
228
  }
85
229
  return state;
86
230
  }
87
231
  export function syncMessages(prev, raw, busy) {
88
- const state = { messages: [], busy, permission: prev.permission };
232
+ const state = {
233
+ messages: [],
234
+ busy,
235
+ permissions: prev.permissions,
236
+ toasts: prev.toasts,
237
+ todos: prev.todos,
238
+ files: prev.files,
239
+ retry: busy ? prev.retry : null,
240
+ error: prev.error,
241
+ diff: prev.diff,
242
+ };
89
243
  for (const m of raw) {
90
244
  if (!m.info?.id)
91
245
  continue;
@@ -108,14 +262,29 @@ function applyPartInto(msg, raw) {
108
262
  if (!part.id)
109
263
  return;
110
264
  const type = part.type ?? 'text';
111
- if (type === 'step-start' || type === 'step-finish')
265
+ if (type === 'step-start')
112
266
  return;
267
+ if (type === 'step-finish') {
268
+ const cp = upsertPart(msg, part.id, 'step');
269
+ cp.step = {
270
+ tokensIn: part.tokens?.input ?? 0,
271
+ tokensOut: part.tokens?.output ?? 0,
272
+ cost: part.cost ?? 0,
273
+ };
274
+ return;
275
+ }
113
276
  if (type === 'tool') {
114
277
  const cp = upsertPart(msg, part.id, 'tool');
115
278
  cp.text = part.state?.title ?? part.tool ?? 'tool';
116
- cp.tool = { status: part.state?.status ?? 'running', output: String(part.state?.output ?? part.state?.error ?? '') };
279
+ cp.tool = {
280
+ name: part.tool ?? 'tool',
281
+ status: part.state?.status ?? 'running',
282
+ input: part.state?.input,
283
+ output: String(part.state?.output ?? part.state?.error ?? ''),
284
+ };
285
+ return;
117
286
  }
118
- else if (typeof part.text === 'string') {
287
+ if (typeof part.text === 'string') {
119
288
  upsertPart(msg, part.id, type === 'reasoning' ? 'reasoning' : 'text').text = part.text;
120
289
  }
121
290
  }
@@ -126,7 +295,70 @@ export function pushUserMessage(prev, text) {
126
295
  { id: PENDING_USER, role: 'user', parts: [{ id: 'p0', kind: 'text', text }] },
127
296
  ],
128
297
  busy: true,
129
- permission: prev.permission,
298
+ permissions: prev.permissions,
299
+ toasts: prev.toasts,
300
+ todos: [],
301
+ files: [],
302
+ retry: null,
303
+ error: null,
304
+ diff: [],
130
305
  };
131
306
  }
307
+ export function summarizeToolInput(input) {
308
+ if (!input)
309
+ return '';
310
+ const keys = ['filePath', 'file_path', 'command', 'pattern', 'query', 'url', 'path', 'prompt', 'description'];
311
+ for (const k of keys)
312
+ if (typeof input[k] === 'string' && input[k])
313
+ return String(input[k]);
314
+ const first = Object.values(input).find((v) => typeof v === 'string' && v);
315
+ return first ? String(first) : '';
316
+ }
317
+ export function messageUsage(msg) {
318
+ const steps = msg.parts.filter((p) => !!p.step);
319
+ if (steps.length === 0)
320
+ return null;
321
+ return steps.reduce((acc, s) => ({
322
+ tokensIn: acc.tokensIn + s.step.tokensIn,
323
+ tokensOut: acc.tokensOut + s.step.tokensOut,
324
+ cost: acc.cost + s.step.cost,
325
+ }), { tokensIn: 0, tokensOut: 0, cost: 0 });
326
+ }
327
+ function idleAssistantText(state) {
328
+ if (state.busy || state.permissions.length > 0)
329
+ return null;
330
+ const last = state.messages[state.messages.length - 1];
331
+ if (!last || last.role !== 'assistant')
332
+ return null;
333
+ const text = last.parts
334
+ .filter((p) => p.kind === 'text')
335
+ .map((p) => p.text)
336
+ .join('')
337
+ .replace(/```[\s\S]*?```/g, '')
338
+ .trim();
339
+ return text || null;
340
+ }
341
+ export function pendingQuestion(state) {
342
+ const text = idleAssistantText(state);
343
+ if (!text)
344
+ return null;
345
+ const lines = text.split('\n').map((l) => l.trim()).filter(Boolean);
346
+ const lastLine = lines.at(-1) ?? '';
347
+ if (/\?["'`)\]]*$/.test(lastLine))
348
+ return lastLine;
349
+ const qLine = [...lines].reverse().find((l) => /\?["'`)\]]*$/.test(l));
350
+ return qLine ?? null;
351
+ }
352
+ export function questionOptions(state) {
353
+ const text = idleAssistantText(state);
354
+ if (!text || !text.includes('?'))
355
+ return [];
356
+ const opts = [];
357
+ for (const raw of text.split('\n')) {
358
+ const m = /^\s*(?:\d{1,2}[.)]|[-*]\s*\[[ xX]?\]|[a-zA-Z][.)])\s+(.{2,120}?)\s*$/.exec(raw);
359
+ if (m?.[1])
360
+ opts.push(m[1].trim());
361
+ }
362
+ return opts.length >= 2 ? opts.slice(0, 8) : [];
363
+ }
132
364
  //# sourceMappingURL=state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { render } from 'ink-testing-library';
2
+ const ANSI = /\x1b\[[0-9;]*m/g;
3
+ export const stripAnsi = (s) => (s ?? '').replace(ANSI, '');
4
+ export async function waitForFrame(frame, predicate, { timeoutMs = 2000, intervalMs = 10 } = {}) {
5
+ const deadline = Date.now() + timeoutMs;
6
+ let last = stripAnsi(frame());
7
+ while (Date.now() < deadline) {
8
+ last = stripAnsi(frame());
9
+ if (predicate(last))
10
+ return last;
11
+ await new Promise((r) => setTimeout(r, intervalMs));
12
+ }
13
+ throw new Error(`waitForFrame: condição não bateu em ${timeoutMs}ms.\n─── último frame ───\n${last}\n────────────────────`);
14
+ }
15
+ export function waitForText(frame, needles, opts) {
16
+ const list = Array.isArray(needles) ? needles : [needles];
17
+ return waitForFrame(frame, (f) => list.every((n) => f.includes(n)), opts);
18
+ }
19
+ export async function frameOf(el) {
20
+ const { lastFrame } = render(el);
21
+ await new Promise((r) => setTimeout(r, 25));
22
+ return stripAnsi(lastFrame());
23
+ }
24
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/tui/test-utils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAS7C,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAqB,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAGxF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAA+B,EAC/B,SAAiC,EACjC,EAAE,SAAS,GAAG,IAAI,EAAE,UAAU,GAAG,EAAE,KAAkD,EAAE;IAEvF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,IAAI,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1B,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,KAAK,CACb,uCAAuC,SAAS,8BAA8B,IAAI,wBAAwB,CAC3G,CAAC;AACJ,CAAC;AAGD,MAAM,UAAU,WAAW,CACzB,KAA+B,EAC/B,OAA0B,EAC1B,IAAkD;IAElD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5E,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAsB;IAClD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAEjC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;AAChC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nio-cli/cli",
3
- "version": "0.4.0",
3
+ "version": "0.7.0",
4
4
  "description": "Orquestrador de ambientes de desenvolvimento: escolhe um perfil, responde um wizard e a CLI (com auxílio de IA via MCP) materializa toolchains, linguagens, frameworks, dotfiles e IDE.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -53,7 +53,7 @@
53
53
  "db:tls": "bash scripts/db-tls-setup.sh",
54
54
  "db:migrate": "bun run scripts/migrate.ts",
55
55
  "argon2:calibrate": "node scripts/argon2-calibrate.mjs",
56
- "dev:sms-echo": "bun run scripts/sms-echo.ts",
56
+ "dev:whatsapp-echo": "bun run scripts/whatsapp-echo.ts",
57
57
  "dev:cli": "bun run src/cli.ts",
58
58
  "dev:mcp": "bun run src/mcp-server.ts",
59
59
  "dev:gateway": "bun run src/gateway/index.ts",
@@ -1,71 +0,0 @@
1
- export function parseAuthHeader(line) {
2
- if (!line)
3
- return {};
4
- const i = line.indexOf(':');
5
- if (i < 1)
6
- return {};
7
- return { [line.slice(0, i).trim()]: line.slice(i + 1).trim() };
8
- }
9
- export function renderBody(template, vars) {
10
- const esc = (s) => JSON.stringify(s).slice(1, -1);
11
- return template
12
- .split('{to}').join(esc(vars.to))
13
- .split('{text}').join(esc(vars.text))
14
- .split('{from}').join(esc(vars.from ?? ''));
15
- }
16
- function readEnv() {
17
- return {
18
- url: process.env.SMS_ENDPOINT_URL?.trim(),
19
- authHeader: process.env.SMS_AUTH_HEADER?.trim(),
20
- bodyTemplate: process.env.SMS_BODY_TEMPLATE?.trim(),
21
- from: process.env.SMS_FROM?.trim(),
22
- };
23
- }
24
- const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1', '[::1]', '0.0.0.0']);
25
- export function smsMode(env = readEnv()) {
26
- if (!env.url || !env.bodyTemplate)
27
- return 'unconfigured';
28
- try {
29
- return LOOPBACK_HOSTS.has(new URL(env.url).hostname) ? 'echo' : 'provider';
30
- }
31
- catch {
32
- return 'provider';
33
- }
34
- }
35
- export function smsProviderHost(env = readEnv()) {
36
- if (!env.url)
37
- return null;
38
- try {
39
- return new URL(env.url).hostname;
40
- }
41
- catch {
42
- return null;
43
- }
44
- }
45
- export function createHttpSmsSender(env = readEnv()) {
46
- return {
47
- async send(to, text) {
48
- if (!env.url || !env.bodyTemplate) {
49
- return { status: 'skipped', error: 'SMS_ENDPOINT_URL / SMS_BODY_TEMPLATE não configurados' };
50
- }
51
- const body = renderBody(env.bodyTemplate, { to, text, from: env.from });
52
- try {
53
- const res = await fetch(env.url, {
54
- method: 'POST',
55
- headers: { 'Content-Type': 'application/json', ...parseAuthHeader(env.authHeader) },
56
- body,
57
- signal: AbortSignal.timeout(10_000),
58
- });
59
- if (!res.ok) {
60
- const detail = (await res.text().catch(() => '')).slice(0, 300);
61
- return { status: 'failed', error: `provedor respondeu ${res.status} ${detail}`.trim() };
62
- }
63
- return { status: 'sent' };
64
- }
65
- catch (err) {
66
- return { status: 'failed', error: err.message };
67
- }
68
- },
69
- };
70
- }
71
- //# sourceMappingURL=http-generic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-generic.js","sourceRoot":"","sources":["../../../src/adapters/sms/http-generic.ts"],"names":[],"mappings":"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"}
@@ -1,108 +0,0 @@
1
- import { rmSync, lstatSync } from "node:fs";
2
- import { homedir } from "node:os";
3
- import { join } from "node:path";
4
- import { confirm } from "../../lib/prompts.js";
5
- import { readSkillDocs } from "../../lib/skills/skills.js";
6
- import { c, sym } from "../../lib/colors.js";
7
- const FULLY_REMOVED = [
8
- "new-spec",
9
- "new-bug",
10
- "new-adr",
11
- "apply-spec",
12
- "apply-bug",
13
- "to-skill",
14
- ];
15
- const COMMAND_TO_SKILL = ["init-sdd", "to-tickets"];
16
- function present(path) {
17
- try {
18
- lstatSync(path);
19
- return true;
20
- }
21
- catch {
22
- return false;
23
- }
24
- }
25
- function currentIds() {
26
- try {
27
- const docs = readSkillDocs();
28
- return {
29
- skills: new Set(docs.filter((d) => d.type === "skill").map((d) => d.id)),
30
- commands: new Set(docs.filter((d) => d.type === "command").map((d) => d.id)),
31
- };
32
- }
33
- catch {
34
- return { skills: new Set(), commands: new Set() };
35
- }
36
- }
37
- function collectLegacy() {
38
- const cur = currentIds();
39
- const out = [];
40
- const add = (path, kind) => {
41
- if (present(path))
42
- out.push({ path, kind });
43
- };
44
- const claude = join(homedir(), ".claude");
45
- const codex = join(homedir(), ".codex");
46
- for (const id of [...FULLY_REMOVED, ...COMMAND_TO_SKILL]) {
47
- if (!cur.commands.has(id))
48
- add(join(claude, "commands", `${id}.md`), "claude command");
49
- }
50
- for (const id of FULLY_REMOVED) {
51
- if (!cur.skills.has(id))
52
- add(join(claude, "skills", id), "claude skill");
53
- }
54
- for (const id of FULLY_REMOVED) {
55
- if (!cur.commands.has(id) && !cur.skills.has(id)) {
56
- add(join(codex, "prompts", `${id}.md`), "codex prompt");
57
- add(join(codex, "skills", id), "codex skill");
58
- }
59
- }
60
- return out;
61
- }
62
- export function registerCleanCommand(program) {
63
- program
64
- .command("clean-legacy")
65
- .description("Remove commands/skills legados (substituídos) de ~/.claude e ~/.codex")
66
- .option("--dry-run", "só lista o que seria removido, sem apagar")
67
- .option("-y, --yes", "remove sem pedir confirmação")
68
- .action(async (opts) => {
69
- const targets = collectLegacy();
70
- if (targets.length === 0) {
71
- console.log("");
72
- console.log(` ${c.green(sym.ok)} nada legado encontrado — já está limpo.`);
73
- return;
74
- }
75
- console.log("");
76
- console.log(` ${c.bold("Artefatos legados encontrados:")}`);
77
- for (const t of targets) {
78
- console.log(` ${c.red("-")} ${t.path} ${c.dim(`(${t.kind})`)}`);
79
- }
80
- if (opts.dryRun) {
81
- console.log("");
82
- console.log(` ${c.dim("[dry-run] nada removido.")}`);
83
- return;
84
- }
85
- const ok = opts.yes === true ||
86
- (await confirm({
87
- message: `Remover ${targets.length} item(ns) legado(s)?`,
88
- default: false,
89
- }));
90
- if (!ok) {
91
- console.log(` ${c.dim("cancelado.")}`);
92
- return;
93
- }
94
- let removed = 0;
95
- for (const t of targets) {
96
- try {
97
- rmSync(t.path, { recursive: true, force: true });
98
- removed++;
99
- }
100
- catch (err) {
101
- console.error(` ${c.red(sym.err)} falha ao remover ${t.path}: ${err.message}`);
102
- }
103
- }
104
- console.log("");
105
- console.log(` ${c.green(sym.ok)} ${removed} removido(s). Reinicie os clientes pra refletir.`);
106
- });
107
- }
108
- //# sourceMappingURL=clean.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../../src/cli/commands/clean.ts"],"names":[],"mappings":"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"}