@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.
Files changed (150) hide show
  1. package/dist/agentCommands.d.ts +11 -0
  2. package/dist/agentCommands.d.ts.map +1 -0
  3. package/dist/agentCommands.js +267 -0
  4. package/dist/agentCommands.js.map +1 -0
  5. package/dist/agentInbox.d.ts +37 -0
  6. package/dist/agentInbox.d.ts.map +1 -0
  7. package/dist/agentInbox.js +128 -0
  8. package/dist/agentInbox.js.map +1 -0
  9. package/dist/agentPresence.d.ts +36 -0
  10. package/dist/agentPresence.d.ts.map +1 -0
  11. package/dist/agentPresence.js +227 -0
  12. package/dist/agentPresence.js.map +1 -0
  13. package/dist/agenticJobs.d.ts +49 -0
  14. package/dist/agenticJobs.d.ts.map +1 -0
  15. package/dist/agenticJobs.js +190 -0
  16. package/dist/agenticJobs.js.map +1 -0
  17. package/dist/architectAdrs.d.ts +7 -0
  18. package/dist/architectAdrs.d.ts.map +1 -1
  19. package/dist/architectAdrs.js +91 -28
  20. package/dist/architectAdrs.js.map +1 -1
  21. package/dist/daemon.d.ts +6 -0
  22. package/dist/daemon.d.ts.map +1 -1
  23. package/dist/daemon.js +14 -0
  24. package/dist/daemon.js.map +1 -1
  25. package/dist/facades/definitions.d.ts.map +1 -1
  26. package/dist/facades/definitions.js +40 -6
  27. package/dist/facades/definitions.js.map +1 -1
  28. package/dist/hq/defineAgent.d.ts +11 -0
  29. package/dist/hq/defineAgent.d.ts.map +1 -0
  30. package/dist/hq/defineAgent.js +185 -0
  31. package/dist/hq/defineAgent.js.map +1 -0
  32. package/dist/hq/index.d.ts +3 -0
  33. package/dist/hq/index.d.ts.map +1 -0
  34. package/dist/hq/index.js +28 -0
  35. package/dist/hq/index.js.map +1 -0
  36. package/dist/hq/types.d.ts +59 -0
  37. package/dist/hq/types.d.ts.map +1 -0
  38. package/dist/hq/types.js +12 -0
  39. package/dist/hq/types.js.map +1 -0
  40. package/dist/httpServer.d.ts +1 -1
  41. package/dist/httpServer.d.ts.map +1 -1
  42. package/dist/httpServer.js +327 -19
  43. package/dist/httpServer.js.map +1 -1
  44. package/dist/kernel.d.ts +3 -1
  45. package/dist/kernel.d.ts.map +1 -1
  46. package/dist/kernel.js +40 -9
  47. package/dist/kernel.js.map +1 -1
  48. package/dist/projectRegistry.d.ts +27 -0
  49. package/dist/projectRegistry.d.ts.map +1 -1
  50. package/dist/projectRegistry.js +191 -5
  51. package/dist/projectRegistry.js.map +1 -1
  52. package/dist/sentinelIssues.d.ts +5 -0
  53. package/dist/sentinelIssues.d.ts.map +1 -1
  54. package/dist/sentinelIssues.js +1 -1
  55. package/dist/sentinelIssues.js.map +1 -1
  56. package/dist/server.js +12 -0
  57. package/dist/server.js.map +1 -1
  58. package/dist/store/fsStore.d.ts +6 -0
  59. package/dist/store/fsStore.d.ts.map +1 -0
  60. package/dist/store/fsStore.js +77 -0
  61. package/dist/store/fsStore.js.map +1 -0
  62. package/dist/store/index.d.ts +8 -0
  63. package/dist/store/index.d.ts.map +1 -0
  64. package/dist/store/index.js +23 -0
  65. package/dist/store/index.js.map +1 -0
  66. package/dist/store/markdown.d.ts +21 -0
  67. package/dist/store/markdown.d.ts.map +1 -0
  68. package/dist/store/markdown.js +175 -0
  69. package/dist/store/markdown.js.map +1 -0
  70. package/dist/store/supabaseStore.d.ts +6 -0
  71. package/dist/store/supabaseStore.d.ts.map +1 -0
  72. package/dist/store/supabaseStore.js +152 -0
  73. package/dist/store/supabaseStore.js.map +1 -0
  74. package/dist/store/types.d.ts +49 -0
  75. package/dist/store/types.d.ts.map +1 -0
  76. package/dist/store/types.js +11 -0
  77. package/dist/store/types.js.map +1 -0
  78. package/dist/supabaseRetry.d.ts +21 -0
  79. package/dist/supabaseRetry.d.ts.map +1 -0
  80. package/dist/supabaseRetry.js +72 -0
  81. package/dist/supabaseRetry.js.map +1 -0
  82. package/dist/toolConfig.d.ts +49 -0
  83. package/dist/toolConfig.d.ts.map +1 -0
  84. package/dist/toolConfig.js +309 -0
  85. package/dist/toolConfig.js.map +1 -0
  86. package/dist/tools/agentic/agentQueue.d.ts.map +1 -1
  87. package/dist/tools/agentic/agentQueue.js +7 -5
  88. package/dist/tools/agentic/agentQueue.js.map +1 -1
  89. package/dist/tools/agentic/index.d.ts +3 -0
  90. package/dist/tools/agentic/index.d.ts.map +1 -1
  91. package/dist/tools/agentic/index.js +158 -1
  92. package/dist/tools/agentic/index.js.map +1 -1
  93. package/dist/tools/codereview/index.d.ts +4 -0
  94. package/dist/tools/codereview/index.d.ts.map +1 -0
  95. package/dist/tools/codereview/index.js +93 -0
  96. package/dist/tools/codereview/index.js.map +1 -0
  97. package/dist/tools/codereview.d.ts +56 -0
  98. package/dist/tools/codereview.d.ts.map +1 -0
  99. package/dist/tools/codereview.js +304 -0
  100. package/dist/tools/codereview.js.map +1 -0
  101. package/dist/tools/concepts.d.ts +38 -0
  102. package/dist/tools/concepts.d.ts.map +1 -0
  103. package/dist/tools/concepts.js +283 -0
  104. package/dist/tools/concepts.js.map +1 -0
  105. package/dist/tools/corpus/index.d.ts +3 -0
  106. package/dist/tools/corpus/index.d.ts.map +1 -1
  107. package/dist/tools/corpus/index.js +183 -1
  108. package/dist/tools/corpus/index.js.map +1 -1
  109. package/dist/tools/corpus.d.ts +52 -0
  110. package/dist/tools/corpus.d.ts.map +1 -1
  111. package/dist/tools/corpus.js +207 -2
  112. package/dist/tools/corpus.js.map +1 -1
  113. package/dist/tools/dojo.d.ts.map +1 -1
  114. package/dist/tools/dojo.js +11 -1
  115. package/dist/tools/dojo.js.map +1 -1
  116. package/dist/tools/git-sentinel.d.ts.map +1 -1
  117. package/dist/tools/git-sentinel.js +24 -8
  118. package/dist/tools/git-sentinel.js.map +1 -1
  119. package/dist/tools/index.d.ts.map +1 -1
  120. package/dist/tools/index.js +6 -0
  121. package/dist/tools/index.js.map +1 -1
  122. package/dist/tools/oracle.d.ts +2 -0
  123. package/dist/tools/oracle.d.ts.map +1 -1
  124. package/dist/tools/oracle.js +146 -17
  125. package/dist/tools/oracle.js.map +1 -1
  126. package/dist/tools/peers.d.ts +15 -0
  127. package/dist/tools/peers.d.ts.map +1 -0
  128. package/dist/tools/peers.js +70 -0
  129. package/dist/tools/peers.js.map +1 -0
  130. package/dist/tools/registry/index.d.ts +4 -0
  131. package/dist/tools/registry/index.d.ts.map +1 -1
  132. package/dist/tools/registry/index.js +274 -1
  133. package/dist/tools/registry/index.js.map +1 -1
  134. package/dist/tools/roadmap.d.ts +4 -0
  135. package/dist/tools/roadmap.d.ts.map +1 -1
  136. package/dist/tools/roadmap.js.map +1 -1
  137. package/dist/tools/sentinel.d.ts +15 -1
  138. package/dist/tools/sentinel.d.ts.map +1 -1
  139. package/dist/tools/sentinel.js +198 -34
  140. package/dist/tools/sentinel.js.map +1 -1
  141. package/dist/tools/voice/index.d.ts.map +1 -1
  142. package/dist/tools/voice/index.js +2 -3
  143. package/dist/tools/voice/index.js.map +1 -1
  144. package/dist/tools/voice.d.ts +1 -1
  145. package/dist/tools/voice.js +2 -2
  146. package/dist/tools/voice.js.map +1 -1
  147. package/dist/tools/workflow.js +5 -5
  148. package/dist/tools/workflow.js.map +1 -1
  149. package/dist/transports/http.js +1 -1
  150. package/package.json +4 -2
@@ -0,0 +1,4 @@
1
+ import { ToolSpec } from '../types.js';
2
+ export declare const codeReviewIngestTool: ToolSpec;
3
+ export declare const codeReviewTools: ToolSpec[];
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}