@slope-dev/slope 1.13.2 → 1.16.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 (212) hide show
  1. package/dist/cli/commands/context.d.ts +2 -0
  2. package/dist/cli/commands/context.d.ts.map +1 -0
  3. package/dist/cli/commands/context.js +190 -0
  4. package/dist/cli/commands/context.js.map +1 -0
  5. package/dist/cli/commands/distill.d.ts.map +1 -1
  6. package/dist/cli/commands/distill.js +13 -4
  7. package/dist/cli/commands/distill.js.map +1 -1
  8. package/dist/cli/commands/docs.d.ts +5 -0
  9. package/dist/cli/commands/docs.d.ts.map +1 -0
  10. package/dist/cli/commands/docs.js +303 -0
  11. package/dist/cli/commands/docs.js.map +1 -0
  12. package/dist/cli/commands/enrich.d.ts +2 -0
  13. package/dist/cli/commands/enrich.d.ts.map +1 -0
  14. package/dist/cli/commands/enrich.js +140 -0
  15. package/dist/cli/commands/enrich.js.map +1 -0
  16. package/dist/cli/commands/guard.d.ts.map +1 -1
  17. package/dist/cli/commands/guard.js +2 -0
  18. package/dist/cli/commands/guard.js.map +1 -1
  19. package/dist/cli/commands/index-cmd.d.ts +2 -0
  20. package/dist/cli/commands/index-cmd.d.ts.map +1 -0
  21. package/dist/cli/commands/index-cmd.js +296 -0
  22. package/dist/cli/commands/index-cmd.js.map +1 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/init.js +73 -182
  25. package/dist/cli/commands/init.js.map +1 -1
  26. package/dist/cli/commands/initiative.d.ts +2 -0
  27. package/dist/cli/commands/initiative.d.ts.map +1 -0
  28. package/dist/cli/commands/initiative.js +207 -0
  29. package/dist/cli/commands/initiative.js.map +1 -0
  30. package/dist/cli/commands/loop.d.ts +2 -0
  31. package/dist/cli/commands/loop.d.ts.map +1 -0
  32. package/dist/cli/commands/loop.js +388 -0
  33. package/dist/cli/commands/loop.js.map +1 -0
  34. package/dist/cli/commands/prep.d.ts +2 -0
  35. package/dist/cli/commands/prep.d.ts.map +1 -0
  36. package/dist/cli/commands/prep.js +94 -0
  37. package/dist/cli/commands/prep.js.map +1 -0
  38. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  39. package/dist/cli/commands/roadmap.js +134 -46
  40. package/dist/cli/commands/roadmap.js.map +1 -1
  41. package/dist/cli/commands/session.d.ts.map +1 -1
  42. package/dist/cli/commands/session.js +2 -0
  43. package/dist/cli/commands/session.js.map +1 -1
  44. package/dist/cli/commands/store.js +76 -10
  45. package/dist/cli/commands/store.js.map +1 -1
  46. package/dist/cli/commands/vision.d.ts.map +1 -1
  47. package/dist/cli/commands/vision.js +104 -7
  48. package/dist/cli/commands/vision.js.map +1 -1
  49. package/dist/cli/guards/stop-check.d.ts +6 -1
  50. package/dist/cli/guards/stop-check.d.ts.map +1 -1
  51. package/dist/cli/guards/stop-check.js +84 -5
  52. package/dist/cli/guards/stop-check.js.map +1 -1
  53. package/dist/cli/guards/worktree-check.d.ts +14 -0
  54. package/dist/cli/guards/worktree-check.d.ts.map +1 -0
  55. package/dist/cli/guards/worktree-check.js +137 -0
  56. package/dist/cli/guards/worktree-check.js.map +1 -0
  57. package/dist/cli/index.js +56 -0
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/cli/interactive-init.d.ts +19 -0
  60. package/dist/cli/interactive-init.d.ts.map +1 -0
  61. package/dist/cli/interactive-init.js +132 -0
  62. package/dist/cli/interactive-init.js.map +1 -0
  63. package/dist/cli/loop/analyze.d.ts +8 -0
  64. package/dist/cli/loop/analyze.d.ts.map +1 -0
  65. package/dist/cli/loop/analyze.js +62 -0
  66. package/dist/cli/loop/analyze.js.map +1 -0
  67. package/dist/cli/loop/backlog.d.ts +26 -0
  68. package/dist/cli/loop/backlog.d.ts.map +1 -0
  69. package/dist/cli/loop/backlog.js +95 -0
  70. package/dist/cli/loop/backlog.js.map +1 -0
  71. package/dist/cli/loop/config.d.ts +10 -0
  72. package/dist/cli/loop/config.d.ts.map +1 -0
  73. package/dist/cli/loop/config.js +75 -0
  74. package/dist/cli/loop/config.js.map +1 -0
  75. package/dist/cli/loop/continuous.d.ts +6 -0
  76. package/dist/cli/loop/continuous.d.ts.map +1 -0
  77. package/dist/cli/loop/continuous.js +108 -0
  78. package/dist/cli/loop/continuous.js.map +1 -0
  79. package/dist/cli/loop/executor.d.ts +8 -0
  80. package/dist/cli/loop/executor.d.ts.map +1 -0
  81. package/dist/cli/loop/executor.js +600 -0
  82. package/dist/cli/loop/executor.js.map +1 -0
  83. package/dist/cli/loop/guard-runner.d.ts +14 -0
  84. package/dist/cli/loop/guard-runner.d.ts.map +1 -0
  85. package/dist/cli/loop/guard-runner.js +53 -0
  86. package/dist/cli/loop/guard-runner.js.map +1 -0
  87. package/dist/cli/loop/logger.d.ts +9 -0
  88. package/dist/cli/loop/logger.d.ts.map +1 -0
  89. package/dist/cli/loop/logger.js +37 -0
  90. package/dist/cli/loop/logger.js.map +1 -0
  91. package/dist/cli/loop/model-selector.d.ts +14 -0
  92. package/dist/cli/loop/model-selector.d.ts.map +1 -0
  93. package/dist/cli/loop/model-selector.js +59 -0
  94. package/dist/cli/loop/model-selector.js.map +1 -0
  95. package/dist/cli/loop/parallel.d.ts +6 -0
  96. package/dist/cli/loop/parallel.d.ts.map +1 -0
  97. package/dist/cli/loop/parallel.js +109 -0
  98. package/dist/cli/loop/parallel.js.map +1 -0
  99. package/dist/cli/loop/pr-lifecycle.d.ts +26 -0
  100. package/dist/cli/loop/pr-lifecycle.d.ts.map +1 -0
  101. package/dist/cli/loop/pr-lifecycle.js +244 -0
  102. package/dist/cli/loop/pr-lifecycle.js.map +1 -0
  103. package/dist/cli/loop/types.d.ts +98 -0
  104. package/dist/cli/loop/types.d.ts.map +1 -0
  105. package/dist/cli/loop/types.js +37 -0
  106. package/dist/cli/loop/types.js.map +1 -0
  107. package/dist/cli/loop/worktree.d.ts +30 -0
  108. package/dist/cli/loop/worktree.d.ts.map +1 -0
  109. package/dist/cli/loop/worktree.js +134 -0
  110. package/dist/cli/loop/worktree.js.map +1 -0
  111. package/dist/cli/registry.d.ts.map +1 -1
  112. package/dist/cli/registry.js +9 -0
  113. package/dist/cli/registry.js.map +1 -1
  114. package/dist/core/analyzers/stack.d.ts +2 -0
  115. package/dist/core/analyzers/stack.d.ts.map +1 -1
  116. package/dist/core/analyzers/stack.js +9 -6
  117. package/dist/core/analyzers/stack.js.map +1 -1
  118. package/dist/core/config.d.ts +6 -0
  119. package/dist/core/config.d.ts.map +1 -1
  120. package/dist/core/config.js.map +1 -1
  121. package/dist/core/constants.d.ts +2 -0
  122. package/dist/core/constants.d.ts.map +1 -1
  123. package/dist/core/constants.js +2 -0
  124. package/dist/core/constants.js.map +1 -1
  125. package/dist/core/context.d.ts +20 -0
  126. package/dist/core/context.d.ts.map +1 -0
  127. package/dist/core/context.js +59 -0
  128. package/dist/core/context.js.map +1 -0
  129. package/dist/core/docs.d.ts +50 -0
  130. package/dist/core/docs.d.ts.map +1 -0
  131. package/dist/core/docs.js +67 -0
  132. package/dist/core/docs.js.map +1 -0
  133. package/dist/core/embedding-client.d.ts +11 -0
  134. package/dist/core/embedding-client.d.ts.map +1 -0
  135. package/dist/core/embedding-client.js +92 -0
  136. package/dist/core/embedding-client.js.map +1 -0
  137. package/dist/core/embedding-store.d.ts +44 -0
  138. package/dist/core/embedding-store.d.ts.map +1 -0
  139. package/dist/core/embedding-store.js +7 -0
  140. package/dist/core/embedding-store.js.map +1 -0
  141. package/dist/core/embedding.d.ts +32 -0
  142. package/dist/core/embedding.d.ts.map +1 -0
  143. package/dist/core/embedding.js +114 -0
  144. package/dist/core/embedding.js.map +1 -0
  145. package/dist/core/enrich.d.ts +76 -0
  146. package/dist/core/enrich.d.ts.map +1 -0
  147. package/dist/core/enrich.js +115 -0
  148. package/dist/core/enrich.js.map +1 -0
  149. package/dist/core/generators/roadmap.d.ts +6 -1
  150. package/dist/core/generators/roadmap.d.ts.map +1 -1
  151. package/dist/core/generators/roadmap.js +150 -0
  152. package/dist/core/generators/roadmap.js.map +1 -1
  153. package/dist/core/guard.d.ts +1 -1
  154. package/dist/core/guard.d.ts.map +1 -1
  155. package/dist/core/guard.js +8 -0
  156. package/dist/core/guard.js.map +1 -1
  157. package/dist/core/index.d.ts +27 -5
  158. package/dist/core/index.d.ts.map +1 -1
  159. package/dist/core/index.js +25 -4
  160. package/dist/core/index.js.map +1 -1
  161. package/dist/core/initiative.d.ts +72 -0
  162. package/dist/core/initiative.d.ts.map +1 -0
  163. package/dist/core/initiative.js +421 -0
  164. package/dist/core/initiative.js.map +1 -0
  165. package/dist/core/interview-engine.d.ts +34 -0
  166. package/dist/core/interview-engine.d.ts.map +1 -0
  167. package/dist/core/interview-engine.js +195 -0
  168. package/dist/core/interview-engine.js.map +1 -0
  169. package/dist/core/interview-steps.d.ts +27 -0
  170. package/dist/core/interview-steps.d.ts.map +1 -0
  171. package/dist/core/interview-steps.js +157 -0
  172. package/dist/core/interview-steps.js.map +1 -0
  173. package/dist/core/interview.d.ts +20 -0
  174. package/dist/core/interview.d.ts.map +1 -1
  175. package/dist/core/interview.js +61 -34
  176. package/dist/core/interview.js.map +1 -1
  177. package/dist/core/metaphor-preview.d.ts +34 -0
  178. package/dist/core/metaphor-preview.d.ts.map +1 -0
  179. package/dist/core/metaphor-preview.js +94 -0
  180. package/dist/core/metaphor-preview.js.map +1 -0
  181. package/dist/core/prep.d.ts +88 -0
  182. package/dist/core/prep.d.ts.map +1 -0
  183. package/dist/core/prep.js +302 -0
  184. package/dist/core/prep.js.map +1 -0
  185. package/dist/core/roles.d.ts +3 -0
  186. package/dist/core/roles.d.ts.map +1 -1
  187. package/dist/core/roles.js +36 -0
  188. package/dist/core/roles.js.map +1 -1
  189. package/dist/core/store.d.ts +1 -1
  190. package/dist/core/store.d.ts.map +1 -1
  191. package/dist/core/vision.d.ts +10 -0
  192. package/dist/core/vision.d.ts.map +1 -1
  193. package/dist/core/vision.js +37 -0
  194. package/dist/core/vision.js.map +1 -1
  195. package/dist/mcp/index.d.ts.map +1 -1
  196. package/dist/mcp/index.js +55 -7
  197. package/dist/mcp/index.js.map +1 -1
  198. package/dist/mcp/registry.d.ts +1 -1
  199. package/dist/mcp/registry.d.ts.map +1 -1
  200. package/dist/mcp/registry.js +44 -0
  201. package/dist/mcp/registry.js.map +1 -1
  202. package/dist/mcp/sandbox.d.ts.map +1 -1
  203. package/dist/mcp/sandbox.js +12 -1
  204. package/dist/mcp/sandbox.js.map +1 -1
  205. package/dist/store/index.d.ts +26 -1
  206. package/dist/store/index.d.ts.map +1 -1
  207. package/dist/store/index.js +193 -1
  208. package/dist/store/index.js.map +1 -1
  209. package/dist/store-pg/index.d.ts.map +1 -1
  210. package/dist/store-pg/index.js +25 -0
  211. package/dist/store-pg/index.js.map +1 -1
  212. package/package.json +3 -1
@@ -0,0 +1,50 @@
1
+ import type { CliCommandMeta } from '../cli/registry.js';
2
+ import type { GuardDefinition } from './guard.js';
3
+ import type { MetaphorDefinition } from './metaphor.js';
4
+ import type { RoleDefinition } from './roles.js';
5
+ import { PAR_THRESHOLDS, SLOPE_FACTORS, SCORE_LABELS, HAZARD_SEVERITY_PENALTIES } from './constants.js';
6
+ export interface ChangelogChange {
7
+ type: 'feat' | 'fix' | 'chore' | 'docs' | 'refactor' | 'test' | 'other';
8
+ scope?: string;
9
+ description: string;
10
+ breaking: boolean;
11
+ hash?: string;
12
+ }
13
+ export interface ChangelogEntry {
14
+ version: string;
15
+ date: string;
16
+ changes: ChangelogChange[];
17
+ }
18
+ export interface ChangelogSection {
19
+ status: 'success' | 'partial' | 'unavailable';
20
+ entries: ChangelogEntry[];
21
+ reason?: string;
22
+ }
23
+ export interface DocsManifestInput {
24
+ version: string;
25
+ gitSha: string;
26
+ changelog: ChangelogSection;
27
+ commands: readonly CliCommandMeta[];
28
+ }
29
+ export interface DocsManifest {
30
+ version: string;
31
+ generatedAt: string;
32
+ gitSha: string;
33
+ checksums: Record<string, string>;
34
+ commands: readonly CliCommandMeta[];
35
+ guards: GuardDefinition[];
36
+ metaphors: MetaphorDefinition[];
37
+ roles: RoleDefinition[];
38
+ constants: {
39
+ parThresholds: typeof PAR_THRESHOLDS;
40
+ slopeFactors: typeof SLOPE_FACTORS;
41
+ scoreLabels: typeof SCORE_LABELS;
42
+ hazardPenalties: typeof HAZARD_SEVERITY_PENALTIES;
43
+ };
44
+ changelog: ChangelogSection;
45
+ }
46
+ /** Compute a deterministic SHA-256 checksum for a data section */
47
+ export declare function computeSectionChecksum(data: unknown): string;
48
+ /** Build a complete documentation manifest from pre-computed input. Pure function — no I/O. */
49
+ export declare function buildDocsManifest(input: DocsManifestInput): DocsManifest;
50
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/core/docs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,OAAO,EACL,cAAc,EACd,aAAa,EACb,YAAY,EACZ,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;IAC9C,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,SAAS,EAAE;QACT,aAAa,EAAE,OAAO,cAAc,CAAC;QACrC,YAAY,EAAE,OAAO,aAAa,CAAC;QACnC,WAAW,EAAE,OAAO,YAAY,CAAC;QACjC,eAAe,EAAE,OAAO,yBAAyB,CAAC;KACnD,CAAC;IACF,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAeD,kEAAkE;AAClE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAI5D;AAID,+FAA+F;AAC/F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAyCxE"}
@@ -0,0 +1,67 @@
1
+ // SLOPE — Documentation Manifest Builder
2
+ // Pure functions — no filesystem or git I/O.
3
+ import { createHash } from 'node:crypto';
4
+ import { GUARD_DEFINITIONS } from './guard.js';
5
+ import { listMetaphors } from './metaphor.js';
6
+ import { listRoles } from './roles.js';
7
+ import { PAR_THRESHOLDS, SLOPE_FACTORS, SCORE_LABELS, HAZARD_SEVERITY_PENALTIES, } from './constants.js';
8
+ // ── Checksum ───────────────────────────────────────────────────
9
+ /** Recursively sort object keys for deterministic serialization */
10
+ function sortObjectKeys(value) {
11
+ if (value === null || typeof value !== 'object')
12
+ return value;
13
+ if (Array.isArray(value))
14
+ return value.map(sortObjectKeys);
15
+ const sorted = {};
16
+ for (const key of Object.keys(value).sort()) {
17
+ sorted[key] = sortObjectKeys(value[key]);
18
+ }
19
+ return sorted;
20
+ }
21
+ /** Compute a deterministic SHA-256 checksum for a data section */
22
+ export function computeSectionChecksum(data) {
23
+ const sorted = sortObjectKeys(data);
24
+ const json = JSON.stringify(sorted);
25
+ return createHash('sha256').update(json).digest('hex');
26
+ }
27
+ // ── Builder ────────────────────────────────────────────────────
28
+ /** Build a complete documentation manifest from pre-computed input. Pure function — no I/O. */
29
+ export function buildDocsManifest(input) {
30
+ const metaphors = listMetaphors();
31
+ if (metaphors.length === 0) {
32
+ console.warn('Warning: metaphor registry is empty — manifest will have no metaphors');
33
+ }
34
+ const roles = listRoles();
35
+ const guards = [...GUARD_DEFINITIONS];
36
+ const constants = {
37
+ parThresholds: PAR_THRESHOLDS,
38
+ slopeFactors: SLOPE_FACTORS,
39
+ scoreLabels: SCORE_LABELS,
40
+ hazardPenalties: HAZARD_SEVERITY_PENALTIES,
41
+ };
42
+ const sections = {
43
+ commands: input.commands,
44
+ guards,
45
+ metaphors,
46
+ roles,
47
+ constants,
48
+ changelog: input.changelog,
49
+ };
50
+ const checksums = {};
51
+ for (const [key, value] of Object.entries(sections)) {
52
+ checksums[key] = computeSectionChecksum(value);
53
+ }
54
+ return {
55
+ version: input.version,
56
+ generatedAt: new Date().toISOString(),
57
+ gitSha: input.gitSha,
58
+ checksums,
59
+ commands: input.commands,
60
+ guards,
61
+ metaphors,
62
+ roles,
63
+ constants,
64
+ changelog: input.changelog,
65
+ };
66
+ }
67
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/core/docs.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,6CAA6C;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,cAAc,EACd,aAAa,EACb,YAAY,EACZ,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAkDxB,kEAAkE;AAElE,mEAAmE;AACnE,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,sBAAsB,CAAC,IAAa;IAClD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,kEAAkE;AAElE,+FAA+F;AAC/F,MAAM,UAAU,iBAAiB,CAAC,KAAwB;IACxD,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG;QAChB,aAAa,EAAE,cAAc;QAC7B,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,YAAY;QACzB,eAAe,EAAE,yBAAyB;KAC3C,CAAC;IAEF,MAAM,QAAQ,GAA4B;QACxC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM;QACN,SAAS;QACT,KAAK;QACL,SAAS;QACT,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;IAEF,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,SAAS,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS;QACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM;QACN,SAAS;QACT,KAAK;QACL,SAAS;QACT,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { EmbeddingConfig, CodeChunk, EmbeddingResult } from './embedding.js';
2
+ /**
3
+ * Embed an array of texts using an OpenAI-compatible embedding endpoint.
4
+ */
5
+ export declare function embed(texts: string[], config: EmbeddingConfig): Promise<Float32Array[]>;
6
+ /**
7
+ * Embed code chunks in batches, returning full EmbeddingResults.
8
+ * Truncates oversized chunks and retries failed batches individually.
9
+ */
10
+ export declare function embedBatch(chunks: CodeChunk[], config: EmbeddingConfig, batchSize?: number): Promise<EmbeddingResult[]>;
11
+ //# sourceMappingURL=embedding-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-client.d.ts","sourceRoot":"","sources":["../../src/core/embedding-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAclF;;GAEG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAqCzB;AAOD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,EAAE,eAAe,EACvB,SAAS,SAAK,GACb,OAAO,CAAC,eAAe,EAAE,CAAC,CAsC5B"}
@@ -0,0 +1,92 @@
1
+ // SLOPE — HTTP Client for OpenAI-Compatible Embedding Endpoints
2
+ /**
3
+ * Resolve apiKey — supports `env:VAR_NAME` syntax for environment variable resolution.
4
+ */
5
+ function resolveApiKey(key) {
6
+ if (!key)
7
+ return undefined;
8
+ if (key.startsWith('env:')) {
9
+ const envVar = key.slice(4);
10
+ return process.env[envVar] || undefined;
11
+ }
12
+ return key;
13
+ }
14
+ /**
15
+ * Embed an array of texts using an OpenAI-compatible embedding endpoint.
16
+ */
17
+ export async function embed(texts, config) {
18
+ if (texts.length === 0)
19
+ return [];
20
+ const apiKey = resolveApiKey(config.apiKey);
21
+ const headers = {
22
+ 'Content-Type': 'application/json',
23
+ };
24
+ if (apiKey) {
25
+ headers['Authorization'] = `Bearer ${apiKey}`;
26
+ }
27
+ const response = await fetch(config.endpoint, {
28
+ method: 'POST',
29
+ headers,
30
+ body: JSON.stringify({
31
+ model: config.model,
32
+ input: texts,
33
+ }),
34
+ signal: AbortSignal.timeout(60_000), // 60s timeout per batch
35
+ });
36
+ if (!response.ok) {
37
+ const body = await response.text().catch(() => '');
38
+ throw new Error(`Embedding request failed (${response.status}): ${body}`);
39
+ }
40
+ const json = await response.json();
41
+ if (!json.data || !Array.isArray(json.data)) {
42
+ throw new Error('Unexpected embedding response shape: missing data array');
43
+ }
44
+ // Sort by index to maintain input order
45
+ const sorted = json.data.sort((a, b) => a.index - b.index);
46
+ return sorted.map(d => new Float32Array(d.embedding));
47
+ }
48
+ // Safety net: truncate chunks that exceed embedding model context.
49
+ // nomic-embed-text has 8192 token context; dense content can tokenize
50
+ // at ~2 chars/token, so 8000 chars is a safe per-chunk ceiling.
51
+ const MAX_EMBED_CHARS = 8000;
52
+ /**
53
+ * Embed code chunks in batches, returning full EmbeddingResults.
54
+ * Truncates oversized chunks and retries failed batches individually.
55
+ */
56
+ export async function embedBatch(chunks, config, batchSize = 32) {
57
+ const results = [];
58
+ for (let i = 0; i < chunks.length; i += batchSize) {
59
+ const batch = chunks.slice(i, i + batchSize);
60
+ const texts = batch.map(c => c.content.length > MAX_EMBED_CHARS ? c.content.slice(0, MAX_EMBED_CHARS) : c.content);
61
+ try {
62
+ const vectors = await embed(texts, config);
63
+ for (let j = 0; j < batch.length; j++) {
64
+ results.push({
65
+ filePath: batch[j].filePath,
66
+ chunkIndex: batch[j].chunkIndex,
67
+ chunkText: batch[j].content,
68
+ vector: vectors[j],
69
+ });
70
+ }
71
+ }
72
+ catch {
73
+ // Batch failed — retry each chunk individually, skip failures
74
+ for (let j = 0; j < batch.length; j++) {
75
+ try {
76
+ const [vector] = await embed([texts[j]], config);
77
+ results.push({
78
+ filePath: batch[j].filePath,
79
+ chunkIndex: batch[j].chunkIndex,
80
+ chunkText: batch[j].content,
81
+ vector,
82
+ });
83
+ }
84
+ catch {
85
+ // Skip this chunk — content exceeds model context
86
+ }
87
+ }
88
+ }
89
+ }
90
+ return results;
91
+ }
92
+ //# sourceMappingURL=embedding-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-client.js","sourceRoot":"","sources":["../../src/core/embedding-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export interface EmbeddingEntry {
2
+ filePath: string;
3
+ chunkIndex: number;
4
+ chunkText: string;
5
+ gitSha: string;
6
+ model: string;
7
+ vector: Float32Array;
8
+ }
9
+ export interface EmbeddingSearchResult {
10
+ id: number;
11
+ filePath: string;
12
+ chunkIndex: number;
13
+ chunkText: string;
14
+ score: number;
15
+ }
16
+ export interface EmbeddingStats {
17
+ fileCount: number;
18
+ chunkCount: number;
19
+ model: string | null;
20
+ dimensions: number | null;
21
+ lastIndexedAt: string | null;
22
+ lastIndexedSha: string | null;
23
+ }
24
+ export interface IndexMeta {
25
+ sha: string;
26
+ model: string;
27
+ dimensions: number;
28
+ }
29
+ export interface EmbeddingStore {
30
+ saveEmbeddings(entries: EmbeddingEntry[]): Promise<void>;
31
+ searchEmbeddings(queryVector: Float32Array, limit?: number): Promise<EmbeddingSearchResult[]>;
32
+ getIndexedFiles(): Promise<Array<{
33
+ filePath: string;
34
+ gitSha: string;
35
+ model: string;
36
+ }>>;
37
+ deleteEmbeddingsByFile(filePath: string): Promise<void>;
38
+ getEmbeddingStats(): Promise<EmbeddingStats>;
39
+ setIndexMeta(sha: string, model: string, dimensions: number): Promise<void>;
40
+ getIndexMeta(): Promise<IndexMeta | null>;
41
+ }
42
+ /** Runtime type guard — check if a store supports embedding operations. */
43
+ export declare function hasEmbeddingSupport(store: unknown): store is EmbeddingStore;
44
+ //# sourceMappingURL=embedding-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-store.d.ts","sourceRoot":"","sources":["../../src/core/embedding-store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD,gBAAgB,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAE9F,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACvF,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,YAAY,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CAC3C;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAE3E"}
@@ -0,0 +1,7 @@
1
+ // SLOPE — EmbeddingStore Interface
2
+ // Separate from SlopeStore — uses type guard for runtime detection.
3
+ /** Runtime type guard — check if a store supports embedding operations. */
4
+ export function hasEmbeddingSupport(store) {
5
+ return store !== null && typeof store === 'object' && 'searchEmbeddings' in store;
6
+ }
7
+ //# sourceMappingURL=embedding-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-store.js","sourceRoot":"","sources":["../../src/core/embedding-store.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,oEAAoE;AA+CpE,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,kBAAkB,IAAK,KAAgB,CAAC;AAChG,CAAC"}
@@ -0,0 +1,32 @@
1
+ export interface EmbeddingConfig {
2
+ endpoint: string;
3
+ model: string;
4
+ dimensions: number;
5
+ apiKey?: string;
6
+ }
7
+ export interface CodeChunk {
8
+ filePath: string;
9
+ chunkIndex: number;
10
+ content: string;
11
+ }
12
+ export interface EmbeddingResult {
13
+ filePath: string;
14
+ chunkIndex: number;
15
+ chunkText: string;
16
+ vector: Float32Array;
17
+ }
18
+ export declare const MAX_CHUNK_FILE_SIZE: number;
19
+ export declare const SKIP_EXTENSIONS: Set<string>;
20
+ /** Filenames to skip regardless of extension (lock files, generated output). */
21
+ export declare const SKIP_FILENAMES: Set<string>;
22
+ export declare const SKIP_DIRS: Set<string>;
23
+ /**
24
+ * Chunk a file into embeddable code segments.
25
+ * Strategy: split by top-level declarations for TS/JS, fixed-size for others.
26
+ */
27
+ export declare function chunkFile(filePath: string, content: string, maxLines?: number): CodeChunk[];
28
+ /**
29
+ * Check if a file path should be skipped for embedding.
30
+ */
31
+ export declare function shouldSkipFile(filePath: string): boolean;
32
+ //# sourceMappingURL=embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,eAAO,MAAM,mBAAmB,QAAa,CAAC;AAE9C,eAAO,MAAM,eAAe,aAI1B,CAAC;AAEH,gFAAgF;AAChF,eAAO,MAAM,cAAc,aAEzB,CAAC;AAEH,eAAO,MAAM,SAAS,aAEpB,CAAC;AAKH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAoB,GAAG,SAAS,EAAE,CAmBtG;AAqED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAcxD"}
@@ -0,0 +1,114 @@
1
+ // SLOPE — Embedding Types & Chunking Logic (pure — no HTTP calls)
2
+ export const MAX_CHUNK_FILE_SIZE = 100 * 1024; // 100KB — skip larger files
3
+ export const SKIP_EXTENSIONS = new Set([
4
+ '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf',
5
+ '.eot', '.mp3', '.mp4', '.zip', '.tar', '.gz', '.bin', '.exe', '.dll',
6
+ '.so', '.dylib', '.lock', '.map',
7
+ ]);
8
+ /** Filenames to skip regardless of extension (lock files, generated output). */
9
+ export const SKIP_FILENAMES = new Set([
10
+ 'pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lockb',
11
+ ]);
12
+ export const SKIP_DIRS = new Set([
13
+ 'node_modules', 'dist', '.git', '.slope', 'coverage', 'slope-loop',
14
+ ]);
15
+ const DEFAULT_MAX_LINES = 200;
16
+ const DEFAULT_OVERLAP_LINES = 20;
17
+ /**
18
+ * Chunk a file into embeddable code segments.
19
+ * Strategy: split by top-level declarations for TS/JS, fixed-size for others.
20
+ */
21
+ export function chunkFile(filePath, content, maxLines = DEFAULT_MAX_LINES) {
22
+ if (content.length > MAX_CHUNK_FILE_SIZE)
23
+ return [];
24
+ if (content.trim().length === 0)
25
+ return [];
26
+ const lines = content.split('\n');
27
+ // Small files: single chunk
28
+ if (lines.length <= maxLines) {
29
+ return [{ filePath, chunkIndex: 0, content }];
30
+ }
31
+ const isTS = filePath.endsWith('.ts') || filePath.endsWith('.tsx') ||
32
+ filePath.endsWith('.js') || filePath.endsWith('.jsx');
33
+ if (isTS) {
34
+ return chunkByDeclarations(filePath, content, lines, maxLines);
35
+ }
36
+ return chunkByLines(filePath, lines, maxLines, DEFAULT_OVERLAP_LINES);
37
+ }
38
+ /**
39
+ * Split TS/JS files by top-level declarations (export, function, class, const, interface, type).
40
+ */
41
+ function chunkByDeclarations(filePath, _content, lines, maxLines) {
42
+ const declarationPattern = /^(export\s+)?(default\s+)?(async\s+)?(function|class|const|let|var|interface|type|enum|abstract)\s/;
43
+ const breakpoints = [0];
44
+ for (let i = 1; i < lines.length; i++) {
45
+ const line = lines[i];
46
+ if (declarationPattern.test(line) && i - breakpoints[breakpoints.length - 1] >= 10) {
47
+ breakpoints.push(i);
48
+ }
49
+ }
50
+ // Merge breakpoints into chunks respecting maxLines
51
+ const chunks = [];
52
+ let chunkStart = 0;
53
+ let chunkIndex = 0;
54
+ for (let b = 1; b < breakpoints.length; b++) {
55
+ if (breakpoints[b] - chunkStart > maxLines) {
56
+ const chunkContent = lines.slice(chunkStart, breakpoints[b]).join('\n');
57
+ chunks.push({ filePath, chunkIndex, content: chunkContent });
58
+ chunkIndex++;
59
+ chunkStart = breakpoints[b];
60
+ }
61
+ }
62
+ // Final chunk
63
+ const remaining = lines.slice(chunkStart).join('\n');
64
+ if (remaining.trim().length > 0) {
65
+ chunks.push({ filePath, chunkIndex, content: remaining });
66
+ }
67
+ return chunks;
68
+ }
69
+ /**
70
+ * Fixed-size line-based chunking with overlap for non-TS files.
71
+ */
72
+ function chunkByLines(filePath, lines, maxLines, overlap) {
73
+ const chunks = [];
74
+ let start = 0;
75
+ let chunkIndex = 0;
76
+ while (start < lines.length) {
77
+ const end = Math.min(start + maxLines, lines.length);
78
+ const chunkContent = lines.slice(start, end).join('\n');
79
+ if (chunkContent.trim().length > 0) {
80
+ chunks.push({ filePath, chunkIndex, content: chunkContent });
81
+ chunkIndex++;
82
+ }
83
+ start = end - overlap;
84
+ if (start >= lines.length - overlap)
85
+ break;
86
+ }
87
+ // Ensure final lines are included
88
+ if (start < lines.length) {
89
+ const chunkContent = lines.slice(start).join('\n');
90
+ if (chunkContent.trim().length > 0 && (chunks.length === 0 || chunks[chunks.length - 1].content !== chunkContent)) {
91
+ chunks.push({ filePath, chunkIndex, content: chunkContent });
92
+ }
93
+ }
94
+ return chunks;
95
+ }
96
+ /**
97
+ * Check if a file path should be skipped for embedding.
98
+ */
99
+ export function shouldSkipFile(filePath) {
100
+ const ext = filePath.slice(filePath.lastIndexOf('.'));
101
+ if (SKIP_EXTENSIONS.has(ext))
102
+ return true;
103
+ const parts = filePath.split('/');
104
+ for (const part of parts) {
105
+ if (SKIP_DIRS.has(part))
106
+ return true;
107
+ }
108
+ // Check filename (lock files with non-.lock extensions)
109
+ const filename = parts[parts.length - 1];
110
+ if (SKIP_FILENAMES.has(filename))
111
+ return true;
112
+ return false;
113
+ }
114
+ //# sourceMappingURL=embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { EmbeddingConfig } from './embedding.js';
2
+ import type { EmbeddingStore } from './embedding-store.js';
3
+ import type { GolfScorecard } from './types.js';
4
+ export interface EnrichedTicket {
5
+ key: string;
6
+ title: string;
7
+ club: string;
8
+ description: string;
9
+ acceptance_criteria: string[];
10
+ modules: string[];
11
+ max_files: number;
12
+ files: {
13
+ primary: string[];
14
+ test: string[];
15
+ related: string[];
16
+ };
17
+ estimated_tokens: number;
18
+ similar_tickets: Array<{
19
+ key: string;
20
+ title: string;
21
+ result: string;
22
+ sprint: number;
23
+ }>;
24
+ hazards: string[];
25
+ }
26
+ export interface EnrichedBacklog {
27
+ sprints: Array<{
28
+ id: string;
29
+ title?: string;
30
+ strategy?: string;
31
+ tickets: EnrichedTicket[];
32
+ [key: string]: unknown;
33
+ }>;
34
+ _enrichMeta: {
35
+ version: 1;
36
+ enrichedAt: string;
37
+ topK: number;
38
+ };
39
+ [key: string]: unknown;
40
+ }
41
+ /**
42
+ * Estimate token count for a list of files.
43
+ * Uses bytes/4 with 1.2x safety factor (TypeScript averages ~3.3 bytes/token).
44
+ */
45
+ export declare function estimateTokens(filePaths: string[], cwd: string): number;
46
+ /**
47
+ * Enrich a single ticket with file context and metadata.
48
+ */
49
+ export declare function enrichTicket(opts: {
50
+ ticket: {
51
+ key: string;
52
+ title: string;
53
+ description: string;
54
+ modules: string[];
55
+ acceptance_criteria: string[];
56
+ club: string;
57
+ max_files: number;
58
+ };
59
+ store: EmbeddingStore;
60
+ embeddingConfig: EmbeddingConfig;
61
+ scorecards: GolfScorecard[];
62
+ cwd: string;
63
+ topK?: number;
64
+ }): Promise<EnrichedTicket>;
65
+ /**
66
+ * Enrich all tickets in a backlog.
67
+ */
68
+ export declare function enrichBacklog(opts: {
69
+ backlogPath: string;
70
+ store: EmbeddingStore;
71
+ embeddingConfig: EmbeddingConfig;
72
+ scorecards: GolfScorecard[];
73
+ cwd: string;
74
+ topK?: number;
75
+ }): Promise<EnrichedBacklog>;
76
+ //# sourceMappingURL=enrich.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../src/core/enrich.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAahD,MAAM,WAAW,cAAc;IAE7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAElB,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvF,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC,CAAC;IACH,WAAW,EAAE;QACX,OAAO,EAAE,CAAC,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,EAAE,cAAc,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,cAAc,CAAC,CAsD1B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,eAAe,CAAC,CA6C3B"}