@decibelsystems/tools 2.1.2 → 2.1.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/dist/agentCommands.d.ts +11 -0
- package/dist/agentCommands.d.ts.map +1 -0
- package/dist/agentCommands.js +267 -0
- package/dist/agentCommands.js.map +1 -0
- package/dist/agentInbox.d.ts +37 -0
- package/dist/agentInbox.d.ts.map +1 -0
- package/dist/agentInbox.js +128 -0
- package/dist/agentInbox.js.map +1 -0
- package/dist/agentPresence.d.ts +36 -0
- package/dist/agentPresence.d.ts.map +1 -0
- package/dist/agentPresence.js +227 -0
- package/dist/agentPresence.js.map +1 -0
- package/dist/agenticJobs.d.ts +49 -0
- package/dist/agenticJobs.d.ts.map +1 -0
- package/dist/agenticJobs.js +190 -0
- package/dist/agenticJobs.js.map +1 -0
- package/dist/architectAdrs.d.ts +7 -0
- package/dist/architectAdrs.d.ts.map +1 -1
- package/dist/architectAdrs.js +91 -28
- package/dist/architectAdrs.js.map +1 -1
- package/dist/daemon.d.ts +6 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +14 -0
- package/dist/daemon.js.map +1 -1
- package/dist/facades/definitions.d.ts.map +1 -1
- package/dist/facades/definitions.js +40 -6
- package/dist/facades/definitions.js.map +1 -1
- package/dist/hq/defineAgent.d.ts +11 -0
- package/dist/hq/defineAgent.d.ts.map +1 -0
- package/dist/hq/defineAgent.js +185 -0
- package/dist/hq/defineAgent.js.map +1 -0
- package/dist/hq/index.d.ts +3 -0
- package/dist/hq/index.d.ts.map +1 -0
- package/dist/hq/index.js +28 -0
- package/dist/hq/index.js.map +1 -0
- package/dist/hq/types.d.ts +59 -0
- package/dist/hq/types.d.ts.map +1 -0
- package/dist/hq/types.js +12 -0
- package/dist/hq/types.js.map +1 -0
- package/dist/httpServer.d.ts +1 -1
- package/dist/httpServer.d.ts.map +1 -1
- package/dist/httpServer.js +327 -19
- package/dist/httpServer.js.map +1 -1
- package/dist/kernel.d.ts +3 -1
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +40 -9
- package/dist/kernel.js.map +1 -1
- package/dist/projectRegistry.d.ts +27 -0
- package/dist/projectRegistry.d.ts.map +1 -1
- package/dist/projectRegistry.js +191 -5
- package/dist/projectRegistry.js.map +1 -1
- package/dist/sentinelIssues.d.ts +5 -0
- package/dist/sentinelIssues.d.ts.map +1 -1
- package/dist/sentinelIssues.js +1 -1
- package/dist/sentinelIssues.js.map +1 -1
- package/dist/server.js +12 -0
- package/dist/server.js.map +1 -1
- package/dist/store/fsStore.d.ts +6 -0
- package/dist/store/fsStore.d.ts.map +1 -0
- package/dist/store/fsStore.js +77 -0
- package/dist/store/fsStore.js.map +1 -0
- package/dist/store/index.d.ts +8 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +23 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/markdown.d.ts +21 -0
- package/dist/store/markdown.d.ts.map +1 -0
- package/dist/store/markdown.js +175 -0
- package/dist/store/markdown.js.map +1 -0
- package/dist/store/supabaseStore.d.ts +6 -0
- package/dist/store/supabaseStore.d.ts.map +1 -0
- package/dist/store/supabaseStore.js +152 -0
- package/dist/store/supabaseStore.js.map +1 -0
- package/dist/store/types.d.ts +49 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +11 -0
- package/dist/store/types.js.map +1 -0
- package/dist/supabaseRetry.d.ts +21 -0
- package/dist/supabaseRetry.d.ts.map +1 -0
- package/dist/supabaseRetry.js +72 -0
- package/dist/supabaseRetry.js.map +1 -0
- package/dist/toolConfig.d.ts +49 -0
- package/dist/toolConfig.d.ts.map +1 -0
- package/dist/toolConfig.js +309 -0
- package/dist/toolConfig.js.map +1 -0
- package/dist/tools/agentic/agentQueue.d.ts.map +1 -1
- package/dist/tools/agentic/agentQueue.js +7 -5
- package/dist/tools/agentic/agentQueue.js.map +1 -1
- package/dist/tools/agentic/index.d.ts +3 -0
- package/dist/tools/agentic/index.d.ts.map +1 -1
- package/dist/tools/agentic/index.js +158 -1
- package/dist/tools/agentic/index.js.map +1 -1
- package/dist/tools/codereview/index.d.ts +4 -0
- package/dist/tools/codereview/index.d.ts.map +1 -0
- package/dist/tools/codereview/index.js +93 -0
- package/dist/tools/codereview/index.js.map +1 -0
- package/dist/tools/codereview.d.ts +56 -0
- package/dist/tools/codereview.d.ts.map +1 -0
- package/dist/tools/codereview.js +304 -0
- package/dist/tools/codereview.js.map +1 -0
- package/dist/tools/concepts.d.ts +38 -0
- package/dist/tools/concepts.d.ts.map +1 -0
- package/dist/tools/concepts.js +283 -0
- package/dist/tools/concepts.js.map +1 -0
- package/dist/tools/corpus/index.d.ts +3 -0
- package/dist/tools/corpus/index.d.ts.map +1 -1
- package/dist/tools/corpus/index.js +183 -1
- package/dist/tools/corpus/index.js.map +1 -1
- package/dist/tools/corpus.d.ts +52 -0
- package/dist/tools/corpus.d.ts.map +1 -1
- package/dist/tools/corpus.js +207 -2
- package/dist/tools/corpus.js.map +1 -1
- package/dist/tools/dojo.d.ts.map +1 -1
- package/dist/tools/dojo.js +11 -1
- package/dist/tools/dojo.js.map +1 -1
- package/dist/tools/git-sentinel.d.ts.map +1 -1
- package/dist/tools/git-sentinel.js +24 -8
- package/dist/tools/git-sentinel.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/oracle.d.ts +2 -0
- package/dist/tools/oracle.d.ts.map +1 -1
- package/dist/tools/oracle.js +146 -17
- package/dist/tools/oracle.js.map +1 -1
- package/dist/tools/peers.d.ts +15 -0
- package/dist/tools/peers.d.ts.map +1 -0
- package/dist/tools/peers.js +70 -0
- package/dist/tools/peers.js.map +1 -0
- package/dist/tools/registry/index.d.ts +4 -0
- package/dist/tools/registry/index.d.ts.map +1 -1
- package/dist/tools/registry/index.js +274 -1
- package/dist/tools/registry/index.js.map +1 -1
- package/dist/tools/roadmap.d.ts +4 -0
- package/dist/tools/roadmap.d.ts.map +1 -1
- package/dist/tools/roadmap.js.map +1 -1
- package/dist/tools/sentinel.d.ts +15 -1
- package/dist/tools/sentinel.d.ts.map +1 -1
- package/dist/tools/sentinel.js +198 -34
- package/dist/tools/sentinel.js.map +1 -1
- package/dist/tools/voice/index.d.ts.map +1 -1
- package/dist/tools/voice/index.js +2 -3
- package/dist/tools/voice/index.js.map +1 -1
- package/dist/tools/voice.d.ts +1 -1
- package/dist/tools/voice.js +2 -2
- package/dist/tools/voice.js.map +1 -1
- package/dist/tools/workflow.js +5 -5
- package/dist/tools/workflow.js.map +1 -1
- package/dist/transports/http.js +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/codereview/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAiBvC,eAAO,MAAM,oBAAoB,EAAE,QAkFlC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,QAAQ,EAA2B,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Code Review Domain Tools
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Tools for ingesting code review output and creating issues/learnings.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { toolSuccess, toolError, requireFields } from '../shared/index.js';
|
|
7
|
+
import { ingestCodeReview, isCodeReviewError, } from '../codereview.js';
|
|
8
|
+
const VALID_REVIEW_TYPES = ['code-review', 'security-review', 'pr-review', 'general'];
|
|
9
|
+
function normalizeProjectId(args) {
|
|
10
|
+
if (!args.projectId && args.project_id) {
|
|
11
|
+
args.projectId = args.project_id;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export const codeReviewIngestTool = {
|
|
15
|
+
definition: {
|
|
16
|
+
name: 'codereview_ingest',
|
|
17
|
+
description: `Ingest code review output and automatically create issues, friction points, and learnings.
|
|
18
|
+
|
|
19
|
+
Paste the raw output from /code-review, /security-review, or /pr-review-toolkit.
|
|
20
|
+
The tool will parse findings and create appropriate entries in .decibel/.
|
|
21
|
+
|
|
22
|
+
**What gets created:**
|
|
23
|
+
- Critical/High bugs and security issues → sentinel issues
|
|
24
|
+
- Performance and architecture issues → sentinel issues
|
|
25
|
+
- Patterns, learnings, and insights → learnings entries
|
|
26
|
+
- Style issues → skipped (too noisy)
|
|
27
|
+
|
|
28
|
+
**Tips:**
|
|
29
|
+
- Use dry_run=true to preview what would be created without creating anything
|
|
30
|
+
- Include source info (pr_number, branch) for better traceability
|
|
31
|
+
- Works best with structured review output (## sections, bullet points)`,
|
|
32
|
+
inputSchema: {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
projectId: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Project ID (optional, uses default if not provided)',
|
|
38
|
+
},
|
|
39
|
+
project_id: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'Alias for projectId',
|
|
42
|
+
},
|
|
43
|
+
review_type: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
enum: ['code-review', 'security-review', 'pr-review', 'general'],
|
|
46
|
+
description: 'Type of review being ingested',
|
|
47
|
+
},
|
|
48
|
+
raw_output: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'Raw text output from the code review',
|
|
51
|
+
},
|
|
52
|
+
source: {
|
|
53
|
+
type: 'object',
|
|
54
|
+
description: 'Source information for traceability',
|
|
55
|
+
properties: {
|
|
56
|
+
pr_number: { type: 'string', description: 'Pull request number' },
|
|
57
|
+
branch: { type: 'string', description: 'Branch name' },
|
|
58
|
+
commit: { type: 'string', description: 'Commit SHA' },
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
dry_run: {
|
|
62
|
+
type: 'boolean',
|
|
63
|
+
description: 'Preview what would be created without actually creating entries',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
required: ['review_type', 'raw_output'],
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
handler: async (args) => {
|
|
70
|
+
try {
|
|
71
|
+
const rawInput = args;
|
|
72
|
+
normalizeProjectId(rawInput);
|
|
73
|
+
const input = rawInput;
|
|
74
|
+
requireFields(input, 'review_type', 'raw_output');
|
|
75
|
+
if (!VALID_REVIEW_TYPES.includes(input.review_type)) {
|
|
76
|
+
throw new Error(`Invalid review_type. Must be one of: ${VALID_REVIEW_TYPES.join(', ')}`);
|
|
77
|
+
}
|
|
78
|
+
if (!input.raw_output || input.raw_output.trim().length === 0) {
|
|
79
|
+
throw new Error('raw_output cannot be empty');
|
|
80
|
+
}
|
|
81
|
+
const result = await ingestCodeReview(input);
|
|
82
|
+
if (isCodeReviewError(result)) {
|
|
83
|
+
return toolError(result.message, result.hint);
|
|
84
|
+
}
|
|
85
|
+
return toolSuccess(result);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
export const codeReviewTools = [codeReviewIngestTool];
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/codereview/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type ReviewType = 'code-review' | 'security-review' | 'pr-review' | 'general';
|
|
2
|
+
export type FindingType = 'bug' | 'security' | 'performance' | 'style' | 'architecture' | 'testing' | 'documentation';
|
|
3
|
+
export type FindingSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
4
|
+
export interface CodeReviewFinding {
|
|
5
|
+
type: FindingType;
|
|
6
|
+
severity: FindingSeverity;
|
|
7
|
+
title: string;
|
|
8
|
+
description: string;
|
|
9
|
+
file_path?: string;
|
|
10
|
+
line_range?: {
|
|
11
|
+
start: number;
|
|
12
|
+
end: number;
|
|
13
|
+
};
|
|
14
|
+
suggestion?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface IngestInput {
|
|
17
|
+
projectId?: string;
|
|
18
|
+
review_type: ReviewType;
|
|
19
|
+
raw_output: string;
|
|
20
|
+
source?: {
|
|
21
|
+
pr_number?: string;
|
|
22
|
+
branch?: string;
|
|
23
|
+
commit?: string;
|
|
24
|
+
};
|
|
25
|
+
dry_run?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface IngestOutput {
|
|
28
|
+
findings_parsed: number;
|
|
29
|
+
issues_created: Array<{
|
|
30
|
+
id: string;
|
|
31
|
+
title: string;
|
|
32
|
+
path: string;
|
|
33
|
+
}>;
|
|
34
|
+
friction_logged: Array<{
|
|
35
|
+
id: string;
|
|
36
|
+
context: string;
|
|
37
|
+
path: string;
|
|
38
|
+
}>;
|
|
39
|
+
learnings_added: Array<{
|
|
40
|
+
title: string;
|
|
41
|
+
path: string;
|
|
42
|
+
}>;
|
|
43
|
+
skipped: Array<{
|
|
44
|
+
title: string;
|
|
45
|
+
reason: string;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
export interface CodeReviewError {
|
|
49
|
+
error: string;
|
|
50
|
+
message: string;
|
|
51
|
+
hint?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function isCodeReviewError(result: unknown): result is CodeReviewError;
|
|
54
|
+
export declare function parseReviewOutput(raw: string, reviewType: ReviewType): CodeReviewFinding[];
|
|
55
|
+
export declare function ingestCodeReview(input: IngestInput): Promise<IngestOutput | CodeReviewError>;
|
|
56
|
+
//# sourceMappingURL=codereview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codereview.d.ts","sourceRoot":"","sources":["../../src/tools/codereview.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,iBAAiB,GAAG,WAAW,GAAG,SAAS,CAAC;AACrF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,GAAG,cAAc,GAAG,SAAS,GAAG,eAAe,CAAC;AACtH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,eAAe,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,eAAe,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,eAAe,CAO5E;AAkCD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,iBAAiB,EAAE,CAsI1F;AA2CD,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,YAAY,GAAG,eAAe,CAAC,CAyGzC"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { log } from '../config.js';
|
|
2
|
+
import { resolveProjectPaths } from '../projectRegistry.js';
|
|
3
|
+
import { createIssue, isProjectResolutionError } from './sentinel.js';
|
|
4
|
+
import { appendLearning, isLearningsError } from './learnings.js';
|
|
5
|
+
export function isCodeReviewError(result) {
|
|
6
|
+
return (typeof result === 'object' &&
|
|
7
|
+
result !== null &&
|
|
8
|
+
'error' in result &&
|
|
9
|
+
'message' in result);
|
|
10
|
+
}
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Severity Mapping
|
|
13
|
+
// ============================================================================
|
|
14
|
+
function mapSeverity(severity) {
|
|
15
|
+
const map = {
|
|
16
|
+
critical: 'critical',
|
|
17
|
+
high: 'high',
|
|
18
|
+
medium: 'med',
|
|
19
|
+
low: 'low',
|
|
20
|
+
info: 'low',
|
|
21
|
+
};
|
|
22
|
+
return map[severity] || 'med';
|
|
23
|
+
}
|
|
24
|
+
function inferLearningCategory(finding) {
|
|
25
|
+
const typeMap = {
|
|
26
|
+
architecture: 'architecture',
|
|
27
|
+
performance: 'debug',
|
|
28
|
+
security: 'integration',
|
|
29
|
+
testing: 'tooling',
|
|
30
|
+
documentation: 'process',
|
|
31
|
+
bug: 'debug',
|
|
32
|
+
style: 'process',
|
|
33
|
+
};
|
|
34
|
+
return typeMap[finding.type] || 'other';
|
|
35
|
+
}
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Raw Text Parser
|
|
38
|
+
// ============================================================================
|
|
39
|
+
export function parseReviewOutput(raw, reviewType) {
|
|
40
|
+
const findings = [];
|
|
41
|
+
// Split by common section patterns (## headers)
|
|
42
|
+
const sections = raw.split(/(?=^##\s)/m);
|
|
43
|
+
for (const section of sections) {
|
|
44
|
+
// Detect severity from section header or content
|
|
45
|
+
let severity = 'medium';
|
|
46
|
+
const severityMatch = section.match(/\b(critical|high|medium|low|info)\b/i);
|
|
47
|
+
if (severityMatch) {
|
|
48
|
+
severity = severityMatch[1].toLowerCase();
|
|
49
|
+
}
|
|
50
|
+
// Detect type from section header
|
|
51
|
+
let type = 'bug';
|
|
52
|
+
if (/security|vulnerabilit|injection|xss|csrf|auth/i.test(section)) {
|
|
53
|
+
type = 'security';
|
|
54
|
+
}
|
|
55
|
+
else if (/performance|slow|optimi|latency|memory/i.test(section)) {
|
|
56
|
+
type = 'performance';
|
|
57
|
+
}
|
|
58
|
+
else if (/architect|design|pattern|structure/i.test(section)) {
|
|
59
|
+
type = 'architecture';
|
|
60
|
+
}
|
|
61
|
+
else if (/test|coverage|spec|unit|integration/i.test(section)) {
|
|
62
|
+
type = 'testing';
|
|
63
|
+
}
|
|
64
|
+
else if (/style|format|lint|naming|convention/i.test(section)) {
|
|
65
|
+
type = 'style';
|
|
66
|
+
}
|
|
67
|
+
else if (/doc|comment|readme|learning|pattern|insight|recommendation/i.test(section)) {
|
|
68
|
+
type = 'documentation';
|
|
69
|
+
}
|
|
70
|
+
else if (/bug|issue|error|fix|broken|fail/i.test(section)) {
|
|
71
|
+
type = 'bug';
|
|
72
|
+
}
|
|
73
|
+
// Override type based on review type for better defaults
|
|
74
|
+
if (reviewType === 'security-review' && type === 'bug') {
|
|
75
|
+
type = 'security';
|
|
76
|
+
}
|
|
77
|
+
// Extract bullet points as individual findings
|
|
78
|
+
const bullets = section.match(/^[-*]\s+.+$/gm) || [];
|
|
79
|
+
for (const bullet of bullets) {
|
|
80
|
+
// Extract file path if present
|
|
81
|
+
const fileMatch = bullet.match(/`([^`]+\.[a-z]{1,4}(?::\d+)?)`|(?:in|at|file:?\s*)([^\s,`]+\.[a-z]{1,4})/i);
|
|
82
|
+
let file_path;
|
|
83
|
+
if (fileMatch) {
|
|
84
|
+
file_path = (fileMatch[1] || fileMatch[2]).replace(/:\d+.*$/, '');
|
|
85
|
+
}
|
|
86
|
+
// Extract line number if present
|
|
87
|
+
let line_range;
|
|
88
|
+
const lineMatch = bullet.match(/:(\d+)(?:-(\d+))?|line[s]?\s+(\d+)(?:\s*-\s*(\d+))?/i);
|
|
89
|
+
if (lineMatch) {
|
|
90
|
+
const start = parseInt(lineMatch[1] || lineMatch[3], 10);
|
|
91
|
+
const end = lineMatch[2] || lineMatch[4] ? parseInt(lineMatch[2] || lineMatch[4], 10) : start;
|
|
92
|
+
line_range = { start, end };
|
|
93
|
+
}
|
|
94
|
+
// Check for inline severity markers
|
|
95
|
+
const inlineSeverityMatch = bullet.match(/\*\*(critical|high|medium|low|info)\*\*|\[(critical|high|medium|low|info)\]/i);
|
|
96
|
+
if (inlineSeverityMatch) {
|
|
97
|
+
severity = (inlineSeverityMatch[1] || inlineSeverityMatch[2]).toLowerCase();
|
|
98
|
+
}
|
|
99
|
+
// Clean up title - remove markdown formatting, file paths, etc.
|
|
100
|
+
let title = bullet
|
|
101
|
+
.replace(/^[-*]\s+/, '')
|
|
102
|
+
.replace(/\*\*[^*]+\*\*/g, match => match.replace(/\*\*/g, ''))
|
|
103
|
+
.replace(/`[^`]+`/g, '')
|
|
104
|
+
.replace(/\s+/g, ' ')
|
|
105
|
+
.trim();
|
|
106
|
+
// Truncate long titles
|
|
107
|
+
if (title.length > 100) {
|
|
108
|
+
title = title.slice(0, 97) + '...';
|
|
109
|
+
}
|
|
110
|
+
// Skip very short or empty items
|
|
111
|
+
if (title.length < 10)
|
|
112
|
+
continue;
|
|
113
|
+
// Route soft suggestions to learnings, but keep actionable items as issues
|
|
114
|
+
// "Consider adding error handling" → learning
|
|
115
|
+
// "Missing null check causes crash" → issue (even if starts with soft language)
|
|
116
|
+
const isSoftSuggestion = /^consider|^you might|^it would be|^perhaps|^maybe/i.test(title);
|
|
117
|
+
const isActionableIssue = /crash|bug|error|fail|broken|vulnerab|inject|leak|missing.*check|null.*check|undefined/i.test(title);
|
|
118
|
+
if (isSoftSuggestion && !isActionableIssue) {
|
|
119
|
+
// Soft suggestion without actionable keywords → learning
|
|
120
|
+
findings.push({
|
|
121
|
+
type: 'documentation',
|
|
122
|
+
severity: 'info',
|
|
123
|
+
title,
|
|
124
|
+
description: bullet,
|
|
125
|
+
file_path,
|
|
126
|
+
line_range,
|
|
127
|
+
});
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
findings.push({
|
|
131
|
+
type,
|
|
132
|
+
severity,
|
|
133
|
+
title,
|
|
134
|
+
description: bullet,
|
|
135
|
+
file_path,
|
|
136
|
+
line_range,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Also look for explicit learning/pattern/insight mentions
|
|
141
|
+
const learningPatterns = [
|
|
142
|
+
/(?:learning|lesson|insight|takeaway|key point):\s*(.+)/gi,
|
|
143
|
+
/(?:pattern|best practice|recommendation):\s*(.+)/gi,
|
|
144
|
+
];
|
|
145
|
+
for (const pattern of learningPatterns) {
|
|
146
|
+
let match;
|
|
147
|
+
while ((match = pattern.exec(raw)) !== null) {
|
|
148
|
+
const title = match[1].trim().slice(0, 100);
|
|
149
|
+
if (title.length >= 10) {
|
|
150
|
+
const exists = findings.some(f => f.title === title);
|
|
151
|
+
if (!exists) {
|
|
152
|
+
findings.push({
|
|
153
|
+
type: 'documentation',
|
|
154
|
+
severity: 'info',
|
|
155
|
+
title,
|
|
156
|
+
description: match[0],
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return findings;
|
|
163
|
+
}
|
|
164
|
+
// ============================================================================
|
|
165
|
+
// Format Issue Details
|
|
166
|
+
// ============================================================================
|
|
167
|
+
function formatIssueDetails(finding, source) {
|
|
168
|
+
let details = finding.description;
|
|
169
|
+
if (finding.file_path) {
|
|
170
|
+
details += `\n\n**File:** \`${finding.file_path}\``;
|
|
171
|
+
if (finding.line_range) {
|
|
172
|
+
if (finding.line_range.start === finding.line_range.end) {
|
|
173
|
+
details += `:${finding.line_range.start}`;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
details += `:${finding.line_range.start}-${finding.line_range.end}`;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (finding.suggestion) {
|
|
181
|
+
details += `\n\n**Suggestion:** ${finding.suggestion}`;
|
|
182
|
+
}
|
|
183
|
+
if (source) {
|
|
184
|
+
const sourceInfo = [];
|
|
185
|
+
if (source.pr_number)
|
|
186
|
+
sourceInfo.push(`PR #${source.pr_number}`);
|
|
187
|
+
if (source.branch)
|
|
188
|
+
sourceInfo.push(`branch: ${source.branch}`);
|
|
189
|
+
if (source.commit)
|
|
190
|
+
sourceInfo.push(`commit: ${source.commit.slice(0, 8)}`);
|
|
191
|
+
if (sourceInfo.length > 0) {
|
|
192
|
+
details += `\n\n**Source:** ${sourceInfo.join(', ')}`;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
details += '\n\n*Created from code review via codereview_ingest*';
|
|
196
|
+
return details;
|
|
197
|
+
}
|
|
198
|
+
// ============================================================================
|
|
199
|
+
// Main Ingest Function
|
|
200
|
+
// ============================================================================
|
|
201
|
+
export async function ingestCodeReview(input) {
|
|
202
|
+
// Validate project exists first
|
|
203
|
+
let resolved;
|
|
204
|
+
try {
|
|
205
|
+
resolved = resolveProjectPaths(input.projectId);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return {
|
|
209
|
+
error: 'PROJECT_NOT_FOUND',
|
|
210
|
+
message: 'Cannot ingest code review: No project context available.',
|
|
211
|
+
hint: 'Specify projectId parameter, set DECIBEL_PROJECT_ROOT env var, or run from a directory with .decibel/',
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// Parse the raw output
|
|
215
|
+
const findings = parseReviewOutput(input.raw_output, input.review_type);
|
|
216
|
+
const result = {
|
|
217
|
+
findings_parsed: findings.length,
|
|
218
|
+
issues_created: [],
|
|
219
|
+
friction_logged: [],
|
|
220
|
+
learnings_added: [],
|
|
221
|
+
skipped: [],
|
|
222
|
+
};
|
|
223
|
+
log(`CodeReview: Parsed ${findings.length} findings from ${input.review_type} review`);
|
|
224
|
+
for (const finding of findings) {
|
|
225
|
+
const isIssueable = ['bug', 'security', 'performance', 'architecture', 'testing'].includes(finding.type);
|
|
226
|
+
const isLearning = finding.type === 'documentation' || finding.severity === 'info';
|
|
227
|
+
if (isIssueable && !isLearning) {
|
|
228
|
+
if (input.dry_run) {
|
|
229
|
+
result.issues_created.push({
|
|
230
|
+
id: 'DRY-RUN',
|
|
231
|
+
title: finding.title,
|
|
232
|
+
path: `[dry-run] .decibel/sentinel/issues/...`,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
const issueInput = {
|
|
237
|
+
projectId: input.projectId,
|
|
238
|
+
severity: mapSeverity(finding.severity),
|
|
239
|
+
title: `[${input.review_type}] ${finding.title}`,
|
|
240
|
+
details: formatIssueDetails(finding, input.source),
|
|
241
|
+
};
|
|
242
|
+
const issueResult = await createIssue(issueInput);
|
|
243
|
+
if (isProjectResolutionError(issueResult)) {
|
|
244
|
+
result.skipped.push({
|
|
245
|
+
title: finding.title,
|
|
246
|
+
reason: 'Project resolution error',
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
else if ('error' in issueResult) {
|
|
250
|
+
result.skipped.push({
|
|
251
|
+
title: finding.title,
|
|
252
|
+
reason: issueResult.message,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
result.issues_created.push({
|
|
257
|
+
id: issueResult.id,
|
|
258
|
+
title: finding.title,
|
|
259
|
+
path: issueResult.path,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else if (isLearning) {
|
|
265
|
+
if (input.dry_run) {
|
|
266
|
+
result.learnings_added.push({
|
|
267
|
+
title: finding.title,
|
|
268
|
+
path: `[dry-run] .decibel/oracle/learnings/learnings.md`,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
const learningInput = {
|
|
273
|
+
projectId: input.projectId,
|
|
274
|
+
category: inferLearningCategory(finding),
|
|
275
|
+
title: finding.title,
|
|
276
|
+
content: finding.description,
|
|
277
|
+
tags: ['code-review', input.review_type],
|
|
278
|
+
};
|
|
279
|
+
const learningResult = await appendLearning(learningInput);
|
|
280
|
+
if (isLearningsError(learningResult)) {
|
|
281
|
+
result.skipped.push({
|
|
282
|
+
title: finding.title,
|
|
283
|
+
reason: learningResult.message,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
result.learnings_added.push({
|
|
288
|
+
title: finding.title,
|
|
289
|
+
path: learningResult.path,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
result.skipped.push({
|
|
296
|
+
title: finding.title,
|
|
297
|
+
reason: `Type '${finding.type}' with severity '${finding.severity}' not auto-created`,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
log(`CodeReview: Created ${result.issues_created.length} issues, ${result.learnings_added.length} learnings, skipped ${result.skipped.length}`);
|
|
302
|
+
return result;
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=codereview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codereview.js","sourceRoot":"","sources":["../../src/tools/codereview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Concepts Domain — pre-project product ideas.
|
|
3
|
+
*
|
|
4
|
+
* Discrete from dojo: dojo wishes/proposals are *feature-scoped* (a capability
|
|
5
|
+
* inside an existing project). Concepts are *project-scoped* — a candidate for
|
|
6
|
+
* a NEW project that doesn't yet exist. Once a concept is committed, it
|
|
7
|
+
* graduates to a real project (project_init + registry_add stay separate
|
|
8
|
+
* deliberately, so the user sees what's happening).
|
|
9
|
+
*
|
|
10
|
+
* Storage: ~/.decibel/concepts/<id>.yaml — user-level, cross-project. Concepts
|
|
11
|
+
* have no project_id by definition; they are pre-project artifacts. The
|
|
12
|
+
* graduated_to field links a committed concept to its eventual project_id.
|
|
13
|
+
*/
|
|
14
|
+
import { ToolSpec } from './types.js';
|
|
15
|
+
export type ConceptStatus = 'ideating' | 'exploring' | 'committed' | 'shelved';
|
|
16
|
+
export interface Concept {
|
|
17
|
+
id: string;
|
|
18
|
+
title: string;
|
|
19
|
+
pitch: string;
|
|
20
|
+
problem: string;
|
|
21
|
+
why_now?: string;
|
|
22
|
+
status: ConceptStatus;
|
|
23
|
+
tags: string[];
|
|
24
|
+
prior_attempts: string[];
|
|
25
|
+
graduated_to: string | null;
|
|
26
|
+
graduated_at: string | null;
|
|
27
|
+
shelved_reason: string | null;
|
|
28
|
+
shelved_at: string | null;
|
|
29
|
+
created_at: string;
|
|
30
|
+
updated_at: string;
|
|
31
|
+
}
|
|
32
|
+
export declare const conceptsAddTool: ToolSpec;
|
|
33
|
+
export declare const conceptsListTool: ToolSpec;
|
|
34
|
+
export declare const conceptsReadTool: ToolSpec;
|
|
35
|
+
export declare const conceptsCommitTool: ToolSpec;
|
|
36
|
+
export declare const conceptsShelveTool: ToolSpec;
|
|
37
|
+
export declare const conceptsTools: ToolSpec[];
|
|
38
|
+
//# sourceMappingURL=concepts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concepts.d.ts","sourceRoot":"","sources":["../../src/tools/concepts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOtC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAE/E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AA8CD,eAAO,MAAM,eAAe,EAAE,QA0D7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,QAqD9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,QAwB9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,QA+ChC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,QAuChC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,QAAQ,EAMnC,CAAC"}
|