@namzu/cli 2.0.0 → 2.1.1

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 (176) hide show
  1. package/dist/tui/App.d.ts.map +1 -1
  2. package/dist/tui/App.js +8 -0
  3. package/dist/tui/App.js.map +1 -1
  4. package/dist/tui/agent.d.ts +10 -0
  5. package/dist/tui/agent.d.ts.map +1 -1
  6. package/dist/tui/agent.js +10 -0
  7. package/dist/tui/agent.js.map +1 -1
  8. package/dist/tui/slashCommands.d.ts +46 -0
  9. package/dist/tui/slashCommands.d.ts.map +1 -1
  10. package/dist/tui/slashCommands.js +96 -0
  11. package/dist/tui/slashCommands.js.map +1 -1
  12. package/package.json +11 -6
  13. package/dist/__tests__/environment-reaches-the-turn.test.d.ts +0 -17
  14. package/dist/__tests__/environment-reaches-the-turn.test.d.ts.map +0 -1
  15. package/dist/__tests__/environment-reaches-the-turn.test.js +0 -128
  16. package/dist/__tests__/environment-reaches-the-turn.test.js.map +0 -1
  17. package/dist/__tests__/headless-trust-gate.test.d.ts +0 -23
  18. package/dist/__tests__/headless-trust-gate.test.d.ts.map +0 -1
  19. package/dist/__tests__/headless-trust-gate.test.js +0 -227
  20. package/dist/__tests__/headless-trust-gate.test.js.map +0 -1
  21. package/dist/__tests__/mcp-servers-reach-the-session.test.d.ts +0 -17
  22. package/dist/__tests__/mcp-servers-reach-the-session.test.d.ts.map +0 -1
  23. package/dist/__tests__/mcp-servers-reach-the-session.test.js +0 -171
  24. package/dist/__tests__/mcp-servers-reach-the-session.test.js.map +0 -1
  25. package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts +0 -31
  26. package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts.map +0 -1
  27. package/dist/__tests__/permission-rules-reach-the-turn.test.js +0 -132
  28. package/dist/__tests__/permission-rules-reach-the-turn.test.js.map +0 -1
  29. package/dist/__tests__/project-instructions-reach-the-turn.test.d.ts +0 -24
  30. package/dist/__tests__/project-instructions-reach-the-turn.test.d.ts.map +0 -1
  31. package/dist/__tests__/project-instructions-reach-the-turn.test.js +0 -153
  32. package/dist/__tests__/project-instructions-reach-the-turn.test.js.map +0 -1
  33. package/dist/cli.test.d.ts +0 -2
  34. package/dist/cli.test.d.ts.map +0 -1
  35. package/dist/cli.test.js +0 -108
  36. package/dist/cli.test.js.map +0 -1
  37. package/dist/commands/__tests__/eval.test.d.ts +0 -2
  38. package/dist/commands/__tests__/eval.test.d.ts.map +0 -1
  39. package/dist/commands/__tests__/eval.test.js +0 -165
  40. package/dist/commands/__tests__/eval.test.js.map +0 -1
  41. package/dist/commands/__tests__/passthrough-help.test.d.ts +0 -2
  42. package/dist/commands/__tests__/passthrough-help.test.d.ts.map +0 -1
  43. package/dist/commands/__tests__/passthrough-help.test.js +0 -96
  44. package/dist/commands/__tests__/passthrough-help.test.js.map +0 -1
  45. package/dist/commands/__tests__/resume.test.d.ts +0 -15
  46. package/dist/commands/__tests__/resume.test.d.ts.map +0 -1
  47. package/dist/commands/__tests__/resume.test.js +0 -116
  48. package/dist/commands/__tests__/resume.test.js.map +0 -1
  49. package/dist/commands/__tests__/run-exit-code.test.d.ts +0 -2
  50. package/dist/commands/__tests__/run-exit-code.test.d.ts.map +0 -1
  51. package/dist/commands/__tests__/run-exit-code.test.js +0 -100
  52. package/dist/commands/__tests__/run-exit-code.test.js.map +0 -1
  53. package/dist/commands/__tests__/run-flags.test.d.ts +0 -11
  54. package/dist/commands/__tests__/run-flags.test.d.ts.map +0 -1
  55. package/dist/commands/__tests__/run-flags.test.js +0 -238
  56. package/dist/commands/__tests__/run-flags.test.js.map +0 -1
  57. package/dist/commands/__tests__/run-stream-flags.test.d.ts +0 -2
  58. package/dist/commands/__tests__/run-stream-flags.test.d.ts.map +0 -1
  59. package/dist/commands/__tests__/run-stream-flags.test.js +0 -295
  60. package/dist/commands/__tests__/run-stream-flags.test.js.map +0 -1
  61. package/dist/commands/doctor.test.d.ts +0 -2
  62. package/dist/commands/doctor.test.d.ts.map +0 -1
  63. package/dist/commands/doctor.test.js +0 -82
  64. package/dist/commands/doctor.test.js.map +0 -1
  65. package/dist/config/load.test.d.ts +0 -2
  66. package/dist/config/load.test.d.ts.map +0 -1
  67. package/dist/config/load.test.js +0 -57
  68. package/dist/config/load.test.js.map +0 -1
  69. package/dist/context/__tests__/environment.test.d.ts +0 -10
  70. package/dist/context/__tests__/environment.test.d.ts.map +0 -1
  71. package/dist/context/__tests__/environment.test.js +0 -84
  72. package/dist/context/__tests__/environment.test.js.map +0 -1
  73. package/dist/context/__tests__/project.test.d.ts +0 -12
  74. package/dist/context/__tests__/project.test.d.ts.map +0 -1
  75. package/dist/context/__tests__/project.test.js +0 -201
  76. package/dist/context/__tests__/project.test.js.map +0 -1
  77. package/dist/doctor/checks/credentials.test.d.ts +0 -10
  78. package/dist/doctor/checks/credentials.test.d.ts.map +0 -1
  79. package/dist/doctor/checks/credentials.test.js +0 -47
  80. package/dist/doctor/checks/credentials.test.js.map +0 -1
  81. package/dist/doctor/checks/sandbox.test.d.ts +0 -2
  82. package/dist/doctor/checks/sandbox.test.d.ts.map +0 -1
  83. package/dist/doctor/checks/sandbox.test.js +0 -59
  84. package/dist/doctor/checks/sandbox.test.js.map +0 -1
  85. package/dist/doctor/registry.test.d.ts +0 -7
  86. package/dist/doctor/registry.test.d.ts.map +0 -1
  87. package/dist/doctor/registry.test.js +0 -379
  88. package/dist/doctor/registry.test.js.map +0 -1
  89. package/dist/integrations/mcp/__tests__/connect.test.d.ts +0 -11
  90. package/dist/integrations/mcp/__tests__/connect.test.d.ts.map +0 -1
  91. package/dist/integrations/mcp/__tests__/connect.test.js +0 -231
  92. package/dist/integrations/mcp/__tests__/connect.test.js.map +0 -1
  93. package/dist/integrations/providers/discover.test.d.ts +0 -2
  94. package/dist/integrations/providers/discover.test.d.ts.map +0 -1
  95. package/dist/integrations/providers/discover.test.js +0 -93
  96. package/dist/integrations/providers/discover.test.js.map +0 -1
  97. package/dist/integrations/providers/keychain.test.d.ts +0 -2
  98. package/dist/integrations/providers/keychain.test.d.ts.map +0 -1
  99. package/dist/integrations/providers/keychain.test.js +0 -21
  100. package/dist/integrations/providers/keychain.test.js.map +0 -1
  101. package/dist/integrations/providers/oauth.test.d.ts +0 -2
  102. package/dist/integrations/providers/oauth.test.d.ts.map +0 -1
  103. package/dist/integrations/providers/oauth.test.js +0 -86
  104. package/dist/integrations/providers/oauth.test.js.map +0 -1
  105. package/dist/integrations/providers/preferences.test.d.ts +0 -2
  106. package/dist/integrations/providers/preferences.test.d.ts.map +0 -1
  107. package/dist/integrations/providers/preferences.test.js +0 -76
  108. package/dist/integrations/providers/preferences.test.js.map +0 -1
  109. package/dist/integrations/sessions/__tests__/archived-workspace.test.d.ts +0 -21
  110. package/dist/integrations/sessions/__tests__/archived-workspace.test.d.ts.map +0 -1
  111. package/dist/integrations/sessions/__tests__/archived-workspace.test.js +0 -62
  112. package/dist/integrations/sessions/__tests__/archived-workspace.test.js.map +0 -1
  113. package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts +0 -2
  114. package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts.map +0 -1
  115. package/dist/integrations/subagents/__tests__/delegation-trace.test.js +0 -114
  116. package/dist/integrations/subagents/__tests__/delegation-trace.test.js.map +0 -1
  117. package/dist/integrations/trust/store.test.d.ts +0 -2
  118. package/dist/integrations/trust/store.test.d.ts.map +0 -1
  119. package/dist/integrations/trust/store.test.js +0 -50
  120. package/dist/integrations/trust/store.test.js.map +0 -1
  121. package/dist/memory/store.test.d.ts +0 -2
  122. package/dist/memory/store.test.d.ts.map +0 -1
  123. package/dist/memory/store.test.js +0 -63
  124. package/dist/memory/store.test.js.map +0 -1
  125. package/dist/output/formatter.test.d.ts +0 -2
  126. package/dist/output/formatter.test.d.ts.map +0 -1
  127. package/dist/output/formatter.test.js +0 -88
  128. package/dist/output/formatter.test.js.map +0 -1
  129. package/dist/output/rendered-payload.test.d.ts +0 -2
  130. package/dist/output/rendered-payload.test.d.ts.map +0 -1
  131. package/dist/output/rendered-payload.test.js +0 -61
  132. package/dist/output/rendered-payload.test.js.map +0 -1
  133. package/dist/permissions/__tests__/mode.test.d.ts +0 -10
  134. package/dist/permissions/__tests__/mode.test.d.ts.map +0 -1
  135. package/dist/permissions/__tests__/mode.test.js +0 -115
  136. package/dist/permissions/__tests__/mode.test.js.map +0 -1
  137. package/dist/permissions/__tests__/rules.test.d.ts +0 -10
  138. package/dist/permissions/__tests__/rules.test.d.ts.map +0 -1
  139. package/dist/permissions/__tests__/rules.test.js +0 -196
  140. package/dist/permissions/__tests__/rules.test.js.map +0 -1
  141. package/dist/skills/store.test.d.ts +0 -2
  142. package/dist/skills/store.test.d.ts.map +0 -1
  143. package/dist/skills/store.test.js +0 -80
  144. package/dist/skills/store.test.js.map +0 -1
  145. package/dist/tui/__tests__/context-gauge.test.d.ts +0 -2
  146. package/dist/tui/__tests__/context-gauge.test.d.ts.map +0 -1
  147. package/dist/tui/__tests__/context-gauge.test.js +0 -83
  148. package/dist/tui/__tests__/context-gauge.test.js.map +0 -1
  149. package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts +0 -24
  150. package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts.map +0 -1
  151. package/dist/tui/__tests__/deferred-tool-discovery.test.js +0 -111
  152. package/dist/tui/__tests__/deferred-tool-discovery.test.js.map +0 -1
  153. package/dist/tui/__tests__/to-agent-event.test.d.ts +0 -2
  154. package/dist/tui/__tests__/to-agent-event.test.d.ts.map +0 -1
  155. package/dist/tui/__tests__/to-agent-event.test.js +0 -230
  156. package/dist/tui/__tests__/to-agent-event.test.js.map +0 -1
  157. package/dist/tui/__tests__/working-directory.test.d.ts +0 -13
  158. package/dist/tui/__tests__/working-directory.test.d.ts.map +0 -1
  159. package/dist/tui/__tests__/working-directory.test.js +0 -109
  160. package/dist/tui/__tests__/working-directory.test.js.map +0 -1
  161. package/dist/tui/agent.test.d.ts +0 -2
  162. package/dist/tui/agent.test.d.ts.map +0 -1
  163. package/dist/tui/agent.test.js +0 -225
  164. package/dist/tui/agent.test.js.map +0 -1
  165. package/dist/tui/markdownParser.test.d.ts +0 -2
  166. package/dist/tui/markdownParser.test.d.ts.map +0 -1
  167. package/dist/tui/markdownParser.test.js +0 -90
  168. package/dist/tui/markdownParser.test.js.map +0 -1
  169. package/dist/tui/mentions.test.d.ts +0 -2
  170. package/dist/tui/mentions.test.d.ts.map +0 -1
  171. package/dist/tui/mentions.test.js +0 -35
  172. package/dist/tui/mentions.test.js.map +0 -1
  173. package/dist/tui/slashCommands.test.d.ts +0 -2
  174. package/dist/tui/slashCommands.test.d.ts.map +0 -1
  175. package/dist/tui/slashCommands.test.js +0 -114
  176. package/dist/tui/slashCommands.test.js.map +0 -1
@@ -1,225 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { batchNeedsPrompt, makeResumeHandler, previewToolInput, toAgentEvent, toolEndDetail, toolStartDetail, } from './agent.js';
3
- const runId = 'run_x';
4
- const sessionId = 'ses_x';
5
- const projectId = 'prj_x';
6
- const toolUseId = 'toolu_x';
7
- // Minimal envelope fields the RunEvent union carries beyond the discriminant.
8
- const env = { schemaVersion: 1, runId, sessionId, projectId };
9
- describe('toAgentEvent', () => {
10
- it('maps text_delta to a delta', () => {
11
- const ev = {
12
- type: 'text_delta',
13
- iteration: 0,
14
- messageId: 'msg_1',
15
- text: 'hello',
16
- ...env,
17
- };
18
- expect(toAgentEvent(ev)).toEqual({ kind: 'delta', text: 'hello' });
19
- });
20
- it('maps tool_executing to tool-start with a command summary', () => {
21
- const ev = {
22
- type: 'tool_executing',
23
- toolUseId,
24
- toolName: 'bash',
25
- input: { command: 'ls -la /tmp' },
26
- ...env,
27
- };
28
- expect(toAgentEvent(ev)).toEqual({
29
- kind: 'tool-start',
30
- toolUseId,
31
- toolName: 'bash',
32
- summary: 'ls -la /tmp',
33
- });
34
- });
35
- it('prefers a path field when there is no command', () => {
36
- const ev = {
37
- type: 'tool_executing',
38
- toolUseId,
39
- toolName: 'read',
40
- input: { file_path: '/etc/hosts' },
41
- ...env,
42
- };
43
- expect(toAgentEvent(ev)).toEqual({
44
- kind: 'tool-start',
45
- toolUseId,
46
- toolName: 'read',
47
- summary: '/etc/hosts',
48
- });
49
- });
50
- it('maps tool_completed to tool-end with a first-line summary + detail lines', () => {
51
- const ev = {
52
- type: 'tool_completed',
53
- toolUseId,
54
- toolName: 'bash',
55
- result: 'multi\n line ',
56
- isError: false,
57
- ...env,
58
- };
59
- expect(toAgentEvent(ev)).toEqual({
60
- kind: 'tool-end',
61
- toolUseId,
62
- toolName: 'bash',
63
- isError: false,
64
- summary: 'multi',
65
- detail: ['multi', ' line'],
66
- });
67
- });
68
- it('maps run_completed to done and run_failed to error', () => {
69
- expect(toAgentEvent({
70
- type: 'run_completed',
71
- result: 'ok',
72
- ...env,
73
- })).toEqual({ kind: 'done' });
74
- expect(toAgentEvent({
75
- type: 'run_failed',
76
- error: 'boom',
77
- ...env,
78
- })).toEqual({ kind: 'error', message: 'boom' });
79
- });
80
- it('maps token_usage_updated to a usage event', () => {
81
- expect(toAgentEvent({
82
- type: 'token_usage_updated',
83
- usage: { totalTokens: 1234 },
84
- cost: { totalCost: 0.0456 },
85
- ...env,
86
- })).toEqual({ kind: 'usage', totalTokens: 1234, costUsd: 0.0456 });
87
- });
88
- it('returns null for events the chat surface ignores', () => {
89
- expect(toAgentEvent({
90
- type: 'iteration_started',
91
- iteration: 1,
92
- ...env,
93
- })).toBeNull();
94
- expect(toAgentEvent({
95
- type: 'checkpoint_created',
96
- ...env,
97
- })).toBeNull();
98
- });
99
- });
100
- const checkpointId = 'cp_x';
101
- const tc = (over) => ({
102
- id: 'call_1',
103
- name: 'read',
104
- input: {},
105
- isDestructive: false,
106
- ...over,
107
- });
108
- const toolReview = (toolCalls) => ({
109
- type: 'tool_review',
110
- runId,
111
- checkpointId,
112
- toolCalls,
113
- });
114
- describe('batchNeedsPrompt', () => {
115
- it('does not prompt for read-only batches', () => {
116
- expect(batchNeedsPrompt([tc({ name: 'read' }), tc({ name: 'glob' })])).toBe(false);
117
- expect(batchNeedsPrompt([tc({ name: 'Grep' })])).toBe(false); // case-insensitive
118
- });
119
- it('prompts when any tool mutates or is flagged destructive', () => {
120
- expect(batchNeedsPrompt([tc({ name: 'read' }), tc({ name: 'write' })])).toBe(true);
121
- expect(batchNeedsPrompt([tc({ name: 'edit' })])).toBe(true);
122
- expect(batchNeedsPrompt([tc({ name: 'bash', isDestructive: true })])).toBe(true);
123
- });
124
- it('prompts for unknown/future tools (safe-by-default)', () => {
125
- expect(batchNeedsPrompt([tc({ name: 'SomeClawtoolThing' })])).toBe(true);
126
- });
127
- });
128
- describe('previewToolInput', () => {
129
- it('previews write content with a head + overflow note', () => {
130
- const content = Array.from({ length: 12 }, (_, i) => `line${i}`).join('\n');
131
- const preview = previewToolInput('write', { path: '/x', content });
132
- expect(preview?.[0]).toBe('line0');
133
- expect(preview?.at(-1)).toContain('+4 more lines');
134
- });
135
- it('previews edit as -old / +new diff lines', () => {
136
- const preview = previewToolInput('edit', {
137
- path: '/x',
138
- old_string: 'foo',
139
- new_string: 'bar',
140
- });
141
- expect(preview).toEqual(['- foo', '+ bar']);
142
- });
143
- it('returns undefined for non-previewable tools', () => {
144
- expect(previewToolInput('bash', { command: 'ls' })).toBeUndefined();
145
- expect(previewToolInput('read', { path: '/x' })).toBeUndefined();
146
- });
147
- });
148
- describe('makeResumeHandler', () => {
149
- it('auto-approves read-only batches without calling onPermission', async () => {
150
- const onPermission = vi.fn();
151
- const handler = makeResumeHandler({ all: false }, onPermission);
152
- const decision = await handler(toolReview([tc({ name: 'read' })]));
153
- expect(decision).toEqual({ action: 'approve_tools' });
154
- expect(onPermission).not.toHaveBeenCalled();
155
- });
156
- it('prompts for destructive batches and maps approve', async () => {
157
- const onPermission = vi.fn(async () => ({ kind: 'approve' }));
158
- const handler = makeResumeHandler({ all: false }, onPermission);
159
- const decision = await handler(toolReview([tc({ name: 'write' })]));
160
- expect(onPermission).toHaveBeenCalledOnce();
161
- expect(decision).toEqual({ action: 'approve_tools' });
162
- });
163
- it('maps reject to reject_tools with feedback', async () => {
164
- const onPermission = vi.fn(async () => ({ kind: 'reject', feedback: 'no' }));
165
- const handler = makeResumeHandler({ all: false }, onPermission);
166
- const decision = await handler(toolReview([tc({ name: 'bash', isDestructive: true })]));
167
- expect(decision).toEqual({ action: 'reject_tools', feedback: 'no' });
168
- });
169
- it('approve-all flips the session flag so later batches skip the prompt', async () => {
170
- const approval = { all: false };
171
- const onPermission = vi.fn(async () => ({ kind: 'approve-all' }));
172
- const handler = makeResumeHandler(approval, onPermission);
173
- await handler(toolReview([tc({ name: 'write' })]));
174
- expect(approval.all).toBe(true);
175
- await handler(toolReview([tc({ name: 'edit' })]));
176
- expect(onPermission).toHaveBeenCalledOnce(); // second batch not prompted
177
- });
178
- it('auto-approves everything when no onPermission is supplied', async () => {
179
- const handler = makeResumeHandler({ all: false }, undefined);
180
- expect(await handler(toolReview([tc({ name: 'write' })]))).toEqual({
181
- action: 'approve_tools',
182
- });
183
- });
184
- it('approves plans and continues checkpoints', async () => {
185
- const handler = makeResumeHandler({ all: false }, vi.fn());
186
- expect(await handler({
187
- type: 'plan_approval',
188
- runId,
189
- checkpointId,
190
- plan: { planId: 'plan_x', title: 't', steps: [] },
191
- })).toEqual({ action: 'approve_plan' });
192
- expect(await handler({
193
- type: 'iteration_checkpoint',
194
- runId,
195
- checkpointId,
196
- summary: {},
197
- })).toEqual({ action: 'continue' });
198
- });
199
- });
200
- describe('toolStartDetail', () => {
201
- it('builds a -old/+new diff for edit', () => {
202
- expect(toolStartDetail('edit', { path: '/x', old_string: 'a\nb', new_string: 'a\nc' })).toEqual(['- a', '- b', '+ a', '+ c']);
203
- });
204
- it('returns the content lines for write', () => {
205
- expect(toolStartDetail('write', { path: '/x', content: 'one\ntwo' })).toEqual(['one', 'two']);
206
- });
207
- it('returns undefined for non-mutating tools', () => {
208
- expect(toolStartDetail('bash', { command: 'ls' })).toBeUndefined();
209
- expect(toolStartDetail('read', { file_path: '/x' })).toBeUndefined();
210
- });
211
- });
212
- describe('toolEndDetail', () => {
213
- it('returns output lines for read/bash', () => {
214
- expect(toolEndDetail('bash', 'line1\nline2')).toEqual(['line1', 'line2']);
215
- });
216
- it('returns undefined for edit/write (diff already shown at call time)', () => {
217
- expect(toolEndDetail('edit', 'Updated /x')).toBeUndefined();
218
- expect(toolEndDetail('write', 'Wrote /x')).toBeUndefined();
219
- });
220
- it('returns undefined for single-line or empty results', () => {
221
- expect(toolEndDetail('bash', 'ok')).toBeUndefined();
222
- expect(toolEndDetail('bash', ' ')).toBeUndefined();
223
- });
224
- });
225
- //# sourceMappingURL=agent.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.test.js","sourceRoot":"","sources":["../../src/tui/agent.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=markdownParser.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdownParser.test.d.ts","sourceRoot":"","sources":["../../src/tui/markdownParser.test.ts"],"names":[],"mappings":""}
@@ -1,90 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { parseInline, parseMarkdown } from './markdownParser.js';
3
- describe('parseMarkdown', () => {
4
- it('parses a fenced code block with a language', () => {
5
- const blocks = parseMarkdown('before\n```ts\nconst x = 1\nconst y = 2\n```\nafter');
6
- expect(blocks).toEqual([
7
- { type: 'paragraph', text: 'before' },
8
- { type: 'code', lang: 'ts', lines: ['const x = 1', 'const y = 2'] },
9
- { type: 'paragraph', text: 'after' },
10
- ]);
11
- });
12
- it('parses headings at varying levels', () => {
13
- expect(parseMarkdown('# Title')).toEqual([{ type: 'heading', level: 1, text: 'Title' }]);
14
- expect(parseMarkdown('### Sub')).toEqual([{ type: 'heading', level: 3, text: 'Sub' }]);
15
- });
16
- it('parses unordered and ordered list items', () => {
17
- const blocks = parseMarkdown('- one\n- two\n1. first\n2) second');
18
- expect(blocks).toEqual([
19
- { type: 'bullet', ordered: false, marker: '•', text: 'one' },
20
- { type: 'bullet', ordered: false, marker: '•', text: 'two' },
21
- { type: 'bullet', ordered: true, marker: '1', text: 'first' },
22
- { type: 'bullet', ordered: true, marker: '2', text: 'second' },
23
- ]);
24
- });
25
- it('merges consecutive plain lines into one paragraph and splits on blanks', () => {
26
- const blocks = parseMarkdown('line one\nline two\n\nsecond para');
27
- expect(blocks).toEqual([
28
- { type: 'paragraph', text: 'line one line two' },
29
- { type: 'paragraph', text: 'second para' },
30
- ]);
31
- });
32
- it('keeps code content verbatim (no markdown interpretation inside)', () => {
33
- const blocks = parseMarkdown('```\n# not a heading\n- not a bullet\n```');
34
- expect(blocks).toEqual([
35
- { type: 'code', lang: undefined, lines: ['# not a heading', '- not a bullet'] },
36
- ]);
37
- });
38
- });
39
- describe('parseInline', () => {
40
- it('splits bold, italic, and inline code', () => {
41
- expect(parseInline('a **b** c `d` e *f*')).toEqual([
42
- { text: 'a ' },
43
- { text: 'b', bold: true },
44
- { text: ' c ' },
45
- { text: 'd', code: true },
46
- { text: ' e ' },
47
- { text: 'f', italic: true },
48
- ]);
49
- });
50
- it('treats __x__ as bold and _x_ as italic', () => {
51
- expect(parseInline('__b__ and _i_')).toEqual([
52
- { text: 'b', bold: true },
53
- { text: ' and ' },
54
- { text: 'i', italic: true },
55
- ]);
56
- });
57
- it('returns a single span for plain text', () => {
58
- expect(parseInline('just text')).toEqual([{ text: 'just text' }]);
59
- });
60
- it('does not parse markers inside inline code', () => {
61
- expect(parseInline('`a*b*c`')).toEqual([{ text: 'a*b*c', code: true }]);
62
- });
63
- it('parses a [text](url) link', () => {
64
- expect(parseInline('see [the docs](https://x.dev/a) now')).toEqual([
65
- { text: 'see ' },
66
- { text: 'the docs', link: 'https://x.dev/a' },
67
- { text: ' now' },
68
- ]);
69
- });
70
- });
71
- describe('parseMarkdown tables', () => {
72
- it('parses a pipe table with header + separator + rows', () => {
73
- const blocks = parseMarkdown('| A | B |\n|---|---|\n| 1 | 2 |\n| 3 | 4 |');
74
- expect(blocks).toEqual([
75
- {
76
- type: 'table',
77
- headers: ['A', 'B'],
78
- rows: [
79
- ['1', '2'],
80
- ['3', '4'],
81
- ],
82
- },
83
- ]);
84
- });
85
- it('does not treat a lone pipe line without a separator as a table', () => {
86
- const blocks = parseMarkdown('| not | a table |\njust text');
87
- expect(blocks[0]?.type).toBe('paragraph');
88
- });
89
- });
90
- //# sourceMappingURL=markdownParser.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdownParser.test.js","sourceRoot":"","sources":["../../src/tui/markdownParser.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mentions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mentions.test.d.ts","sourceRoot":"","sources":["../../src/tui/mentions.test.ts"],"names":[],"mappings":""}
@@ -1,35 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { expandFileMentions } from './mentions.js';
3
- const fake = (files) => (rel) => files[rel] ?? null;
4
- describe('expandFileMentions', () => {
5
- it('inlines a mentioned file and reports it', () => {
6
- const { sendText, attached } = expandFileMentions('fix @src/auth.ts please', '/repo', fake({ 'src/auth.ts': 'export const x = 1' }));
7
- expect(attached).toEqual(['src/auth.ts']);
8
- expect(sendText).toContain('fix @src/auth.ts please');
9
- expect(sendText).toContain('<file path="src/auth.ts">\nexport const x = 1\n</file>');
10
- });
11
- it('leaves text untouched when there are no mentions', () => {
12
- const r = expandFileMentions('no mentions here', '/repo', fake({}));
13
- expect(r).toEqual({ sendText: 'no mentions here', attached: [] });
14
- });
15
- it('ignores tokens that do not resolve to a readable file', () => {
16
- const r = expandFileMentions('@missing.ts', '/repo', fake({}));
17
- expect(r.attached).toEqual([]);
18
- expect(r.sendText).toBe('@missing.ts');
19
- });
20
- it('de-duplicates repeated mentions', () => {
21
- const { attached } = expandFileMentions('@a.ts and again @a.ts', '/repo', fake({ 'a.ts': 'x' }));
22
- expect(attached).toEqual(['a.ts']);
23
- });
24
- it('does not swallow trailing punctuation into the path', () => {
25
- const { attached } = expandFileMentions('see @a.ts, @b.ts.', '/repo', fake({ 'a.ts': '1', 'b.ts': '2' }));
26
- expect(attached).toEqual(['a.ts', 'b.ts']);
27
- });
28
- it('inlines multiple distinct files', () => {
29
- const { attached, sendText } = expandFileMentions('@a.ts @b.ts', '/repo', fake({ 'a.ts': 'A', 'b.ts': 'B' }));
30
- expect(attached).toEqual(['a.ts', 'b.ts']);
31
- expect(sendText).toContain('<file path="a.ts">');
32
- expect(sendText).toContain('<file path="b.ts">');
33
- });
34
- });
35
- //# sourceMappingURL=mentions.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mentions.test.js","sourceRoot":"","sources":["../../src/tui/mentions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAElD,MAAM,IAAI,GAAG,CAAC,KAA6B,EAAE,EAAE,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA;AAEnF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAChD,yBAAyB,EACzB,OAAO,EACP,IAAI,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE,CAAC,CAC7C,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA;QACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,wDAAwD,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,GAAG,kBAAkB,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QACnE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAG,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9D,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC9B,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAC,uBAAuB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAChG,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,MAAM,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CACtC,mBAAmB,EACnB,OAAO,EACP,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAClC,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAChD,aAAa,EACb,OAAO,EACP,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAClC,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAChD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=slashCommands.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"slashCommands.test.d.ts","sourceRoot":"","sources":["../../src/tui/slashCommands.test.ts"],"names":[],"mappings":""}
@@ -1,114 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { SLASH_COMMANDS, matchSlashCommands, parseSlash, runSlash, } from './slashCommands.js';
3
- const ctx = {
4
- availableTools: [],
5
- providerSummary: null,
6
- modelSummary: null,
7
- };
8
- const ctxWithTools = {
9
- availableTools: ['Bash', 'Read', 'Edit'],
10
- providerSummary: 'anthropic-personal (anthropic)',
11
- modelSummary: 'claude-opus-4-7',
12
- };
13
- describe('matchSlashCommands', () => {
14
- it('returns all commands for a bare slash', () => {
15
- expect(matchSlashCommands('/')).toEqual(SLASH_COMMANDS);
16
- });
17
- it('filters by name prefix (case-insensitive)', () => {
18
- const names = matchSlashCommands('/me').map((c) => c.name);
19
- expect(names).toContain('memory');
20
- expect(names).not.toContain('help');
21
- expect(matchSlashCommands('/MO').map((c) => c.name)).toContain('model');
22
- });
23
- it('returns [] once a space is typed (now entering arguments)', () => {
24
- expect(matchSlashCommands('/model ')).toEqual([]);
25
- expect(matchSlashCommands('/skill foo')).toEqual([]);
26
- });
27
- it('returns [] for non-slash input', () => {
28
- expect(matchSlashCommands('hello')).toEqual([]);
29
- expect(matchSlashCommands('')).toEqual([]);
30
- });
31
- it('returns [] when nothing matches the prefix', () => {
32
- expect(matchSlashCommands('/zzz')).toEqual([]);
33
- });
34
- });
35
- describe('parseSlash', () => {
36
- it('returns null for non-slash lines', () => {
37
- expect(parseSlash('hello world')).toBeNull();
38
- expect(parseSlash('')).toBeNull();
39
- expect(parseSlash(' ')).toBeNull();
40
- });
41
- it('tolerates leading whitespace', () => {
42
- expect(parseSlash(' /help')).toEqual({ name: 'help', args: [] });
43
- });
44
- it('splits args on whitespace', () => {
45
- expect(parseSlash('/model anthropic claude-opus-4-7')).toEqual({
46
- name: 'model',
47
- args: ['anthropic', 'claude-opus-4-7'],
48
- });
49
- });
50
- it('returns null for a bare slash', () => {
51
- expect(parseSlash('/')).toBeNull();
52
- expect(parseSlash('/ ')).toBeNull();
53
- });
54
- });
55
- describe('runSlash', () => {
56
- it('returns null for non-slash input', () => {
57
- expect(runSlash('plain message', ctx)).toBeNull();
58
- });
59
- it('reports unknown commands as system messages', () => {
60
- const r = runSlash('/nope', ctx);
61
- expect(r?.kind).toBe('message');
62
- if (r?.kind === 'message')
63
- expect(r.content).toContain('Unknown command');
64
- });
65
- it('/help lists every registered command', () => {
66
- const r = runSlash('/help', ctx);
67
- expect(r?.kind).toBe('message');
68
- if (r?.kind === 'message') {
69
- for (const cmd of SLASH_COMMANDS) {
70
- expect(r.content).toContain(`/${cmd.name}`);
71
- }
72
- }
73
- });
74
- it('/clear returns a clear action', () => {
75
- expect(runSlash('/clear', ctx)).toEqual({ kind: 'clear' });
76
- });
77
- it('/quit and /exit both produce an exit action', () => {
78
- expect(runSlash('/quit', ctx)).toEqual({ kind: 'exit' });
79
- expect(runSlash('/exit', ctx)).toEqual({ kind: 'exit' });
80
- });
81
- it('/tools reports "no tools" when registry is empty', () => {
82
- const r = runSlash('/tools', ctx);
83
- expect(r?.kind).toBe('message');
84
- if (r?.kind === 'message')
85
- expect(r.content).toContain('No tools registered');
86
- });
87
- it('/tools lists registered tools when present', () => {
88
- const r = runSlash('/tools', ctxWithTools);
89
- expect(r?.kind).toBe('message');
90
- if (r?.kind === 'message') {
91
- expect(r.content).toContain('Bash');
92
- expect(r.content).toContain('Read');
93
- expect(r.content).toContain('3');
94
- }
95
- });
96
- it('/provider says "not configured" when no provider', () => {
97
- const r = runSlash('/provider', ctx);
98
- expect(r?.kind).toBe('message');
99
- if (r?.kind === 'message')
100
- expect(r.content).toContain('No provider configured');
101
- });
102
- it('/provider shows summary when configured', () => {
103
- const r = runSlash('/provider', ctxWithTools);
104
- expect(r?.kind).toBe('message');
105
- if (r?.kind === 'message') {
106
- expect(r.content).toContain('anthropic-personal');
107
- expect(r.content).toContain('claude-opus-4-7');
108
- }
109
- });
110
- it('/model re-opens the picker (repick action)', () => {
111
- expect(runSlash('/model', ctxWithTools)).toEqual({ kind: 'repick' });
112
- });
113
- });
114
- //# sourceMappingURL=slashCommands.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"slashCommands.test.js","sourceRoot":"","sources":["../../src/tui/slashCommands.test.ts"],"names":[],"mappings":"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"}