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
@@ -9,7 +9,7 @@
9
9
  {
10
10
  "name": "olympus-ai",
11
11
  "description": "Multi-agent orchestration with intelligent model routing, The Ascent persistence loop, and specialized agents. Summon the gods of code.",
12
- "version": "1.0.2",
12
+ "version": "3.4.0",
13
13
  "author": {
14
14
  "name": "mikev10"
15
15
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "olympus-ai",
3
- "version": "3.2.3",
3
+ "version": "3.3.0",
4
4
  "description": "Olympus: Multi-agent orchestration for Claude Code. Summon the gods of code.",
5
5
  "author": {
6
6
  "name": "mikev10",
package/README.md CHANGED
@@ -45,6 +45,7 @@ Olympus transforms Claude Code from a single agent into a **pantheon of speciali
45
45
  - **Pattern Extraction** - Identifies recurring feedback and adapts behavior accordingly
46
46
  - **Preference Learning** - Infers your communication style (concise vs. detailed, autonomous vs. collaborative)
47
47
  - **Agent Performance Tracking** - Monitors which agents succeed or fail for specific tasks
48
+ - **Token Efficiency Tracking** - Automatically tracks token usage per agent to optimize cost without manual intervention
48
49
  - **Discovery Storage** - Structured JSONL storage with verification tracking and confidence scoring
49
50
  - **Context Injection** - Learned preferences and discoveries are automatically applied in new sessions
50
51
 
@@ -79,6 +80,7 @@ Olympus transforms Claude Code from a single agent into a **pantheon of speciali
79
80
  | **Task Persistence** | Stops when asked | Continues until verified complete |
80
81
  | **Background Tasks** | Blocks waiting | Runs async with notifications |
81
82
  | **Agent Specialization** | Generic responses | 20+ experts for specific domains |
83
+ | **Token Awareness** | Manual tracking | Automatic efficiency guidance |
82
84
 
83
85
  ---
84
86
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ascent-checkpoint.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ascent-checkpoint.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ascent-checkpoint.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,261 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { saveCheckpoint, loadCheckpoint, listCheckpoints, validateCheckpoint, hashPlanContent, getGitSha } from '../features/ascent-checkpoint/index.js';
3
+ import { existsSync, mkdirSync, rmSync, readdirSync, writeFileSync } from 'fs';
4
+ import { join } from 'path';
5
+ describe('Ascent Checkpoint System', () => {
6
+ const testCheckpointsDir = join(process.cwd(), '.olympus-test', 'checkpoints');
7
+ beforeEach(() => {
8
+ // Clean up test directory
9
+ if (existsSync(testCheckpointsDir)) {
10
+ rmSync(testCheckpointsDir, { recursive: true, force: true });
11
+ }
12
+ });
13
+ afterEach(() => {
14
+ // Clean up after tests
15
+ if (existsSync(testCheckpointsDir)) {
16
+ rmSync(testCheckpointsDir, { recursive: true, force: true });
17
+ }
18
+ });
19
+ describe('hashPlanContent', () => {
20
+ it('should generate consistent hash for same content', () => {
21
+ const content = 'Test plan content';
22
+ const hash1 = hashPlanContent(content);
23
+ const hash2 = hashPlanContent(content);
24
+ expect(hash1).toBe(hash2);
25
+ expect(hash1).toHaveLength(16);
26
+ });
27
+ it('should generate different hashes for different content', () => {
28
+ const content1 = 'Plan version 1';
29
+ const content2 = 'Plan version 2';
30
+ const hash1 = hashPlanContent(content1);
31
+ const hash2 = hashPlanContent(content2);
32
+ expect(hash1).not.toBe(hash2);
33
+ });
34
+ });
35
+ describe('getGitSha', () => {
36
+ it('should return a git SHA or unknown', () => {
37
+ const sha = getGitSha();
38
+ // Should be either a valid SHA (40 hex chars) or 'unknown'
39
+ expect(sha === 'unknown' || /^[a-f0-9]{40}$/i.test(sha)).toBe(true);
40
+ });
41
+ });
42
+ describe('saveCheckpoint', () => {
43
+ it('should create checkpoints directory if it does not exist', () => {
44
+ expect(existsSync(testCheckpointsDir)).toBe(false);
45
+ saveCheckpoint('test-plan', {
46
+ gitSha: 'abc123',
47
+ planHash: 'hash123',
48
+ iterationCount: 50,
49
+ tasks: []
50
+ }, testCheckpointsDir);
51
+ expect(existsSync(testCheckpointsDir)).toBe(true);
52
+ });
53
+ it('should save checkpoint with correct structure', () => {
54
+ const checkpoint = {
55
+ gitSha: 'abc123def456',
56
+ planHash: 'plan-hash-123',
57
+ iterationCount: 75,
58
+ tasks: [
59
+ { id: 'task-1', status: 'completed', description: 'First task' },
60
+ { id: 'task-2', status: 'in_progress', description: 'Second task' }
61
+ ]
62
+ };
63
+ saveCheckpoint('my-plan', checkpoint, testCheckpointsDir);
64
+ const files = readdirSync(testCheckpointsDir);
65
+ expect(files.length).toBe(1);
66
+ expect(files[0]).toMatch(/^my-plan-\d+\.json$/);
67
+ const loaded = loadCheckpoint('my-plan', testCheckpointsDir);
68
+ expect(loaded).not.toBeNull();
69
+ expect(loaded?.planName).toBe('my-plan');
70
+ expect(loaded?.gitSha).toBe('abc123def456');
71
+ expect(loaded?.iterationCount).toBe(75);
72
+ expect(loaded?.tasks).toHaveLength(2);
73
+ expect(loaded?.timestamp).toBeDefined();
74
+ });
75
+ it('should allow multiple checkpoints for same plan', () => {
76
+ saveCheckpoint('plan-a', {
77
+ gitSha: 'sha1',
78
+ planHash: 'hash1',
79
+ iterationCount: 10,
80
+ tasks: []
81
+ }, testCheckpointsDir);
82
+ // Wait a bit to ensure different timestamp
83
+ const now = Date.now();
84
+ while (Date.now() === now) {
85
+ // Busy wait
86
+ }
87
+ saveCheckpoint('plan-a', {
88
+ gitSha: 'sha2',
89
+ planHash: 'hash2',
90
+ iterationCount: 20,
91
+ tasks: []
92
+ }, testCheckpointsDir);
93
+ const checkpoints = listCheckpoints('plan-a', testCheckpointsDir);
94
+ expect(checkpoints.length).toBe(2);
95
+ });
96
+ });
97
+ describe('loadCheckpoint', () => {
98
+ it('should return null if no checkpoints exist', () => {
99
+ const loaded = loadCheckpoint('nonexistent-plan', testCheckpointsDir);
100
+ expect(loaded).toBeNull();
101
+ });
102
+ it('should load the most recent checkpoint', () => {
103
+ const now = Date.now();
104
+ // Create checkpoints directory
105
+ mkdirSync(testCheckpointsDir, { recursive: true });
106
+ // Save older checkpoint
107
+ const older = {
108
+ planName: 'plan-b',
109
+ timestamp: new Date(now - 10000).toISOString(),
110
+ gitSha: 'old-sha',
111
+ planHash: 'old-hash',
112
+ iterationCount: 10,
113
+ tasks: []
114
+ };
115
+ writeFileSync(join(testCheckpointsDir, `plan-b-${now - 10000}.json`), JSON.stringify(older), 'utf-8');
116
+ // Save newer checkpoint
117
+ const newer = {
118
+ planName: 'plan-b',
119
+ timestamp: new Date(now).toISOString(),
120
+ gitSha: 'new-sha',
121
+ planHash: 'new-hash',
122
+ iterationCount: 50,
123
+ tasks: []
124
+ };
125
+ writeFileSync(join(testCheckpointsDir, `plan-b-${now}.json`), JSON.stringify(newer), 'utf-8');
126
+ const loaded = loadCheckpoint('plan-b', testCheckpointsDir);
127
+ expect(loaded).not.toBeNull();
128
+ expect(loaded?.gitSha).toBe('new-sha');
129
+ expect(loaded?.iterationCount).toBe(50);
130
+ });
131
+ it('should handle corrupted checkpoint files gracefully', () => {
132
+ mkdirSync(testCheckpointsDir, { recursive: true });
133
+ // Write invalid JSON
134
+ writeFileSync(join(testCheckpointsDir, 'plan-c-123456.json'), 'invalid json {{{', 'utf-8');
135
+ const loaded = loadCheckpoint('plan-c', testCheckpointsDir);
136
+ expect(loaded).toBeNull();
137
+ });
138
+ });
139
+ describe('listCheckpoints', () => {
140
+ it('should return empty array if directory does not exist', () => {
141
+ const checkpoints = listCheckpoints('any-plan', testCheckpointsDir);
142
+ expect(checkpoints).toEqual([]);
143
+ });
144
+ it('should list only checkpoints for specified plan', () => {
145
+ mkdirSync(testCheckpointsDir, { recursive: true });
146
+ // Create checkpoints for different plans
147
+ writeFileSync(join(testCheckpointsDir, 'plan-a-100.json'), '{}', 'utf-8');
148
+ writeFileSync(join(testCheckpointsDir, 'plan-a-200.json'), '{}', 'utf-8');
149
+ writeFileSync(join(testCheckpointsDir, 'plan-b-100.json'), '{}', 'utf-8');
150
+ writeFileSync(join(testCheckpointsDir, 'other-file.txt'), 'text', 'utf-8');
151
+ const planACheckpoints = listCheckpoints('plan-a', testCheckpointsDir);
152
+ expect(planACheckpoints).toHaveLength(2);
153
+ expect(planACheckpoints.every(f => f.startsWith('plan-a-'))).toBe(true);
154
+ const planBCheckpoints = listCheckpoints('plan-b', testCheckpointsDir);
155
+ expect(planBCheckpoints).toHaveLength(1);
156
+ });
157
+ it('should sort checkpoints by most recent first', () => {
158
+ mkdirSync(testCheckpointsDir, { recursive: true });
159
+ writeFileSync(join(testCheckpointsDir, 'plan-x-100.json'), '{}', 'utf-8');
160
+ writeFileSync(join(testCheckpointsDir, 'plan-x-300.json'), '{}', 'utf-8');
161
+ writeFileSync(join(testCheckpointsDir, 'plan-x-200.json'), '{}', 'utf-8');
162
+ const checkpoints = listCheckpoints('plan-x', testCheckpointsDir);
163
+ expect(checkpoints).toEqual([
164
+ 'plan-x-300.json',
165
+ 'plan-x-200.json',
166
+ 'plan-x-100.json'
167
+ ]);
168
+ });
169
+ });
170
+ describe('validateCheckpoint', () => {
171
+ const checkpoint = {
172
+ planName: 'test-plan',
173
+ timestamp: new Date().toISOString(),
174
+ gitSha: 'abc123',
175
+ planHash: 'hash456',
176
+ iterationCount: 50,
177
+ tasks: []
178
+ };
179
+ it('should validate checkpoint with no changes', () => {
180
+ const result = validateCheckpoint(checkpoint, 'abc123', 'hash456');
181
+ expect(result.valid).toBe(true);
182
+ expect(result.warnings).toHaveLength(0);
183
+ });
184
+ it('should warn if git SHA changed', () => {
185
+ const result = validateCheckpoint(checkpoint, 'different-sha', 'hash456');
186
+ expect(result.valid).toBe(true);
187
+ expect(result.warnings).toHaveLength(1);
188
+ expect(result.warnings[0]).toContain('Git SHA has changed');
189
+ expect(result.warnings[0]).toContain('abc123');
190
+ expect(result.warnings[0]).toContain('different-sha');
191
+ });
192
+ it('should not warn if checkpoint SHA is unknown', () => {
193
+ const unknownCheckpoint = { ...checkpoint, gitSha: 'unknown' };
194
+ const result = validateCheckpoint(unknownCheckpoint, 'any-sha', 'hash456');
195
+ expect(result.valid).toBe(true);
196
+ expect(result.warnings).toHaveLength(0);
197
+ });
198
+ it('should warn if plan hash changed', () => {
199
+ const result = validateCheckpoint(checkpoint, 'abc123', 'different-hash');
200
+ expect(result.valid).toBe(true);
201
+ expect(result.warnings).toHaveLength(1);
202
+ expect(result.warnings[0]).toContain('Plan has been modified');
203
+ expect(result.warnings[0]).toContain('hash456');
204
+ expect(result.warnings[0]).toContain('different-hash');
205
+ });
206
+ it('should warn for both git SHA and plan hash changes', () => {
207
+ const result = validateCheckpoint(checkpoint, 'new-sha', 'new-hash');
208
+ expect(result.valid).toBe(true);
209
+ expect(result.warnings).toHaveLength(2);
210
+ expect(result.warnings[0]).toContain('Git SHA has changed');
211
+ expect(result.warnings[1]).toContain('Plan has been modified');
212
+ });
213
+ });
214
+ describe('Integration test', () => {
215
+ it('should handle full checkpoint lifecycle', () => {
216
+ // 1. Save initial checkpoint
217
+ saveCheckpoint('integration-test', {
218
+ gitSha: getGitSha(),
219
+ planHash: hashPlanContent('Plan content v1'),
220
+ iterationCount: 25,
221
+ tasks: [
222
+ { id: '1', status: 'completed', description: 'Task 1' },
223
+ { id: '2', status: 'in_progress', description: 'Task 2' },
224
+ { id: '3', status: 'pending', description: 'Task 3' }
225
+ ]
226
+ }, testCheckpointsDir);
227
+ // 2. List checkpoints
228
+ const checkpoints = listCheckpoints('integration-test', testCheckpointsDir);
229
+ expect(checkpoints).toHaveLength(1);
230
+ // 3. Load checkpoint
231
+ const loaded = loadCheckpoint('integration-test', testCheckpointsDir);
232
+ expect(loaded).not.toBeNull();
233
+ expect(loaded?.planName).toBe('integration-test');
234
+ expect(loaded?.iterationCount).toBe(25);
235
+ expect(loaded?.tasks).toHaveLength(3);
236
+ // 4. Validate checkpoint
237
+ const validation = validateCheckpoint(loaded, loaded.gitSha, loaded.planHash);
238
+ expect(validation.valid).toBe(true);
239
+ expect(validation.warnings).toHaveLength(0);
240
+ // 5. Save another checkpoint (progress)
241
+ saveCheckpoint('integration-test', {
242
+ gitSha: getGitSha(),
243
+ planHash: hashPlanContent('Plan content v1'),
244
+ iterationCount: 50,
245
+ tasks: [
246
+ { id: '1', status: 'completed', description: 'Task 1' },
247
+ { id: '2', status: 'completed', description: 'Task 2' },
248
+ { id: '3', status: 'in_progress', description: 'Task 3' }
249
+ ]
250
+ }, testCheckpointsDir);
251
+ // 6. Verify most recent is loaded
252
+ const latest = loadCheckpoint('integration-test', testCheckpointsDir);
253
+ expect(latest?.iterationCount).toBe(50);
254
+ expect(latest?.tasks[1].status).toBe('completed');
255
+ // 7. List all checkpoints
256
+ const allCheckpoints = listCheckpoints('integration-test', testCheckpointsDir);
257
+ expect(allCheckpoints).toHaveLength(2);
258
+ });
259
+ });
260
+ });
261
+ //# sourceMappingURL=ascent-checkpoint.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ascent-checkpoint.test.js","sourceRoot":"","sources":["../../src/__tests__/ascent-checkpoint.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-ascent.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-ascent.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config-ascent.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,134 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { loadEnvConfig } from '../config/loader.js';
3
+ describe('Config Loader - Ascent Configuration', () => {
4
+ let originalEnv;
5
+ beforeEach(() => {
6
+ // Save original environment
7
+ originalEnv = { ...process.env };
8
+ });
9
+ afterEach(() => {
10
+ // Restore original environment
11
+ process.env = originalEnv;
12
+ });
13
+ describe('loadEnvConfig - OLYMPUS_MAX_ASCENT_ITERATIONS', () => {
14
+ it('should load valid max iterations from environment', () => {
15
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '150';
16
+ const config = loadEnvConfig();
17
+ expect(config.ascent?.maxIterations).toBe(150);
18
+ });
19
+ it('should accept minimum value of 10', () => {
20
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '10';
21
+ const config = loadEnvConfig();
22
+ expect(config.ascent?.maxIterations).toBe(10);
23
+ });
24
+ it('should accept maximum value of 1000', () => {
25
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '1000';
26
+ const config = loadEnvConfig();
27
+ expect(config.ascent?.maxIterations).toBe(1000);
28
+ });
29
+ it('should reject values below 10', () => {
30
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '5';
31
+ const config = loadEnvConfig();
32
+ expect(config.ascent?.maxIterations).toBeUndefined();
33
+ });
34
+ it('should reject values above 1000', () => {
35
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '2000';
36
+ const config = loadEnvConfig();
37
+ expect(config.ascent?.maxIterations).toBeUndefined();
38
+ });
39
+ it('should ignore non-numeric values', () => {
40
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = 'not-a-number';
41
+ const config = loadEnvConfig();
42
+ expect(config.ascent?.maxIterations).toBeUndefined();
43
+ });
44
+ it('should ignore empty string', () => {
45
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '';
46
+ const config = loadEnvConfig();
47
+ expect(config.ascent?.maxIterations).toBeUndefined();
48
+ });
49
+ it('should not set ascent config if env var not set', () => {
50
+ delete process.env.OLYMPUS_MAX_ASCENT_ITERATIONS;
51
+ const config = loadEnvConfig();
52
+ // ascent should not be set at all, or should be undefined
53
+ expect(config.ascent).toBeUndefined();
54
+ });
55
+ it('should handle decimal values by truncating', () => {
56
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '150.7';
57
+ const config = loadEnvConfig();
58
+ expect(config.ascent?.maxIterations).toBe(150);
59
+ });
60
+ it('should handle negative values correctly (reject)', () => {
61
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '-50';
62
+ const config = loadEnvConfig();
63
+ expect(config.ascent?.maxIterations).toBeUndefined();
64
+ });
65
+ });
66
+ describe('Integration with other env configs', () => {
67
+ it('should not interfere with other environment configurations', () => {
68
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '200';
69
+ process.env.OLYMPUS_MAX_BACKGROUND_TASKS = '3';
70
+ process.env.OLYMPUS_PARALLEL_EXECUTION = 'true';
71
+ const config = loadEnvConfig();
72
+ expect(config.ascent?.maxIterations).toBe(200);
73
+ expect(config.permissions?.maxBackgroundTasks).toBe(3);
74
+ expect(config.features?.parallelExecution).toBe(true);
75
+ });
76
+ it('should work when only ascent env var is set', () => {
77
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '75';
78
+ const config = loadEnvConfig();
79
+ expect(config.ascent?.maxIterations).toBe(75);
80
+ // Other configs should be undefined (not set from env)
81
+ expect(config.permissions).toBeUndefined();
82
+ expect(config.features).toBeUndefined();
83
+ });
84
+ });
85
+ describe('Type validation', () => {
86
+ it('should return PluginConfig type', () => {
87
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '100';
88
+ const config = loadEnvConfig();
89
+ expect(config).toBeDefined();
90
+ expect(typeof config).toBe('object');
91
+ });
92
+ it('should have correct ascent config structure', () => {
93
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '250';
94
+ const config = loadEnvConfig();
95
+ expect(config.ascent).toBeDefined();
96
+ expect(config.ascent).toHaveProperty('maxIterations');
97
+ expect(typeof config.ascent?.maxIterations).toBe('number');
98
+ });
99
+ });
100
+ describe('Edge cases', () => {
101
+ it('should handle boundary value 10 correctly', () => {
102
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '10';
103
+ const config = loadEnvConfig();
104
+ expect(config.ascent?.maxIterations).toBe(10);
105
+ });
106
+ it('should handle boundary value 1000 correctly', () => {
107
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '1000';
108
+ const config = loadEnvConfig();
109
+ expect(config.ascent?.maxIterations).toBe(1000);
110
+ });
111
+ it('should reject boundary minus one (9)', () => {
112
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '9';
113
+ const config = loadEnvConfig();
114
+ expect(config.ascent?.maxIterations).toBeUndefined();
115
+ });
116
+ it('should reject boundary plus one (1001)', () => {
117
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '1001';
118
+ const config = loadEnvConfig();
119
+ expect(config.ascent?.maxIterations).toBeUndefined();
120
+ });
121
+ it('should handle zero correctly (reject)', () => {
122
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = '0';
123
+ const config = loadEnvConfig();
124
+ expect(config.ascent?.maxIterations).toBeUndefined();
125
+ });
126
+ it('should handle whitespace in value', () => {
127
+ process.env.OLYMPUS_MAX_ASCENT_ITERATIONS = ' 100 ';
128
+ const config = loadEnvConfig();
129
+ // parseInt handles leading/trailing whitespace
130
+ expect(config.ascent?.maxIterations).toBe(100);
131
+ });
132
+ });
133
+ });
134
+ //# sourceMappingURL=config-ascent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-ascent.test.js","sourceRoot":"","sources":["../../src/__tests__/config-ascent.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Integration Tests for Hook Blocking System
3
+ *
4
+ * Tests the complete flow: session state tracking, hook blocking logic,
5
+ * and violation logging.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=hook-blocking.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-blocking.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hook-blocking.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}