codehere 0.2.2 → 0.3.0-rc.10
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 +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +261 -1224
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +348 -72
- package/dist/infrastructure/observability/execution-tracer.js +11 -6
- package/dist/infrastructure/orchestration/agent-adapter.js +13 -0
- package/dist/infrastructure/orchestration/agent-installer.js +101 -0
- package/dist/infrastructure/orchestration/agents-config-seed.js +56 -0
- package/dist/infrastructure/orchestration/aider-adapter.js +319 -0
- package/dist/infrastructure/orchestration/artifacts-extractor.js +175 -0
- package/dist/infrastructure/orchestration/claude-code-adapter.js +352 -0
- package/dist/infrastructure/orchestration/codex-adapter.js +310 -0
- package/dist/infrastructure/orchestration/conductor-adapter.js +340 -0
- package/dist/infrastructure/orchestration/generic-cli-adapter.js +553 -0
- package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
- package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
- package/dist/infrastructure/orchestration/readiness.js +106 -0
- package/dist/infrastructure/orchestration/session-manager.js +278 -0
- package/dist/infrastructure/orchestration/session-persistence.js +109 -0
- package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
- package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
- package/dist/infrastructure/protocols/probe-port.js +36 -0
- package/dist/infrastructure/protocols/ui-page.js +1827 -0
- package/dist/infrastructure/security/file-collection.js +115 -0
- package/dist/infrastructure/security/trust-scorer.js +301 -56
- package/dist/infrastructure/storage/task-repository.js +8 -7
- package/dist/monitoring.js +9 -38
- package/dist/presentation/cli/commands/help-command.js +96 -139
- package/dist/presentation/cli/commands/hook-command.js +17 -24
- package/dist/presentation/cli/commands/report-command.js +59 -72
- package/dist/presentation/cli/commands/setup-command.js +4 -4
- package/dist/presentation/cli/commands/status-command.js +321 -30
- package/dist/presentation/cli/commands/trust-command.js +84 -72
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/presentation/cli/repl.js +474 -0
- package/dist/ui.js +11 -11
- package/package.json +24 -62
- package/dist/agents/base.js +0 -101
- package/dist/agents/orchestrator-model-driven.js +0 -141
- package/dist/agents/react-orchestrator-agent.js +0 -54
- package/dist/application/agents/execution-agent.js +0 -508
- package/dist/application/agents/multi-agent-orchestrator.js +0 -295
- package/dist/application/agents/planning-agent.js +0 -433
- package/dist/application/agents/validation-agent.js +0 -317
- package/dist/application/architectures/plan-and-act.js +0 -242
- package/dist/application/index.js +0 -12
- package/dist/application/services/agent-factory.js +0 -28
- package/dist/application/services/dependency-container.js +0 -596
- package/dist/application/services/git-context-service.js +0 -83
- package/dist/application/services/intelligent-router.js +0 -934
- package/dist/application/services/tool-executor-service.js +0 -94
- package/dist/application/use-cases/ask-question-use-case.js +0 -338
- package/dist/application/use-cases/edit-file-use-case.js +0 -830
- package/dist/application/use-cases/explain-file-use-case.js +0 -50
- package/dist/application/use-cases/index-codebase-use-case.js +0 -113
- package/dist/application/use-cases/planning-use-case.js +0 -276
- package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
- package/dist/application/use-cases/reflexion-use-case.js +0 -30
- package/dist/application/workflows/deterministic-workflows.js +0 -189
- package/dist/ast-parser.js +0 -331
- package/dist/cache.js +0 -180
- package/dist/chat.js +0 -251
- package/dist/code-analysis.js +0 -327
- package/dist/context.js +0 -187
- package/dist/docs.js +0 -146
- package/dist/domain/entities/code-chunk.js +0 -6
- package/dist/domain/entities/decision.js +0 -9
- package/dist/domain/entities/edit.js +0 -6
- package/dist/domain/entities/knowledge-node.js +0 -9
- package/dist/domain/entities/knowledge-preservation.js +0 -10
- package/dist/domain/entities/memory.js +0 -6
- package/dist/domain/entities/pattern.js +0 -7
- package/dist/domain/entities/plan.js +0 -6
- package/dist/domain/entities/query.js +0 -6
- package/dist/domain/errors/embeddings-not-found-error.js +0 -13
- package/dist/domain/index.js +0 -19
- package/dist/domain/interfaces/ai-service.interface.js +0 -6
- package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
- package/dist/domain/interfaces/decision-repository.interface.js +0 -9
- package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
- package/dist/domain/interfaces/memory-repository.interface.js +0 -6
- package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
- package/dist/domain/interfaces/verification-service.interface.js +0 -6
- package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
- package/dist/domain/services/decision-recorder.js +0 -223
- package/dist/domain/services/decision-retriever.js +0 -133
- package/dist/domain/services/environment-mode-manager.js +0 -22
- package/dist/domain/services/graded-memory-activation.js +0 -69
- package/dist/domain/services/knowledge-access.js +0 -132
- package/dist/domain/services/knowledge-extractor.js +0 -247
- package/dist/domain/services/knowledge-graph-builder.js +0 -268
- package/dist/domain/services/knowledge-graph-query.js +0 -187
- package/dist/domain/services/memory-retriever.js +0 -82
- package/dist/domain/services/memory-synthesizer.js +0 -91
- package/dist/domain/services/pattern-extractor.js +0 -442
- package/dist/domain/services/query-intent-classifier.js +0 -140
- package/dist/domain/services/react-loop.js +0 -186
- package/dist/domain/services/risk-tier-detector.js +0 -78
- package/dist/edit.js +0 -319
- package/dist/embed.js +0 -459
- package/dist/formatter.js +0 -168
- package/dist/git.js +0 -198
- package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
- package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
- package/dist/infrastructure/ai/model-config.js +0 -84
- package/dist/infrastructure/ai/provider-ai-service.js +0 -477
- package/dist/infrastructure/cache/embedding-cache.js +0 -175
- package/dist/infrastructure/cache/query-result-cache.js +0 -66
- package/dist/infrastructure/cache/response-cache.js +0 -48
- package/dist/infrastructure/cache/security-scan-cache.js +0 -47
- package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
- package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
- package/dist/infrastructure/context/context-compressor.js +0 -329
- package/dist/infrastructure/context/conversation-context.js +0 -128
- package/dist/infrastructure/context/session-manager.js +0 -94
- package/dist/infrastructure/cost/cost-tracker.js +0 -360
- package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
- package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
- package/dist/infrastructure/governance/policy-as-code.js +0 -258
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
- package/dist/infrastructure/index.js +0 -7
- package/dist/infrastructure/observability/prompt-versioner.js +0 -145
- package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
- package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
- package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
- package/dist/infrastructure/protocols/mcp-server.js +0 -333
- package/dist/infrastructure/protocols/streaming-handler.js +0 -103
- package/dist/infrastructure/providers/cohere-provider.js +0 -444
- package/dist/infrastructure/providers/fake-provider.js +0 -130
- package/dist/infrastructure/providers/local-llm-provider.js +0 -330
- package/dist/infrastructure/providers/model-config.types.js +0 -9
- package/dist/infrastructure/providers/model-provider.interface.js +0 -8
- package/dist/infrastructure/providers/openai-provider.js +0 -413
- package/dist/infrastructure/providers/openrouter-provider.js +0 -399
- package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
- package/dist/infrastructure/providers/provider-config-loader.js +0 -120
- package/dist/infrastructure/providers/provider-registry.js +0 -88
- package/dist/infrastructure/safety/pattern-detector.js +0 -133
- package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
- package/dist/infrastructure/security/docker-sandbox.js +0 -178
- package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
- package/dist/infrastructure/security/license-scanner.js +0 -167
- package/dist/infrastructure/security/provider-bias-detector.js +0 -164
- package/dist/infrastructure/security/sandbox-executor.js +0 -64
- package/dist/infrastructure/serialization/toon-serializer.js +0 -119
- package/dist/infrastructure/storage/memory-stream-service.js +0 -204
- package/dist/infrastructure/storage/plan-repository.js +0 -96
- package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
- package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
- package/dist/infrastructure/storage/task-helpers.js +0 -197
- package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
- package/dist/infrastructure/ux/appropriate-friction.js +0 -213
- package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
- package/dist/infrastructure/ux/capability-boundaries.js +0 -42
- package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
- package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
- package/dist/infrastructure/ux/expectation-management.js +0 -327
- package/dist/infrastructure/ux/feature-discovery.js +0 -14
- package/dist/infrastructure/ux/feedback-prompt.js +0 -45
- package/dist/infrastructure/ux/hitl-validation.js +0 -297
- package/dist/infrastructure/ux/progress-indicator.js +0 -116
- package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
- package/dist/infrastructure/ux/review-checkpoint.js +0 -72
- package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
- package/dist/infrastructure/ux/stream-markdown.js +0 -151
- package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
- package/dist/infrastructure/ux/team-standards.js +0 -196
- package/dist/infrastructure/ux/transparency.js +0 -71
- package/dist/infrastructure/validation/agent-feedback.js +0 -55
- package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
- package/dist/infrastructure/validation/review-handler.js +0 -40
- package/dist/infrastructure/validation/summary-aggregator.js +0 -70
- package/dist/infrastructure/validation/summary-extractor.js +0 -45
- package/dist/infrastructure/validation/trace-summary.js +0 -52
- package/dist/infrastructure/verification/verification-service.js +0 -47
- package/dist/infrastructure/xai/attention-visualizer.js +0 -172
- package/dist/infrastructure/xai/cot-visualizer.js +0 -283
- package/dist/infrastructure/xai/decision-tree-log.js +0 -212
- package/dist/infrastructure/xai/interactive-xai.js +0 -260
- package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
- package/dist/intelligent-retrieval.js +0 -272
- package/dist/intent/classifier.js +0 -2
- package/dist/intent/context.js +0 -2
- package/dist/iterative-refinement.js +0 -189
- package/dist/learning.js +0 -232
- package/dist/log.js +0 -31
- package/dist/migrate.js +0 -133
- package/dist/parallel-processor.js +0 -534
- package/dist/planner.js +0 -198
- package/dist/policy.js +0 -26
- package/dist/presentation/cli/commands/ask-command.js +0 -314
- package/dist/presentation/cli/commands/cost-command.js +0 -191
- package/dist/presentation/cli/commands/decision-command.js +0 -207
- package/dist/presentation/cli/commands/docs-command.js +0 -25
- package/dist/presentation/cli/commands/fix-command.js +0 -53
- package/dist/presentation/cli/commands/knowledge-command.js +0 -129
- package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
- package/dist/presentation/cli/commands/models-command.js +0 -194
- package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
- package/dist/presentation/cli/commands/plan-command.js +0 -246
- package/dist/presentation/cli/commands/product-command.js +0 -199
- package/dist/presentation/cli/commands/react-command.js +0 -181
- package/dist/presentation/cli/commands/review-command.js +0 -154
- package/dist/presentation/cli/commands/run-command.js +0 -188
- package/dist/presentation/cli/commands/smart-command.js +0 -395
- package/dist/presentation/cli/commands/suggest-command.js +0 -138
- package/dist/presentation/cli/commands/trace-command.js +0 -129
- package/dist/presentation/cli/commands/undo-command.js +0 -150
- package/dist/query-optimizer.js +0 -205
- package/dist/refactor.js +0 -116
- package/dist/review.js +0 -206
- package/dist/search.js +0 -163
- package/dist/session.js +0 -704
- package/dist/task-verification.js +0 -336
- package/dist/testgen.js +0 -166
- package/dist/token-optimizer.js +0 -277
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit.js +0 -235
- package/dist/tools/executor.js +0 -153
- package/dist/tools/git-tool.js +0 -292
- package/dist/tools/parser.js +0 -158
- package/dist/tools/registry.js +0 -302
- package/dist/tools/search.js +0 -100
- package/dist/types.js +0 -2
- package/dist/utils/check-api-status.js +0 -100
- package/dist/utils/diff-parser.js +0 -162
- package/dist/verification/backup.js +0 -259
- package/dist/verification/compiler.js +0 -264
- package/dist/verification/index.js +0 -273
- package/dist/verification/test-runner.js +0 -379
|
@@ -17,57 +17,34 @@
|
|
|
17
17
|
* - Actionable recommendations in plain English
|
|
18
18
|
* - A shareable badge and attribution
|
|
19
19
|
*/
|
|
20
|
-
import { writeFileSync } from 'fs';
|
|
21
|
-
import { basename, relative } from 'path';
|
|
20
|
+
import { writeFileSync, readFileSync, existsSync } from 'fs';
|
|
21
|
+
import { basename, relative, join, isAbsolute } from 'path';
|
|
22
22
|
import { colors, success, error, newline, info } from '../../../ui.js';
|
|
23
23
|
import { scoreFile } from '../../../infrastructure/security/trust-scorer.js';
|
|
24
|
-
import {
|
|
25
|
-
import { join, extname } from 'path';
|
|
24
|
+
import { collectCodeFiles } from '../../../infrastructure/security/file-collection.js';
|
|
26
25
|
import { loadProductContext, adjustRecommendation } from '../../../infrastructure/config/product-context.js';
|
|
27
|
-
// ── File collection (mirrors trust-command) ──────────────────────────────────
|
|
28
|
-
const CODE_EXTENSIONS = new Set([
|
|
29
|
-
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
30
|
-
'.py', '.rb', '.go', '.java', '.cs', '.php',
|
|
31
|
-
'.sh', '.bash', '.zsh',
|
|
32
|
-
'.sql', '.html', '.vue', '.svelte',
|
|
33
|
-
]);
|
|
34
|
-
const IGNORE_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', 'coverage', '.cache', '.codehere', '.codehere-cache']);
|
|
35
|
-
function collectFiles(target) {
|
|
36
|
-
const stat = statSync(target);
|
|
37
|
-
if (stat.isFile())
|
|
38
|
-
return [target];
|
|
39
|
-
const files = [];
|
|
40
|
-
function walk(dir) {
|
|
41
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
42
|
-
if (IGNORE_DIRS.has(entry.name))
|
|
43
|
-
continue;
|
|
44
|
-
const full = join(dir, entry.name);
|
|
45
|
-
if (entry.isDirectory()) {
|
|
46
|
-
walk(full);
|
|
47
|
-
}
|
|
48
|
-
else if (CODE_EXTENSIONS.has(extname(entry.name))) {
|
|
49
|
-
files.push(full);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
walk(target);
|
|
54
|
-
return files;
|
|
55
|
-
}
|
|
56
26
|
// ── Markdown generation ───────────────────────────────────────────────────────
|
|
57
27
|
function gradeEmoji(grade) {
|
|
58
28
|
return grade === 'A' ? '🟢' : grade === 'B' ? '🟡' : grade === 'C' ? '🟠' : grade === 'D' ? '🔴' : '🚨';
|
|
59
29
|
}
|
|
60
30
|
function severityLabel(severity) {
|
|
61
|
-
return severity === 'critical'
|
|
62
|
-
|
|
63
|
-
|
|
31
|
+
return severity === 'critical'
|
|
32
|
+
? '🚨 Critical'
|
|
33
|
+
: severity === 'high'
|
|
34
|
+
? '⚠️ High'
|
|
35
|
+
: severity === 'medium'
|
|
36
|
+
? '🔵 Medium'
|
|
64
37
|
: '⬇️ Low';
|
|
65
38
|
}
|
|
66
39
|
function badgeUrl(score, grade) {
|
|
67
|
-
const color = grade === 'A'
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
40
|
+
const color = grade === 'A'
|
|
41
|
+
? 'brightgreen'
|
|
42
|
+
: grade === 'B'
|
|
43
|
+
? 'green'
|
|
44
|
+
: grade === 'C'
|
|
45
|
+
? 'yellow'
|
|
46
|
+
: grade === 'D'
|
|
47
|
+
? 'orange'
|
|
71
48
|
: 'red';
|
|
72
49
|
return `https://img.shields.io/badge/codehere%20trust-${score}%25%20${grade}-${color}?logo=shield&logoColor=white`;
|
|
73
50
|
}
|
|
@@ -75,14 +52,16 @@ function narrativeSummary(report) {
|
|
|
75
52
|
const { overallScore, grade, criticalCount, highCount, mediumCount, lowCount, files } = report;
|
|
76
53
|
if (criticalCount === 0 && highCount === 0) {
|
|
77
54
|
if (overallScore >= 90) {
|
|
78
|
-
return `Clean codebase. ${files.length} file${files.length !== 1 ? 's' : ''} scanned, nothing blocking a merge. ` +
|
|
79
|
-
(mediumCount > 0
|
|
55
|
+
return (`Clean codebase. ${files.length} file${files.length !== 1 ? 's' : ''} scanned, nothing blocking a merge. ` +
|
|
56
|
+
(mediumCount > 0
|
|
57
|
+
? `${mediumCount} medium-severity pattern${mediumCount !== 1 ? 's' : ''} worth reviewing in a future sprint.`
|
|
58
|
+
: 'No significant findings.'));
|
|
80
59
|
}
|
|
81
60
|
return `Solid codebase with some medium/low findings. ${overallScore}/100 — worth a review pass but not blocking.`;
|
|
82
61
|
}
|
|
83
62
|
if (criticalCount > 0) {
|
|
84
|
-
return `${criticalCount} critical issue${criticalCount !== 1 ? 's' : ''} found that should be resolved before this merges. ` +
|
|
85
|
-
`${highCount > 0 ? `Also ${highCount} high-severity pattern${highCount !== 1 ? 's' : ''} to address.` : ''}
|
|
63
|
+
return (`${criticalCount} critical issue${criticalCount !== 1 ? 's' : ''} found that should be resolved before this merges. ` +
|
|
64
|
+
`${highCount > 0 ? `Also ${highCount} high-severity pattern${highCount !== 1 ? 's' : ''} to address.` : ''}`);
|
|
86
65
|
}
|
|
87
66
|
return `No critical issues, but ${highCount} high-severity pattern${highCount !== 1 ? 's' : ''} worth addressing before merge.`;
|
|
88
67
|
}
|
|
@@ -111,7 +90,7 @@ function findingsMarkdown(files, cwd) {
|
|
|
111
90
|
for (const severity of ['critical', 'high', 'medium', 'low']) {
|
|
112
91
|
const allFindings = [];
|
|
113
92
|
for (const f of files) {
|
|
114
|
-
for (const finding of f.findings.filter(x => x.severity === severity)) {
|
|
93
|
+
for (const finding of f.findings.filter((x) => x.severity === severity)) {
|
|
115
94
|
allFindings.push({ filepath: f.filepath, ...finding });
|
|
116
95
|
}
|
|
117
96
|
}
|
|
@@ -186,7 +165,7 @@ Renders as: 
|
|
|
186
165
|
|
|
187
166
|
---
|
|
188
167
|
|
|
189
|
-
*Generated with [codehere](https://github.com/codehere-dev/codehere) —
|
|
168
|
+
*Generated with [codehere](https://github.com/codehere-dev/codehere) — every AI action, traced. Every agent, verified.*
|
|
190
169
|
`;
|
|
191
170
|
}
|
|
192
171
|
// ── Command ───────────────────────────────────────────────────────────────────
|
|
@@ -210,10 +189,14 @@ function generateSimpleReport(report, target) {
|
|
|
210
189
|
}
|
|
211
190
|
lines.push('');
|
|
212
191
|
// Score in human terms
|
|
213
|
-
const gradeMeaning = grade === 'A'
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
192
|
+
const gradeMeaning = grade === 'A'
|
|
193
|
+
? 'Excellent'
|
|
194
|
+
: grade === 'B'
|
|
195
|
+
? 'Good'
|
|
196
|
+
: grade === 'C'
|
|
197
|
+
? 'Fair — some issues to address'
|
|
198
|
+
: grade === 'D'
|
|
199
|
+
? 'Needs work'
|
|
217
200
|
: 'Urgent attention needed';
|
|
218
201
|
lines.push(`Security score: ${overallScore}/100 (${gradeMeaning})`);
|
|
219
202
|
lines.push(`Files checked: ${files.length}`);
|
|
@@ -256,34 +239,37 @@ function generateSimpleReport(report, target) {
|
|
|
256
239
|
}
|
|
257
240
|
export async function executeReportCommand(target, options = {}) {
|
|
258
241
|
const cwd = process.cwd();
|
|
259
|
-
const resolved = target ? join(cwd, target) : cwd;
|
|
242
|
+
const resolved = target ? (isAbsolute(target) ? target : join(cwd, target)) : cwd;
|
|
243
|
+
// Default: write to a file so the user gets a shareable artifact instead of
|
|
244
|
+
// raw markdown sprayed at the terminal. --stdout opts into the old behavior
|
|
245
|
+
// for piping; --out overrides the default path.
|
|
246
|
+
const defaultOutName = options.json ? 'codehere-audit.json' : 'codehere-audit.md';
|
|
247
|
+
const effectiveOut = options.stdout ? undefined : (options.out ?? defaultOutName);
|
|
260
248
|
if (!existsSync(resolved)) {
|
|
261
249
|
console.error(error(`Not found: ${resolved}`));
|
|
262
250
|
process.exit(1);
|
|
263
251
|
}
|
|
264
252
|
// Collect and scan
|
|
265
|
-
const paths =
|
|
253
|
+
const paths = collectCodeFiles(resolved);
|
|
266
254
|
if (paths.length === 0) {
|
|
267
255
|
console.log(info('No code files found to scan.'));
|
|
268
256
|
return;
|
|
269
257
|
}
|
|
270
258
|
// Show progress for large codebases
|
|
271
|
-
if (!
|
|
259
|
+
if (!effectiveOut && paths.length > 20 && process.stderr.isTTY) {
|
|
272
260
|
process.stderr.write(colors.dim(` Scanning ${paths.length} files...`));
|
|
273
261
|
}
|
|
274
|
-
const results = paths.map(p => scoreFile(relative(cwd, p), readFileSync(p, 'utf-8')));
|
|
262
|
+
const results = paths.map((p) => scoreFile(relative(cwd, p), readFileSync(p, 'utf-8')));
|
|
275
263
|
// Clear progress line
|
|
276
|
-
if (!
|
|
264
|
+
if (!effectiveOut && paths.length > 20 && process.stderr.isTTY) {
|
|
277
265
|
process.stderr.write('\r\x1b[K');
|
|
278
266
|
}
|
|
279
267
|
const totalFindings = results.reduce((s, r) => s + r.findings.length, 0);
|
|
280
|
-
const criticalCount = results.reduce((s, r) => s + r.findings.filter(f => f.severity === 'critical').length, 0);
|
|
281
|
-
const highCount = results.reduce((s, r) => s + r.findings.filter(f => f.severity === 'high').length, 0);
|
|
282
|
-
const mediumCount = results.reduce((s, r) => s + r.findings.filter(f => f.severity === 'medium').length, 0);
|
|
283
|
-
const lowCount = results.reduce((s, r) => s + r.findings.filter(f => f.severity === 'low').length, 0);
|
|
284
|
-
const overallScore = results.length > 0
|
|
285
|
-
? Math.round(results.reduce((s, r) => s + r.score, 0) / results.length)
|
|
286
|
-
: 100;
|
|
268
|
+
const criticalCount = results.reduce((s, r) => s + r.findings.filter((f) => f.severity === 'critical').length, 0);
|
|
269
|
+
const highCount = results.reduce((s, r) => s + r.findings.filter((f) => f.severity === 'high').length, 0);
|
|
270
|
+
const mediumCount = results.reduce((s, r) => s + r.findings.filter((f) => f.severity === 'medium').length, 0);
|
|
271
|
+
const lowCount = results.reduce((s, r) => s + r.findings.filter((f) => f.severity === 'low').length, 0);
|
|
272
|
+
const overallScore = results.length > 0 ? Math.round(results.reduce((s, r) => s + r.score, 0) / results.length) : 100;
|
|
287
273
|
const grade = overallScore >= 90 ? 'A' : overallScore >= 75 ? 'B' : overallScore >= 60 ? 'C' : overallScore >= 40 ? 'D' : 'F';
|
|
288
274
|
const recommendation = criticalCount > 0
|
|
289
275
|
? `${criticalCount} critical issue${criticalCount !== 1 ? 's' : ''} need${criticalCount === 1 ? 's' : ''} attention before this merges.`
|
|
@@ -310,9 +296,9 @@ export async function executeReportCommand(target, options = {}) {
|
|
|
310
296
|
// JSON output
|
|
311
297
|
if (options.json) {
|
|
312
298
|
const output = JSON.stringify(report, null, 2);
|
|
313
|
-
if (
|
|
314
|
-
writeFileSync(
|
|
315
|
-
console.log(success(`Report written to ${
|
|
299
|
+
if (effectiveOut) {
|
|
300
|
+
writeFileSync(effectiveOut, output);
|
|
301
|
+
console.log(success(`Report written to ${effectiveOut}`));
|
|
316
302
|
}
|
|
317
303
|
else {
|
|
318
304
|
console.log(output);
|
|
@@ -322,9 +308,9 @@ export async function executeReportCommand(target, options = {}) {
|
|
|
322
308
|
// Simple (non-technical) output
|
|
323
309
|
if (options.simple) {
|
|
324
310
|
const simple = generateSimpleReport(report, resolved);
|
|
325
|
-
if (
|
|
326
|
-
writeFileSync(
|
|
327
|
-
console.log(success(`Plain-English report written to ${
|
|
311
|
+
if (effectiveOut) {
|
|
312
|
+
writeFileSync(effectiveOut, simple);
|
|
313
|
+
console.log(success(`Plain-English report written to ${effectiveOut}`));
|
|
328
314
|
}
|
|
329
315
|
else {
|
|
330
316
|
process.stdout.write(simple + '\n');
|
|
@@ -333,20 +319,21 @@ export async function executeReportCommand(target, options = {}) {
|
|
|
333
319
|
}
|
|
334
320
|
// Markdown output
|
|
335
321
|
const markdown = generateMarkdown(report, resolved, cwd);
|
|
336
|
-
if (
|
|
337
|
-
writeFileSync(
|
|
322
|
+
if (effectiveOut) {
|
|
323
|
+
writeFileSync(effectiveOut, markdown);
|
|
338
324
|
newline();
|
|
339
|
-
console.log(success(`Report written to ${
|
|
325
|
+
console.log(success(`Report written to ${effectiveOut}`));
|
|
340
326
|
console.log(colors.dim(` ${paths.length} files · score ${overallScore}/100 · grade ${grade}`));
|
|
341
327
|
if (criticalCount > 0) {
|
|
342
328
|
console.log(colors.red(` ${criticalCount} critical issue${criticalCount !== 1 ? 's' : ''} — check the report`));
|
|
343
329
|
}
|
|
344
330
|
newline();
|
|
345
331
|
console.log(colors.dim(' Share it: paste it in your PR, add the badge to your README.'));
|
|
332
|
+
console.log(colors.dim(' Use --stdout to pipe the report instead of writing a file.'));
|
|
346
333
|
newline();
|
|
347
334
|
}
|
|
348
335
|
else {
|
|
349
|
-
//
|
|
336
|
+
// --stdout: print to stdout (can be piped)
|
|
350
337
|
process.stdout.write(markdown);
|
|
351
338
|
}
|
|
352
339
|
}
|
|
@@ -188,7 +188,7 @@ export async function executeSetupCommand(force = false) {
|
|
|
188
188
|
}
|
|
189
189
|
else {
|
|
190
190
|
console.log(warning('Codebase: Not detected'));
|
|
191
|
-
console.log(colors.dim(
|
|
191
|
+
console.log(colors.dim(" Make sure you're in your project directory."));
|
|
192
192
|
result.codebaseDetected = false;
|
|
193
193
|
}
|
|
194
194
|
newline();
|
|
@@ -221,9 +221,9 @@ export async function executeSetupCommand(force = false) {
|
|
|
221
221
|
console.log(success('Done.'));
|
|
222
222
|
newline();
|
|
223
223
|
console.log(colors.bold('Next steps:'));
|
|
224
|
-
console.log(colors.dim(` 1. ${colors.cyan('codehere
|
|
225
|
-
console.log(colors.dim(` 2. ${colors.cyan('codehere
|
|
226
|
-
console.log(colors.dim(` 3. ${colors.cyan('codehere')}
|
|
224
|
+
console.log(colors.dim(` 1. ${colors.cyan('codehere start')} Open the task intake at :3773`));
|
|
225
|
+
console.log(colors.dim(` 2. ${colors.cyan('codehere hook install')} Audit every Claude Code action`));
|
|
226
|
+
console.log(colors.dim(` 3. ${colors.cyan('codehere trust .')} Scan your project (no API key)`));
|
|
227
227
|
newline();
|
|
228
228
|
saveSetupConfig(result);
|
|
229
229
|
// Track onboarding completion for first-time users
|