olympus-ai 3.2.3 → 3.4.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/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +2 -0
  4. package/dist/__tests__/ascent-checkpoint.test.d.ts +2 -0
  5. package/dist/__tests__/ascent-checkpoint.test.d.ts.map +1 -0
  6. package/dist/__tests__/ascent-checkpoint.test.js +261 -0
  7. package/dist/__tests__/ascent-checkpoint.test.js.map +1 -0
  8. package/dist/__tests__/config-ascent.test.d.ts +2 -0
  9. package/dist/__tests__/config-ascent.test.d.ts.map +1 -0
  10. package/dist/__tests__/config-ascent.test.js +134 -0
  11. package/dist/__tests__/config-ascent.test.js.map +1 -0
  12. package/dist/__tests__/hook-blocking.test.d.ts +8 -0
  13. package/dist/__tests__/hook-blocking.test.d.ts.map +1 -0
  14. package/dist/__tests__/hook-blocking.test.js +277 -0
  15. package/dist/__tests__/hook-blocking.test.js.map +1 -0
  16. package/dist/__tests__/installer.test.js +1 -1
  17. package/dist/__tests__/learning/aggregation.test.d.ts +2 -0
  18. package/dist/__tests__/learning/aggregation.test.d.ts.map +1 -0
  19. package/dist/__tests__/learning/aggregation.test.js +282 -0
  20. package/dist/__tests__/learning/aggregation.test.js.map +1 -0
  21. package/dist/__tests__/learning/anomaly.test.d.ts +2 -0
  22. package/dist/__tests__/learning/anomaly.test.d.ts.map +1 -0
  23. package/dist/__tests__/learning/anomaly.test.js +107 -0
  24. package/dist/__tests__/learning/anomaly.test.js.map +1 -0
  25. package/dist/__tests__/learning/baselines.test.d.ts +2 -0
  26. package/dist/__tests__/learning/baselines.test.d.ts.map +1 -0
  27. package/dist/__tests__/learning/baselines.test.js +155 -0
  28. package/dist/__tests__/learning/baselines.test.js.map +1 -0
  29. package/dist/__tests__/learning/efficiency.test.d.ts +2 -0
  30. package/dist/__tests__/learning/efficiency.test.d.ts.map +1 -0
  31. package/dist/__tests__/learning/efficiency.test.js +94 -0
  32. package/dist/__tests__/learning/efficiency.test.js.map +1 -0
  33. package/dist/__tests__/learning/feedback-loop-injection.test.d.ts +6 -0
  34. package/dist/__tests__/learning/feedback-loop-injection.test.d.ts.map +1 -0
  35. package/dist/__tests__/learning/feedback-loop-injection.test.js +288 -0
  36. package/dist/__tests__/learning/feedback-loop-injection.test.js.map +1 -0
  37. package/dist/__tests__/learning/learning-capture-integration.test.d.ts +6 -0
  38. package/dist/__tests__/learning/learning-capture-integration.test.d.ts.map +1 -0
  39. package/dist/__tests__/learning/learning-capture-integration.test.js +151 -0
  40. package/dist/__tests__/learning/learning-capture-integration.test.js.map +1 -0
  41. package/dist/__tests__/learning/token-metrics.test.d.ts +2 -0
  42. package/dist/__tests__/learning/token-metrics.test.d.ts.map +1 -0
  43. package/dist/__tests__/learning/token-metrics.test.js +308 -0
  44. package/dist/__tests__/learning/token-metrics.test.js.map +1 -0
  45. package/dist/__tests__/metrics-cli.test.d.ts +5 -0
  46. package/dist/__tests__/metrics-cli.test.d.ts.map +1 -0
  47. package/dist/__tests__/metrics-cli.test.js +24 -0
  48. package/dist/__tests__/metrics-cli.test.js.map +1 -0
  49. package/dist/__tests__/skill-auto-detection.test.d.ts +2 -0
  50. package/dist/__tests__/skill-auto-detection.test.d.ts.map +1 -0
  51. package/dist/__tests__/skill-auto-detection.test.js +255 -0
  52. package/dist/__tests__/skill-auto-detection.test.js.map +1 -0
  53. package/dist/__tests__/token-estimator.test.d.ts +5 -0
  54. package/dist/__tests__/token-estimator.test.d.ts.map +1 -0
  55. package/dist/__tests__/token-estimator.test.js +192 -0
  56. package/dist/__tests__/token-estimator.test.js.map +1 -0
  57. package/dist/__tests__/token-tracking-integration.test.d.ts +8 -0
  58. package/dist/__tests__/token-tracking-integration.test.d.ts.map +1 -0
  59. package/dist/__tests__/token-tracking-integration.test.js +669 -0
  60. package/dist/__tests__/token-tracking-integration.test.js.map +1 -0
  61. package/dist/agents/definitions.d.ts.map +1 -1
  62. package/dist/agents/definitions.js +83 -1
  63. package/dist/agents/definitions.js.map +1 -1
  64. package/dist/agents/document-writer.d.ts.map +1 -1
  65. package/dist/agents/document-writer.js +38 -0
  66. package/dist/agents/document-writer.js.map +1 -1
  67. package/dist/agents/frontend-engineer.d.ts.map +1 -1
  68. package/dist/agents/frontend-engineer.js +16 -0
  69. package/dist/agents/frontend-engineer.js.map +1 -1
  70. package/dist/agents/olympian.d.ts.map +1 -1
  71. package/dist/agents/olympian.js +15 -0
  72. package/dist/agents/olympian.js.map +1 -1
  73. package/dist/cli/commands/metrics.d.ts +39 -0
  74. package/dist/cli/commands/metrics.d.ts.map +1 -0
  75. package/dist/cli/commands/metrics.js +52 -0
  76. package/dist/cli/commands/metrics.js.map +1 -0
  77. package/dist/cli/index.js +235 -1
  78. package/dist/cli/index.js.map +1 -1
  79. package/dist/config/loader.d.ts.map +1 -1
  80. package/dist/config/loader.js +30 -0
  81. package/dist/config/loader.js.map +1 -1
  82. package/dist/features/ascent-checkpoint/index.d.ts +48 -0
  83. package/dist/features/ascent-checkpoint/index.d.ts.map +1 -0
  84. package/dist/features/ascent-checkpoint/index.js +144 -0
  85. package/dist/features/ascent-checkpoint/index.js.map +1 -0
  86. package/dist/features/hook-logging/index.d.ts +37 -0
  87. package/dist/features/hook-logging/index.d.ts.map +1 -0
  88. package/dist/features/hook-logging/index.js +120 -0
  89. package/dist/features/hook-logging/index.js.map +1 -0
  90. package/dist/features/hook-logging/index.test.d.ts +5 -0
  91. package/dist/features/hook-logging/index.test.d.ts.map +1 -0
  92. package/dist/features/hook-logging/index.test.js +268 -0
  93. package/dist/features/hook-logging/index.test.js.map +1 -0
  94. package/dist/features/index.d.ts +3 -0
  95. package/dist/features/index.d.ts.map +1 -1
  96. package/dist/features/index.js +8 -0
  97. package/dist/features/index.js.map +1 -1
  98. package/dist/features/magic-keywords.d.ts +51 -0
  99. package/dist/features/magic-keywords.d.ts.map +1 -1
  100. package/dist/features/magic-keywords.js +172 -0
  101. package/dist/features/magic-keywords.js.map +1 -1
  102. package/dist/features/session-state/index.d.ts +50 -0
  103. package/dist/features/session-state/index.d.ts.map +1 -0
  104. package/dist/features/session-state/index.js +64 -0
  105. package/dist/features/session-state/index.js.map +1 -0
  106. package/dist/features/session-state/index.test.d.ts +5 -0
  107. package/dist/features/session-state/index.test.d.ts.map +1 -0
  108. package/dist/features/session-state/index.test.js +221 -0
  109. package/dist/features/session-state/index.test.js.map +1 -0
  110. package/dist/features/token-metrics/index.d.ts +6 -0
  111. package/dist/features/token-metrics/index.d.ts.map +1 -0
  112. package/dist/features/token-metrics/index.js +5 -0
  113. package/dist/features/token-metrics/index.js.map +1 -0
  114. package/dist/features/token-metrics/storage.d.ts +16 -0
  115. package/dist/features/token-metrics/storage.d.ts.map +1 -0
  116. package/dist/features/token-metrics/storage.js +144 -0
  117. package/dist/features/token-metrics/storage.js.map +1 -0
  118. package/dist/features/token-metrics/token-estimator.d.ts +66 -0
  119. package/dist/features/token-metrics/token-estimator.d.ts.map +1 -0
  120. package/dist/features/token-metrics/token-estimator.js +230 -0
  121. package/dist/features/token-metrics/token-estimator.js.map +1 -0
  122. package/dist/features/token-metrics/types.d.ts +63 -0
  123. package/dist/features/token-metrics/types.d.ts.map +1 -0
  124. package/dist/features/token-metrics/types.js +5 -0
  125. package/dist/features/token-metrics/types.js.map +1 -0
  126. package/dist/hooks/olympus-orchestrator/constants.d.ts +2 -0
  127. package/dist/hooks/olympus-orchestrator/constants.d.ts.map +1 -1
  128. package/dist/hooks/olympus-orchestrator/constants.js +41 -0
  129. package/dist/hooks/olympus-orchestrator/constants.js.map +1 -1
  130. package/dist/hooks/olympus-orchestrator/index.d.ts +10 -1
  131. package/dist/hooks/olympus-orchestrator/index.d.ts.map +1 -1
  132. package/dist/hooks/olympus-orchestrator/index.js +108 -14
  133. package/dist/hooks/olympus-orchestrator/index.js.map +1 -1
  134. package/dist/hooks/registrations/budget-warning.d.ts +8 -0
  135. package/dist/hooks/registrations/budget-warning.d.ts.map +1 -0
  136. package/dist/hooks/registrations/budget-warning.js +63 -0
  137. package/dist/hooks/registrations/budget-warning.js.map +1 -0
  138. package/dist/hooks/registrations/index.d.ts +3 -1
  139. package/dist/hooks/registrations/index.d.ts.map +1 -1
  140. package/dist/hooks/registrations/index.js +5 -1
  141. package/dist/hooks/registrations/index.js.map +1 -1
  142. package/dist/hooks/registrations/learning-capture.d.ts +19 -0
  143. package/dist/hooks/registrations/learning-capture.d.ts.map +1 -0
  144. package/dist/hooks/registrations/learning-capture.js +220 -0
  145. package/dist/hooks/registrations/learning-capture.js.map +1 -0
  146. package/dist/hooks/registrations/session-start.d.ts.map +1 -1
  147. package/dist/hooks/registrations/session-start.js +13 -0
  148. package/dist/hooks/registrations/session-start.js.map +1 -1
  149. package/dist/hooks/registrations/token-metrics.d.ts +19 -0
  150. package/dist/hooks/registrations/token-metrics.d.ts.map +1 -0
  151. package/dist/hooks/registrations/token-metrics.js +133 -0
  152. package/dist/hooks/registrations/token-metrics.js.map +1 -0
  153. package/dist/installer/index.d.ts +2 -2
  154. package/dist/installer/index.d.ts.map +1 -1
  155. package/dist/installer/index.js +390 -9
  156. package/dist/installer/index.js.map +1 -1
  157. package/dist/learning/aggregation.d.ts +39 -0
  158. package/dist/learning/aggregation.d.ts.map +1 -0
  159. package/dist/learning/aggregation.js +101 -0
  160. package/dist/learning/aggregation.js.map +1 -0
  161. package/dist/learning/anomaly.d.ts +30 -0
  162. package/dist/learning/anomaly.d.ts.map +1 -0
  163. package/dist/learning/anomaly.js +102 -0
  164. package/dist/learning/anomaly.js.map +1 -0
  165. package/dist/learning/baselines.d.ts +44 -0
  166. package/dist/learning/baselines.d.ts.map +1 -0
  167. package/dist/learning/baselines.js +126 -0
  168. package/dist/learning/baselines.js.map +1 -0
  169. package/dist/learning/efficiency.d.ts +23 -0
  170. package/dist/learning/efficiency.d.ts.map +1 -0
  171. package/dist/learning/efficiency.js +67 -0
  172. package/dist/learning/efficiency.js.map +1 -0
  173. package/dist/learning/hooks/learned-context.d.ts.map +1 -1
  174. package/dist/learning/hooks/learned-context.js +46 -0
  175. package/dist/learning/hooks/learned-context.js.map +1 -1
  176. package/dist/learning/pricing.d.ts +30 -0
  177. package/dist/learning/pricing.d.ts.map +1 -0
  178. package/dist/learning/pricing.js +98 -0
  179. package/dist/learning/pricing.js.map +1 -0
  180. package/dist/learning/session-state.d.ts +12 -2
  181. package/dist/learning/session-state.d.ts.map +1 -1
  182. package/dist/learning/session-state.js +72 -3
  183. package/dist/learning/session-state.js.map +1 -1
  184. package/dist/learning/storage.d.ts +21 -1
  185. package/dist/learning/storage.d.ts.map +1 -1
  186. package/dist/learning/storage.js +84 -0
  187. package/dist/learning/storage.js.map +1 -1
  188. package/dist/learning/token-estimator.d.ts +41 -0
  189. package/dist/learning/token-estimator.d.ts.map +1 -0
  190. package/dist/learning/token-estimator.js +111 -0
  191. package/dist/learning/token-estimator.js.map +1 -0
  192. package/dist/learning/types.d.ts +32 -0
  193. package/dist/learning/types.d.ts.map +1 -1
  194. package/dist/learning/utils.d.ts +42 -0
  195. package/dist/learning/utils.d.ts.map +1 -0
  196. package/dist/learning/utils.js +76 -0
  197. package/dist/learning/utils.js.map +1 -0
  198. package/dist/shared/types.d.ts +45 -0
  199. package/dist/shared/types.d.ts.map +1 -1
  200. package/package.json +3 -3
  201. package/scripts/.olympus/token-metrics.jsonl +1 -0
  202. package/scripts/dist/hooks/olympus-hooks.cjs +128 -127
  203. package/scripts/esbuild.hooks.mjs +1 -1
  204. package/.claude/CLAUDE.md +0 -66
  205. package/scripts/generate-logo-hybrid-v2.mjs +0 -213
  206. package/scripts/generate-logo-hybrid.mjs +0 -209
  207. package/scripts/generate-logo-infinity.mjs +0 -239
  208. package/scripts/generate-logo-mythology.mjs +0 -190
  209. package/scripts/generate-logo-orchestration.mjs +0 -228
  210. package/scripts/generate-logo-recraft.mjs +0 -147
  211. package/scripts/generate-logo-simple.mjs +0 -154
  212. package/scripts/generate-logo.mjs +0 -117
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,sBAAsB,EACtB,gCAAgC,EAChC,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,+BAA+B,CAAC;AAEvC,OAAO;AAOL,YAAY;AACZ,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,YAAY;AACZ,YAAY;AACZ,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB;AACjB,qBAAqB;AACrB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAE1B,sCAAsC;AACtC,OAAO;AAKL,YAAY;AACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,cAAc;AACd,YAAY;AACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,mEAAmE;AACnE,OAAO;AACL,UAAU;AACV,gBAAgB,EAChB,gBAAgB;AAChB,YAAY;AACZ,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EAW1B,MAAM,6BAA6B,CAAC;AAErC,gDAAgD;AAChD,OAAO;AACL,UAAU;AACV,iBAAiB,EACjB,kBAAkB;AAClB,YAAY;AACZ,oBAAoB,EACpB,sBAAsB,EAQvB,MAAM,6BAA6B,CAAC;AAErC,6CAA6C;AAC7C,OAAO;AACL,YAAY;AACZ,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EAKtB,MAAM,2BAA2B,CAAC;AAEnC,iDAAiD;AACjD,OAAO;AACL,iBAAiB;AACjB,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,cAAc,EACd,iBAAiB;AACjB,oBAAoB;AACpB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB;AACjB,UAAU;AACV,wBAAwB,EACxB,uBAAuB,EACvB,WAAW,EACX,iBAAiB,EACjB,mBAAmB;AACnB,QAAQ;AACR,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,qBAAqB;AACrB,oBAAoB;AACpB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,mBAAmB;AACnB,YAAY;AACZ,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GAYvB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,sBAAsB,EACtB,gCAAgC,EAChC,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,+BAA+B,CAAC;AAEvC,OAAO;AAOL,YAAY;AACZ,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,YAAY;AACZ,YAAY;AACZ,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB;AACjB,qBAAqB;AACrB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAE1B,sCAAsC;AACtC,OAAO;AAKL,YAAY;AACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,cAAc;AACd,YAAY;AACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,mEAAmE;AACnE,OAAO;AACL,UAAU;AACV,gBAAgB,EAChB,gBAAgB;AAChB,YAAY;AACZ,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EAW1B,MAAM,6BAA6B,CAAC;AAErC,gDAAgD;AAChD,OAAO;AACL,UAAU;AACV,iBAAiB,EACjB,kBAAkB;AAClB,YAAY;AACZ,oBAAoB,EACpB,sBAAsB,EAQvB,MAAM,6BAA6B,CAAC;AAErC,6CAA6C;AAC7C,OAAO;AACL,YAAY;AACZ,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EAKtB,MAAM,2BAA2B,CAAC;AAEnC,0DAA0D;AAC1D,OAAO;AACL,YAAY;AACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,iBAAiB,EAGlB,MAAM,8BAA8B,CAAC;AAEtC,iDAAiD;AACjD,OAAO;AACL,iBAAiB;AACjB,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,cAAc,EACd,iBAAiB;AACjB,oBAAoB;AACpB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB;AACjB,UAAU;AACV,wBAAwB,EACxB,uBAAuB,EACvB,WAAW,EACX,iBAAiB,EACjB,mBAAmB;AACnB,QAAQ;AACR,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,qBAAqB;AACrB,oBAAoB;AACpB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,mBAAmB;AACnB,YAAY;AACZ,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GAYvB,MAAM,0BAA0B,CAAC;AAElC,2CAA2C;AAC3C,OAAO,EACL,YAAY,EACZ,YAAY,EAEb,MAAM,0BAA0B,CAAC;AAElC,mCAAmC;AACnC,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EAEhB,MAAM,yBAAyB,CAAC"}
@@ -10,6 +10,11 @@
10
10
  * - ANALYZE: Delegate to oracle agent
11
11
  * - ASCENT: Relentless persistence mode
12
12
  *
13
+ * Skill Auto-Detection:
14
+ * - FRONTEND-UI-UX: Detects UI/component/design work with 2+ visual keywords
15
+ * - GIT-MASTER: Detects refactor/rename/restructure operations
16
+ * - ASCENT: Detects completion signals like "must complete", "don't stop", "until done"
17
+ *
13
18
  * Behavior: Strips code blocks before detection to avoid false positives
14
19
  * Configuration: Customizable keyword patterns via olympus.jsonc
15
20
  */
@@ -34,4 +39,50 @@ export declare function extractPromptText(parts: Array<{
34
39
  text?: string;
35
40
  [key: string]: unknown;
36
41
  }>): string;
42
+ /**
43
+ * Auto-detect frontend-ui-ux skill from prompt
44
+ *
45
+ * Detection logic:
46
+ * - Primary keywords: component, ui, ux, design, styling, css, html, tailwind, sass, scss
47
+ * - Element keywords: button, modal, dialog, form, input, navbar, sidebar, menu, dropdown, card, layout
48
+ * - Action keywords: animate, responsive, theme, style
49
+ * - Negative signals: api, backend, server, database, endpoint, query, migration
50
+ *
51
+ * Rules:
52
+ * - Check negative signals first (if present, return false)
53
+ * - Require 2+ keyword matches from primary/elements/actions
54
+ */
55
+ export declare function detectFrontendUiUx(prompt: string): boolean;
56
+ /**
57
+ * Auto-detect git-master skill from prompt
58
+ *
59
+ * Detection logic:
60
+ * - Trigger keywords: refactor, rename, reorganize, migrate, restructure, move files
61
+ * - Post-Task activation: when 2+ files modified (checked via hook)
62
+ * - Check git status is clean before activation
63
+ *
64
+ * Rules:
65
+ * - Check prompt for trigger keywords
66
+ * - Skip if git status dirty (unsafe to start)
67
+ */
68
+ export declare function detectGitMaster(prompt: string): boolean;
69
+ /**
70
+ * Auto-detect ascent skill from prompt
71
+ *
72
+ * Detection logic:
73
+ * - Positive patterns: don't stop, must complete, finish this/it/everything,
74
+ * complete all/everything, until done/complete/finished, keep going, don't give up
75
+ * - Negative patterns: try, attempt, explore, investigate, check if, see if
76
+ *
77
+ * Rules:
78
+ * - Check negative patterns first (if match, return false)
79
+ * - Use regex for positive patterns (handle contractions)
80
+ * - Return true if any positive pattern matches
81
+ */
82
+ export declare function detectAscent(prompt: string): boolean;
83
+ /**
84
+ * Detect all skills from a prompt
85
+ * Returns array of skill names that should be activated
86
+ */
87
+ export declare function detectSkills(prompt: string): string[];
37
88
  //# sourceMappingURL=magic-keywords.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"magic-keywords.d.ts","sourceRoot":"","sources":["../../src/features/magic-keywords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA2UrE;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,YAAY,EAK9C,CAAC;AAEF;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CA+C9G;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,MAAM,EAAE,CAoCpG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,GAAG,MAAM,CAK/G"}
1
+ {"version":3,"file":"magic-keywords.d.ts","sourceRoot":"","sources":["../../src/features/magic-keywords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA2UrE;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,YAAY,EAK9C,CAAC;AAEF;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CA+C9G;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,MAAM,EAAE,CAoCpG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,GAAG,MAAM,CAK/G;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAoE1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAoBvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAqCpD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBrD"}
@@ -10,6 +10,11 @@
10
10
  * - ANALYZE: Delegate to oracle agent
11
11
  * - ASCENT: Relentless persistence mode
12
12
  *
13
+ * Skill Auto-Detection:
14
+ * - FRONTEND-UI-UX: Detects UI/component/design work with 2+ visual keywords
15
+ * - GIT-MASTER: Detects refactor/rename/restructure operations
16
+ * - ASCENT: Detects completion signals like "must complete", "don't stop", "until done"
17
+ *
13
18
  * Behavior: Strips code blocks before detection to avoid false positives
14
19
  * Configuration: Customizable keyword patterns via olympus.jsonc
15
20
  */
@@ -427,4 +432,171 @@ export function extractPromptText(parts) {
427
432
  .map(p => p.text ?? '')
428
433
  .join('\n');
429
434
  }
435
+ /**
436
+ * Auto-detect frontend-ui-ux skill from prompt
437
+ *
438
+ * Detection logic:
439
+ * - Primary keywords: component, ui, ux, design, styling, css, html, tailwind, sass, scss
440
+ * - Element keywords: button, modal, dialog, form, input, navbar, sidebar, menu, dropdown, card, layout
441
+ * - Action keywords: animate, responsive, theme, style
442
+ * - Negative signals: api, backend, server, database, endpoint, query, migration
443
+ *
444
+ * Rules:
445
+ * - Check negative signals first (if present, return false)
446
+ * - Require 2+ keyword matches from primary/elements/actions
447
+ */
448
+ export function detectFrontendUiUx(prompt) {
449
+ const cleanPrompt = removeCodeBlocks(prompt).toLowerCase();
450
+ // Negative signals - if present, NOT a frontend task
451
+ const negativeSignals = [
452
+ /\bapi\b/,
453
+ /\bbackend\b/,
454
+ /\bserver\b/,
455
+ /\bdatabase\b/,
456
+ /\bendpoint\b/,
457
+ /\bquery\b/,
458
+ /\bmigration\b/
459
+ ];
460
+ for (const signal of negativeSignals) {
461
+ if (signal.test(cleanPrompt)) {
462
+ return false;
463
+ }
464
+ }
465
+ // Primary keywords
466
+ const primaryKeywords = [
467
+ /\bcomponent\b/,
468
+ /\bui\b/,
469
+ /\bux\b/,
470
+ /\bdesign\b/,
471
+ /\bstyling\b/,
472
+ /\bcss\b/,
473
+ /\bhtml\b/,
474
+ /\btailwind\b/,
475
+ /\bsass\b/,
476
+ /\bscss\b/
477
+ ];
478
+ // Element keywords
479
+ const elementKeywords = [
480
+ /\bbutton\b/,
481
+ /\bmodal\b/,
482
+ /\bdialog\b/,
483
+ /\bform\b/,
484
+ /\binput\b/,
485
+ /\bnavbar\b/,
486
+ /\bsidebar\b/,
487
+ /\bmenu\b/,
488
+ /\bdropdown\b/,
489
+ /\bcard\b/,
490
+ /\blayout\b/
491
+ ];
492
+ // Action keywords
493
+ const actionKeywords = [
494
+ /\banimate\b/,
495
+ /\bresponsive\b/,
496
+ /\btheme\b/,
497
+ /\bstyle\b/
498
+ ];
499
+ // Count matches
500
+ let matchCount = 0;
501
+ for (const keyword of [...primaryKeywords, ...elementKeywords, ...actionKeywords]) {
502
+ if (keyword.test(cleanPrompt)) {
503
+ matchCount++;
504
+ }
505
+ }
506
+ // Require 2+ keyword matches
507
+ return matchCount >= 2;
508
+ }
509
+ /**
510
+ * Auto-detect git-master skill from prompt
511
+ *
512
+ * Detection logic:
513
+ * - Trigger keywords: refactor, rename, reorganize, migrate, restructure, move files
514
+ * - Post-Task activation: when 2+ files modified (checked via hook)
515
+ * - Check git status is clean before activation
516
+ *
517
+ * Rules:
518
+ * - Check prompt for trigger keywords
519
+ * - Skip if git status dirty (unsafe to start)
520
+ */
521
+ export function detectGitMaster(prompt) {
522
+ const cleanPrompt = removeCodeBlocks(prompt).toLowerCase();
523
+ // Trigger keywords
524
+ const triggerKeywords = [
525
+ /\brefactor\b/,
526
+ /\brename\b/,
527
+ /\breorganize\b/,
528
+ /\bmigrate\b/,
529
+ /\brestructure\b/,
530
+ /\bmove\s+files?\b/
531
+ ];
532
+ for (const keyword of triggerKeywords) {
533
+ if (keyword.test(cleanPrompt)) {
534
+ return true;
535
+ }
536
+ }
537
+ return false;
538
+ }
539
+ /**
540
+ * Auto-detect ascent skill from prompt
541
+ *
542
+ * Detection logic:
543
+ * - Positive patterns: don't stop, must complete, finish this/it/everything,
544
+ * complete all/everything, until done/complete/finished, keep going, don't give up
545
+ * - Negative patterns: try, attempt, explore, investigate, check if, see if
546
+ *
547
+ * Rules:
548
+ * - Check negative patterns first (if match, return false)
549
+ * - Use regex for positive patterns (handle contractions)
550
+ * - Return true if any positive pattern matches
551
+ */
552
+ export function detectAscent(prompt) {
553
+ const cleanPrompt = removeCodeBlocks(prompt).toLowerCase();
554
+ // Negative patterns - if present, NOT an ascent task
555
+ const negativePatterns = [
556
+ /\btry\b/,
557
+ /\battempt\b/,
558
+ /\bexplore\b/,
559
+ /\binvestigate\b/,
560
+ /\bcheck\s+if\b/,
561
+ /\bsee\s+if\b/
562
+ ];
563
+ for (const pattern of negativePatterns) {
564
+ if (pattern.test(cleanPrompt)) {
565
+ return false;
566
+ }
567
+ }
568
+ // Positive patterns (with contraction support)
569
+ const positivePatterns = [
570
+ /don'?t\s+stop/,
571
+ /must\s+complete/,
572
+ /finish\s+(this|it|everything)/,
573
+ /complete\s+(all|everything)/,
574
+ /until\s+(done|complete|finished)/,
575
+ /keep\s+going/,
576
+ /don'?t\s+give\s+up/
577
+ ];
578
+ for (const pattern of positivePatterns) {
579
+ if (pattern.test(cleanPrompt)) {
580
+ return true;
581
+ }
582
+ }
583
+ return false;
584
+ }
585
+ /**
586
+ * Detect all skills from a prompt
587
+ * Returns array of skill names that should be activated
588
+ */
589
+ export function detectSkills(prompt) {
590
+ const skills = [];
591
+ if (detectFrontendUiUx(prompt)) {
592
+ skills.push('frontend-ui-ux');
593
+ }
594
+ if (detectGitMaster(prompt)) {
595
+ skills.push('git-master');
596
+ }
597
+ if (detectAscent(prompt)) {
598
+ skills.push('ascent');
599
+ }
600
+ return skills;
601
+ }
430
602
  //# sourceMappingURL=magic-keywords.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"magic-keywords.js","sourceRoot":"","sources":["../../src/features/magic-keywords.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"magic-keywords.js","sourceRoot":"","sources":["../../src/features/magic-keywords.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Session State Tracking
3
+ *
4
+ * Tracks recent task completions to enable smart verification edit detection.
5
+ * Maintains in-memory state of the last 3 completed tasks and their modified files.
6
+ */
7
+ export interface TaskCompletion {
8
+ timestamp: number;
9
+ filesModified: string[];
10
+ taskId: string;
11
+ }
12
+ /**
13
+ * SessionState tracks recent task completions and determines if an edit
14
+ * qualifies as a "verification edit" (small edit on recently-modified file).
15
+ */
16
+ export declare class SessionState {
17
+ private recentTasks;
18
+ private readonly maxTracked;
19
+ /**
20
+ * Record a task completion with its modified files
21
+ */
22
+ recordTaskCompletion(completion: TaskCompletion): void;
23
+ /**
24
+ * Check if a file edit qualifies as a verification edit:
25
+ * - File was modified by one of the last 3 tasks
26
+ * - Edit is small (< 10 lines changed)
27
+ */
28
+ isVerificationEdit(filePath: string, linesChanged: number): boolean;
29
+ /**
30
+ * Get all files modified by recent tasks (deduplicated)
31
+ */
32
+ getRecentTaskFiles(): string[];
33
+ /**
34
+ * Get recent task completions (for debugging/testing)
35
+ */
36
+ getRecentTasks(): TaskCompletion[];
37
+ /**
38
+ * Clear all tracked tasks (for testing)
39
+ */
40
+ clear(): void;
41
+ /**
42
+ * Get number of tracked tasks
43
+ */
44
+ get trackedCount(): number;
45
+ }
46
+ /**
47
+ * Singleton instance for the session
48
+ */
49
+ export declare const sessionState: SessionState;
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/session-state/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAK;IAEhC;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI;IAOtD;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAUnE;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAK9B;;OAEG;IACH,cAAc,IAAI,cAAc,EAAE;IAIlC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Session State Tracking
3
+ *
4
+ * Tracks recent task completions to enable smart verification edit detection.
5
+ * Maintains in-memory state of the last 3 completed tasks and their modified files.
6
+ */
7
+ /**
8
+ * SessionState tracks recent task completions and determines if an edit
9
+ * qualifies as a "verification edit" (small edit on recently-modified file).
10
+ */
11
+ export class SessionState {
12
+ recentTasks = [];
13
+ maxTracked = 3;
14
+ /**
15
+ * Record a task completion with its modified files
16
+ */
17
+ recordTaskCompletion(completion) {
18
+ this.recentTasks.unshift(completion);
19
+ if (this.recentTasks.length > this.maxTracked) {
20
+ this.recentTasks.pop();
21
+ }
22
+ }
23
+ /**
24
+ * Check if a file edit qualifies as a verification edit:
25
+ * - File was modified by one of the last 3 tasks
26
+ * - Edit is small (< 10 lines changed)
27
+ */
28
+ isVerificationEdit(filePath, linesChanged) {
29
+ // Check if file was modified by any of last 3 tasks
30
+ const wasModifiedByTask = this.recentTasks.some((task) => task.filesModified.includes(filePath));
31
+ // Must be small edit (< 10 lines) on file from recent task
32
+ return wasModifiedByTask && linesChanged < 10;
33
+ }
34
+ /**
35
+ * Get all files modified by recent tasks (deduplicated)
36
+ */
37
+ getRecentTaskFiles() {
38
+ const allFiles = this.recentTasks.flatMap((t) => t.filesModified);
39
+ return Array.from(new Set(allFiles));
40
+ }
41
+ /**
42
+ * Get recent task completions (for debugging/testing)
43
+ */
44
+ getRecentTasks() {
45
+ return [...this.recentTasks];
46
+ }
47
+ /**
48
+ * Clear all tracked tasks (for testing)
49
+ */
50
+ clear() {
51
+ this.recentTasks = [];
52
+ }
53
+ /**
54
+ * Get number of tracked tasks
55
+ */
56
+ get trackedCount() {
57
+ return this.recentTasks.length;
58
+ }
59
+ }
60
+ /**
61
+ * Singleton instance for the session
62
+ */
63
+ export const sessionState = new SessionState();
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/session-state/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;;GAGG;AACH,MAAM,OAAO,YAAY;IACf,WAAW,GAAqB,EAAE,CAAC;IAC1B,UAAU,GAAG,CAAC,CAAC;IAEhC;;OAEG;IACH,oBAAoB,CAAC,UAA0B;QAC7C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,QAAgB,EAAE,YAAoB;QACvD,oDAAoD;QACpD,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACvD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACtC,CAAC;QAEF,2DAA2D;QAC3D,OAAO,iBAAiB,IAAI,YAAY,GAAG,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IACjC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for Session State Tracking
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/features/session-state/index.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Tests for Session State Tracking
3
+ */
4
+ import { describe, it, expect, beforeEach } from 'vitest';
5
+ import { SessionState } from './index.js';
6
+ describe('SessionState', () => {
7
+ let state;
8
+ beforeEach(() => {
9
+ state = new SessionState();
10
+ });
11
+ describe('recordTaskCompletion', () => {
12
+ it('should record a single task completion', () => {
13
+ const completion = {
14
+ timestamp: Date.now(),
15
+ filesModified: ['src/index.ts'],
16
+ taskId: 'task-1',
17
+ };
18
+ state.recordTaskCompletion(completion);
19
+ expect(state.trackedCount).toBe(1);
20
+ expect(state.getRecentTasks()).toEqual([completion]);
21
+ });
22
+ it('should record multiple task completions', () => {
23
+ const completion1 = {
24
+ timestamp: Date.now(),
25
+ filesModified: ['src/index.ts'],
26
+ taskId: 'task-1',
27
+ };
28
+ const completion2 = {
29
+ timestamp: Date.now() + 1000,
30
+ filesModified: ['src/utils.ts'],
31
+ taskId: 'task-2',
32
+ };
33
+ state.recordTaskCompletion(completion1);
34
+ state.recordTaskCompletion(completion2);
35
+ expect(state.trackedCount).toBe(2);
36
+ expect(state.getRecentTasks()).toEqual([completion2, completion1]);
37
+ });
38
+ it('should maintain maximum of 3 tasks', () => {
39
+ const tasks = [
40
+ { timestamp: 1, filesModified: ['file1.ts'], taskId: 'task-1' },
41
+ { timestamp: 2, filesModified: ['file2.ts'], taskId: 'task-2' },
42
+ { timestamp: 3, filesModified: ['file3.ts'], taskId: 'task-3' },
43
+ { timestamp: 4, filesModified: ['file4.ts'], taskId: 'task-4' },
44
+ ];
45
+ for (const task of tasks) {
46
+ state.recordTaskCompletion(task);
47
+ }
48
+ expect(state.trackedCount).toBe(3);
49
+ const recent = state.getRecentTasks();
50
+ expect(recent).toHaveLength(3);
51
+ expect(recent[0].taskId).toBe('task-4'); // Most recent
52
+ expect(recent[1].taskId).toBe('task-3');
53
+ expect(recent[2].taskId).toBe('task-2');
54
+ // task-1 should be evicted
55
+ });
56
+ it('should add new tasks to the front', () => {
57
+ const task1 = {
58
+ timestamp: 1,
59
+ filesModified: ['file1.ts'],
60
+ taskId: 'task-1',
61
+ };
62
+ const task2 = {
63
+ timestamp: 2,
64
+ filesModified: ['file2.ts'],
65
+ taskId: 'task-2',
66
+ };
67
+ state.recordTaskCompletion(task1);
68
+ state.recordTaskCompletion(task2);
69
+ const recent = state.getRecentTasks();
70
+ expect(recent[0]).toEqual(task2); // Most recent first
71
+ expect(recent[1]).toEqual(task1);
72
+ });
73
+ });
74
+ describe('isVerificationEdit', () => {
75
+ beforeEach(() => {
76
+ state.recordTaskCompletion({
77
+ timestamp: Date.now(),
78
+ filesModified: ['src/index.ts', 'src/utils.ts'],
79
+ taskId: 'task-1',
80
+ });
81
+ });
82
+ it('should return true for small edit on recent task file', () => {
83
+ expect(state.isVerificationEdit('src/index.ts', 5)).toBe(true);
84
+ expect(state.isVerificationEdit('src/utils.ts', 9)).toBe(true);
85
+ });
86
+ it('should return false for large edit on recent task file', () => {
87
+ expect(state.isVerificationEdit('src/index.ts', 10)).toBe(false);
88
+ expect(state.isVerificationEdit('src/index.ts', 100)).toBe(false);
89
+ });
90
+ it('should return false for small edit on non-recent file', () => {
91
+ expect(state.isVerificationEdit('src/other.ts', 5)).toBe(false);
92
+ });
93
+ it('should return false for file not modified by any task', () => {
94
+ expect(state.isVerificationEdit('new-file.ts', 3)).toBe(false);
95
+ });
96
+ it('should check across multiple recent tasks', () => {
97
+ state.recordTaskCompletion({
98
+ timestamp: Date.now() + 1000,
99
+ filesModified: ['src/components.ts'],
100
+ taskId: 'task-2',
101
+ });
102
+ state.recordTaskCompletion({
103
+ timestamp: Date.now() + 2000,
104
+ filesModified: ['src/hooks.ts'],
105
+ taskId: 'task-3',
106
+ });
107
+ // All files from last 3 tasks should be considered
108
+ expect(state.isVerificationEdit('src/hooks.ts', 5)).toBe(true);
109
+ expect(state.isVerificationEdit('src/components.ts', 5)).toBe(true);
110
+ expect(state.isVerificationEdit('src/index.ts', 5)).toBe(true);
111
+ });
112
+ it('should not consider files from evicted tasks', () => {
113
+ // Add 3 more tasks, pushing task-1 out
114
+ state.recordTaskCompletion({
115
+ timestamp: Date.now() + 1000,
116
+ filesModified: ['file2.ts'],
117
+ taskId: 'task-2',
118
+ });
119
+ state.recordTaskCompletion({
120
+ timestamp: Date.now() + 2000,
121
+ filesModified: ['file3.ts'],
122
+ taskId: 'task-3',
123
+ });
124
+ state.recordTaskCompletion({
125
+ timestamp: Date.now() + 3000,
126
+ filesModified: ['file4.ts'],
127
+ taskId: 'task-4',
128
+ });
129
+ // Original files should no longer be considered
130
+ expect(state.isVerificationEdit('src/index.ts', 5)).toBe(false);
131
+ expect(state.isVerificationEdit('src/utils.ts', 5)).toBe(false);
132
+ // New files should be considered
133
+ expect(state.isVerificationEdit('file2.ts', 5)).toBe(true);
134
+ expect(state.isVerificationEdit('file3.ts', 5)).toBe(true);
135
+ expect(state.isVerificationEdit('file4.ts', 5)).toBe(true);
136
+ });
137
+ it('should handle boundary case of exactly 10 lines', () => {
138
+ expect(state.isVerificationEdit('src/index.ts', 9)).toBe(true);
139
+ expect(state.isVerificationEdit('src/index.ts', 10)).toBe(false);
140
+ });
141
+ });
142
+ describe('getRecentTaskFiles', () => {
143
+ it('should return empty array when no tasks', () => {
144
+ expect(state.getRecentTaskFiles()).toEqual([]);
145
+ });
146
+ it('should return files from single task', () => {
147
+ state.recordTaskCompletion({
148
+ timestamp: Date.now(),
149
+ filesModified: ['file1.ts', 'file2.ts'],
150
+ taskId: 'task-1',
151
+ });
152
+ const files = state.getRecentTaskFiles();
153
+ expect(files).toContain('file1.ts');
154
+ expect(files).toContain('file2.ts');
155
+ });
156
+ it('should return deduplicated files from multiple tasks', () => {
157
+ state.recordTaskCompletion({
158
+ timestamp: 1,
159
+ filesModified: ['file1.ts', 'file2.ts'],
160
+ taskId: 'task-1',
161
+ });
162
+ state.recordTaskCompletion({
163
+ timestamp: 2,
164
+ filesModified: ['file2.ts', 'file3.ts'], // file2.ts repeated
165
+ taskId: 'task-2',
166
+ });
167
+ const files = state.getRecentTaskFiles();
168
+ expect(files).toHaveLength(3);
169
+ expect(files).toContain('file1.ts');
170
+ expect(files).toContain('file2.ts');
171
+ expect(files).toContain('file3.ts');
172
+ });
173
+ it('should only include files from last 3 tasks', () => {
174
+ state.recordTaskCompletion({
175
+ timestamp: 1,
176
+ filesModified: ['old-file.ts'],
177
+ taskId: 'task-1',
178
+ });
179
+ state.recordTaskCompletion({
180
+ timestamp: 2,
181
+ filesModified: ['file2.ts'],
182
+ taskId: 'task-2',
183
+ });
184
+ state.recordTaskCompletion({
185
+ timestamp: 3,
186
+ filesModified: ['file3.ts'],
187
+ taskId: 'task-3',
188
+ });
189
+ state.recordTaskCompletion({
190
+ timestamp: 4,
191
+ filesModified: ['file4.ts'],
192
+ taskId: 'task-4',
193
+ });
194
+ const files = state.getRecentTaskFiles();
195
+ expect(files).not.toContain('old-file.ts');
196
+ expect(files).toContain('file2.ts');
197
+ expect(files).toContain('file3.ts');
198
+ expect(files).toContain('file4.ts');
199
+ });
200
+ });
201
+ describe('clear', () => {
202
+ it('should clear all tracked tasks', () => {
203
+ state.recordTaskCompletion({
204
+ timestamp: Date.now(),
205
+ filesModified: ['file1.ts'],
206
+ taskId: 'task-1',
207
+ });
208
+ state.recordTaskCompletion({
209
+ timestamp: Date.now(),
210
+ filesModified: ['file2.ts'],
211
+ taskId: 'task-2',
212
+ });
213
+ expect(state.trackedCount).toBe(2);
214
+ state.clear();
215
+ expect(state.trackedCount).toBe(0);
216
+ expect(state.getRecentTasks()).toEqual([]);
217
+ expect(state.getRecentTaskFiles()).toEqual([]);
218
+ });
219
+ });
220
+ });
221
+ //# sourceMappingURL=index.test.js.map