@promptwheel/core 0.6.0

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 (169) hide show
  1. package/dist/codebase-index/index.d.ts +23 -0
  2. package/dist/codebase-index/index.d.ts.map +1 -0
  3. package/dist/codebase-index/index.js +361 -0
  4. package/dist/codebase-index/index.js.map +1 -0
  5. package/dist/codebase-index/shared.d.ts +95 -0
  6. package/dist/codebase-index/shared.d.ts.map +1 -0
  7. package/dist/codebase-index/shared.js +319 -0
  8. package/dist/codebase-index/shared.js.map +1 -0
  9. package/dist/config/defaults.d.ts +45 -0
  10. package/dist/config/defaults.d.ts.map +1 -0
  11. package/dist/config/defaults.js +79 -0
  12. package/dist/config/defaults.js.map +1 -0
  13. package/dist/critic/shared.d.ts +49 -0
  14. package/dist/critic/shared.d.ts.map +1 -0
  15. package/dist/critic/shared.js +204 -0
  16. package/dist/critic/shared.js.map +1 -0
  17. package/dist/db/adapter.d.ts +191 -0
  18. package/dist/db/adapter.d.ts.map +1 -0
  19. package/dist/db/adapter.js +40 -0
  20. package/dist/db/adapter.js.map +1 -0
  21. package/dist/db/contract.d.ts +47 -0
  22. package/dist/db/contract.d.ts.map +1 -0
  23. package/dist/db/contract.js +258 -0
  24. package/dist/db/contract.js.map +1 -0
  25. package/dist/db/index.d.ts +6 -0
  26. package/dist/db/index.d.ts.map +1 -0
  27. package/dist/db/index.js +7 -0
  28. package/dist/db/index.js.map +1 -0
  29. package/dist/dedup/shared.d.ts +82 -0
  30. package/dist/dedup/shared.d.ts.map +1 -0
  31. package/dist/dedup/shared.js +215 -0
  32. package/dist/dedup/shared.js.map +1 -0
  33. package/dist/exec/index.d.ts +5 -0
  34. package/dist/exec/index.d.ts.map +1 -0
  35. package/dist/exec/index.js +5 -0
  36. package/dist/exec/index.js.map +1 -0
  37. package/dist/exec/types.d.ts +64 -0
  38. package/dist/exec/types.d.ts.map +1 -0
  39. package/dist/exec/types.js +8 -0
  40. package/dist/exec/types.js.map +1 -0
  41. package/dist/formulas/shared.d.ts +42 -0
  42. package/dist/formulas/shared.d.ts.map +1 -0
  43. package/dist/formulas/shared.js +204 -0
  44. package/dist/formulas/shared.js.map +1 -0
  45. package/dist/guidelines/shared.d.ts +46 -0
  46. package/dist/guidelines/shared.d.ts.map +1 -0
  47. package/dist/guidelines/shared.js +128 -0
  48. package/dist/guidelines/shared.js.map +1 -0
  49. package/dist/index.d.ts +35 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +51 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/learnings/shared.d.ts +112 -0
  54. package/dist/learnings/shared.d.ts.map +1 -0
  55. package/dist/learnings/shared.js +402 -0
  56. package/dist/learnings/shared.js.map +1 -0
  57. package/dist/proposals/shared.d.ts +137 -0
  58. package/dist/proposals/shared.d.ts.map +1 -0
  59. package/dist/proposals/shared.js +254 -0
  60. package/dist/proposals/shared.js.map +1 -0
  61. package/dist/repos/index.d.ts +15 -0
  62. package/dist/repos/index.d.ts.map +1 -0
  63. package/dist/repos/index.js +11 -0
  64. package/dist/repos/index.js.map +1 -0
  65. package/dist/repos/projects.d.ts +41 -0
  66. package/dist/repos/projects.d.ts.map +1 -0
  67. package/dist/repos/projects.js +75 -0
  68. package/dist/repos/projects.js.map +1 -0
  69. package/dist/repos/run_steps.d.ts +152 -0
  70. package/dist/repos/run_steps.d.ts.map +1 -0
  71. package/dist/repos/run_steps.js +328 -0
  72. package/dist/repos/run_steps.js.map +1 -0
  73. package/dist/repos/runs.d.ts +92 -0
  74. package/dist/repos/runs.d.ts.map +1 -0
  75. package/dist/repos/runs.js +185 -0
  76. package/dist/repos/runs.js.map +1 -0
  77. package/dist/repos/tickets.d.ts +71 -0
  78. package/dist/repos/tickets.d.ts.map +1 -0
  79. package/dist/repos/tickets.js +158 -0
  80. package/dist/repos/tickets.js.map +1 -0
  81. package/dist/scope/shared.d.ts +67 -0
  82. package/dist/scope/shared.d.ts.map +1 -0
  83. package/dist/scope/shared.js +355 -0
  84. package/dist/scope/shared.js.map +1 -0
  85. package/dist/scout/index.d.ts +18 -0
  86. package/dist/scout/index.d.ts.map +1 -0
  87. package/dist/scout/index.js +445 -0
  88. package/dist/scout/index.js.map +1 -0
  89. package/dist/scout/kimi-runner.d.ts +21 -0
  90. package/dist/scout/kimi-runner.d.ts.map +1 -0
  91. package/dist/scout/kimi-runner.js +76 -0
  92. package/dist/scout/kimi-runner.js.map +1 -0
  93. package/dist/scout/mcp-batch-server.d.ts +37 -0
  94. package/dist/scout/mcp-batch-server.d.ts.map +1 -0
  95. package/dist/scout/mcp-batch-server.js +144 -0
  96. package/dist/scout/mcp-batch-server.js.map +1 -0
  97. package/dist/scout/openai-local-runner.d.ts +20 -0
  98. package/dist/scout/openai-local-runner.d.ts.map +1 -0
  99. package/dist/scout/openai-local-runner.js +82 -0
  100. package/dist/scout/openai-local-runner.js.map +1 -0
  101. package/dist/scout/prompt.d.ts +49 -0
  102. package/dist/scout/prompt.d.ts.map +1 -0
  103. package/dist/scout/prompt.js +153 -0
  104. package/dist/scout/prompt.js.map +1 -0
  105. package/dist/scout/runner.d.ts +101 -0
  106. package/dist/scout/runner.d.ts.map +1 -0
  107. package/dist/scout/runner.js +521 -0
  108. package/dist/scout/runner.js.map +1 -0
  109. package/dist/scout/scanner.d.ts +61 -0
  110. package/dist/scout/scanner.d.ts.map +1 -0
  111. package/dist/scout/scanner.js +315 -0
  112. package/dist/scout/scanner.js.map +1 -0
  113. package/dist/scout/types.d.ts +221 -0
  114. package/dist/scout/types.d.ts.map +1 -0
  115. package/dist/scout/types.js +44 -0
  116. package/dist/scout/types.js.map +1 -0
  117. package/dist/sectors/shared.d.ts +146 -0
  118. package/dist/sectors/shared.d.ts.map +1 -0
  119. package/dist/sectors/shared.js +408 -0
  120. package/dist/sectors/shared.js.map +1 -0
  121. package/dist/services/index.d.ts +10 -0
  122. package/dist/services/index.d.ts.map +1 -0
  123. package/dist/services/index.js +9 -0
  124. package/dist/services/index.js.map +1 -0
  125. package/dist/services/qa.d.ts +76 -0
  126. package/dist/services/qa.d.ts.map +1 -0
  127. package/dist/services/qa.js +228 -0
  128. package/dist/services/qa.js.map +1 -0
  129. package/dist/services/scout.d.ts +164 -0
  130. package/dist/services/scout.d.ts.map +1 -0
  131. package/dist/services/scout.js +215 -0
  132. package/dist/services/scout.js.map +1 -0
  133. package/dist/spindle/shared.d.ts +14 -0
  134. package/dist/spindle/shared.d.ts.map +1 -0
  135. package/dist/spindle/shared.js +65 -0
  136. package/dist/spindle/shared.js.map +1 -0
  137. package/dist/tools/shared.d.ts +35 -0
  138. package/dist/tools/shared.d.ts.map +1 -0
  139. package/dist/tools/shared.js +247 -0
  140. package/dist/tools/shared.js.map +1 -0
  141. package/dist/trace/shared.d.ts +147 -0
  142. package/dist/trace/shared.d.ts.map +1 -0
  143. package/dist/trace/shared.js +414 -0
  144. package/dist/trace/shared.js.map +1 -0
  145. package/dist/trajectory/shared.d.ts +69 -0
  146. package/dist/trajectory/shared.d.ts.map +1 -0
  147. package/dist/trajectory/shared.js +336 -0
  148. package/dist/trajectory/shared.js.map +1 -0
  149. package/dist/utils/id.d.ts +12 -0
  150. package/dist/utils/id.d.ts.map +1 -0
  151. package/dist/utils/id.js +24 -0
  152. package/dist/utils/id.js.map +1 -0
  153. package/dist/utils/id.test.d.ts +5 -0
  154. package/dist/utils/id.test.d.ts.map +1 -0
  155. package/dist/utils/id.test.js +173 -0
  156. package/dist/utils/id.test.js.map +1 -0
  157. package/dist/utils/index.d.ts +6 -0
  158. package/dist/utils/index.d.ts.map +1 -0
  159. package/dist/utils/index.js +6 -0
  160. package/dist/utils/index.js.map +1 -0
  161. package/dist/utils/json.d.ts +9 -0
  162. package/dist/utils/json.d.ts.map +1 -0
  163. package/dist/utils/json.js +19 -0
  164. package/dist/utils/json.js.map +1 -0
  165. package/dist/waves/shared.d.ts +106 -0
  166. package/dist/waves/shared.d.ts.map +1 -0
  167. package/dist/waves/shared.js +356 -0
  168. package/dist/waves/shared.js.map +1 -0
  169. package/package.json +126 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Pure learnings algorithms — no filesystem, no database, no crypto.
3
+ *
4
+ * Shared by both @promptwheel/cli and @promptwheel/mcp.
5
+ * Callers handle file I/O (reading/writing learnings.json) and ID generation.
6
+ */
7
+ /**
8
+ * Structured knowledge attached to a learning.
9
+ * Optional — learnings without this field use text-only matching (backward compat).
10
+ */
11
+ export interface StructuredKnowledge {
12
+ /** Files that must co-change together (learned from execution diffs) */
13
+ cochange_files?: string[];
14
+ /** Files with high failure rate when modified */
15
+ fragile_paths?: string[];
16
+ /** Root cause explanation for a failure */
17
+ root_cause?: string;
18
+ /** What type of knowledge this represents */
19
+ pattern_type?: 'dependency' | 'convention' | 'antipattern' | 'environment';
20
+ /** Glob scope this knowledge applies to */
21
+ applies_to?: string;
22
+ /** Failure context from QA/execution */
23
+ failure_context?: {
24
+ /** Which QA command failed */
25
+ command: string;
26
+ /** Normalized error signature (e.g. "TypeError: X is not a function") */
27
+ error_signature: string;
28
+ /** What fix was applied (populated on subsequent success) */
29
+ fix_applied?: string;
30
+ };
31
+ }
32
+ export interface Learning {
33
+ id: string;
34
+ text: string;
35
+ category: 'gotcha' | 'pattern' | 'warning' | 'context' | 'compaction';
36
+ source: {
37
+ type: 'qa_failure' | 'ticket_failure' | 'ticket_success' | 'review_downgrade' | 'plan_rejection' | 'scope_violation' | 'reviewer_feedback' | 'cross_sector_pattern' | 'process_insight' | 'manual';
38
+ detail?: string;
39
+ };
40
+ tags: string[];
41
+ weight: number;
42
+ created_at: string;
43
+ last_confirmed_at: string;
44
+ access_count: number;
45
+ /** Effectiveness tracking: times learning was applied */
46
+ applied_count?: number;
47
+ /** Effectiveness tracking: successful outcomes when applied */
48
+ success_count?: number;
49
+ /** Structured knowledge for richer retrieval and prompt injection */
50
+ structured?: StructuredKnowledge;
51
+ }
52
+ export declare const LEARNINGS_DEFAULTS: {
53
+ readonly DECAY_RATE: 3;
54
+ readonly DEFAULT_WEIGHT: 50;
55
+ readonly MAX_WEIGHT: 100;
56
+ readonly CONSOLIDATION_THRESHOLD: 50;
57
+ readonly SIMILARITY_MERGE_THRESHOLD: 0.7;
58
+ readonly CONFIRMATION_WINDOW_MS: number;
59
+ readonly DEFAULT_BUDGET: 2000;
60
+ };
61
+ /**
62
+ * Apply temporal decay to learnings, returning only entries with weight > 0.
63
+ * Access bonus halves decay; recent confirmation halves it again.
64
+ */
65
+ export declare function applyLearningsDecay(learnings: Learning[], decayRate?: number, now?: number): Learning[];
66
+ /**
67
+ * Consolidate near-duplicate learnings (>70% text similarity).
68
+ * Keeps the higher weight entry, sums access counts.
69
+ * Returns null if no consolidation needed (below threshold or too aggressive).
70
+ */
71
+ export declare function consolidateLearnings(learnings: Learning[]): Learning[] | null;
72
+ /**
73
+ * Format learnings for prompt injection.
74
+ * Sorts by weight descending, respects char budget.
75
+ * Includes structured knowledge annotations when available.
76
+ */
77
+ export declare function formatLearningsForPrompt(learnings: Learning[], budget?: number): string;
78
+ /**
79
+ * Extract top keywords from text for fuzzy matching.
80
+ */
81
+ export declare function extractKeywords(text: string): string[];
82
+ /**
83
+ * Extract tags from paths and commands for tag matching.
84
+ */
85
+ export declare function extractTags(paths: string[], commands: string[]): string[];
86
+ /**
87
+ * Select learnings relevant to the current context.
88
+ * Scores by tag overlap × weight with enhanced relevance.
89
+ * Structured knowledge fields provide additional scoring signals.
90
+ * Returns scored and sorted learnings (highest relevance first).
91
+ */
92
+ export declare function selectRelevant(learnings: Learning[], context: {
93
+ paths?: string[];
94
+ commands?: string[];
95
+ titleHint?: string;
96
+ }, opts?: {
97
+ maxResults?: number;
98
+ }, now?: number): Learning[];
99
+ export type AdaptiveRiskLevel = 'low' | 'normal' | 'elevated' | 'high';
100
+ export interface AdaptiveRiskAssessment {
101
+ level: AdaptiveRiskLevel;
102
+ score: number;
103
+ fragile_paths: string[];
104
+ known_issues: string[];
105
+ failure_count: number;
106
+ }
107
+ /**
108
+ * Assess adaptive risk for a ticket based on failure history in learnings.
109
+ * Only counts failure-sourced learnings with path overlap.
110
+ */
111
+ export declare function assessAdaptiveRisk(learnings: Learning[], ticketPaths: string[]): AdaptiveRiskAssessment;
112
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/learnings/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,402 @@
1
+ /**
2
+ * Pure learnings algorithms — no filesystem, no database, no crypto.
3
+ *
4
+ * Shared by both @promptwheel/cli and @promptwheel/mcp.
5
+ * Callers handle file I/O (reading/writing learnings.json) and ID generation.
6
+ */
7
+ import { bigramSimilarity } from '../dedup/shared.js';
8
+ // ---------------------------------------------------------------------------
9
+ // Constants
10
+ // ---------------------------------------------------------------------------
11
+ export const LEARNINGS_DEFAULTS = {
12
+ DECAY_RATE: 3,
13
+ DEFAULT_WEIGHT: 50,
14
+ MAX_WEIGHT: 100,
15
+ CONSOLIDATION_THRESHOLD: 50,
16
+ SIMILARITY_MERGE_THRESHOLD: 0.7,
17
+ CONFIRMATION_WINDOW_MS: 7 * 24 * 60 * 60 * 1000, // 7 days
18
+ DEFAULT_BUDGET: 2000,
19
+ };
20
+ // ---------------------------------------------------------------------------
21
+ // Decay (pure — operates on array, returns surviving entries)
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Apply temporal decay to learnings, returning only entries with weight > 0.
25
+ * Access bonus halves decay; recent confirmation halves it again.
26
+ */
27
+ export function applyLearningsDecay(learnings, decayRate = LEARNINGS_DEFAULTS.DECAY_RATE, now = Date.now()) {
28
+ const surviving = [];
29
+ for (const l of learnings) {
30
+ let decay = decayRate;
31
+ // Access bonus: halve decay if accessed
32
+ if (l.access_count > 0) {
33
+ decay /= 2;
34
+ }
35
+ // Confirmation bonus: halve again if confirmed within 7 days
36
+ const confirmedAt = new Date(l.last_confirmed_at).getTime();
37
+ if (now - confirmedAt < LEARNINGS_DEFAULTS.CONFIRMATION_WINDOW_MS) {
38
+ decay /= 2;
39
+ }
40
+ l.weight = Math.min(LEARNINGS_DEFAULTS.MAX_WEIGHT, l.weight - decay);
41
+ if (l.weight > 0) {
42
+ surviving.push(l);
43
+ }
44
+ }
45
+ return surviving;
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Consolidation (pure — merges near-duplicate learnings)
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * Consolidate near-duplicate learnings (>70% text similarity).
52
+ * Keeps the higher weight entry, sums access counts.
53
+ * Returns null if no consolidation needed (below threshold or too aggressive).
54
+ */
55
+ export function consolidateLearnings(learnings) {
56
+ if (learnings.length <= LEARNINGS_DEFAULTS.CONSOLIDATION_THRESHOLD)
57
+ return null;
58
+ // Deep-clone entries so the original array is never mutated
59
+ const entries = learnings.map(l => ({
60
+ ...l,
61
+ source: { ...l.source },
62
+ tags: [...l.tags],
63
+ structured: l.structured ? { ...l.structured } : undefined,
64
+ }));
65
+ const merged = new Set();
66
+ for (let i = 0; i < entries.length; i++) {
67
+ if (merged.has(i))
68
+ continue;
69
+ for (let j = i + 1; j < entries.length; j++) {
70
+ if (merged.has(j))
71
+ continue;
72
+ if (bigramSimilarity(entries[i].text, entries[j].text) >= LEARNINGS_DEFAULTS.SIMILARITY_MERGE_THRESHOLD) {
73
+ // Guard: don't merge across different categories
74
+ if (entries[i].category !== entries[j].category)
75
+ continue;
76
+ // Guard: don't merge across different source types
77
+ if (entries[i].source.type !== entries[j].source.type)
78
+ continue;
79
+ // Guard: don't merge different failure types
80
+ const ftI = entries[i].tags.find(t => t.startsWith('failureType:'));
81
+ const ftJ = entries[j].tags.find(t => t.startsWith('failureType:'));
82
+ if (ftI && ftJ && ftI !== ftJ)
83
+ continue;
84
+ // Guard: don't merge frequently accessed learnings
85
+ if (entries[i].access_count >= 3 || entries[j].access_count >= 3)
86
+ continue;
87
+ // Merge j into i (keep higher weight)
88
+ if (entries[j].weight > entries[i].weight) {
89
+ entries[i].weight = entries[j].weight;
90
+ entries[i].text = entries[j].text;
91
+ }
92
+ entries[i].access_count += entries[j].access_count;
93
+ // Merge tags
94
+ const tagSet = new Set([...entries[i].tags, ...entries[j].tags]);
95
+ entries[i].tags = [...tagSet];
96
+ // Merge structured knowledge (union cochange_files and fragile_paths, keep winner's other fields)
97
+ if (entries[i].structured || entries[j].structured) {
98
+ const si = entries[i].structured ?? {};
99
+ const sj = entries[j].structured ?? {};
100
+ entries[i].structured = {
101
+ ...si,
102
+ cochange_files: si.cochange_files || sj.cochange_files
103
+ ? [...new Set([...(si.cochange_files ?? []), ...(sj.cochange_files ?? [])])]
104
+ : undefined,
105
+ fragile_paths: si.fragile_paths || sj.fragile_paths
106
+ ? [...new Set([...(si.fragile_paths ?? []), ...(sj.fragile_paths ?? [])])]
107
+ : undefined,
108
+ // Keep winner's root_cause (already set by weight comparison above)
109
+ root_cause: si.root_cause ?? sj.root_cause,
110
+ failure_context: si.failure_context ?? sj.failure_context,
111
+ };
112
+ }
113
+ // Preserve most recent confirmation date for decay calculations
114
+ if (new Date(entries[j].last_confirmed_at).getTime() > new Date(entries[i].last_confirmed_at).getTime()) {
115
+ entries[i].last_confirmed_at = entries[j].last_confirmed_at;
116
+ }
117
+ merged.add(j);
118
+ }
119
+ }
120
+ }
121
+ const result = entries.filter((_, idx) => !merged.has(idx));
122
+ // Guard: if consolidation was too aggressive, skip
123
+ if (result.length < Math.ceil(LEARNINGS_DEFAULTS.CONSOLIDATION_THRESHOLD * 0.4))
124
+ return null;
125
+ return result;
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Prompt formatting (pure)
129
+ // ---------------------------------------------------------------------------
130
+ /**
131
+ * Format a single structured knowledge block as an inline annotation.
132
+ * Returns empty string if no actionable structured data.
133
+ */
134
+ function formatStructuredAnnotation(sk) {
135
+ const parts = [];
136
+ if (sk.cochange_files && sk.cochange_files.length > 0) {
137
+ parts.push(`Co-change: ${sk.cochange_files.join(', ')}`);
138
+ }
139
+ if (sk.fragile_paths && sk.fragile_paths.length > 0) {
140
+ parts.push(`Fragile: ${sk.fragile_paths.join(', ')}`);
141
+ }
142
+ if (sk.root_cause) {
143
+ parts.push(`Cause: ${sk.root_cause}`);
144
+ }
145
+ if (sk.failure_context?.error_signature) {
146
+ parts.push(`Error: ${sk.failure_context.error_signature}`);
147
+ }
148
+ if (sk.failure_context?.fix_applied) {
149
+ parts.push(`Fix: ${sk.failure_context.fix_applied}`);
150
+ }
151
+ if (parts.length === 0)
152
+ return '';
153
+ return ` → ${parts.join(' | ')}`;
154
+ }
155
+ /**
156
+ * Format learnings for prompt injection.
157
+ * Sorts by weight descending, respects char budget.
158
+ * Includes structured knowledge annotations when available.
159
+ */
160
+ export function formatLearningsForPrompt(learnings, budget = LEARNINGS_DEFAULTS.DEFAULT_BUDGET) {
161
+ if (learnings.length === 0)
162
+ return '';
163
+ const sorted = [...learnings].sort((a, b) => b.weight - a.weight);
164
+ const lines = [];
165
+ let charCount = 0;
166
+ const header = '<project-learnings>\n## Learnings from Previous Runs\n';
167
+ const footer = '\n</project-learnings>';
168
+ charCount += header.length + footer.length;
169
+ for (const l of sorted) {
170
+ const tag = l.category.toUpperCase();
171
+ let line = `- [${tag}] ${l.text} (w:${Math.round(l.weight)})`;
172
+ // Append structured annotation if present and budget allows
173
+ if (l.structured) {
174
+ const annotation = formatStructuredAnnotation(l.structured);
175
+ if (annotation) {
176
+ line += '\n' + annotation;
177
+ }
178
+ }
179
+ if (charCount + line.length + 1 > budget)
180
+ break;
181
+ lines.push(line);
182
+ charCount += line.length + 1;
183
+ }
184
+ if (lines.length === 0)
185
+ return '';
186
+ return header + lines.join('\n') + footer;
187
+ }
188
+ // ---------------------------------------------------------------------------
189
+ // Keyword extraction and relevance scoring (pure)
190
+ // ---------------------------------------------------------------------------
191
+ const STOPWORDS = new Set([
192
+ 'the', 'and', 'for', 'that', 'this', 'with', 'from', 'are', 'was', 'were',
193
+ 'been', 'have', 'has', 'had', 'not', 'but', 'all', 'can', 'her', 'his',
194
+ 'its', 'may', 'new', 'now', 'old', 'see', 'way', 'who', 'did', 'get',
195
+ 'let', 'say', 'she', 'too', 'use', 'add', 'fix', 'run', 'set', 'try',
196
+ 'import', 'export', 'function', 'const', 'return', 'type', 'interface',
197
+ 'class', 'async', 'await', 'string', 'number', 'boolean', 'null', 'undefined',
198
+ 'file', 'files', 'code', 'should', 'would', 'could',
199
+ ]);
200
+ /**
201
+ * Extract top keywords from text for fuzzy matching.
202
+ */
203
+ export function extractKeywords(text) {
204
+ const words = text
205
+ .toLowerCase()
206
+ .replace(/[^a-z0-9\s]/g, '')
207
+ .split(/\s+/)
208
+ .filter(w => w.length > 2 && !STOPWORDS.has(w));
209
+ const unique = [...new Set(words)];
210
+ // Sort by length descending (longer words are more specific)
211
+ unique.sort((a, b) => b.length - a.length);
212
+ return unique.slice(0, 5);
213
+ }
214
+ /**
215
+ * Extract tags from paths and commands for tag matching.
216
+ */
217
+ export function extractTags(paths, commands) {
218
+ const tags = [];
219
+ for (const p of paths) {
220
+ // Normalize: strip trailing globs
221
+ const clean = p.replace(/\/?\*\*?$/, '');
222
+ if (clean)
223
+ tags.push(`path:${clean}`);
224
+ }
225
+ for (const c of commands) {
226
+ tags.push(`cmd:${c}`);
227
+ }
228
+ return tags;
229
+ }
230
+ /**
231
+ * Select learnings relevant to the current context.
232
+ * Scores by tag overlap × weight with enhanced relevance.
233
+ * Structured knowledge fields provide additional scoring signals.
234
+ * Returns scored and sorted learnings (highest relevance first).
235
+ */
236
+ export function selectRelevant(learnings, context, opts, now = Date.now()) {
237
+ const contextTags = extractTags(context.paths ?? [], context.commands ?? []);
238
+ if (contextTags.length === 0)
239
+ return learnings;
240
+ const contextPathTags = contextTags.filter(t => t.startsWith('path:'));
241
+ const contextCmdTags = new Set(contextTags.filter(t => t.startsWith('cmd:')));
242
+ const contextPaths = (context.paths ?? []).map(p => p.replace(/\/?\*\*?$/, ''));
243
+ const hasCommands = (context.commands?.length ?? 0) > 0;
244
+ const scored = learnings.map(l => {
245
+ let tagScore = 0;
246
+ // Standard tag matching
247
+ for (const t of l.tags) {
248
+ if (t.startsWith('path:')) {
249
+ const lPath = t.slice(5);
250
+ if (contextPathTags.some(ct => ct.slice(5) === lPath)) {
251
+ tagScore += 30;
252
+ continue;
253
+ }
254
+ if (contextPathTags.some(ct => ct.slice(5).startsWith(lPath + '/') || lPath.startsWith(ct.slice(5) + '/'))) {
255
+ tagScore += 15;
256
+ continue;
257
+ }
258
+ }
259
+ else if (t.startsWith('cmd:') && contextCmdTags.has(t)) {
260
+ tagScore += 10;
261
+ }
262
+ else if (t.startsWith('failureType:') && contextCmdTags.size > 0) {
263
+ tagScore += 5;
264
+ }
265
+ }
266
+ // Structured knowledge scoring
267
+ if (l.structured) {
268
+ const sk = l.structured;
269
+ // Cochange files: if any cochange file overlaps with context paths, strong signal
270
+ if (sk.cochange_files && sk.cochange_files.length > 0) {
271
+ for (const cf of sk.cochange_files) {
272
+ if (contextPaths.some(cp => cf.startsWith(cp + '/') || cf === cp || cp.startsWith(cf + '/'))) {
273
+ tagScore += 20;
274
+ break; // one match is enough
275
+ }
276
+ }
277
+ }
278
+ // Fragile paths: if context touches a known fragile path, boost
279
+ if (sk.fragile_paths && sk.fragile_paths.length > 0) {
280
+ for (const fp of sk.fragile_paths) {
281
+ if (contextPaths.some(cp => fp.startsWith(cp + '/') || fp === cp || cp.startsWith(fp + '/'))) {
282
+ tagScore += 15;
283
+ break;
284
+ }
285
+ }
286
+ }
287
+ // Error signature: if context has the same failing command, boost
288
+ if (sk.failure_context?.command && contextCmdTags.has(`cmd:${sk.failure_context.command}`)) {
289
+ tagScore += 12;
290
+ }
291
+ // Pattern type bonuses: antipatterns and dependencies are high-value
292
+ if (sk.pattern_type === 'antipattern')
293
+ tagScore += 5;
294
+ if (sk.pattern_type === 'dependency')
295
+ tagScore += 5;
296
+ }
297
+ if (context.titleHint) {
298
+ const hintLower = context.titleHint.toLowerCase();
299
+ for (const kw of extractKeywords(l.text)) {
300
+ if (hintLower.includes(kw))
301
+ tagScore += 3;
302
+ }
303
+ }
304
+ if (l.category === 'gotcha' && hasCommands)
305
+ tagScore += 10;
306
+ if (l.last_confirmed_at) {
307
+ const age = now - new Date(l.last_confirmed_at).getTime();
308
+ if (age < 3 * 24 * 60 * 60 * 1000)
309
+ tagScore += 5;
310
+ }
311
+ return { learning: l, score: tagScore + l.weight };
312
+ });
313
+ scored.sort((a, b) => b.score - a.score);
314
+ const max = opts?.maxResults ?? 15;
315
+ return scored.slice(0, max).map(s => s.learning);
316
+ }
317
+ /** Failure-sourced learning types that indicate risk. */
318
+ const FAILURE_SOURCES = new Set([
319
+ 'qa_failure', 'ticket_failure', 'scope_violation', 'plan_rejection',
320
+ ]);
321
+ /** Compaction-sourced learnings that indicate context pressure. */
322
+ const COMPACTION_CATEGORY = 'compaction';
323
+ /**
324
+ * Assess adaptive risk for a ticket based on failure history in learnings.
325
+ * Only counts failure-sourced learnings with path overlap.
326
+ */
327
+ export function assessAdaptiveRisk(learnings, ticketPaths) {
328
+ const pathSet = new Set(ticketPaths.map(p => p.replace(/\/?\*\*?$/, '')));
329
+ let score = 0;
330
+ let failureCount = 0;
331
+ const fragilePaths = new Set();
332
+ const knownIssues = [];
333
+ for (const l of learnings) {
334
+ // Check compaction-sourced learnings — these indicate context pressure
335
+ if (l.category === COMPACTION_CATEGORY) {
336
+ // Check path overlap for compaction learnings
337
+ let compactionOverlap = false;
338
+ for (const tag of l.tags) {
339
+ if (tag.startsWith('path:')) {
340
+ const lPath = tag.slice(5);
341
+ if (pathSet.has(lPath) || [...pathSet].some(p => lPath.startsWith(p + '/') || p.startsWith(lPath + '/'))) {
342
+ compactionOverlap = true;
343
+ break;
344
+ }
345
+ }
346
+ }
347
+ if (compactionOverlap) {
348
+ score += 12 * (l.weight / 50);
349
+ if (knownIssues.length < 5) {
350
+ knownIssues.push(l.text.slice(0, 150));
351
+ }
352
+ }
353
+ continue;
354
+ }
355
+ // Only count failure-sourced learnings
356
+ if (!FAILURE_SOURCES.has(l.source.type))
357
+ continue;
358
+ // Check path overlap via tags
359
+ let hasOverlap = false;
360
+ for (const tag of l.tags) {
361
+ if (tag.startsWith('path:')) {
362
+ const lPath = tag.slice(5);
363
+ if (pathSet.has(lPath) || [...pathSet].some(p => lPath.startsWith(p + '/') || p.startsWith(lPath + '/'))) {
364
+ hasOverlap = true;
365
+ break;
366
+ }
367
+ }
368
+ }
369
+ if (!hasOverlap)
370
+ continue;
371
+ failureCount++;
372
+ score += 10 * (l.weight / 50);
373
+ // Collect fragile paths
374
+ if (l.structured?.fragile_paths) {
375
+ for (const fp of l.structured.fragile_paths) {
376
+ fragilePaths.add(fp);
377
+ }
378
+ score += 8 * (l.weight / 50);
379
+ }
380
+ // Collect antipattern bonus
381
+ if (l.structured?.pattern_type === 'antipattern') {
382
+ score += 5 * (l.weight / 50);
383
+ }
384
+ // Collect known issues (up to 5)
385
+ if (knownIssues.length < 5) {
386
+ knownIssues.push(l.text.slice(0, 150));
387
+ }
388
+ }
389
+ score = Math.min(100, score);
390
+ const level = score < 10 ? 'low' :
391
+ score < 30 ? 'normal' :
392
+ score < 60 ? 'elevated' :
393
+ 'high';
394
+ return {
395
+ level,
396
+ score,
397
+ fragile_paths: [...fragilePaths],
398
+ known_issues: knownIssues,
399
+ failure_count: failureCount,
400
+ };
401
+ }
402
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/learnings/shared.ts"],"names":[],"mappings":"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"}