fivocell 1.0.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 (249) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/CONTRIBUTING.md +60 -0
  3. package/LICENSE +98 -0
  4. package/README.md +267 -0
  5. package/bin/cell.js +2 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +1131 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/core/ab-test-framework.d.ts +33 -0
  11. package/dist/core/ab-test-framework.d.ts.map +1 -0
  12. package/dist/core/ab-test-framework.js +93 -0
  13. package/dist/core/ab-test-framework.js.map +1 -0
  14. package/dist/core/ast-extractor.d.ts +10 -0
  15. package/dist/core/ast-extractor.d.ts.map +1 -0
  16. package/dist/core/ast-extractor.js +111 -0
  17. package/dist/core/ast-extractor.js.map +1 -0
  18. package/dist/core/build-failure-predictor.d.ts +25 -0
  19. package/dist/core/build-failure-predictor.d.ts.map +1 -0
  20. package/dist/core/build-failure-predictor.js +124 -0
  21. package/dist/core/build-failure-predictor.js.map +1 -0
  22. package/dist/core/cell-pro.d.ts +28 -0
  23. package/dist/core/cell-pro.d.ts.map +1 -0
  24. package/dist/core/cell-pro.js +70 -0
  25. package/dist/core/cell-pro.js.map +1 -0
  26. package/dist/core/circular-dependency-detector.d.ts +22 -0
  27. package/dist/core/circular-dependency-detector.d.ts.map +1 -0
  28. package/dist/core/circular-dependency-detector.js +95 -0
  29. package/dist/core/circular-dependency-detector.js.map +1 -0
  30. package/dist/core/cloud-client.d.ts +40 -0
  31. package/dist/core/cloud-client.d.ts.map +1 -0
  32. package/dist/core/cloud-client.js +126 -0
  33. package/dist/core/cloud-client.js.map +1 -0
  34. package/dist/core/community-full.d.ts +38 -0
  35. package/dist/core/community-full.d.ts.map +1 -0
  36. package/dist/core/community-full.js +125 -0
  37. package/dist/core/community-full.js.map +1 -0
  38. package/dist/core/community-live.d.ts +31 -0
  39. package/dist/core/community-live.d.ts.map +1 -0
  40. package/dist/core/community-live.js +187 -0
  41. package/dist/core/community-live.js.map +1 -0
  42. package/dist/core/community-prior.d.ts +25 -0
  43. package/dist/core/community-prior.d.ts.map +1 -0
  44. package/dist/core/community-prior.js +181 -0
  45. package/dist/core/community-prior.js.map +1 -0
  46. package/dist/core/complexity-analyzer.d.ts +28 -0
  47. package/dist/core/complexity-analyzer.d.ts.map +1 -0
  48. package/dist/core/complexity-analyzer.js +110 -0
  49. package/dist/core/complexity-analyzer.js.map +1 -0
  50. package/dist/core/confidence-engine.d.ts +16 -0
  51. package/dist/core/confidence-engine.d.ts.map +1 -0
  52. package/dist/core/confidence-engine.js +155 -0
  53. package/dist/core/confidence-engine.js.map +1 -0
  54. package/dist/core/config-attribution.d.ts +30 -0
  55. package/dist/core/config-attribution.d.ts.map +1 -0
  56. package/dist/core/config-attribution.js +288 -0
  57. package/dist/core/config-attribution.js.map +1 -0
  58. package/dist/core/conflict-detector.d.ts +43 -0
  59. package/dist/core/conflict-detector.d.ts.map +1 -0
  60. package/dist/core/conflict-detector.js +205 -0
  61. package/dist/core/conflict-detector.js.map +1 -0
  62. package/dist/core/context-restore.d.ts +25 -0
  63. package/dist/core/context-restore.d.ts.map +1 -0
  64. package/dist/core/context-restore.js +129 -0
  65. package/dist/core/context-restore.js.map +1 -0
  66. package/dist/core/cross-domain-projections.d.ts +19 -0
  67. package/dist/core/cross-domain-projections.d.ts.map +1 -0
  68. package/dist/core/cross-domain-projections.js +69 -0
  69. package/dist/core/cross-domain-projections.js.map +1 -0
  70. package/dist/core/cross-language-mappings.d.ts +15 -0
  71. package/dist/core/cross-language-mappings.d.ts.map +1 -0
  72. package/dist/core/cross-language-mappings.js +202 -0
  73. package/dist/core/cross-language-mappings.js.map +1 -0
  74. package/dist/core/cross-project-sync.d.ts +24 -0
  75. package/dist/core/cross-project-sync.d.ts.map +1 -0
  76. package/dist/core/cross-project-sync.js +132 -0
  77. package/dist/core/cross-project-sync.js.map +1 -0
  78. package/dist/core/dead-code-detector.d.ts +20 -0
  79. package/dist/core/dead-code-detector.d.ts.map +1 -0
  80. package/dist/core/dead-code-detector.js +106 -0
  81. package/dist/core/dead-code-detector.js.map +1 -0
  82. package/dist/core/decay-engine.d.ts +14 -0
  83. package/dist/core/decay-engine.d.ts.map +1 -0
  84. package/dist/core/decay-engine.js +41 -0
  85. package/dist/core/decay-engine.js.map +1 -0
  86. package/dist/core/dependency-health-checker.d.ts +23 -0
  87. package/dist/core/dependency-health-checker.d.ts.map +1 -0
  88. package/dist/core/dependency-health-checker.js +94 -0
  89. package/dist/core/dependency-health-checker.js.map +1 -0
  90. package/dist/core/duplication-detector.d.ts +29 -0
  91. package/dist/core/duplication-detector.d.ts.map +1 -0
  92. package/dist/core/duplication-detector.js +115 -0
  93. package/dist/core/duplication-detector.js.map +1 -0
  94. package/dist/core/enterprise-features.d.ts +32 -0
  95. package/dist/core/enterprise-features.d.ts.map +1 -0
  96. package/dist/core/enterprise-features.js +87 -0
  97. package/dist/core/enterprise-features.js.map +1 -0
  98. package/dist/core/enterprise.d.ts +27 -0
  99. package/dist/core/enterprise.d.ts.map +1 -0
  100. package/dist/core/enterprise.js +41 -0
  101. package/dist/core/enterprise.js.map +1 -0
  102. package/dist/core/error-predictor.d.ts +16 -0
  103. package/dist/core/error-predictor.d.ts.map +1 -0
  104. package/dist/core/error-predictor.js +123 -0
  105. package/dist/core/error-predictor.js.map +1 -0
  106. package/dist/core/extraction-cascade.d.ts +18 -0
  107. package/dist/core/extraction-cascade.d.ts.map +1 -0
  108. package/dist/core/extraction-cascade.js +48 -0
  109. package/dist/core/extraction-cascade.js.map +1 -0
  110. package/dist/core/git-branch-pregenerator.d.ts +23 -0
  111. package/dist/core/git-branch-pregenerator.d.ts.map +1 -0
  112. package/dist/core/git-branch-pregenerator.js +100 -0
  113. package/dist/core/git-branch-pregenerator.js.map +1 -0
  114. package/dist/core/handoff-detector.d.ts +24 -0
  115. package/dist/core/handoff-detector.d.ts.map +1 -0
  116. package/dist/core/handoff-detector.js +116 -0
  117. package/dist/core/handoff-detector.js.map +1 -0
  118. package/dist/core/identity-resolver.d.ts +7 -0
  119. package/dist/core/identity-resolver.d.ts.map +1 -0
  120. package/dist/core/identity-resolver.js +82 -0
  121. package/dist/core/identity-resolver.js.map +1 -0
  122. package/dist/core/interruption-recovery.d.ts +26 -0
  123. package/dist/core/interruption-recovery.d.ts.map +1 -0
  124. package/dist/core/interruption-recovery.js +135 -0
  125. package/dist/core/interruption-recovery.js.map +1 -0
  126. package/dist/core/knowledge-silo-detector.d.ts +20 -0
  127. package/dist/core/knowledge-silo-detector.d.ts.map +1 -0
  128. package/dist/core/knowledge-silo-detector.js +117 -0
  129. package/dist/core/knowledge-silo-detector.js.map +1 -0
  130. package/dist/core/language-switch-assistant.d.ts +18 -0
  131. package/dist/core/language-switch-assistant.d.ts.map +1 -0
  132. package/dist/core/language-switch-assistant.js +98 -0
  133. package/dist/core/language-switch-assistant.js.map +1 -0
  134. package/dist/core/merge-conflict-predictor.d.ts +18 -0
  135. package/dist/core/merge-conflict-predictor.d.ts.map +1 -0
  136. package/dist/core/merge-conflict-predictor.js +98 -0
  137. package/dist/core/merge-conflict-predictor.js.map +1 -0
  138. package/dist/core/model-intelligence.d.ts +24 -0
  139. package/dist/core/model-intelligence.d.ts.map +1 -0
  140. package/dist/core/model-intelligence.js +73 -0
  141. package/dist/core/model-intelligence.js.map +1 -0
  142. package/dist/core/next-action-predictor.d.ts +26 -0
  143. package/dist/core/next-action-predictor.d.ts.map +1 -0
  144. package/dist/core/next-action-predictor.js +136 -0
  145. package/dist/core/next-action-predictor.js.map +1 -0
  146. package/dist/core/offline-queue.d.ts +40 -0
  147. package/dist/core/offline-queue.d.ts.map +1 -0
  148. package/dist/core/offline-queue.js +193 -0
  149. package/dist/core/offline-queue.js.map +1 -0
  150. package/dist/core/pattern-store.d.ts +27 -0
  151. package/dist/core/pattern-store.d.ts.map +1 -0
  152. package/dist/core/pattern-store.js +233 -0
  153. package/dist/core/pattern-store.js.map +1 -0
  154. package/dist/core/performance-predictor.d.ts +16 -0
  155. package/dist/core/performance-predictor.d.ts.map +1 -0
  156. package/dist/core/performance-predictor.js +111 -0
  157. package/dist/core/performance-predictor.js.map +1 -0
  158. package/dist/core/platt-calibration.d.ts +18 -0
  159. package/dist/core/platt-calibration.d.ts.map +1 -0
  160. package/dist/core/platt-calibration.js +89 -0
  161. package/dist/core/platt-calibration.js.map +1 -0
  162. package/dist/core/pr-review-assistant.d.ts +17 -0
  163. package/dist/core/pr-review-assistant.d.ts.map +1 -0
  164. package/dist/core/pr-review-assistant.js +85 -0
  165. package/dist/core/pr-review-assistant.js.map +1 -0
  166. package/dist/core/prompt-conditioner.d.ts +10 -0
  167. package/dist/core/prompt-conditioner.d.ts.map +1 -0
  168. package/dist/core/prompt-conditioner.js +54 -0
  169. package/dist/core/prompt-conditioner.js.map +1 -0
  170. package/dist/core/realtime-guardian.d.ts +19 -0
  171. package/dist/core/realtime-guardian.d.ts.map +1 -0
  172. package/dist/core/realtime-guardian.js +64 -0
  173. package/dist/core/realtime-guardian.js.map +1 -0
  174. package/dist/core/regex-extractor.d.ts +10 -0
  175. package/dist/core/regex-extractor.d.ts.map +1 -0
  176. package/dist/core/regex-extractor.js +141 -0
  177. package/dist/core/regex-extractor.js.map +1 -0
  178. package/dist/core/scale-tester.d.ts +20 -0
  179. package/dist/core/scale-tester.d.ts.map +1 -0
  180. package/dist/core/scale-tester.js +79 -0
  181. package/dist/core/scale-tester.js.map +1 -0
  182. package/dist/core/security-predictor.d.ts +15 -0
  183. package/dist/core/security-predictor.d.ts.map +1 -0
  184. package/dist/core/security-predictor.js +91 -0
  185. package/dist/core/security-predictor.js.map +1 -0
  186. package/dist/core/session-recovery.d.ts +19 -0
  187. package/dist/core/session-recovery.d.ts.map +1 -0
  188. package/dist/core/session-recovery.js +138 -0
  189. package/dist/core/session-recovery.js.map +1 -0
  190. package/dist/core/signal-capture.d.ts +22 -0
  191. package/dist/core/signal-capture.d.ts.map +1 -0
  192. package/dist/core/signal-capture.js +76 -0
  193. package/dist/core/signal-capture.js.map +1 -0
  194. package/dist/core/solution-index.d.ts +33 -0
  195. package/dist/core/solution-index.d.ts.map +1 -0
  196. package/dist/core/solution-index.js +175 -0
  197. package/dist/core/solution-index.js.map +1 -0
  198. package/dist/core/standup-generator.d.ts +17 -0
  199. package/dist/core/standup-generator.d.ts.map +1 -0
  200. package/dist/core/standup-generator.js +84 -0
  201. package/dist/core/standup-generator.js.map +1 -0
  202. package/dist/core/team-composer.d.ts +29 -0
  203. package/dist/core/team-composer.d.ts.map +1 -0
  204. package/dist/core/team-composer.js +150 -0
  205. package/dist/core/team-composer.js.map +1 -0
  206. package/dist/core/test-anticipator.d.ts +17 -0
  207. package/dist/core/test-anticipator.d.ts.map +1 -0
  208. package/dist/core/test-anticipator.js +113 -0
  209. package/dist/core/test-anticipator.js.map +1 -0
  210. package/dist/daemon/lifecycle.d.ts +19 -0
  211. package/dist/daemon/lifecycle.d.ts.map +1 -0
  212. package/dist/daemon/lifecycle.js +199 -0
  213. package/dist/daemon/lifecycle.js.map +1 -0
  214. package/dist/daemon/server.d.ts +81 -0
  215. package/dist/daemon/server.d.ts.map +1 -0
  216. package/dist/daemon/server.js +505 -0
  217. package/dist/daemon/server.js.map +1 -0
  218. package/dist/daemon/watchdog.d.ts +2 -0
  219. package/dist/daemon/watchdog.d.ts.map +1 -0
  220. package/dist/daemon/watchdog.js +93 -0
  221. package/dist/daemon/watchdog.js.map +1 -0
  222. package/dist/daemon/websocket.d.ts +5 -0
  223. package/dist/daemon/websocket.d.ts.map +1 -0
  224. package/dist/daemon/websocket.js +90 -0
  225. package/dist/daemon/websocket.js.map +1 -0
  226. package/dist/index.d.ts +44 -0
  227. package/dist/index.d.ts.map +1 -0
  228. package/dist/index.js +90 -0
  229. package/dist/index.js.map +1 -0
  230. package/dist/types.d.ts +88 -0
  231. package/dist/types.d.ts.map +1 -0
  232. package/dist/types.js +28 -0
  233. package/dist/types.js.map +1 -0
  234. package/extensions/jetbrains/plugin.json +9 -0
  235. package/extensions/shell/copilot-sync.js +59 -0
  236. package/extensions/shell/install.sh +38 -0
  237. package/extensions/shell/watcher.js +113 -0
  238. package/extensions/vscode/.vscodeignore +5 -0
  239. package/extensions/vscode/dist/daemon-client.js +94 -0
  240. package/extensions/vscode/dist/diff-tracker.js +94 -0
  241. package/extensions/vscode/dist/extension.js +100 -0
  242. package/extensions/vscode/dist/status-bar.js +70 -0
  243. package/extensions/vscode/package-lock.json +40 -0
  244. package/extensions/vscode/package.json +27 -0
  245. package/package.json +53 -0
  246. package/packages/mcp-server/dist/server.d.ts +2 -0
  247. package/packages/mcp-server/dist/server.js +213 -0
  248. package/packages/mcp-server/package-lock.json +970 -0
  249. package/packages/mcp-server/package.json +19 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-cascade.d.ts","sourceRoot":"","sources":["../../src/core/extraction-cascade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,QAAQ,EAAE,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;;IAOnC,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa;IAqBhE,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa;IAgBnE,QAAQ,IAAI;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE;CAM/D"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExtractionCascade = void 0;
4
+ const regex_extractor_1 = require("./regex-extractor");
5
+ const ast_extractor_1 = require("./ast-extractor");
6
+ class ExtractionCascade {
7
+ regexExtractor;
8
+ astExtractor;
9
+ constructor() {
10
+ this.regexExtractor = new regex_extractor_1.RegexExtractor();
11
+ this.astExtractor = new ast_extractor_1.ASTExtractor();
12
+ }
13
+ extract(originalCode, editedCode) {
14
+ const startTime = performance.now();
15
+ const regexPatterns = this.regexExtractor.extractFromDiff(originalCode, editedCode);
16
+ if (regexPatterns.length > 0) {
17
+ const latency = Math.round((performance.now() - startTime) * 100) / 100;
18
+ return { patterns: regexPatterns, stepUsed: 'regex', latencyMs: latency };
19
+ }
20
+ const astPatterns = this.astExtractor.extract(originalCode, editedCode);
21
+ if (astPatterns.length > 0) {
22
+ const latency = Math.round((performance.now() - startTime) * 100) / 100;
23
+ return { patterns: astPatterns, stepUsed: 'ast', latencyMs: latency };
24
+ }
25
+ const latency = Math.round((performance.now() - startTime) * 100) / 100;
26
+ return { patterns: [], stepUsed: 'none', latencyMs: latency };
27
+ }
28
+ extractAll(originalCode, editedCode) {
29
+ const startTime = performance.now();
30
+ const regexPatterns = this.regexExtractor.extractFromDiff(originalCode, editedCode);
31
+ const astPatterns = this.astExtractor.extract(originalCode, editedCode);
32
+ const allPatterns = [...regexPatterns, ...astPatterns];
33
+ const stepUsed = regexPatterns.length > 0 && astPatterns.length > 0 ? 'combined'
34
+ : regexPatterns.length > 0 ? 'regex'
35
+ : astPatterns.length > 0 ? 'ast'
36
+ : 'none';
37
+ const latency = Math.round((performance.now() - startTime) * 100) / 100;
38
+ return { patterns: allPatterns, stepUsed, latencyMs: latency };
39
+ }
40
+ getStats() {
41
+ return {
42
+ regexPatterns: this.regexExtractor.getPatternCount(),
43
+ astCapabilities: 4,
44
+ };
45
+ }
46
+ }
47
+ exports.ExtractionCascade = ExtractionCascade;
48
+ //# sourceMappingURL=extraction-cascade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-cascade.js","sourceRoot":"","sources":["../../src/core/extraction-cascade.ts"],"names":[],"mappings":";;;AACA,uDAAmD;AACnD,mDAA+C;AAQ/C,MAAa,iBAAiB;IACpB,cAAc,CAAiB;IAC/B,YAAY,CAAe;IAEnC;QACE,IAAI,CAAC,cAAc,GAAG,IAAI,gCAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,4BAAY,EAAE,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,YAAoB,EAAE,UAAkB;QAC9C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAEpF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;YACxE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC5E,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAExE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;YACxE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACxE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QACxE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAChE,CAAC;IAED,UAAU,CAAC,YAAoB,EAAE,UAAkB;QACjD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACpF,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAExE,MAAM,WAAW,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,WAAW,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU;YAC9E,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO;gBACpC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK;oBAChC,CAAC,CAAC,MAAM,CAAC;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAExE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACjE,CAAC;IAED,QAAQ;QACN,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE;YACpD,eAAe,EAAE,CAAC;SACnB,CAAC;IACJ,CAAC;CACF;AApDD,8CAoDC"}
@@ -0,0 +1,23 @@
1
+ import { Pattern } from '../types';
2
+ export interface GeneratedFile {
3
+ path: string;
4
+ content: string;
5
+ type: 'model' | 'test' | 'readme' | 'component';
6
+ }
7
+ export declare class GitBranchPreGenerator {
8
+ private readonly intentPatterns;
9
+ parseBranchName(branchName: string): {
10
+ type: string;
11
+ name: string;
12
+ intent: string;
13
+ };
14
+ generateFiles(branchName: string, patterns: Pattern[], language?: string): GeneratedFile[];
15
+ getIntentSummary(branchName: string): string;
16
+ private generateModel;
17
+ private generateTest;
18
+ private generateReadme;
19
+ private toFileName;
20
+ private toPascalCase;
21
+ private getExtension;
22
+ }
23
+ //# sourceMappingURL=git-branch-pregenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-branch-pregenerator.d.ts","sourceRoot":"","sources":["../../src/core/git-branch-pregenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;CACjD;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAU7B;IAEF,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAsBnF,aAAa,CACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,EAAE,EACnB,QAAQ,GAAE,MAAqB,GAC9B,aAAa,EAAE;IAkClB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAM5C,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,YAAY;CAQrB"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitBranchPreGenerator = void 0;
4
+ class GitBranchPreGenerator {
5
+ intentPatterns = {
6
+ feature: { files: ['model', 'service', 'routes', 'tests'], description: 'New feature' },
7
+ fix: { files: ['tests', 'fix'], description: 'Bug fix' },
8
+ bugfix: { files: ['tests', 'fix'], description: 'Bug fix' },
9
+ refactor: { files: ['tests', 'refactored'], description: 'Code refactor' },
10
+ chore: { files: ['config', 'deps'], description: 'Maintenance' },
11
+ docs: { files: ['readme'], description: 'Documentation' },
12
+ test: { files: ['tests'], description: 'Testing' },
13
+ perf: { files: ['benchmark', 'optimized'], description: 'Performance' },
14
+ security: { files: ['audit', 'fix'], description: 'Security' },
15
+ };
16
+ parseBranchName(branchName) {
17
+ const cleaned = branchName.replace(/^(origin\/|remotes\/)/, '');
18
+ const parts = cleaned.split('/');
19
+ let type = 'feature';
20
+ let name = cleaned;
21
+ if (parts.length >= 2) {
22
+ const prefix = parts[0].toLowerCase();
23
+ if (this.intentPatterns[prefix]) {
24
+ type = prefix;
25
+ name = parts.slice(1).join('-');
26
+ }
27
+ }
28
+ const intent = name
29
+ .replace(/[-_]/g, ' ')
30
+ .replace(/\b\w/g, (c) => c.toUpperCase());
31
+ return { type, name, intent };
32
+ }
33
+ generateFiles(branchName, patterns, language = 'typescript') {
34
+ const { type, name, intent } = this.parseBranchName(branchName);
35
+ const intentConfig = this.intentPatterns[type] || this.intentPatterns['feature'];
36
+ const files = [];
37
+ const ext = this.getExtension(language);
38
+ if (intentConfig.files.includes('model')) {
39
+ files.push({
40
+ path: `src/models/${this.toFileName(name)}.${ext}`,
41
+ content: this.generateModel(name, intent, patterns, language),
42
+ type: 'model',
43
+ });
44
+ }
45
+ if (intentConfig.files.includes('tests')) {
46
+ files.push({
47
+ path: `src/__tests__/${this.toFileName(name)}.test.${ext}`,
48
+ content: this.generateTest(name, intent, patterns, language),
49
+ type: 'test',
50
+ });
51
+ }
52
+ if (intentConfig.files.includes('readme')) {
53
+ files.push({
54
+ path: `docs/${this.toFileName(name)}.md`,
55
+ content: this.generateReadme(name, intent),
56
+ type: 'readme',
57
+ });
58
+ }
59
+ return files;
60
+ }
61
+ getIntentSummary(branchName) {
62
+ const { type, intent } = this.parseBranchName(branchName);
63
+ const config = this.intentPatterns[type] || this.intentPatterns['feature'];
64
+ return `${config.description}: ${intent}. Will generate: ${config.files.join(', ')}.`;
65
+ }
66
+ generateModel(name, intent, patterns, language) {
67
+ const className = this.toPascalCase(name);
68
+ const useTypes = patterns.some((p) => p.category === 'type_annotation');
69
+ if (language === 'typescript' && useTypes) {
70
+ return `export interface ${className} {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n}\n`;
71
+ }
72
+ return `// ${intent} - Model\n// TODO: Define ${className} schema\n`;
73
+ }
74
+ generateTest(_name, intent, _patterns, _language) {
75
+ const componentName = this.toPascalCase(_name);
76
+ return `import { describe, it, expect } from 'vitest';\n\ndescribe('${componentName}', () => {\n it('should handle ${intent.toLowerCase()}', () => {\n // TODO: Add test cases\n expect(true).toBe(true);\n });\n});\n`;
77
+ }
78
+ generateReadme(_name, intent) {
79
+ return `# ${intent}\n\n## Overview\n\nTODO: Describe the ${intent.toLowerCase()} feature.\n\n## Usage\n\n\`\`\`typescript\n// TODO: Add usage examples\n\`\`\`\n`;
80
+ }
81
+ toFileName(name) {
82
+ return name.toLowerCase().replace(/\s+/g, '-');
83
+ }
84
+ toPascalCase(name) {
85
+ return name
86
+ .replace(/[-_]/g, ' ')
87
+ .replace(/\b\w/g, (c) => c.toUpperCase())
88
+ .replace(/\s+/g, '');
89
+ }
90
+ getExtension(language) {
91
+ switch (language) {
92
+ case 'typescript': return 'ts';
93
+ case 'javascript': return 'js';
94
+ case 'python': return 'py';
95
+ default: return 'ts';
96
+ }
97
+ }
98
+ }
99
+ exports.GitBranchPreGenerator = GitBranchPreGenerator;
100
+ //# sourceMappingURL=git-branch-pregenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-branch-pregenerator.js","sourceRoot":"","sources":["../../src/core/git-branch-pregenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface HandoffSummary {
2
+ teammate: string;
3
+ branch: string;
4
+ absentDays: number;
5
+ filesChanged: string[];
6
+ patternsUsed: string[];
7
+ todos: string[];
8
+ lastCommit: string;
9
+ }
10
+ export declare class HandoffDetector {
11
+ private handoffPath;
12
+ private absenceThresholdDays;
13
+ constructor(cellDir: string);
14
+ detectAbsence(teammate: string, branch: string): boolean;
15
+ generateReturnSummary(teammate: string, branch: string, filesChanged: string[], patternsUsed: string[], todos: string[], lastCommit: string): HandoffSummary;
16
+ getReturnPrompt(summary: HandoffSummary): string;
17
+ getReviewPrompt(summary: HandoffSummary): string;
18
+ getContinuePrompt(summary: HandoffSummary): string;
19
+ trackActivity(teammate: string, branch: string): void;
20
+ private getLastActivity;
21
+ private sanitizeBranch;
22
+ private ensureDirectory;
23
+ }
24
+ //# sourceMappingURL=handoff-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-detector.d.ts","sourceRoot":"","sources":["../../src/core/handoff-detector.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,OAAO,EAAE,MAAM;IAM3B,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAQxD,qBAAqB,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EAAE,EACtB,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,GACjB,cAAc;IAiBjB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IAIhD,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IAIhD,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IAIlD,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBrD,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,eAAe;CAKxB"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.HandoffDetector = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ class HandoffDetector {
40
+ handoffPath;
41
+ absenceThresholdDays;
42
+ constructor(cellDir) {
43
+ this.handoffPath = path.join(cellDir, 'handoffs');
44
+ this.absenceThresholdDays = 2;
45
+ this.ensureDirectory(this.handoffPath);
46
+ }
47
+ detectAbsence(teammate, branch) {
48
+ const lastActivity = this.getLastActivity(teammate, branch);
49
+ if (!lastActivity)
50
+ return false;
51
+ const daysSince = (Date.now() - new Date(lastActivity).getTime()) / (86400000);
52
+ return daysSince >= this.absenceThresholdDays;
53
+ }
54
+ generateReturnSummary(teammate, branch, filesChanged, patternsUsed, todos, lastCommit) {
55
+ const summary = {
56
+ teammate,
57
+ branch,
58
+ absentDays: Math.max(0, Math.floor((Date.now() - new Date(lastCommit).getTime()) / 86400000)),
59
+ filesChanged,
60
+ patternsUsed,
61
+ todos,
62
+ lastCommit,
63
+ };
64
+ const filePath = path.join(this.handoffPath, `${teammate}_${this.sanitizeBranch(branch)}.json`);
65
+ fs.writeFileSync(filePath, JSON.stringify(summary, null, 2), 'utf-8');
66
+ return summary;
67
+ }
68
+ getReturnPrompt(summary) {
69
+ return `${summary.teammate} was away for ${summary.absentDays} days. ${summary.filesChanged.length} files changed on ${summary.branch}. ${summary.todos.length} TODOs pending. Review changes or continue from TODO?`;
70
+ }
71
+ getReviewPrompt(summary) {
72
+ return `Review changes on ${summary.branch}:\n${summary.filesChanged.map((f) => ` - ${f}`).join('\n')}\n\nPatterns used: ${summary.patternsUsed.join(', ')}\n\nTODOs:\n${summary.todos.map((t) => ` - ${t}`).join('\n')}`;
73
+ }
74
+ getContinuePrompt(summary) {
75
+ return `Continue from TODO on ${summary.branch}:\n${summary.todos.map((t) => ` - ${t}`).join('\n')}`;
76
+ }
77
+ trackActivity(teammate, branch) {
78
+ const activityPath = path.join(this.handoffPath, 'activity.json');
79
+ let activities = {};
80
+ if (fs.existsSync(activityPath)) {
81
+ try {
82
+ activities = JSON.parse(fs.readFileSync(activityPath, 'utf-8'));
83
+ }
84
+ catch { }
85
+ }
86
+ const key = `${teammate}_${this.sanitizeBranch(branch)}`;
87
+ activities[key] = new Date().toISOString();
88
+ try {
89
+ fs.writeFileSync(activityPath, JSON.stringify(activities, null, 2), 'utf-8');
90
+ }
91
+ catch { }
92
+ }
93
+ getLastActivity(teammate, branch) {
94
+ const activityPath = path.join(this.handoffPath, 'activity.json');
95
+ if (!fs.existsSync(activityPath))
96
+ return null;
97
+ try {
98
+ const activities = JSON.parse(fs.readFileSync(activityPath, 'utf-8'));
99
+ const key = `${teammate}_${this.sanitizeBranch(branch)}`;
100
+ return activities[key] || null;
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ sanitizeBranch(branch) {
107
+ return branch.replace(/[^a-zA-Z0-9_-]/g, '_');
108
+ }
109
+ ensureDirectory(dir) {
110
+ if (!fs.existsSync(dir)) {
111
+ fs.mkdirSync(dir, { recursive: true });
112
+ }
113
+ }
114
+ }
115
+ exports.HandoffDetector = HandoffDetector;
116
+ //# sourceMappingURL=handoff-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-detector.js","sourceRoot":"","sources":["../../src/core/handoff-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface IdentityPayload {
2
+ fingerprint: string;
3
+ tool: string;
4
+ }
5
+ export declare function generateFingerprint(): string;
6
+ export declare function createIdentityPayload(tool: string): IdentityPayload;
7
+ //# sourceMappingURL=identity-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-resolver.d.ts","sourceRoot":"","sources":["../../src/core/identity-resolver.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAiBD,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAEnE"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ // Identity Resolver — Cross-tool user fingerprint + merge
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.generateFingerprint = generateFingerprint;
38
+ exports.createIdentityPayload = createIdentityPayload;
39
+ const os = __importStar(require("os"));
40
+ const crypto = __importStar(require("crypto"));
41
+ const child_process_1 = require("child_process");
42
+ function getMachineId() {
43
+ try {
44
+ switch (process.platform) {
45
+ case 'linux': return (0, child_process_1.execSync)('cat /etc/machine-id', { encoding: 'utf-8' }).trim();
46
+ case 'darwin': return (0, child_process_1.execSync)("ioreg -d2 -c IOPlatformExpertDevice | grep IOPlatformUUID | awk '{print $NF}' | tr -d '\"'", { encoding: 'utf-8' }).trim();
47
+ case 'win32': return (0, child_process_1.execSync)('reg query HKLM\\SOFTWARE\\Microsoft\\Cryptography /v MachineGuid', { encoding: 'utf-8' }).split('REG_SZ')[1]?.trim() || '';
48
+ default: return '';
49
+ }
50
+ }
51
+ catch {
52
+ return '';
53
+ }
54
+ }
55
+ function getGitEmail() {
56
+ try {
57
+ return (0, child_process_1.execSync)('git config user.email', { encoding: 'utf-8', timeout: 5000 }).trim();
58
+ }
59
+ catch {
60
+ return '';
61
+ }
62
+ }
63
+ function generateFingerprint() {
64
+ let username = '';
65
+ try {
66
+ username = os.userInfo().username;
67
+ }
68
+ catch {
69
+ username = os.hostname();
70
+ }
71
+ const components = [
72
+ os.hostname(),
73
+ username,
74
+ getGitEmail(),
75
+ getMachineId(),
76
+ ].filter(Boolean);
77
+ return crypto.createHash('sha256').update(components.join('|')).digest('hex').substring(0, 16);
78
+ }
79
+ function createIdentityPayload(tool) {
80
+ return { fingerprint: generateFingerprint(), tool };
81
+ }
82
+ //# sourceMappingURL=identity-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-resolver.js","sourceRoot":"","sources":["../../src/core/identity-resolver.ts"],"names":[],"mappings":";AAAA,0DAA0D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0B1D,kDAUC;AAED,sDAEC;AAtCD,uCAAyB;AACzB,+CAAiC;AACjC,iDAAyC;AAOzC,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,wBAAQ,EAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnF,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAA,wBAAQ,EAAC,4FAA4F,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3J,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,wBAAQ,EAAC,kEAAkE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC1J,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC;QAAC,OAAO,IAAA,wBAAQ,EAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACrH,CAAC;AAED,SAAgB,mBAAmB;IACjC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAAC,CAAC;IAC9E,MAAM,UAAU,GAAG;QACjB,EAAE,CAAC,QAAQ,EAAE;QACb,QAAQ;QACR,WAAW,EAAE;QACb,YAAY,EAAE;KACf,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,SAAgB,qBAAqB,CAAC,IAAY;IAChD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface InterruptionState {
2
+ timestamp: string;
3
+ file: string;
4
+ line: number;
5
+ task: string;
6
+ thought: string;
7
+ projectId: string;
8
+ }
9
+ export declare class InterruptionRecovery {
10
+ private recoveryPath;
11
+ private gapThresholdMs;
12
+ constructor(cellDir: string);
13
+ captureState(file: string, line: number, task: string, thought: string, projectId: string): InterruptionState;
14
+ detectInterruption(): InterruptionState | null;
15
+ getContinuePrompt(state: InterruptionState): string;
16
+ getSummaryPrompt(state: InterruptionState): string;
17
+ getRestartPrompt(): string;
18
+ getInterruptionStats(): {
19
+ count: number;
20
+ averageGapMinutes: number;
21
+ };
22
+ archive(): void;
23
+ private getElapsed;
24
+ private ensureDirectory;
25
+ }
26
+ //# sourceMappingURL=interruption-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interruption-recovery.d.ts","sourceRoot":"","sources":["../../src/core/interruption-recovery.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,EAAE,MAAM;IAM3B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB;IAmB7G,kBAAkB,IAAI,iBAAiB,GAAG,IAAI;IAiB9C,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAInD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAKlD,gBAAgB,IAAI,MAAM;IAI1B,oBAAoB,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE;IAmBpE,OAAO,IAAI,IAAI;IAkBf,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,eAAe;CAKxB"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.InterruptionRecovery = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ class InterruptionRecovery {
40
+ recoveryPath;
41
+ gapThresholdMs;
42
+ constructor(cellDir) {
43
+ this.recoveryPath = path.join(cellDir, 'recovery');
44
+ this.gapThresholdMs = 10 * 60 * 1000;
45
+ this.ensureDirectory(this.recoveryPath);
46
+ }
47
+ captureState(file, line, task, thought, projectId) {
48
+ const state = {
49
+ timestamp: new Date().toISOString(),
50
+ file,
51
+ line,
52
+ task,
53
+ thought,
54
+ projectId,
55
+ };
56
+ fs.writeFileSync(path.join(this.recoveryPath, 'last-state.json'), JSON.stringify(state, null, 2), 'utf-8');
57
+ return state;
58
+ }
59
+ detectInterruption() {
60
+ const statePath = path.join(this.recoveryPath, 'last-state.json');
61
+ if (!fs.existsSync(statePath))
62
+ return null;
63
+ try {
64
+ const state = JSON.parse(fs.readFileSync(statePath, 'utf-8'));
65
+ const elapsed = Date.now() - new Date(state.timestamp).getTime();
66
+ if (elapsed > this.gapThresholdMs) {
67
+ return state;
68
+ }
69
+ return null;
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ getContinuePrompt(state) {
76
+ return `Continue working on "${state.task}"? You were at ${state.file}:${state.line}. Last thought: "${state.thought}"`;
77
+ }
78
+ getSummaryPrompt(state) {
79
+ const elapsed = this.getElapsed(state.timestamp);
80
+ return `You were away for ${elapsed}. Here's a summary: working on "${state.task}" in ${state.file}. Last thought: "${state.thought}"`;
81
+ }
82
+ getRestartPrompt() {
83
+ return 'Start fresh. Previous context will be archived.';
84
+ }
85
+ getInterruptionStats() {
86
+ const historyPath = path.join(this.recoveryPath, 'history.json');
87
+ if (!fs.existsSync(historyPath))
88
+ return { count: 0, averageGapMinutes: 0 };
89
+ try {
90
+ const history = JSON.parse(fs.readFileSync(historyPath, 'utf-8'));
91
+ if (history.length === 0)
92
+ return { count: 0, averageGapMinutes: 0 };
93
+ const gaps = history.slice(1).map((h, i) => {
94
+ return (new Date(h.timestamp).getTime() - new Date(history[i].timestamp).getTime()) / 60000;
95
+ }).filter((g) => g > 0);
96
+ const avg = gaps.length > 0 ? Math.round(gaps.reduce((a, b) => a + b, 0) / gaps.length) : 0;
97
+ return { count: history.length, averageGapMinutes: avg };
98
+ }
99
+ catch {
100
+ return { count: 0, averageGapMinutes: 0 };
101
+ }
102
+ }
103
+ archive() {
104
+ const statePath = path.join(this.recoveryPath, 'last-state.json');
105
+ const historyPath = path.join(this.recoveryPath, 'history.json');
106
+ if (fs.existsSync(statePath)) {
107
+ try {
108
+ const state = JSON.parse(fs.readFileSync(statePath, 'utf-8'));
109
+ const history = fs.existsSync(historyPath)
110
+ ? JSON.parse(fs.readFileSync(historyPath, 'utf-8'))
111
+ : [];
112
+ history.push(state);
113
+ if (history.length > 50)
114
+ history.splice(0, history.length - 50);
115
+ fs.writeFileSync(historyPath, JSON.stringify(history, null, 2), 'utf-8');
116
+ fs.unlinkSync(statePath);
117
+ }
118
+ catch { }
119
+ }
120
+ }
121
+ getElapsed(timestamp) {
122
+ const diff = Date.now() - new Date(timestamp).getTime();
123
+ const minutes = Math.floor(diff / 60000);
124
+ if (minutes < 60)
125
+ return `${minutes}m`;
126
+ return `${Math.floor(minutes / 60)}h ${minutes % 60}m`;
127
+ }
128
+ ensureDirectory(dir) {
129
+ if (!fs.existsSync(dir)) {
130
+ fs.mkdirSync(dir, { recursive: true });
131
+ }
132
+ }
133
+ }
134
+ exports.InterruptionRecovery = InterruptionRecovery;
135
+ //# sourceMappingURL=interruption-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interruption-recovery.js","sourceRoot":"","sources":["../../src/core/interruption-recovery.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAW7B,MAAa,oBAAoB;IACvB,YAAY,CAAS;IACrB,cAAc,CAAS;IAE/B,YAAY,OAAe;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,OAAe,EAAE,SAAiB;QACvF,MAAM,KAAK,GAAsB;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,OAAO;YACP,SAAS;SACV,CAAC;QAEF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAC/C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAC9B,OAAO,CACR,CAAC;QAEF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAClE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,KAAK,GAAsB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACjF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAEjE,IAAI,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBAClC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,KAAwB;QACxC,OAAO,wBAAwB,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,oBAAoB,KAAK,CAAC,OAAO,GAAG,CAAC;IAC1H,CAAC;IAED,gBAAgB,CAAC,KAAwB;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,qBAAqB,OAAO,mCAAmC,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,oBAAoB,KAAK,CAAC,OAAO,GAAG,CAAC;IACzI,CAAC;IAED,gBAAgB;QACd,OAAO,iDAAiD,CAAC;IAC3D,CAAC;IAED,oBAAoB;QAClB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;QAE3E,IAAI,CAAC;YACH,MAAM,OAAO,GAAwB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YACvF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;YAEpE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACzC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;YAC9F,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAExB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5F,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAEjE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;oBACxC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBACnD,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;oBAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;gBAChE,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACzE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,SAAiB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QACzC,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,GAAG,CAAC;QACvC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IACzD,CAAC;IAEO,eAAe,CAAC,GAAW;QACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;CACF;AA5GD,oDA4GC"}
@@ -0,0 +1,20 @@
1
+ export interface SiloReport {
2
+ module: string;
3
+ riskScore: number;
4
+ contributors: string[];
5
+ busFactor: number;
6
+ recommendation: string;
7
+ }
8
+ export declare class KnowledgeSiloDetector {
9
+ private siloPath;
10
+ constructor(cellDir: string);
11
+ analyzeModule(module: string, contributors: string[], totalContributors: number): SiloReport;
12
+ analyzeProject(moduleContributors: Record<string, string[]>): SiloReport[];
13
+ getGenerateDocsAction(module: string): string;
14
+ getPairProgrammingAction(module: string): string;
15
+ getTopRisks(reports: SiloReport[], threshold?: number): SiloReport[];
16
+ saveReport(reports: SiloReport[]): void;
17
+ loadReport(): SiloReport[];
18
+ private ensureDirectory;
19
+ }
20
+ //# sourceMappingURL=knowledge-silo-detector.d.ts.map