codehere 1.0.1 → 1.0.2

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 (163) hide show
  1. package/README.md +36 -192
  2. package/dist/application/use-cases/check-claimed-tests.js +81 -0
  3. package/dist/application/use-cases/detect-test-weakening.js +237 -0
  4. package/dist/application/use-cases/rerun-tests.js +110 -7
  5. package/dist/index.js +38 -1212
  6. package/dist/infrastructure/orchestration/artifacts-extractor.js +2 -323
  7. package/dist/presentation/cli/commands/check-command.js +178 -23
  8. package/dist/presentation/cli/commands/help-command.js +21 -285
  9. package/dist/ui.js +5 -236
  10. package/dist/utils/version.js +0 -6
  11. package/package.json +9 -38
  12. package/dist/application/services/verdict-service.js +0 -154
  13. package/dist/application/use-cases/assess-cross-vendor.js +0 -126
  14. package/dist/application/use-cases/build-cross-vendor-verdict.js +0 -118
  15. package/dist/application/use-cases/domain-trust.js +0 -110
  16. package/dist/application/use-cases/export-aat.js +0 -107
  17. package/dist/application/use-cases/generate-acceptance-criteria.js +0 -223
  18. package/dist/application/use-cases/generate-final-report.js +0 -259
  19. package/dist/application/use-cases/generate-narration.js +0 -130
  20. package/dist/application/use-cases/generate-thread-title.js +0 -181
  21. package/dist/application/use-cases/narrator-prompt-template.js +0 -158
  22. package/dist/application/use-cases/plan-auto-review.js +0 -57
  23. package/dist/application/use-cases/reconcile-audit.js +0 -100
  24. package/dist/application/use-cases/search-sessions.js +0 -70
  25. package/dist/application/use-cases/should-auto-review.js +0 -71
  26. package/dist/application/use-cases/thread-export.js +0 -245
  27. package/dist/application/use-cases/verify-claim.js +0 -456
  28. package/dist/application/use-cases/write-pass.js +0 -277
  29. package/dist/domain/audit.js +0 -11
  30. package/dist/domain/services/codebase-detector.js +0 -85
  31. package/dist/domain/task.js +0 -91
  32. package/dist/error-handler.js +0 -139
  33. package/dist/infrastructure/completion/bash-completion.js +0 -29
  34. package/dist/infrastructure/completion/fish-completion.js +0 -17
  35. package/dist/infrastructure/completion/zsh-completion.js +0 -25
  36. package/dist/infrastructure/config/config-manager.js +0 -174
  37. package/dist/infrastructure/config/product-context.js +0 -49
  38. package/dist/infrastructure/context/adapters/drawio-source.js +0 -157
  39. package/dist/infrastructure/context/adapters/figma-source.js +0 -198
  40. package/dist/infrastructure/context/adapters/github-issue-source.js +0 -160
  41. package/dist/infrastructure/context/adapters/linear-source.js +0 -190
  42. package/dist/infrastructure/context/context-resolver.js +0 -144
  43. package/dist/infrastructure/context/context-source.js +0 -114
  44. package/dist/infrastructure/context/github-api.js +0 -110
  45. package/dist/infrastructure/context/github-device-flow.js +0 -65
  46. package/dist/infrastructure/context/oauth-flow.js +0 -207
  47. package/dist/infrastructure/context/oauth-store.js +0 -122
  48. package/dist/infrastructure/context/registry-bootstrap.js +0 -95
  49. package/dist/infrastructure/context/write-pass-resolver.js +0 -106
  50. package/dist/infrastructure/cost/budget-config.js +0 -114
  51. package/dist/infrastructure/cost/cost-router.js +0 -97
  52. package/dist/infrastructure/cost/spend-aggregator.js +0 -222
  53. package/dist/infrastructure/cost/team-ledger.js +0 -355
  54. package/dist/infrastructure/discovery/discovery-log.js +0 -85
  55. package/dist/infrastructure/hooks/audit-tip-signature.js +0 -336
  56. package/dist/infrastructure/hooks/claude-sdk-hook.js +0 -1018
  57. package/dist/infrastructure/hooks/hook-mode.js +0 -87
  58. package/dist/infrastructure/hooks/mirror-tool-call-to-audit.js +0 -49
  59. package/dist/infrastructure/hooks/pre-prompt-scan.js +0 -122
  60. package/dist/infrastructure/hooks/session-analyzer.js +0 -177
  61. package/dist/infrastructure/observability/execution-tracer.js +0 -227
  62. package/dist/infrastructure/orchestration/agent-adapter.js +0 -13
  63. package/dist/infrastructure/orchestration/agent-installer.js +0 -101
  64. package/dist/infrastructure/orchestration/agents-config-seed.js +0 -68
  65. package/dist/infrastructure/orchestration/aider-adapter.js +0 -611
  66. package/dist/infrastructure/orchestration/cassette-recorder.js +0 -120
  67. package/dist/infrastructure/orchestration/claude-code-adapter.js +0 -592
  68. package/dist/infrastructure/orchestration/codex-adapter.js +0 -574
  69. package/dist/infrastructure/orchestration/conductor-adapter.js +0 -416
  70. package/dist/infrastructure/orchestration/context-handoff.js +0 -162
  71. package/dist/infrastructure/orchestration/control/codex-control-surface.js +0 -99
  72. package/dist/infrastructure/orchestration/control/control-surface.js +0 -15
  73. package/dist/infrastructure/orchestration/detect-ollama.js +0 -75
  74. package/dist/infrastructure/orchestration/failover-classifier.js +0 -151
  75. package/dist/infrastructure/orchestration/failover-config.js +0 -67
  76. package/dist/infrastructure/orchestration/failover-policy.js +0 -106
  77. package/dist/infrastructure/orchestration/gemini-adapter.js +0 -663
  78. package/dist/infrastructure/orchestration/generic-cli-adapter.js +0 -689
  79. package/dist/infrastructure/orchestration/graphify-context.js +0 -209
  80. package/dist/infrastructure/orchestration/memory-injector.js +0 -380
  81. package/dist/infrastructure/orchestration/mocks/mock-agent-repl.js +0 -388
  82. package/dist/infrastructure/orchestration/mocks/mock-codex-app-server.js +0 -73
  83. package/dist/infrastructure/orchestration/mocks/mock-synthesis.js +0 -83
  84. package/dist/infrastructure/orchestration/mocks/resolve-agent-spawn.js +0 -37
  85. package/dist/infrastructure/orchestration/opencode-adapter.js +0 -580
  86. package/dist/infrastructure/orchestration/progress-aggregator.js +0 -906
  87. package/dist/infrastructure/orchestration/readiness.js +0 -103
  88. package/dist/infrastructure/orchestration/session-manager.js +0 -1590
  89. package/dist/infrastructure/orchestration/session-persistence.js +0 -394
  90. package/dist/infrastructure/orchestration/thread-key-store.js +0 -127
  91. package/dist/infrastructure/orchestration/write-pass-store.js +0 -38
  92. package/dist/infrastructure/protocols/cloud-sync.js +0 -207
  93. package/dist/infrastructure/protocols/mcp-helpers.js +0 -25
  94. package/dist/infrastructure/protocols/mcp-server-impl.js +0 -3935
  95. package/dist/infrastructure/protocols/mcp-tools.js +0 -401
  96. package/dist/infrastructure/protocols/probe-port.js +0 -36
  97. package/dist/infrastructure/protocols/thread-phase.js +0 -105
  98. package/dist/infrastructure/protocols/ui/app-script-artifacts.js +0 -121
  99. package/dist/infrastructure/protocols/ui/app-script-audit-footer.js +0 -44
  100. package/dist/infrastructure/protocols/ui/app-script-audit-verify.js +0 -56
  101. package/dist/infrastructure/protocols/ui/app-script-composer-cost.js +0 -588
  102. package/dist/infrastructure/protocols/ui/app-script-context-sources.js +0 -168
  103. package/dist/infrastructure/protocols/ui/app-script-conversation.js +0 -67
  104. package/dist/infrastructure/protocols/ui/app-script-drawer.js +0 -115
  105. package/dist/infrastructure/protocols/ui/app-script-failover.js +0 -133
  106. package/dist/infrastructure/protocols/ui/app-script-github.js +0 -113
  107. package/dist/infrastructure/protocols/ui/app-script-observer.js +0 -104
  108. package/dist/infrastructure/protocols/ui/app-script-onboarding.js +0 -80
  109. package/dist/infrastructure/protocols/ui/app-script-overlay.js +0 -203
  110. package/dist/infrastructure/protocols/ui/app-script-recovery.js +0 -136
  111. package/dist/infrastructure/protocols/ui/app-script-render.js +0 -166
  112. package/dist/infrastructure/protocols/ui/app-script-share.js +0 -78
  113. package/dist/infrastructure/protocols/ui/app-script-sidebar.js +0 -194
  114. package/dist/infrastructure/protocols/ui/app-script-tour.js +0 -78
  115. package/dist/infrastructure/protocols/ui/app-script-wpass.js +0 -312
  116. package/dist/infrastructure/protocols/ui/app-script.js +0 -2998
  117. package/dist/infrastructure/protocols/ui/font-faces.js +0 -7
  118. package/dist/infrastructure/protocols/ui/styles.js +0 -2147
  119. package/dist/infrastructure/protocols/ui/tokens.js +0 -96
  120. package/dist/infrastructure/protocols/ui-page-v2.js +0 -320
  121. package/dist/infrastructure/protocols/verify-page.js +0 -1677
  122. package/dist/infrastructure/security/file-collection.js +0 -118
  123. package/dist/infrastructure/security/fix-code.js +0 -144
  124. package/dist/infrastructure/security/fix-secret.js +0 -89
  125. package/dist/infrastructure/security/permissions-config.js +0 -235
  126. package/dist/infrastructure/security/scan-types.js +0 -10
  127. package/dist/infrastructure/security/ship-scan.js +0 -195
  128. package/dist/infrastructure/security/trust-scorer.js +0 -724
  129. package/dist/infrastructure/security/vibe-checks.js +0 -99
  130. package/dist/infrastructure/storage/atomic-write.js +0 -86
  131. package/dist/infrastructure/storage/cross-tool-agents.js +0 -268
  132. package/dist/infrastructure/storage/project-thread-migration.js +0 -237
  133. package/dist/infrastructure/storage/project-thread-mirror.js +0 -671
  134. package/dist/infrastructure/storage/project-thread-reader.js +0 -409
  135. package/dist/infrastructure/storage/project-thread-title-backfill.js +0 -214
  136. package/dist/monitoring.js +0 -212
  137. package/dist/presentation/cli/commands/audit-command.js +0 -201
  138. package/dist/presentation/cli/commands/budget-command.js +0 -79
  139. package/dist/presentation/cli/commands/config-command.js +0 -125
  140. package/dist/presentation/cli/commands/context-source-command.js +0 -217
  141. package/dist/presentation/cli/commands/hook-command.js +0 -265
  142. package/dist/presentation/cli/commands/init-command.js +0 -590
  143. package/dist/presentation/cli/commands/memory-command.js +0 -1031
  144. package/dist/presentation/cli/commands/narrator-command.js +0 -101
  145. package/dist/presentation/cli/commands/permission-command.js +0 -105
  146. package/dist/presentation/cli/commands/protocols-builder.js +0 -254
  147. package/dist/presentation/cli/commands/protocols-command.js +0 -84
  148. package/dist/presentation/cli/commands/repo-map-builder.js +0 -247
  149. package/dist/presentation/cli/commands/report-command.js +0 -403
  150. package/dist/presentation/cli/commands/scan-command.js +0 -52
  151. package/dist/presentation/cli/commands/scan-tool-command.js +0 -110
  152. package/dist/presentation/cli/commands/search-command.js +0 -51
  153. package/dist/presentation/cli/commands/setup-command.js +0 -330
  154. package/dist/presentation/cli/commands/status-command.js +0 -614
  155. package/dist/presentation/cli/commands/team-command.js +0 -256
  156. package/dist/presentation/cli/commands/thread-command.js +0 -370
  157. package/dist/presentation/cli/commands/trust-command.js +0 -328
  158. package/dist/presentation/cli/commands/verify-command.js +0 -298
  159. package/dist/presentation/cli/error-display.js +0 -328
  160. package/dist/presentation/cli/repl.js +0 -805
  161. package/dist/presentation/cli/task-deliverable.js +0 -153
  162. package/dist/testing/cassette.js +0 -125
  163. package/dist/testing/replay-adapter.js +0 -147
@@ -1,269 +1,38 @@
1
1
  /**
2
2
  * Help Command
3
- * Provides contextual help for Codehere commands
3
+ * Contextual help for the commands codehere ships: check and help.
4
4
  */
5
5
  import { colors, newline } from '../../../ui.js';
6
6
  const COMMAND_INFO = {
7
- // === Delegate (the v0.3 PM surface) ===
8
- start: {
9
- name: 'start',
10
- description: 'Open the task intake web UI at http://127.0.0.1:3773',
11
- usage: 'codehere start [options]',
12
- examples: ['codehere start', 'codehere start --port 3773', 'codehere start --no-open'],
13
- options: [
14
- { flag: '--port <n>', description: 'Port for the local UI (default: 3773)' },
15
- { flag: '--no-open', description: "Don't auto-open the browser" },
16
- ],
17
- related: ['task', 'kill', 'status'],
18
- },
19
- task: {
20
- name: 'task',
21
- description: 'Spawn a task from the CLI (requires `codehere start` running)',
22
- usage: 'codehere task <prompt> [options]',
23
- examples: [
24
- 'codehere task "review src/auth.ts for SQL injection"',
25
- 'codehere task "add JSDoc to all exports" --agent codex',
26
- ],
27
- options: [
28
- { flag: '--agent <id>', description: 'Agent ID: claude-code | codex | aider | opencode' },
29
- { flag: '--cwd <path>', description: 'Absolute working directory for the agent' },
30
- ],
31
- related: ['start', 'kill'],
32
- },
33
- kill: {
34
- name: 'kill',
35
- description: 'Terminate a running task session',
36
- usage: 'codehere kill <sessionId>',
37
- examples: ['codehere kill abc123de-...'],
38
- related: ['task', 'status'],
39
- },
40
- // === Safety & Trust (no API key, no agents needed) ===
41
- hook: {
42
- name: 'hook',
43
- description: 'Install, manage, and monitor the safety hook for Claude Code',
44
- usage: 'codehere hook <action>',
45
- examples: ['codehere hook install', 'codehere hook status', 'codehere hook log', 'codehere hook uninstall'],
46
- related: ['trust', 'status'],
47
- },
48
- trust: {
49
- name: 'trust',
50
- description: 'Scan your project for security issues · instant score, no API key needed',
51
- usage: 'codehere trust [path] [options]',
52
- examples: [
53
- 'codehere trust .',
54
- 'codehere trust src/api/',
55
- 'codehere trust --json',
56
- 'codehere trust --ci',
57
- 'codehere trust --badge',
58
- ],
59
- options: [
60
- { flag: '--json', description: 'Output results as JSON' },
61
- { flag: '--ci', description: 'Exit 1 if score drops below threshold' },
62
- { flag: '--badge', description: 'Generate a shields.io badge for your README' },
63
- ],
64
- related: ['report', 'hook'],
65
- },
66
- report: {
67
- name: 'report',
68
- description: 'Generate a shareable markdown audit report',
69
- usage: 'codehere report [options]',
70
- examples: [
71
- 'codehere report',
72
- 'codehere report --simple',
73
- 'codehere report --json',
74
- 'codehere report --out audit.md',
75
- ],
76
- options: [
77
- { flag: '--simple', description: 'Plain English report for non-technical readers' },
78
- { flag: '--json', description: 'Machine-readable JSON output' },
79
- { flag: '--out <file>', description: 'Write report to a file' },
80
- ],
81
- related: ['trust', 'status'],
82
- },
83
- status: {
84
- name: 'status',
85
- description: 'Dashboard · sessions, blocked calls, audit trends',
86
- usage: 'codehere status [options]',
87
- examples: ['codehere status', 'codehere status --sessions', 'codehere status --weekly', 'codehere status --json'],
88
- options: [
89
- { flag: '--sessions', description: 'Show session breakdown with risk levels' },
90
- { flag: '--weekly', description: '7-day shareable agent-activity recap' },
91
- { flag: '--json', description: 'Output as JSON' },
92
- { flag: '--export <fmt>', description: 'Export raw audit feed (jsonl, json, csv, md)' },
93
- ],
94
- related: ['hook', 'trust', 'verify'],
95
- },
96
- verify: {
97
- name: 'verify',
98
- description: "Verify a session's Final Report against the recorded reality (catches optimistic claims)",
99
- usage: 'codehere verify [session-id] [options]',
100
- examples: ['codehere verify', 'codehere verify a1b2c3d4', 'codehere verify a1b2c3d4 --json'],
101
- options: [{ flag: '--json', description: 'Machine-readable verdict for CI' }],
102
- related: ['status', 'report', 'audit'],
103
- },
104
- audit: {
105
- name: 'audit',
106
- description: 'Inspect the hash-chained audit log · verify integrity or show one entry',
107
- usage: 'codehere audit [verify|show <seq>] [options]',
108
- examples: ['codehere audit', 'codehere audit verify', 'codehere audit verify --json', 'codehere audit show 42'],
109
- options: [{ flag: '--json', description: 'Machine-readable output' }],
110
- related: ['status', 'verify', 'hook'],
111
- },
112
- 'context-source': {
113
- name: 'context-source',
114
- description: 'Connect external tools (Linear, Figma) via OAuth · list status · disconnect',
115
- usage: 'codehere context-source [list|connect <provider>|disconnect <provider>]',
116
- examples: [
117
- 'codehere context-source list',
118
- 'codehere context-source connect linear',
119
- 'codehere context-source connect figma --no-open',
120
- 'codehere context-source disconnect linear',
121
- ],
122
- options: [
123
- { flag: '--json', description: 'Machine-readable output' },
124
- { flag: '--no-open', description: 'For connect: print URL but skip auto-opening the browser' },
125
- ],
126
- related: ['serve', 'start'],
127
- },
128
- thread: {
129
- name: 'thread',
130
- description: 'Share or import a signed session bundle · local-first, no relay',
131
- usage: 'codehere thread <export|import|keys|trust|untrust> [args] [options]',
7
+ check: {
8
+ name: 'check',
9
+ description: 'Re-run your tests and report what actually passed',
10
+ usage: 'codehere check [target] [options]',
132
11
  examples: [
133
- 'codehere thread export <session-id> --out my-task.codehere.json',
134
- 'codehere thread import my-task.codehere.json',
135
- 'codehere thread import my-task.codehere.json --trust',
136
- 'codehere thread keys',
137
- 'codehere thread trust <pubkey-b64> "alice@laptop"',
12
+ 'codehere check',
13
+ 'codehere check --base origin/main',
14
+ 'codehere check --claim "added tests, all pass"',
15
+ 'codehere check --proof',
138
16
  ],
139
17
  options: [
140
- { flag: '--out <file>', description: 'For export: write to file (otherwise stdout)' },
141
- { flag: '--trust', description: 'For import: trust the signer key then proceed' },
142
18
  { flag: '--json', description: 'Machine-readable output' },
19
+ { flag: '--proof', description: 'Paste-ready proof block for a pull request' },
20
+ { flag: '--claim <text>', description: "The AI's summary: test files it names that do not exist are flagged" },
21
+ { flag: '--base <ref>', description: 'Look for weakened tests in everything since this branch left <ref>' },
143
22
  ],
144
- related: ['start', 'verify'],
145
- },
146
- serve: {
147
- name: 'serve',
148
- description: 'Start codehere as an MCP server (Claude Desktop, Cursor, Zed, etc.)',
149
- usage: 'codehere serve [options]',
150
- examples: ['codehere serve', 'codehere serve --show-config', 'codehere serve --port 8080'],
151
- options: [
152
- { flag: '--show-config', description: 'Print MCP config for Claude Desktop or Cursor' },
153
- { flag: '--port <n>', description: 'Port (default: 3773)' },
154
- ],
155
- related: ['hook'],
156
- },
157
- // === Configuration ===
158
- setup: {
159
- name: 'setup',
160
- description: 'Interactive first-run setup wizard',
161
- usage: 'codehere setup [options]',
162
- examples: ['codehere setup', 'codehere setup --force'],
163
- options: [{ flag: '--force, -f', description: 'Force reconfiguration' }],
164
- related: ['config', 'hook'],
165
- },
166
- config: {
167
- name: 'config',
168
- description: 'Manage configuration and preferences',
169
- usage: 'codehere config [action] [key] [value]',
170
- examples: ['codehere config', 'codehere config set temperature 0.5'],
171
- related: ['setup'],
172
23
  },
173
- health: {
174
- name: 'health',
175
- description: 'System health check · filesystem, memory, audit log accessible',
176
- usage: 'codehere health [options]',
177
- examples: ['codehere health', 'codehere health --json'],
178
- options: [{ flag: '--json', description: 'Output as JSON' }],
179
- related: ['status'],
180
- },
181
- completion: {
182
- name: 'completion',
183
- description: 'Generate bash, zsh, or fish completion script',
184
- usage: 'codehere completion <shell>',
185
- examples: [
186
- 'codehere completion bash >> ~/.bashrc',
187
- 'codehere completion zsh > /usr/local/share/zsh/site-functions/_codehere',
188
- 'codehere completion fish > ~/.config/fish/completions/codehere.fish',
189
- ],
190
- related: [],
24
+ help: {
25
+ name: 'help',
26
+ description: 'Show help for commands',
27
+ usage: 'codehere help [command]',
28
+ examples: ['codehere help', 'codehere help check'],
191
29
  },
192
30
  };
193
- const ALL_COMMANDS = Object.keys(COMMAND_INFO);
194
- /**
195
- * Find similar commands (for typo detection)
196
- */
197
- function findSimilarCommands(input, maxResults = 3) {
198
- const lowerInput = input.toLowerCase();
199
- // Exact match
200
- if (COMMAND_INFO[lowerInput]) {
201
- return [lowerInput];
202
- }
203
- // Calculate similarity scores
204
- const scores = ALL_COMMANDS.map((cmd) => {
205
- const lowerCmd = cmd.toLowerCase();
206
- // Exact substring match
207
- if (lowerCmd.includes(lowerInput) || lowerInput.includes(lowerCmd)) {
208
- return { cmd, score: 10 };
209
- }
210
- // Levenshtein distance (simple)
211
- const distance = levenshteinDistance(lowerInput, lowerCmd);
212
- const maxLen = Math.max(lowerInput.length, lowerCmd.length);
213
- const similarity = (maxLen - distance) / maxLen;
214
- return { cmd, score: similarity * 5 };
215
- });
216
- // Sort by score and return top matches
217
- return scores
218
- .filter((s) => s.score > 0.3)
219
- .sort((a, b) => b.score - a.score)
220
- .slice(0, maxResults)
221
- .map((s) => s.cmd);
222
- }
223
- /**
224
- * Simple Levenshtein distance calculation
225
- */
226
- function levenshteinDistance(str1, str2) {
227
- const m = str1.length;
228
- const n = str2.length;
229
- const dp = Array(m + 1)
230
- .fill(null)
231
- .map(() => Array(n + 1).fill(0));
232
- for (let i = 0; i <= m; i++)
233
- dp[i][0] = i;
234
- for (let j = 0; j <= n; j++)
235
- dp[0][j] = j;
236
- for (let i = 1; i <= m; i++) {
237
- for (let j = 1; j <= n; j++) {
238
- if (str1[i - 1] === str2[j - 1]) {
239
- dp[i][j] = dp[i - 1][j - 1];
240
- }
241
- else {
242
- dp[i][j] = Math.min(dp[i - 1][j] + 1, // deletion
243
- dp[i][j - 1] + 1, // insertion
244
- dp[i - 1][j - 1] + 1);
245
- }
246
- }
247
- }
248
- return dp[m][n];
249
- }
250
- /**
251
- * Display help for a specific command
252
- */
253
31
  function displayCommandHelp(commandName) {
254
32
  const command = COMMAND_INFO[commandName.toLowerCase()];
255
33
  if (!command) {
256
- const suggestions = findSimilarCommands(commandName);
257
34
  newline();
258
35
  console.error(colors.red(`Command '${commandName}' not found.`));
259
- if (suggestions.length > 0) {
260
- newline();
261
- console.log(colors.bold('Did you mean:'));
262
- suggestions.forEach((cmd) => {
263
- console.log(` ${colors.cyan(`codehere help ${cmd}`)}`);
264
- });
265
- newline();
266
- }
267
36
  console.log(colors.dim('Run') + ' ' + colors.cyan('codehere --help') + ' ' + colors.dim('to see all commands.'));
268
37
  newline();
269
38
  return;
@@ -286,50 +55,17 @@ function displayCommandHelp(commandName) {
286
55
  });
287
56
  newline();
288
57
  }
289
- if (command.related && command.related.length > 0) {
290
- console.log(colors.bold('Related'));
291
- command.related.forEach((related) => {
292
- console.log(' ' + colors.cyan(`codehere help ${related}`));
293
- });
294
- newline();
295
- }
296
- }
297
- /**
298
- * Display general help (all commands overview)
299
- */
300
- function printCmd(name, desc) {
301
- console.log(' ' + colors.cyan(name.padEnd(14)) + colors.dim(desc));
302
58
  }
303
59
  function displayGeneralHelp() {
304
60
  newline();
305
- console.log(colors.bold('codehere') + colors.dim(' · Your AI coding agents: audited, cost-bounded, cross-vendor'));
61
+ console.log(colors.bold('codehere') + colors.dim(' · re-run the tests an AI says passed'));
306
62
  newline();
307
- console.log(colors.bold('Delegate'));
308
- for (const cmd of ['start', 'task', 'kill']) {
309
- printCmd(cmd, COMMAND_INFO[cmd].description);
310
- }
311
- newline();
312
- console.log(colors.bold('Safety & Trust') + colors.dim(' (no API key, no agents needed)'));
313
- for (const cmd of ['hook', 'trust', 'report', 'status', 'serve']) {
314
- printCmd(cmd, COMMAND_INFO[cmd].description);
315
- }
316
- newline();
317
- console.log(colors.bold('Configuration'));
318
- for (const cmd of ['setup', 'config', 'health', 'completion']) {
319
- printCmd(cmd, COMMAND_INFO[cmd].description);
320
- }
321
- newline();
322
- console.log(colors.bold('Getting Started'));
323
- console.log(colors.dim(' 1. ') + colors.cyan('codehere start') + colors.dim(' Open the task intake at :3773'));
324
- console.log(colors.dim(' 2. ') + colors.cyan('codehere hook install') + colors.dim(' Audit every Claude Code action'));
325
- console.log(colors.dim(' 3. ') + colors.cyan('codehere trust .') + colors.dim(' Scan your project (no API key)'));
63
+ console.log(colors.bold('Check'));
64
+ console.log(' ' + colors.cyan('check'.padEnd(14)) + colors.dim('Re-run your tests and report what actually passed'));
326
65
  newline();
327
- console.log(colors.dim('Run ') + colors.cyan('codehere help <command>') + colors.dim(' for details on any command.'));
66
+ console.log(colors.dim('Run ') + colors.cyan('codehere help check') + colors.dim(' for its options.'));
328
67
  newline();
329
68
  }
330
- /**
331
- * Execute help command
332
- */
333
69
  export async function executeHelpCommand(commandName) {
334
70
  if (commandName) {
335
71
  displayCommandHelp(commandName);
package/dist/ui.js CHANGED
@@ -1,36 +1,8 @@
1
1
  import chalk from 'chalk';
2
- import Table from 'cli-table3';
3
- let cachedCliStyle = null;
4
- export function getCliStyle() {
5
- if (cachedCliStyle)
6
- return cachedCliStyle;
7
- const envStyle = process.env.CODEHERE_CLI_STYLE?.toLowerCase();
8
- cachedCliStyle = envStyle === 'verbose' ? 'verbose' : 'minimal';
9
- return cachedCliStyle;
10
- }
11
- export function isMinimalStyle() {
12
- return getCliStyle() === 'minimal';
13
- }
14
- // Minimal header for commands (used in minimal style)
15
- export function printMinimalHeader(command, query) {
16
- if (query) {
17
- console.log(colors.cyan(`codehere ${command}`) + colors.dim(' ▸ ') + query);
18
- }
19
- else {
20
- console.log(colors.cyan(`codehere ${command}`));
21
- }
22
- console.log();
23
- }
24
- // Professional color scheme - subtle and enterprise-ready
25
- // CLI color economy (DESIGN.md §5.2) — color carries MEANING, not decoration,
26
- // and is always redundant with a glyph + word so NO_COLOR / piped output stays
27
- // legible (chalk auto-disables on non-TTY and when NO_COLOR is set). The
28
- // semantic names below are the vocabulary CLI output should use; the raw chalk
29
- // names are kept for back-compat but new output uses meaning:
2
+ // Color roles (DESIGN.md §1): color carries meaning.
30
3
  // verified = green (independently verified ONLY) caught = red (a contradiction caught ONLY)
31
- // warn = amber (budget/attention) evidence = dim (machine facts, metadata)
32
- // identity = cyan (an agent/session id, sparingly) heading = bold (the one thing that matters)
33
- // Retired: magenta as decoration.
4
+ // warn = amber (attention) evidence = dim (machine facts, metadata)
5
+ // identity = cyan (an id, sparingly) heading = bold (the one thing that matters)
34
6
  export const colors = {
35
7
  success: chalk.green,
36
8
  error: chalk.red,
@@ -45,7 +17,6 @@ export const colors = {
45
17
  green: chalk.green,
46
18
  gray: chalk.gray,
47
19
  blue: chalk.blue,
48
- // semantic economy — prefer these in new CLI output
49
20
  verified: chalk.green,
50
21
  caught: chalk.red,
51
22
  warn: chalk.yellow,
@@ -53,9 +24,8 @@ export const colors = {
53
24
  identity: chalk.cyan,
54
25
  heading: chalk.bold,
55
26
  };
56
- // S19 glyph language (BINDING, shared with the web design tokens in
57
- // ui-page-v2): status = the sanctioned geometric set + ANSI color —
58
- // ✓ ✕ · — › ● ○ ⊘ — never emoji-as-icon, never pictographs in stdout/stderr.
27
+ // Glyph language (DESIGN.md): the sanctioned geometric set plus ANSI color,
28
+ // never emoji-as-icon.
59
29
  export const symbols = {
60
30
  success: '✓',
61
31
  error: '✕',
@@ -72,213 +42,12 @@ export const symbols = {
72
42
  minus: '-',
73
43
  bullet: '•',
74
44
  };
75
- // Professional banner - clean and minimal
76
- export function createBanner(title, subtitle) {
77
- const width = Math.max(title.length, subtitle?.length || 0) + 4;
78
- const top = '┌' + '─'.repeat(width - 2) + '┐';
79
- const bottom = '└' + '─'.repeat(width - 2) + '┘';
80
- const titleLine = '│ ' + colors.bold(title) + ' '.repeat(width - title.length - 3) + '│';
81
- let banner = `\n${colors.gray(top)}\n${colors.gray(titleLine)}\n`;
82
- if (subtitle) {
83
- const subtitleLine = '│ ' + colors.dim(subtitle) + ' '.repeat(width - subtitle.length - 3) + '│';
84
- banner += `${colors.gray(subtitleLine)}\n`;
85
- }
86
- banner += `${colors.gray(bottom)}\n`;
87
- return banner;
88
- }
89
- // Separator - clean line
90
- export function separator(char = '─', length = 60) {
91
- return colors.dim(char.repeat(length));
92
- }
93
- // Success message - professional
94
- export function success(message) {
95
- return colors.green(symbols.success + ' ' + message);
96
- }
97
- // Error message - professional
98
45
  export function error(message) {
99
46
  return colors.red(symbols.error + ' ' + message);
100
47
  }
101
- // Warning message - professional
102
- export function warning(message) {
103
- return colors.yellow(symbols.warning + ' ' + message);
104
- }
105
- // Info message - professional
106
- export function info(message) {
107
- return colors.blue(symbols.info + ' ' + message);
108
- }
109
- // Section heading (DESIGN.md §5.2) — the one structural line per block. Bold,
110
- // no color: color is reserved for meaning (verdict/identity), so a heading
111
- // earns emphasis from weight, not decoration. Legible with NO_COLOR (bold is
112
- // the fallback; the words carry it regardless).
113
- export function heading(message) {
114
- return colors.heading(message);
115
- }
116
- // Create professional table - minimal styling
117
- export function createTable(headers, rows) {
118
- const table = new Table({
119
- head: headers.map((h) => colors.bold(h)),
120
- style: {
121
- head: [],
122
- border: ['gray'],
123
- compact: false,
124
- },
125
- chars: {
126
- top: '─',
127
- 'top-mid': '┬',
128
- 'top-left': '┌',
129
- 'top-right': '┐',
130
- bottom: '─',
131
- 'bottom-mid': '┴',
132
- 'bottom-left': '└',
133
- 'bottom-right': '┘',
134
- left: '│',
135
- 'left-mid': '├',
136
- mid: '─',
137
- 'mid-mid': '┼',
138
- right: '│',
139
- 'right-mid': '┤',
140
- middle: '│',
141
- },
142
- colWidths: headers.map((_, i) => {
143
- const maxWidth = Math.max(headers[i].length, ...rows.map((row) => (row[i] || '').length));
144
- return Math.min(maxWidth + 2, 50);
145
- }),
146
- });
147
- rows.forEach((row) => table.push(row));
148
- return table;
149
- }
150
- // Format number - bold
151
- export function formatNumber(num) {
152
- return colors.bold(num.toString());
153
- }
154
- // Professional section header
155
- export function sectionHeader(title) {
156
- console.log(colors.bold(title));
157
- console.log(separator());
158
- }
159
- // Print empty line
160
48
  export function newline(count = 1) {
161
49
  for (let i = 0; i < count; i++) {
162
50
  console.log();
163
51
  }
164
52
  }
165
- // Gradient logo for "codehere" - coral → purple → blue
166
- export function createCodehereLogo() {
167
- const text = 'codehere';
168
- const letters = text.split('');
169
- // Color stops: coral → blue (matches landing page #ff9a76 → #4a90e2)
170
- const colorStops = [
171
- { r: 255, g: 154, b: 118 }, // #ff9a76 coral
172
- { r: 255, g: 148, b: 110 },
173
- { r: 230, g: 148, b: 130 },
174
- { r: 200, g: 150, b: 155 },
175
- { r: 160, g: 155, b: 190 },
176
- { r: 120, g: 158, b: 218 },
177
- { r: 85, g: 150, b: 232 },
178
- { r: 74, g: 144, b: 226 }, // #4a90e2 blue
179
- ];
180
- // Map each letter to a color
181
- const coloredLetters = letters.map((letter, index) => {
182
- const colorIndex = Math.floor((index / (letters.length - 1)) * (colorStops.length - 1));
183
- const color = colorStops[colorIndex];
184
- // Use chalk's rgb for gradient effect
185
- return chalk.rgb(color.r, color.g, color.b)(letter);
186
- });
187
- return coloredLetters.join('');
188
- }
189
- // Import centralized version utility
190
- import { getVersionWithPrefix } from './utils/version.js';
191
- // Welcome message with logo
192
- export function createWelcomeMessage() {
193
- const logo = createCodehereLogo();
194
- const version = getVersionWithPrefix();
195
- // Matches the positioning in `codehere --help` and `codehere help`. codehere
196
- // is the LAYER over your coding agents, not itself an agent — the old
197
- // "AI coding agent with built-in safety" line implied the opposite.
198
- const tagline = 'Your AI coding agents: audited, cost-bounded, cross-vendor';
199
- return `
200
- ${colors.bold(logo)} ${colors.dim(version)}
201
- ${colors.dim(tagline)}
202
- `;
203
- }
204
- // ── Delight utilities ─────────────────────────────────────────────────────────
205
- const CLEAN_SCAN_CELEBRATIONS = [
206
- 'Perfect score. Nothing to worry about.',
207
- 'All clear · clean scan.',
208
- 'Zero findings. Enjoy the green.',
209
- 'Nothing suspicious. Carry on.',
210
- 'Clean as a whistle.',
211
- ];
212
- export function randomCleanScan() {
213
- return CLEAN_SCAN_CELEBRATIONS[Math.floor(Math.random() * CLEAN_SCAN_CELEBRATIONS.length)];
214
- }
215
- /**
216
- * v0.6.2 sync — every non-replOnly entry MUST correspond to a real
217
- * `program.command('<name>')` registration in src/index.ts. Drift is
218
- * blocked by test/cli/slash-commands-sync.test.ts (UAT-001 CI guard).
219
- *
220
- * Pre-fix (v0.6.1 and earlier): this list carried 16 ghost commands
221
- * (ask/explain/fix/review/plan/suggest/test/docs/refactor/orchestrate/run/
222
- * git-review/index/cost/models/undo) removed in v0.3 — and was missing
223
- * 8 real commands (init/memory/permission/narrator/budget/start/task/kill).
224
- * Catastrophic first-impression bug found by UAT 2026-05-19.
225
- */
226
- export const SLASH_COMMANDS = [
227
- // Setup + config (no key)
228
- { name: 'setup', args: '', description: 'Interactive first-run wizard', noKey: true },
229
- { name: 'init', args: '', description: 'Scaffold .codehere/ in this repo', noKey: true },
230
- { name: 'memory', args: '<sub>', description: 'Project memory · init / repo-map / show', noKey: true },
231
- { name: 'config', args: '[key] [value]', description: 'Manage preferences', noKey: true },
232
- { name: 'permission', args: '<sub>', description: 'Manage .codehere/permissions.yaml allow/deny', noKey: true },
233
- { name: 'narrator', args: '', description: 'Customize the PM narrator prompt', noKey: true },
234
- { name: 'budget', args: '[set <amount>]', description: 'Daily spend budget', noKey: true },
235
- {
236
- name: 'team',
237
- args: '[set-dir <path>|budget <usd>]',
238
- description: "Merge each machine's spend into one team total · local-first",
239
- noKey: true,
240
- },
241
- // Safety + observability (no key)
242
- { name: 'hook', args: '[install|status]', description: 'Safety hook management', noKey: true },
243
- { name: 'trust', args: '[path]', description: 'Scan for vulnerabilities', noKey: true },
244
- {
245
- name: 'scan',
246
- args: '[path]',
247
- description: 'Is your app safe to ship? — the 1 thing that gets you hacked',
248
- noKey: true,
249
- },
250
- { name: 'check', args: '[path]', description: 'Re-run your tests — proof, not the AI’s claim', noKey: true },
251
- { name: 'report', args: '[path]', description: 'Shareable security audit', noKey: true },
252
- { name: 'status', args: '', description: 'Security dashboard · hook activity', noKey: true },
253
- {
254
- name: 'verify',
255
- args: '[session-id]',
256
- description: "Verify a session's Final Report against recorded reality",
257
- noKey: true,
258
- },
259
- { name: 'audit', args: '[verify|show]', description: 'Inspect the hash-chained audit log', noKey: true },
260
- { name: 'search', args: '<query>', description: 'Search past sessions · every hit cites its evidence', noKey: true },
261
- {
262
- name: 'context-source',
263
- args: '[list|connect|disconnect]',
264
- description: 'Connect Linear/Figma via OAuth',
265
- noKey: true,
266
- },
267
- { name: 'thread', args: '<sub> [arg]', description: 'Share or import a signed session bundle', noKey: true },
268
- { name: 'health', args: '', description: 'System health + metrics', noKey: true },
269
- // Orchestration
270
- { name: 'start', args: '', description: 'Open the dashboard at localhost:3773' },
271
- { name: 'serve', args: '', description: 'Run headless MCP server (no UI)', noKey: true },
272
- { name: 'task', args: '<prompt>', description: 'Delegate a task to a coding agent' },
273
- { name: 'reply', args: '<id> <text>', description: 'Continue a goal · send a follow-up to a session' },
274
- { name: 'kill', args: '<sessionId>', description: 'Kill a running task' },
275
- // Utility (no key)
276
- { name: 'help', args: '', description: 'Command reference', noKey: true },
277
- // REPL-only meta-commands (handled in repl.ts, not in Commander).
278
- // Marked replOnly so the CI sync guard skips them.
279
- { name: 'agents', args: '', description: 'List installed specialists', noKey: true, replOnly: true },
280
- { name: 'history', args: '', description: 'Recent REPL session history', noKey: true, replOnly: true },
281
- { name: 'clear', args: '', description: 'Clear the screen', noKey: true, replOnly: true },
282
- { name: 'exit', args: '', description: 'Leave the session', noKey: true, replOnly: true },
283
- ];
284
53
  //# sourceMappingURL=ui.js.map
@@ -37,10 +37,4 @@ export function getVersion() {
37
37
  cachedVersion = '0.3.0';
38
38
  return cachedVersion;
39
39
  }
40
- /**
41
- * Get version with 'v' prefix (e.g., "v0.2.0")
42
- */
43
- export function getVersionWithPrefix() {
44
- return `v${getVersion()}`;
45
- }
46
40
  //# sourceMappingURL=version.js.map