codehere 1.0.1 → 1.0.3
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.
- package/README.md +35 -193
- package/dist/application/use-cases/check-claimed-tests.js +81 -0
- package/dist/application/use-cases/detect-test-weakening.js +237 -0
- package/dist/application/use-cases/rerun-tests.js +110 -7
- package/dist/index.js +38 -1212
- package/dist/infrastructure/orchestration/artifacts-extractor.js +2 -323
- package/dist/presentation/cli/commands/check-command.js +178 -23
- package/dist/presentation/cli/commands/help-command.js +21 -285
- package/dist/ui.js +5 -236
- package/dist/utils/version.js +0 -6
- package/package.json +9 -38
- package/dist/application/services/verdict-service.js +0 -154
- package/dist/application/use-cases/assess-cross-vendor.js +0 -126
- package/dist/application/use-cases/build-cross-vendor-verdict.js +0 -118
- package/dist/application/use-cases/domain-trust.js +0 -110
- package/dist/application/use-cases/export-aat.js +0 -107
- package/dist/application/use-cases/generate-acceptance-criteria.js +0 -223
- package/dist/application/use-cases/generate-final-report.js +0 -259
- package/dist/application/use-cases/generate-narration.js +0 -130
- package/dist/application/use-cases/generate-thread-title.js +0 -181
- package/dist/application/use-cases/narrator-prompt-template.js +0 -158
- package/dist/application/use-cases/plan-auto-review.js +0 -57
- package/dist/application/use-cases/reconcile-audit.js +0 -100
- package/dist/application/use-cases/search-sessions.js +0 -70
- package/dist/application/use-cases/should-auto-review.js +0 -71
- package/dist/application/use-cases/thread-export.js +0 -245
- package/dist/application/use-cases/verify-claim.js +0 -456
- package/dist/application/use-cases/write-pass.js +0 -277
- package/dist/domain/audit.js +0 -11
- package/dist/domain/services/codebase-detector.js +0 -85
- package/dist/domain/task.js +0 -91
- package/dist/error-handler.js +0 -139
- package/dist/infrastructure/completion/bash-completion.js +0 -29
- package/dist/infrastructure/completion/fish-completion.js +0 -17
- package/dist/infrastructure/completion/zsh-completion.js +0 -25
- package/dist/infrastructure/config/config-manager.js +0 -174
- package/dist/infrastructure/config/product-context.js +0 -49
- package/dist/infrastructure/context/adapters/drawio-source.js +0 -157
- package/dist/infrastructure/context/adapters/figma-source.js +0 -198
- package/dist/infrastructure/context/adapters/github-issue-source.js +0 -160
- package/dist/infrastructure/context/adapters/linear-source.js +0 -190
- package/dist/infrastructure/context/context-resolver.js +0 -144
- package/dist/infrastructure/context/context-source.js +0 -114
- package/dist/infrastructure/context/github-api.js +0 -110
- package/dist/infrastructure/context/github-device-flow.js +0 -65
- package/dist/infrastructure/context/oauth-flow.js +0 -207
- package/dist/infrastructure/context/oauth-store.js +0 -122
- package/dist/infrastructure/context/registry-bootstrap.js +0 -95
- package/dist/infrastructure/context/write-pass-resolver.js +0 -106
- package/dist/infrastructure/cost/budget-config.js +0 -114
- package/dist/infrastructure/cost/cost-router.js +0 -97
- package/dist/infrastructure/cost/spend-aggregator.js +0 -222
- package/dist/infrastructure/cost/team-ledger.js +0 -355
- package/dist/infrastructure/discovery/discovery-log.js +0 -85
- package/dist/infrastructure/hooks/audit-tip-signature.js +0 -336
- package/dist/infrastructure/hooks/claude-sdk-hook.js +0 -1018
- package/dist/infrastructure/hooks/hook-mode.js +0 -87
- package/dist/infrastructure/hooks/mirror-tool-call-to-audit.js +0 -49
- package/dist/infrastructure/hooks/pre-prompt-scan.js +0 -122
- package/dist/infrastructure/hooks/session-analyzer.js +0 -177
- package/dist/infrastructure/observability/execution-tracer.js +0 -227
- package/dist/infrastructure/orchestration/agent-adapter.js +0 -13
- package/dist/infrastructure/orchestration/agent-installer.js +0 -101
- package/dist/infrastructure/orchestration/agents-config-seed.js +0 -68
- package/dist/infrastructure/orchestration/aider-adapter.js +0 -611
- package/dist/infrastructure/orchestration/cassette-recorder.js +0 -120
- package/dist/infrastructure/orchestration/claude-code-adapter.js +0 -592
- package/dist/infrastructure/orchestration/codex-adapter.js +0 -574
- package/dist/infrastructure/orchestration/conductor-adapter.js +0 -416
- package/dist/infrastructure/orchestration/context-handoff.js +0 -162
- package/dist/infrastructure/orchestration/control/codex-control-surface.js +0 -99
- package/dist/infrastructure/orchestration/control/control-surface.js +0 -15
- package/dist/infrastructure/orchestration/detect-ollama.js +0 -75
- package/dist/infrastructure/orchestration/failover-classifier.js +0 -151
- package/dist/infrastructure/orchestration/failover-config.js +0 -67
- package/dist/infrastructure/orchestration/failover-policy.js +0 -106
- package/dist/infrastructure/orchestration/gemini-adapter.js +0 -663
- package/dist/infrastructure/orchestration/generic-cli-adapter.js +0 -689
- package/dist/infrastructure/orchestration/graphify-context.js +0 -209
- package/dist/infrastructure/orchestration/memory-injector.js +0 -380
- package/dist/infrastructure/orchestration/mocks/mock-agent-repl.js +0 -388
- package/dist/infrastructure/orchestration/mocks/mock-codex-app-server.js +0 -73
- package/dist/infrastructure/orchestration/mocks/mock-synthesis.js +0 -83
- package/dist/infrastructure/orchestration/mocks/resolve-agent-spawn.js +0 -37
- package/dist/infrastructure/orchestration/opencode-adapter.js +0 -580
- package/dist/infrastructure/orchestration/progress-aggregator.js +0 -906
- package/dist/infrastructure/orchestration/readiness.js +0 -103
- package/dist/infrastructure/orchestration/session-manager.js +0 -1590
- package/dist/infrastructure/orchestration/session-persistence.js +0 -394
- package/dist/infrastructure/orchestration/thread-key-store.js +0 -127
- package/dist/infrastructure/orchestration/write-pass-store.js +0 -38
- package/dist/infrastructure/protocols/cloud-sync.js +0 -207
- package/dist/infrastructure/protocols/mcp-helpers.js +0 -25
- package/dist/infrastructure/protocols/mcp-server-impl.js +0 -3935
- package/dist/infrastructure/protocols/mcp-tools.js +0 -401
- package/dist/infrastructure/protocols/probe-port.js +0 -36
- package/dist/infrastructure/protocols/thread-phase.js +0 -105
- package/dist/infrastructure/protocols/ui/app-script-artifacts.js +0 -121
- package/dist/infrastructure/protocols/ui/app-script-audit-footer.js +0 -44
- package/dist/infrastructure/protocols/ui/app-script-audit-verify.js +0 -56
- package/dist/infrastructure/protocols/ui/app-script-composer-cost.js +0 -588
- package/dist/infrastructure/protocols/ui/app-script-context-sources.js +0 -168
- package/dist/infrastructure/protocols/ui/app-script-conversation.js +0 -67
- package/dist/infrastructure/protocols/ui/app-script-drawer.js +0 -115
- package/dist/infrastructure/protocols/ui/app-script-failover.js +0 -133
- package/dist/infrastructure/protocols/ui/app-script-github.js +0 -113
- package/dist/infrastructure/protocols/ui/app-script-observer.js +0 -104
- package/dist/infrastructure/protocols/ui/app-script-onboarding.js +0 -80
- package/dist/infrastructure/protocols/ui/app-script-overlay.js +0 -203
- package/dist/infrastructure/protocols/ui/app-script-recovery.js +0 -136
- package/dist/infrastructure/protocols/ui/app-script-render.js +0 -166
- package/dist/infrastructure/protocols/ui/app-script-share.js +0 -78
- package/dist/infrastructure/protocols/ui/app-script-sidebar.js +0 -194
- package/dist/infrastructure/protocols/ui/app-script-tour.js +0 -78
- package/dist/infrastructure/protocols/ui/app-script-wpass.js +0 -312
- package/dist/infrastructure/protocols/ui/app-script.js +0 -2998
- package/dist/infrastructure/protocols/ui/font-faces.js +0 -7
- package/dist/infrastructure/protocols/ui/styles.js +0 -2147
- package/dist/infrastructure/protocols/ui/tokens.js +0 -96
- package/dist/infrastructure/protocols/ui-page-v2.js +0 -320
- package/dist/infrastructure/protocols/verify-page.js +0 -1677
- package/dist/infrastructure/security/file-collection.js +0 -118
- package/dist/infrastructure/security/fix-code.js +0 -144
- package/dist/infrastructure/security/fix-secret.js +0 -89
- package/dist/infrastructure/security/permissions-config.js +0 -235
- package/dist/infrastructure/security/scan-types.js +0 -10
- package/dist/infrastructure/security/ship-scan.js +0 -195
- package/dist/infrastructure/security/trust-scorer.js +0 -724
- package/dist/infrastructure/security/vibe-checks.js +0 -99
- package/dist/infrastructure/storage/atomic-write.js +0 -86
- package/dist/infrastructure/storage/cross-tool-agents.js +0 -268
- package/dist/infrastructure/storage/project-thread-migration.js +0 -237
- package/dist/infrastructure/storage/project-thread-mirror.js +0 -671
- package/dist/infrastructure/storage/project-thread-reader.js +0 -409
- package/dist/infrastructure/storage/project-thread-title-backfill.js +0 -214
- package/dist/monitoring.js +0 -212
- package/dist/presentation/cli/commands/audit-command.js +0 -201
- package/dist/presentation/cli/commands/budget-command.js +0 -79
- package/dist/presentation/cli/commands/config-command.js +0 -125
- package/dist/presentation/cli/commands/context-source-command.js +0 -217
- package/dist/presentation/cli/commands/hook-command.js +0 -265
- package/dist/presentation/cli/commands/init-command.js +0 -590
- package/dist/presentation/cli/commands/memory-command.js +0 -1031
- package/dist/presentation/cli/commands/narrator-command.js +0 -101
- package/dist/presentation/cli/commands/permission-command.js +0 -105
- package/dist/presentation/cli/commands/protocols-builder.js +0 -254
- package/dist/presentation/cli/commands/protocols-command.js +0 -84
- package/dist/presentation/cli/commands/repo-map-builder.js +0 -247
- package/dist/presentation/cli/commands/report-command.js +0 -403
- package/dist/presentation/cli/commands/scan-command.js +0 -52
- package/dist/presentation/cli/commands/scan-tool-command.js +0 -110
- package/dist/presentation/cli/commands/search-command.js +0 -51
- package/dist/presentation/cli/commands/setup-command.js +0 -330
- package/dist/presentation/cli/commands/status-command.js +0 -614
- package/dist/presentation/cli/commands/team-command.js +0 -256
- package/dist/presentation/cli/commands/thread-command.js +0 -370
- package/dist/presentation/cli/commands/trust-command.js +0 -328
- package/dist/presentation/cli/commands/verify-command.js +0 -298
- package/dist/presentation/cli/error-display.js +0 -328
- package/dist/presentation/cli/repl.js +0 -805
- package/dist/presentation/cli/task-deliverable.js +0 -153
- package/dist/testing/cassette.js +0 -125
- package/dist/testing/replay-adapter.js +0 -147
|
@@ -1,269 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Help Command
|
|
3
|
-
*
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
134
|
-
'codehere
|
|
135
|
-
'codehere
|
|
136
|
-
'codehere
|
|
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
|
-
|
|
174
|
-
name: '
|
|
175
|
-
description: '
|
|
176
|
-
usage: 'codehere
|
|
177
|
-
examples: ['codehere
|
|
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(' ·
|
|
61
|
+
console.log(colors.bold('codehere') + colors.dim(' · re-run the tests an AI says passed'));
|
|
306
62
|
newline();
|
|
307
|
-
console.log(colors.bold('
|
|
308
|
-
|
|
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
|
|
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
|
-
|
|
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 (
|
|
32
|
-
// identity = cyan (an
|
|
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
|
-
//
|
|
57
|
-
//
|
|
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
|
package/dist/utils/version.js
CHANGED
|
@@ -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
|