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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +2 -0
- package/dist/__tests__/ascent-checkpoint.test.d.ts +2 -0
- package/dist/__tests__/ascent-checkpoint.test.d.ts.map +1 -0
- package/dist/__tests__/ascent-checkpoint.test.js +261 -0
- package/dist/__tests__/ascent-checkpoint.test.js.map +1 -0
- package/dist/__tests__/config-ascent.test.d.ts +2 -0
- package/dist/__tests__/config-ascent.test.d.ts.map +1 -0
- package/dist/__tests__/config-ascent.test.js +134 -0
- package/dist/__tests__/config-ascent.test.js.map +1 -0
- package/dist/__tests__/hook-blocking.test.d.ts +8 -0
- package/dist/__tests__/hook-blocking.test.d.ts.map +1 -0
- package/dist/__tests__/hook-blocking.test.js +277 -0
- package/dist/__tests__/hook-blocking.test.js.map +1 -0
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/learning/aggregation.test.d.ts +2 -0
- package/dist/__tests__/learning/aggregation.test.d.ts.map +1 -0
- package/dist/__tests__/learning/aggregation.test.js +282 -0
- package/dist/__tests__/learning/aggregation.test.js.map +1 -0
- package/dist/__tests__/learning/anomaly.test.d.ts +2 -0
- package/dist/__tests__/learning/anomaly.test.d.ts.map +1 -0
- package/dist/__tests__/learning/anomaly.test.js +107 -0
- package/dist/__tests__/learning/anomaly.test.js.map +1 -0
- package/dist/__tests__/learning/baselines.test.d.ts +2 -0
- package/dist/__tests__/learning/baselines.test.d.ts.map +1 -0
- package/dist/__tests__/learning/baselines.test.js +155 -0
- package/dist/__tests__/learning/baselines.test.js.map +1 -0
- package/dist/__tests__/learning/efficiency.test.d.ts +2 -0
- package/dist/__tests__/learning/efficiency.test.d.ts.map +1 -0
- package/dist/__tests__/learning/efficiency.test.js +94 -0
- package/dist/__tests__/learning/efficiency.test.js.map +1 -0
- package/dist/__tests__/learning/feedback-loop-injection.test.d.ts +6 -0
- package/dist/__tests__/learning/feedback-loop-injection.test.d.ts.map +1 -0
- package/dist/__tests__/learning/feedback-loop-injection.test.js +288 -0
- package/dist/__tests__/learning/feedback-loop-injection.test.js.map +1 -0
- package/dist/__tests__/learning/learning-capture-integration.test.d.ts +6 -0
- package/dist/__tests__/learning/learning-capture-integration.test.d.ts.map +1 -0
- package/dist/__tests__/learning/learning-capture-integration.test.js +151 -0
- package/dist/__tests__/learning/learning-capture-integration.test.js.map +1 -0
- package/dist/__tests__/learning/token-metrics.test.d.ts +2 -0
- package/dist/__tests__/learning/token-metrics.test.d.ts.map +1 -0
- package/dist/__tests__/learning/token-metrics.test.js +308 -0
- package/dist/__tests__/learning/token-metrics.test.js.map +1 -0
- package/dist/__tests__/metrics-cli.test.d.ts +5 -0
- package/dist/__tests__/metrics-cli.test.d.ts.map +1 -0
- package/dist/__tests__/metrics-cli.test.js +24 -0
- package/dist/__tests__/metrics-cli.test.js.map +1 -0
- package/dist/__tests__/skill-auto-detection.test.d.ts +2 -0
- package/dist/__tests__/skill-auto-detection.test.d.ts.map +1 -0
- package/dist/__tests__/skill-auto-detection.test.js +255 -0
- package/dist/__tests__/skill-auto-detection.test.js.map +1 -0
- package/dist/__tests__/token-estimator.test.d.ts +5 -0
- package/dist/__tests__/token-estimator.test.d.ts.map +1 -0
- package/dist/__tests__/token-estimator.test.js +192 -0
- package/dist/__tests__/token-estimator.test.js.map +1 -0
- package/dist/__tests__/token-tracking-integration.test.d.ts +8 -0
- package/dist/__tests__/token-tracking-integration.test.d.ts.map +1 -0
- package/dist/__tests__/token-tracking-integration.test.js +669 -0
- package/dist/__tests__/token-tracking-integration.test.js.map +1 -0
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +83 -1
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/document-writer.d.ts.map +1 -1
- package/dist/agents/document-writer.js +38 -0
- package/dist/agents/document-writer.js.map +1 -1
- package/dist/agents/frontend-engineer.d.ts.map +1 -1
- package/dist/agents/frontend-engineer.js +16 -0
- package/dist/agents/frontend-engineer.js.map +1 -1
- package/dist/agents/olympian.d.ts.map +1 -1
- package/dist/agents/olympian.js +15 -0
- package/dist/agents/olympian.js.map +1 -1
- package/dist/cli/commands/metrics.d.ts +39 -0
- package/dist/cli/commands/metrics.d.ts.map +1 -0
- package/dist/cli/commands/metrics.js +52 -0
- package/dist/cli/commands/metrics.js.map +1 -0
- package/dist/cli/index.js +235 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +30 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/features/ascent-checkpoint/index.d.ts +48 -0
- package/dist/features/ascent-checkpoint/index.d.ts.map +1 -0
- package/dist/features/ascent-checkpoint/index.js +144 -0
- package/dist/features/ascent-checkpoint/index.js.map +1 -0
- package/dist/features/hook-logging/index.d.ts +37 -0
- package/dist/features/hook-logging/index.d.ts.map +1 -0
- package/dist/features/hook-logging/index.js +120 -0
- package/dist/features/hook-logging/index.js.map +1 -0
- package/dist/features/hook-logging/index.test.d.ts +5 -0
- package/dist/features/hook-logging/index.test.d.ts.map +1 -0
- package/dist/features/hook-logging/index.test.js +268 -0
- package/dist/features/hook-logging/index.test.js.map +1 -0
- package/dist/features/index.d.ts +3 -0
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +8 -0
- package/dist/features/index.js.map +1 -1
- package/dist/features/magic-keywords.d.ts +51 -0
- package/dist/features/magic-keywords.d.ts.map +1 -1
- package/dist/features/magic-keywords.js +172 -0
- package/dist/features/magic-keywords.js.map +1 -1
- package/dist/features/session-state/index.d.ts +50 -0
- package/dist/features/session-state/index.d.ts.map +1 -0
- package/dist/features/session-state/index.js +64 -0
- package/dist/features/session-state/index.js.map +1 -0
- package/dist/features/session-state/index.test.d.ts +5 -0
- package/dist/features/session-state/index.test.d.ts.map +1 -0
- package/dist/features/session-state/index.test.js +221 -0
- package/dist/features/session-state/index.test.js.map +1 -0
- package/dist/features/token-metrics/index.d.ts +6 -0
- package/dist/features/token-metrics/index.d.ts.map +1 -0
- package/dist/features/token-metrics/index.js +5 -0
- package/dist/features/token-metrics/index.js.map +1 -0
- package/dist/features/token-metrics/storage.d.ts +16 -0
- package/dist/features/token-metrics/storage.d.ts.map +1 -0
- package/dist/features/token-metrics/storage.js +144 -0
- package/dist/features/token-metrics/storage.js.map +1 -0
- package/dist/features/token-metrics/token-estimator.d.ts +66 -0
- package/dist/features/token-metrics/token-estimator.d.ts.map +1 -0
- package/dist/features/token-metrics/token-estimator.js +230 -0
- package/dist/features/token-metrics/token-estimator.js.map +1 -0
- package/dist/features/token-metrics/types.d.ts +63 -0
- package/dist/features/token-metrics/types.d.ts.map +1 -0
- package/dist/features/token-metrics/types.js +5 -0
- package/dist/features/token-metrics/types.js.map +1 -0
- package/dist/hooks/olympus-orchestrator/constants.d.ts +2 -0
- package/dist/hooks/olympus-orchestrator/constants.d.ts.map +1 -1
- package/dist/hooks/olympus-orchestrator/constants.js +41 -0
- package/dist/hooks/olympus-orchestrator/constants.js.map +1 -1
- package/dist/hooks/olympus-orchestrator/index.d.ts +10 -1
- package/dist/hooks/olympus-orchestrator/index.d.ts.map +1 -1
- package/dist/hooks/olympus-orchestrator/index.js +108 -14
- package/dist/hooks/olympus-orchestrator/index.js.map +1 -1
- package/dist/hooks/registrations/budget-warning.d.ts +8 -0
- package/dist/hooks/registrations/budget-warning.d.ts.map +1 -0
- package/dist/hooks/registrations/budget-warning.js +63 -0
- package/dist/hooks/registrations/budget-warning.js.map +1 -0
- package/dist/hooks/registrations/index.d.ts +3 -1
- package/dist/hooks/registrations/index.d.ts.map +1 -1
- package/dist/hooks/registrations/index.js +5 -1
- package/dist/hooks/registrations/index.js.map +1 -1
- package/dist/hooks/registrations/learning-capture.d.ts +19 -0
- package/dist/hooks/registrations/learning-capture.d.ts.map +1 -0
- package/dist/hooks/registrations/learning-capture.js +220 -0
- package/dist/hooks/registrations/learning-capture.js.map +1 -0
- package/dist/hooks/registrations/session-start.d.ts.map +1 -1
- package/dist/hooks/registrations/session-start.js +13 -0
- package/dist/hooks/registrations/session-start.js.map +1 -1
- package/dist/hooks/registrations/token-metrics.d.ts +19 -0
- package/dist/hooks/registrations/token-metrics.d.ts.map +1 -0
- package/dist/hooks/registrations/token-metrics.js +133 -0
- package/dist/hooks/registrations/token-metrics.js.map +1 -0
- package/dist/installer/index.d.ts +2 -2
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +390 -9
- package/dist/installer/index.js.map +1 -1
- package/dist/learning/aggregation.d.ts +39 -0
- package/dist/learning/aggregation.d.ts.map +1 -0
- package/dist/learning/aggregation.js +101 -0
- package/dist/learning/aggregation.js.map +1 -0
- package/dist/learning/anomaly.d.ts +30 -0
- package/dist/learning/anomaly.d.ts.map +1 -0
- package/dist/learning/anomaly.js +102 -0
- package/dist/learning/anomaly.js.map +1 -0
- package/dist/learning/baselines.d.ts +44 -0
- package/dist/learning/baselines.d.ts.map +1 -0
- package/dist/learning/baselines.js +126 -0
- package/dist/learning/baselines.js.map +1 -0
- package/dist/learning/efficiency.d.ts +23 -0
- package/dist/learning/efficiency.d.ts.map +1 -0
- package/dist/learning/efficiency.js +67 -0
- package/dist/learning/efficiency.js.map +1 -0
- package/dist/learning/hooks/learned-context.d.ts.map +1 -1
- package/dist/learning/hooks/learned-context.js +46 -0
- package/dist/learning/hooks/learned-context.js.map +1 -1
- package/dist/learning/pricing.d.ts +30 -0
- package/dist/learning/pricing.d.ts.map +1 -0
- package/dist/learning/pricing.js +98 -0
- package/dist/learning/pricing.js.map +1 -0
- package/dist/learning/session-state.d.ts +12 -2
- package/dist/learning/session-state.d.ts.map +1 -1
- package/dist/learning/session-state.js +72 -3
- package/dist/learning/session-state.js.map +1 -1
- package/dist/learning/storage.d.ts +21 -1
- package/dist/learning/storage.d.ts.map +1 -1
- package/dist/learning/storage.js +84 -0
- package/dist/learning/storage.js.map +1 -1
- package/dist/learning/token-estimator.d.ts +41 -0
- package/dist/learning/token-estimator.d.ts.map +1 -0
- package/dist/learning/token-estimator.js +111 -0
- package/dist/learning/token-estimator.js.map +1 -0
- package/dist/learning/types.d.ts +32 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/learning/utils.d.ts +42 -0
- package/dist/learning/utils.d.ts.map +1 -0
- package/dist/learning/utils.js +76 -0
- package/dist/learning/utils.js.map +1 -0
- package/dist/shared/types.d.ts +45 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/scripts/.olympus/token-metrics.jsonl +1 -0
- package/scripts/dist/hooks/olympus-hooks.cjs +128 -127
- package/scripts/esbuild.hooks.mjs +1 -1
- package/.claude/CLAUDE.md +0 -66
- package/scripts/generate-logo-hybrid-v2.mjs +0 -213
- package/scripts/generate-logo-hybrid.mjs +0 -209
- package/scripts/generate-logo-infinity.mjs +0 -239
- package/scripts/generate-logo-mythology.mjs +0 -190
- package/scripts/generate-logo-orchestration.mjs +0 -228
- package/scripts/generate-logo-recraft.mjs +0 -147
- package/scripts/generate-logo-simple.mjs +0 -154
- 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
|
|
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":"AAAA
|
|
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 @@
|
|
|
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
|