jfl 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/dist/commands/doctor.d.ts +1 -0
  2. package/dist/commands/doctor.d.ts.map +1 -1
  3. package/dist/commands/doctor.js +30 -1
  4. package/dist/commands/doctor.js.map +1 -1
  5. package/dist/commands/ide.d.ts +2 -1
  6. package/dist/commands/ide.d.ts.map +1 -1
  7. package/dist/commands/ide.js +60 -1
  8. package/dist/commands/ide.js.map +1 -1
  9. package/dist/commands/init-from-service.d.ts +15 -0
  10. package/dist/commands/init-from-service.d.ts.map +1 -0
  11. package/dist/commands/init-from-service.js +541 -0
  12. package/dist/commands/init-from-service.js.map +1 -0
  13. package/dist/commands/init.d.ts +1 -0
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +32 -1
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/kanban.d.ts.map +1 -1
  18. package/dist/commands/kanban.js +13 -4
  19. package/dist/commands/kanban.js.map +1 -1
  20. package/dist/commands/linear.d.ts +41 -0
  21. package/dist/commands/linear.d.ts.map +1 -0
  22. package/dist/commands/linear.js +715 -0
  23. package/dist/commands/linear.js.map +1 -0
  24. package/dist/commands/peter.d.ts.map +1 -1
  25. package/dist/commands/peter.js +232 -25
  26. package/dist/commands/peter.js.map +1 -1
  27. package/dist/commands/services.d.ts.map +1 -1
  28. package/dist/commands/services.js +146 -0
  29. package/dist/commands/services.js.map +1 -1
  30. package/dist/commands/setup.d.ts.map +1 -1
  31. package/dist/commands/setup.js +173 -13
  32. package/dist/commands/setup.js.map +1 -1
  33. package/dist/commands/telemetry-monitor.d.ts +11 -0
  34. package/dist/commands/telemetry-monitor.d.ts.map +1 -0
  35. package/dist/commands/telemetry-monitor.js +224 -0
  36. package/dist/commands/telemetry-monitor.js.map +1 -0
  37. package/dist/commands/telemetry-test.d.ts +11 -0
  38. package/dist/commands/telemetry-test.d.ts.map +1 -0
  39. package/dist/commands/telemetry-test.js +67 -0
  40. package/dist/commands/telemetry-test.js.map +1 -0
  41. package/dist/commands/tenet-agents.d.ts +13 -0
  42. package/dist/commands/tenet-agents.d.ts.map +1 -0
  43. package/dist/commands/tenet-agents.js +191 -0
  44. package/dist/commands/tenet-agents.js.map +1 -0
  45. package/dist/commands/tenet-setup.d.ts +19 -0
  46. package/dist/commands/tenet-setup.d.ts.map +1 -0
  47. package/dist/commands/tenet-setup.js +131 -0
  48. package/dist/commands/tenet-setup.js.map +1 -0
  49. package/dist/commands/train.d.ts +18 -0
  50. package/dist/commands/train.d.ts.map +1 -1
  51. package/dist/commands/train.js +182 -0
  52. package/dist/commands/train.js.map +1 -1
  53. package/dist/commands/whoami.d.ts +2 -0
  54. package/dist/commands/whoami.d.ts.map +1 -0
  55. package/dist/commands/whoami.js +24 -0
  56. package/dist/commands/whoami.js.map +1 -0
  57. package/dist/index.js +159 -10
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/advanced-setup.d.ts +78 -0
  60. package/dist/lib/advanced-setup.d.ts.map +1 -0
  61. package/dist/lib/advanced-setup.js +433 -0
  62. package/dist/lib/advanced-setup.js.map +1 -0
  63. package/dist/lib/agent-config.d.ts +33 -0
  64. package/dist/lib/agent-config.d.ts.map +1 -1
  65. package/dist/lib/agent-config.js +26 -0
  66. package/dist/lib/agent-config.js.map +1 -1
  67. package/dist/lib/counterfactual-training-bridge.d.ts +114 -0
  68. package/dist/lib/counterfactual-training-bridge.d.ts.map +1 -0
  69. package/dist/lib/counterfactual-training-bridge.js +322 -0
  70. package/dist/lib/counterfactual-training-bridge.js.map +1 -0
  71. package/dist/lib/discovery-agent.d.ts +48 -0
  72. package/dist/lib/discovery-agent.d.ts.map +1 -0
  73. package/dist/lib/discovery-agent.js +111 -0
  74. package/dist/lib/discovery-agent.js.map +1 -0
  75. package/dist/lib/flow-engine.d.ts.map +1 -1
  76. package/dist/lib/flow-engine.js +46 -8
  77. package/dist/lib/flow-engine.js.map +1 -1
  78. package/dist/lib/gtm-generator.d.ts +29 -0
  79. package/dist/lib/gtm-generator.d.ts.map +1 -0
  80. package/dist/lib/gtm-generator.js +252 -0
  81. package/dist/lib/gtm-generator.js.map +1 -0
  82. package/dist/lib/hub-health.d.ts +40 -0
  83. package/dist/lib/hub-health.d.ts.map +1 -0
  84. package/dist/lib/hub-health.js +89 -0
  85. package/dist/lib/hub-health.js.map +1 -0
  86. package/dist/lib/invariant-monitor.d.ts +6 -2
  87. package/dist/lib/invariant-monitor.d.ts.map +1 -1
  88. package/dist/lib/invariant-monitor.js +89 -2
  89. package/dist/lib/invariant-monitor.js.map +1 -1
  90. package/dist/lib/journal-analyzer.d.ts +71 -0
  91. package/dist/lib/journal-analyzer.d.ts.map +1 -0
  92. package/dist/lib/journal-analyzer.js +306 -0
  93. package/dist/lib/journal-analyzer.js.map +1 -0
  94. package/dist/lib/linear-client.d.ts +73 -0
  95. package/dist/lib/linear-client.d.ts.map +1 -0
  96. package/dist/lib/linear-client.js +112 -0
  97. package/dist/lib/linear-client.js.map +1 -0
  98. package/dist/lib/linear-id-map.d.ts +20 -0
  99. package/dist/lib/linear-id-map.d.ts.map +1 -0
  100. package/dist/lib/linear-id-map.js +57 -0
  101. package/dist/lib/linear-id-map.js.map +1 -0
  102. package/dist/lib/linear-kanban.d.ts +66 -0
  103. package/dist/lib/linear-kanban.d.ts.map +1 -0
  104. package/dist/lib/linear-kanban.js +175 -0
  105. package/dist/lib/linear-kanban.js.map +1 -0
  106. package/dist/lib/onboarding.d.ts +40 -0
  107. package/dist/lib/onboarding.d.ts.map +1 -0
  108. package/dist/lib/onboarding.js +213 -0
  109. package/dist/lib/onboarding.js.map +1 -0
  110. package/dist/lib/physical-world-model.d.ts +50 -0
  111. package/dist/lib/physical-world-model.d.ts.map +1 -0
  112. package/dist/lib/physical-world-model.js +251 -0
  113. package/dist/lib/physical-world-model.js.map +1 -0
  114. package/dist/lib/planning-loop.d.ts +157 -0
  115. package/dist/lib/planning-loop.d.ts.map +1 -0
  116. package/dist/lib/planning-loop.js +537 -0
  117. package/dist/lib/planning-loop.js.map +1 -0
  118. package/dist/lib/policy-head.d.ts +13 -0
  119. package/dist/lib/policy-head.d.ts.map +1 -1
  120. package/dist/lib/policy-head.js +168 -2
  121. package/dist/lib/policy-head.js.map +1 -1
  122. package/dist/lib/resource-optimizer-middleware.d.ts +39 -0
  123. package/dist/lib/resource-optimizer-middleware.d.ts.map +1 -0
  124. package/dist/lib/resource-optimizer-middleware.js +222 -0
  125. package/dist/lib/resource-optimizer-middleware.js.map +1 -0
  126. package/dist/lib/resource-optimizer.d.ts +71 -0
  127. package/dist/lib/resource-optimizer.d.ts.map +1 -0
  128. package/dist/lib/resource-optimizer.js +228 -0
  129. package/dist/lib/resource-optimizer.js.map +1 -0
  130. package/dist/lib/rl-manager.d.ts +74 -0
  131. package/dist/lib/rl-manager.d.ts.map +1 -0
  132. package/dist/lib/rl-manager.js +244 -0
  133. package/dist/lib/rl-manager.js.map +1 -0
  134. package/dist/lib/service-analyzer.d.ts +76 -0
  135. package/dist/lib/service-analyzer.d.ts.map +1 -0
  136. package/dist/lib/service-analyzer.js +704 -0
  137. package/dist/lib/service-analyzer.js.map +1 -0
  138. package/dist/lib/service-gtm.js +2 -2
  139. package/dist/lib/service-gtm.js.map +1 -1
  140. package/dist/lib/service-questionnaire.d.ts +11 -0
  141. package/dist/lib/service-questionnaire.d.ts.map +1 -0
  142. package/dist/lib/service-questionnaire.js +89 -0
  143. package/dist/lib/service-questionnaire.js.map +1 -0
  144. package/dist/lib/setup/agent-generator.d.ts +2 -0
  145. package/dist/lib/setup/agent-generator.d.ts.map +1 -1
  146. package/dist/lib/setup/agent-generator.js +128 -4
  147. package/dist/lib/setup/agent-generator.js.map +1 -1
  148. package/dist/lib/setup/flow-generator.d.ts +10 -0
  149. package/dist/lib/setup/flow-generator.d.ts.map +1 -0
  150. package/dist/lib/setup/flow-generator.js +113 -0
  151. package/dist/lib/setup/flow-generator.js.map +1 -0
  152. package/dist/lib/setup/invariant-bridge.d.ts +91 -0
  153. package/dist/lib/setup/invariant-bridge.d.ts.map +1 -0
  154. package/dist/lib/setup/invariant-bridge.js +384 -0
  155. package/dist/lib/setup/invariant-bridge.js.map +1 -0
  156. package/dist/lib/setup/spec-generator.d.ts +41 -5
  157. package/dist/lib/setup/spec-generator.d.ts.map +1 -1
  158. package/dist/lib/setup/spec-generator.js +503 -29
  159. package/dist/lib/setup/spec-generator.js.map +1 -1
  160. package/dist/lib/stratus-client.js +1 -1
  161. package/dist/lib/stratus-client.js.map +1 -1
  162. package/dist/lib/surface-agent.d.ts +78 -0
  163. package/dist/lib/surface-agent.d.ts.map +1 -0
  164. package/dist/lib/surface-agent.js +105 -0
  165. package/dist/lib/surface-agent.js.map +1 -0
  166. package/dist/lib/surface-coordination-example.d.ts +30 -0
  167. package/dist/lib/surface-coordination-example.d.ts.map +1 -0
  168. package/dist/lib/surface-coordination-example.js +164 -0
  169. package/dist/lib/surface-coordination-example.js.map +1 -0
  170. package/dist/lib/telemetry/physical-world-collector.d.ts +15 -0
  171. package/dist/lib/telemetry/physical-world-collector.d.ts.map +1 -0
  172. package/dist/lib/telemetry/physical-world-collector.js +177 -0
  173. package/dist/lib/telemetry/physical-world-collector.js.map +1 -0
  174. package/dist/lib/telemetry/training-bridge.d.ts +51 -0
  175. package/dist/lib/telemetry/training-bridge.d.ts.map +1 -0
  176. package/dist/lib/telemetry/training-bridge.js +185 -0
  177. package/dist/lib/telemetry/training-bridge.js.map +1 -0
  178. package/dist/lib/telemetry.d.ts +2 -1
  179. package/dist/lib/telemetry.d.ts.map +1 -1
  180. package/dist/lib/telemetry.js +23 -2
  181. package/dist/lib/telemetry.js.map +1 -1
  182. package/dist/lib/tenet-board-agent.d.ts +52 -0
  183. package/dist/lib/tenet-board-agent.d.ts.map +1 -0
  184. package/dist/lib/tenet-board-agent.js +226 -0
  185. package/dist/lib/tenet-board-agent.js.map +1 -0
  186. package/dist/lib/tenet-ide-agent.d.ts +40 -0
  187. package/dist/lib/tenet-ide-agent.d.ts.map +1 -0
  188. package/dist/lib/tenet-ide-agent.js +199 -0
  189. package/dist/lib/tenet-ide-agent.js.map +1 -0
  190. package/dist/lib/workspace/data-pipeline.d.ts.map +1 -1
  191. package/dist/lib/workspace/data-pipeline.js +27 -5
  192. package/dist/lib/workspace/data-pipeline.js.map +1 -1
  193. package/dist/lib/workspace/sidebar-runner.d.ts +13 -0
  194. package/dist/lib/workspace/sidebar-runner.d.ts.map +1 -0
  195. package/dist/lib/workspace/sidebar-runner.js +419 -0
  196. package/dist/lib/workspace/sidebar-runner.js.map +1 -0
  197. package/dist/lib/workspace/surface-registry.d.ts.map +1 -1
  198. package/dist/lib/workspace/surface-registry.js +4 -1
  199. package/dist/lib/workspace/surface-registry.js.map +1 -1
  200. package/dist/lib/workspace/surfaces/agent-overview.d.ts +3 -3
  201. package/dist/lib/workspace/surfaces/agent-overview.d.ts.map +1 -1
  202. package/dist/lib/workspace/surfaces/agent-overview.js +3 -3
  203. package/dist/lib/workspace/surfaces/agent-overview.js.map +1 -1
  204. package/dist/lib/workspace/surfaces/index.d.ts +3 -0
  205. package/dist/lib/workspace/surfaces/index.d.ts.map +1 -1
  206. package/dist/lib/workspace/surfaces/index.js +3 -0
  207. package/dist/lib/workspace/surfaces/index.js.map +1 -1
  208. package/dist/lib/workspace/surfaces/kanban.d.ts +15 -0
  209. package/dist/lib/workspace/surfaces/kanban.d.ts.map +1 -0
  210. package/dist/lib/workspace/surfaces/kanban.js +43 -0
  211. package/dist/lib/workspace/surfaces/kanban.js.map +1 -0
  212. package/dist/lib/workspace/surfaces/physical-world.d.ts +15 -0
  213. package/dist/lib/workspace/surfaces/physical-world.d.ts.map +1 -0
  214. package/dist/lib/workspace/surfaces/physical-world.js +37 -0
  215. package/dist/lib/workspace/surfaces/physical-world.js.map +1 -0
  216. package/dist/lib/workspace/surfaces/sidebar.d.ts +22 -0
  217. package/dist/lib/workspace/surfaces/sidebar.d.ts.map +1 -0
  218. package/dist/lib/workspace/surfaces/sidebar.js +90 -0
  219. package/dist/lib/workspace/surfaces/sidebar.js.map +1 -0
  220. package/dist/types/flows.d.ts +2 -1
  221. package/dist/types/flows.d.ts.map +1 -1
  222. package/dist/types/physical-world-model.d.ts +65 -0
  223. package/dist/types/physical-world-model.d.ts.map +1 -0
  224. package/dist/types/physical-world-model.js +43 -0
  225. package/dist/types/physical-world-model.js.map +1 -0
  226. package/dist/types/telemetry.d.ts +37 -0
  227. package/dist/types/telemetry.d.ts.map +1 -1
  228. package/dist/types/world-model.d.ts.map +1 -1
  229. package/dist/types/world-model.js +14 -7
  230. package/dist/types/world-model.js.map +1 -1
  231. package/dist/utils/context-hub-port.d.ts.map +1 -1
  232. package/dist/utils/context-hub-port.js +6 -1
  233. package/dist/utils/context-hub-port.js.map +1 -1
  234. package/package.json +3 -2
  235. package/packages/pi/extensions/index.ts +34 -6
  236. package/packages/pi/extensions/onboarding-v1.ts +8 -8
  237. package/packages/pi/extensions/onboarding-v2.ts +5 -5
  238. package/scripts/telemetry-dashboard.sh +44 -0
  239. package/scripts/test-planning-loop-e2e.ts +181 -0
  240. package/scripts/test-server-inference.ts +49 -0
  241. package/scripts/test-state-sensitivity.ts +32 -0
  242. package/scripts/train/v2/benchmark.py +661 -0
  243. package/scripts/train/v2/generate_balanced.py +439 -0
  244. package/scripts/train/v2/generate_hard_negatives.py +219 -0
  245. package/scripts/train/v2/infer.py +149 -36
  246. package/scripts/train/v2/infer_server.py +224 -0
  247. package/scripts/train/v2/online_train.py +576 -0
  248. package/scripts/train/v2/precompute.py +24 -6
  249. package/template/CLAUDE.md +74 -132
@@ -0,0 +1,306 @@
1
+ /**
2
+ * @purpose Analyze project journals to create personalized RL agent recommendations
3
+ *
4
+ * Reads .jfl/journal/, eval data, git patterns to understand actual work patterns
5
+ */
6
+ import { readFileSync, existsSync, readdirSync } from 'fs';
7
+ import { join } from 'path';
8
+ import chalk from 'chalk';
9
+ export class JournalAnalyzer {
10
+ projectRoot;
11
+ jflDir;
12
+ constructor(projectRoot) {
13
+ this.projectRoot = projectRoot;
14
+ this.jflDir = join(projectRoot, '.jfl');
15
+ }
16
+ /**
17
+ * Analyze project patterns to create personalized agent recommendations
18
+ */
19
+ async analyzeForPersonalizedAgents() {
20
+ console.log(chalk.cyan('🔍 ') + 'Analyzing your development patterns...');
21
+ const patterns = await this.extractWorkPatterns();
22
+ const agents = this.createPersonalizedAgents(patterns);
23
+ const insights = this.generateInsights(patterns, agents);
24
+ return { patterns, recommendedAgents: agents, insights };
25
+ }
26
+ /**
27
+ * Extract work patterns from journals and project history
28
+ */
29
+ async extractWorkPatterns() {
30
+ const patterns = [];
31
+ // Analyze journal entries
32
+ if (existsSync(join(this.jflDir, 'journal'))) {
33
+ const journalPatterns = await this.analyzeJournals();
34
+ patterns.push(...journalPatterns);
35
+ }
36
+ // Analyze eval history
37
+ if (existsSync(join(this.jflDir, 'eval.jsonl'))) {
38
+ const evalPatterns = await this.analyzeEvals();
39
+ patterns.push(...evalPatterns);
40
+ }
41
+ // Analyze git workflow
42
+ if (existsSync(join(this.projectRoot, '.git'))) {
43
+ const gitPatterns = await this.analyzeGitWorkflow();
44
+ patterns.push(...gitPatterns);
45
+ }
46
+ // Analyze package.json evolution
47
+ const packagePatterns = await this.analyzePackageEvolution();
48
+ patterns.push(...packagePatterns);
49
+ return patterns.filter(p => p.frequency > 0);
50
+ }
51
+ /**
52
+ * Analyze project journals for work patterns
53
+ */
54
+ async analyzeJournals() {
55
+ const journalDir = join(this.jflDir, 'journal');
56
+ const patterns = [];
57
+ try {
58
+ const files = readdirSync(journalDir).filter(f => f.endsWith('.jsonl'));
59
+ let totalEntries = 0;
60
+ const categories = new Map();
61
+ const examples = new Map();
62
+ for (const file of files.slice(-10)) { // Last 10 files
63
+ const content = readFileSync(join(journalDir, file), 'utf8');
64
+ const lines = content.trim().split('\n').filter(Boolean);
65
+ for (const line of lines) {
66
+ try {
67
+ const entry = JSON.parse(line);
68
+ totalEntries++;
69
+ // Categorize work types
70
+ if (entry.type === 'task' || entry.task) {
71
+ const category = this.categorizeTask(entry.task || entry.description);
72
+ categories.set(category, (categories.get(category) || 0) + 1);
73
+ if (!examples.has(category))
74
+ examples.set(category, []);
75
+ examples.get(category).push(entry.task || entry.description);
76
+ }
77
+ }
78
+ catch {
79
+ continue;
80
+ }
81
+ }
82
+ }
83
+ // Convert to patterns
84
+ for (const [category, count] of categories.entries()) {
85
+ patterns.push({
86
+ category,
87
+ frequency: count / totalEntries,
88
+ examples: examples.get(category)?.slice(0, 3) || [],
89
+ impact: count > totalEntries * 0.3 ? 'high' : count > totalEntries * 0.1 ? 'medium' : 'low',
90
+ optimization_opportunity: this.getOptimizationHint(category, count)
91
+ });
92
+ }
93
+ }
94
+ catch (error) {
95
+ console.warn('Could not analyze journals:', error);
96
+ }
97
+ return patterns;
98
+ }
99
+ /**
100
+ * Analyze eval.jsonl for performance patterns
101
+ */
102
+ async analyzeEvals() {
103
+ const patterns = [];
104
+ try {
105
+ const evalPath = join(this.jflDir, 'eval.jsonl');
106
+ const content = readFileSync(evalPath, 'utf8');
107
+ const evals = content.trim().split('\n').filter(Boolean).map(line => JSON.parse(line));
108
+ // Analyze test patterns
109
+ const testData = evals.filter(e => e.metrics?.test_pass_rate !== undefined);
110
+ if (testData.length > 0) {
111
+ const avgTestRate = testData.reduce((sum, e) => sum + e.metrics.test_pass_rate, 0) / testData.length;
112
+ patterns.push({
113
+ category: 'testing',
114
+ frequency: testData.length / evals.length,
115
+ examples: [`${testData.length} test runs`, `Average pass rate: ${(avgTestRate * 100).toFixed(1)}%`],
116
+ impact: avgTestRate < 0.9 ? 'high' : 'medium',
117
+ optimization_opportunity: avgTestRate < 0.9 ? 'Improve test reliability' : 'Maintain test quality'
118
+ });
119
+ }
120
+ // Analyze performance patterns
121
+ const perfData = evals.filter(e => e.metrics?.performance_score !== undefined);
122
+ if (perfData.length > 0) {
123
+ patterns.push({
124
+ category: 'performance',
125
+ frequency: perfData.length / evals.length,
126
+ examples: [`${perfData.length} performance measurements`],
127
+ impact: 'medium',
128
+ optimization_opportunity: 'Continuous performance monitoring and improvement'
129
+ });
130
+ }
131
+ }
132
+ catch (error) {
133
+ console.warn('Could not analyze evals:', error);
134
+ }
135
+ return patterns;
136
+ }
137
+ /**
138
+ * Analyze git workflow patterns
139
+ */
140
+ async analyzeGitWorkflow() {
141
+ const patterns = [];
142
+ try {
143
+ // This would analyze git logs, commit patterns, branch strategies
144
+ // For now, return basic patterns
145
+ patterns.push({
146
+ category: 'version_control',
147
+ frequency: 1.0,
148
+ examples: ['Git repository detected'],
149
+ impact: 'medium',
150
+ optimization_opportunity: 'Optimize git workflow and branch management'
151
+ });
152
+ }
153
+ catch (error) {
154
+ console.warn('Could not analyze git workflow:', error);
155
+ }
156
+ return patterns;
157
+ }
158
+ /**
159
+ * Analyze package.json evolution
160
+ */
161
+ async analyzePackageEvolution() {
162
+ const patterns = [];
163
+ try {
164
+ const pkgPath = join(this.projectRoot, 'package.json');
165
+ if (existsSync(pkgPath)) {
166
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
167
+ // Analyze dependencies
168
+ const totalDeps = Object.keys(pkg.dependencies || {}).length + Object.keys(pkg.devDependencies || {}).length;
169
+ if (totalDeps > 0) {
170
+ patterns.push({
171
+ category: 'dependency_management',
172
+ frequency: 0.8,
173
+ examples: [`${totalDeps} dependencies`, 'Package.json maintenance'],
174
+ impact: totalDeps > 50 ? 'high' : 'medium',
175
+ optimization_opportunity: totalDeps > 50 ? 'Optimize dependency usage' : 'Monitor dependency health'
176
+ });
177
+ }
178
+ }
179
+ }
180
+ catch (error) {
181
+ console.warn('Could not analyze package evolution:', error);
182
+ }
183
+ return patterns;
184
+ }
185
+ /**
186
+ * Create personalized RL agents based on discovered patterns
187
+ */
188
+ createPersonalizedAgents(patterns) {
189
+ const agents = [];
190
+ for (const pattern of patterns) {
191
+ switch (pattern.category) {
192
+ case 'testing':
193
+ if (pattern.impact === 'high') {
194
+ agents.push({
195
+ name: 'test-reliability-agent',
196
+ purpose: 'Improve test stability and coverage based on your test patterns',
197
+ based_on: pattern.examples,
198
+ metrics_to_optimize: ['test_pass_rate', 'test_coverage', 'test_execution_time'],
199
+ current_baseline: pattern.frequency,
200
+ potential_improvement: '+15-30% test reliability',
201
+ training_data_available: Math.floor(pattern.frequency * 100)
202
+ });
203
+ }
204
+ break;
205
+ case 'performance':
206
+ agents.push({
207
+ name: 'performance-optimizer',
208
+ purpose: 'Optimize performance based on your measurement history',
209
+ based_on: pattern.examples,
210
+ metrics_to_optimize: ['startup_time', 'memory_usage', 'throughput'],
211
+ current_baseline: pattern.frequency,
212
+ potential_improvement: '+10-25% performance',
213
+ training_data_available: Math.floor(pattern.frequency * 50)
214
+ });
215
+ break;
216
+ case 'bug_fixes':
217
+ if (pattern.frequency > 0.2) {
218
+ agents.push({
219
+ name: 'bug-prevention-agent',
220
+ purpose: 'Reduce bugs based on your historical bug patterns',
221
+ based_on: pattern.examples,
222
+ metrics_to_optimize: ['bug_rate', 'error_frequency', 'stability_score'],
223
+ current_baseline: pattern.frequency,
224
+ potential_improvement: '+40-60% bug reduction',
225
+ training_data_available: Math.floor(pattern.frequency * 30)
226
+ });
227
+ }
228
+ break;
229
+ case 'feature_development':
230
+ agents.push({
231
+ name: 'feature-velocity-agent',
232
+ purpose: 'Accelerate feature development based on your work patterns',
233
+ based_on: pattern.examples,
234
+ metrics_to_optimize: ['feature_completion_time', 'code_quality', 'review_speed'],
235
+ current_baseline: pattern.frequency,
236
+ potential_improvement: '+20-35% development speed',
237
+ training_data_available: Math.floor(pattern.frequency * 40)
238
+ });
239
+ break;
240
+ }
241
+ }
242
+ return agents;
243
+ }
244
+ /**
245
+ * Generate insights about the user's work patterns
246
+ */
247
+ generateInsights(patterns, agents) {
248
+ const insights = [];
249
+ const highImpactPatterns = patterns.filter(p => p.impact === 'high');
250
+ if (highImpactPatterns.length > 0) {
251
+ insights.push(`You spend significant time on: ${highImpactPatterns.map(p => p.category).join(', ')}`);
252
+ }
253
+ const totalOptimization = agents.reduce((sum, agent) => {
254
+ const improvement = agent.potential_improvement.match(/(\d+)-(\d+)%/);
255
+ return sum + (improvement ? parseInt(improvement[2]) : 0);
256
+ }, 0);
257
+ if (totalOptimization > 0) {
258
+ insights.push(`Potential cumulative improvement: ${totalOptimization}% across all areas`);
259
+ }
260
+ const dataAvailable = agents.reduce((sum, agent) => sum + agent.training_data_available, 0);
261
+ if (dataAvailable > 100) {
262
+ insights.push(`Strong training data available (${dataAvailable} data points) for immediate optimization`);
263
+ }
264
+ else {
265
+ insights.push(`Building training data - agents will improve as you continue developing`);
266
+ }
267
+ return insights;
268
+ }
269
+ /**
270
+ * Categorize work tasks from journal entries
271
+ */
272
+ categorizeTask(task) {
273
+ const taskLower = task.toLowerCase();
274
+ if (taskLower.includes('test') || taskLower.includes('spec'))
275
+ return 'testing';
276
+ if (taskLower.includes('bug') || taskLower.includes('fix') || taskLower.includes('error'))
277
+ return 'bug_fixes';
278
+ if (taskLower.includes('performance') || taskLower.includes('optimize') || taskLower.includes('speed'))
279
+ return 'performance';
280
+ if (taskLower.includes('feature') || taskLower.includes('implement') || taskLower.includes('add'))
281
+ return 'feature_development';
282
+ if (taskLower.includes('refactor') || taskLower.includes('clean') || taskLower.includes('improve'))
283
+ return 'code_quality';
284
+ if (taskLower.includes('deploy') || taskLower.includes('ci') || taskLower.includes('build'))
285
+ return 'infrastructure';
286
+ if (taskLower.includes('doc') || taskLower.includes('readme') || taskLower.includes('comment'))
287
+ return 'documentation';
288
+ return 'general_development';
289
+ }
290
+ /**
291
+ * Get optimization hint based on category and frequency
292
+ */
293
+ getOptimizationHint(category, frequency) {
294
+ const hints = {
295
+ 'testing': frequency > 20 ? 'High test activity - optimize test performance' : 'Improve test automation',
296
+ 'bug_fixes': 'Pattern-based bug prevention opportunities detected',
297
+ 'performance': 'Performance optimization potential identified',
298
+ 'feature_development': 'Feature velocity improvement opportunities',
299
+ 'code_quality': 'Code quality automation potential',
300
+ 'infrastructure': 'CI/CD optimization opportunities',
301
+ 'documentation': 'Documentation automation potential'
302
+ };
303
+ return hints[category] || 'General development optimization opportunities';
304
+ }
305
+ }
306
+ //# sourceMappingURL=journal-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-analyzer.js","sourceRoot":"","sources":["../../src/lib/journal-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Linear Client Wrapper
3
+ *
4
+ * Typed helpers around the @linear/sdk LinearClient.
5
+ * Keeps API calls centralized and testable.
6
+ *
7
+ * @purpose Wrapper for Linear API — auth, teams, projects, issues
8
+ */
9
+ import { LinearClient } from "@linear/sdk";
10
+ export type { LinearClient };
11
+ export declare function getLinearClient(apiKey: string): LinearClient;
12
+ export interface LinearTeam {
13
+ id: string;
14
+ name: string;
15
+ key: string;
16
+ }
17
+ export interface LinearProject {
18
+ id: string;
19
+ name: string;
20
+ description?: string;
21
+ }
22
+ export interface LinearState {
23
+ id: string;
24
+ name: string;
25
+ type: string;
26
+ color: string;
27
+ position: number;
28
+ }
29
+ export interface LinearIssue {
30
+ id: string;
31
+ identifier: string;
32
+ title: string;
33
+ description?: string;
34
+ priority: number;
35
+ state: LinearState;
36
+ assignee?: {
37
+ id: string;
38
+ name: string;
39
+ email: string;
40
+ };
41
+ labels: Array<{
42
+ id: string;
43
+ name: string;
44
+ color: string;
45
+ }>;
46
+ url: string;
47
+ createdAt: string;
48
+ updatedAt: string;
49
+ }
50
+ export declare function getLinearTeams(client: LinearClient): Promise<LinearTeam[]>;
51
+ export declare function getLinearProjects(client: LinearClient, teamId: string): Promise<LinearProject[]>;
52
+ export declare function getTeamStates(client: LinearClient, teamId: string): Promise<LinearState[]>;
53
+ export declare function getLinearIssue(client: LinearClient, issueId: string): Promise<LinearIssue | null>;
54
+ export declare function getProjectIssues(client: LinearClient, projectId: string): Promise<LinearIssue[]>;
55
+ export interface CreateIssueInput {
56
+ title: string;
57
+ description?: string;
58
+ teamId: string;
59
+ projectId?: string;
60
+ stateId?: string;
61
+ priority?: number;
62
+ labelIds?: string[];
63
+ assigneeId?: string;
64
+ }
65
+ export declare function createLinearIssue(client: LinearClient, opts: CreateIssueInput): Promise<LinearIssue | null>;
66
+ export interface UpdateIssueInput {
67
+ title?: string;
68
+ description?: string;
69
+ stateId?: string;
70
+ priority?: number;
71
+ }
72
+ export declare function updateLinearIssue(client: LinearClient, issueId: string, opts: UpdateIssueInput): Promise<boolean>;
73
+ //# sourceMappingURL=linear-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-client.d.ts","sourceRoot":"","sources":["../../src/lib/linear-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Linear Client Wrapper
3
+ *
4
+ * Typed helpers around the @linear/sdk LinearClient.
5
+ * Keeps API calls centralized and testable.
6
+ *
7
+ * @purpose Wrapper for Linear API — auth, teams, projects, issues
8
+ */
9
+ import { LinearClient } from "@linear/sdk";
10
+ export function getLinearClient(apiKey) {
11
+ return new LinearClient({ apiKey });
12
+ }
13
+ export async function getLinearTeams(client) {
14
+ const result = await client.teams();
15
+ return result.nodes.map(t => ({
16
+ id: t.id,
17
+ name: t.name,
18
+ key: t.key,
19
+ }));
20
+ }
21
+ export async function getLinearProjects(client, teamId) {
22
+ const team = await client.team(teamId);
23
+ const projects = await team.projects();
24
+ return projects.nodes.map(p => ({
25
+ id: p.id,
26
+ name: p.name,
27
+ description: p.description ?? undefined,
28
+ }));
29
+ }
30
+ export async function getTeamStates(client, teamId) {
31
+ const result = await client.workflowStates({
32
+ filter: { team: { id: { eq: teamId } } },
33
+ });
34
+ return result.nodes.map(s => ({
35
+ id: s.id,
36
+ name: s.name,
37
+ type: s.type,
38
+ color: s.color,
39
+ position: s.position,
40
+ }));
41
+ }
42
+ export async function getLinearIssue(client, issueId) {
43
+ try {
44
+ const issue = await client.issue(issueId);
45
+ return normalizeIssue(issue);
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ export async function getProjectIssues(client, projectId) {
52
+ const result = await client.issues({
53
+ filter: { project: { id: { eq: projectId } } },
54
+ });
55
+ const issues = await Promise.all(result.nodes.map(normalizeIssue));
56
+ return issues.filter((i) => i !== null);
57
+ }
58
+ export async function createLinearIssue(client, opts) {
59
+ const result = await client.createIssue({
60
+ title: opts.title,
61
+ description: opts.description,
62
+ teamId: opts.teamId,
63
+ projectId: opts.projectId,
64
+ stateId: opts.stateId,
65
+ priority: opts.priority,
66
+ labelIds: opts.labelIds,
67
+ assigneeId: opts.assigneeId,
68
+ });
69
+ if (!result.success)
70
+ return null;
71
+ const issue = await result.issue;
72
+ if (!issue)
73
+ return null;
74
+ return normalizeIssue(issue);
75
+ }
76
+ export async function updateLinearIssue(client, issueId, opts) {
77
+ const result = await client.updateIssue(issueId, opts);
78
+ return result.success;
79
+ }
80
+ async function normalizeIssue(issue) {
81
+ const state = await issue.state;
82
+ const assignee = await issue.assignee;
83
+ const labels = await issue.labels();
84
+ return {
85
+ id: issue.id,
86
+ identifier: issue.identifier,
87
+ title: issue.title,
88
+ description: issue.description ?? undefined,
89
+ priority: issue.priority ?? 0,
90
+ state: {
91
+ id: state?.id ?? "",
92
+ name: state?.name ?? "Backlog",
93
+ type: state?.type ?? "backlog",
94
+ color: state?.color ?? "#888888",
95
+ position: state?.position ?? 0,
96
+ },
97
+ assignee: assignee ? {
98
+ id: assignee.id,
99
+ name: assignee.name,
100
+ email: assignee.email,
101
+ } : undefined,
102
+ labels: labels?.nodes?.map((l) => ({
103
+ id: l.id,
104
+ name: l.name,
105
+ color: l.color,
106
+ })) ?? [],
107
+ url: issue.url,
108
+ createdAt: issue.createdAt?.toISOString() ?? new Date().toISOString(),
109
+ updatedAt: issue.updatedAt?.toISOString() ?? new Date().toISOString(),
110
+ };
111
+ }
112
+ //# sourceMappingURL=linear-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-client.js","sourceRoot":"","sources":["../../src/lib/linear-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Linear ID Map — Bidirectional Mapping Store
3
+ *
4
+ * Persists GitHub issue number ↔ Linear issue ID mappings
5
+ * in .jfl/linear-map.json. No database required for Phase 1.
6
+ *
7
+ * @purpose Bidirectional ID mapping between GitHub Issues and Linear Issues
8
+ */
9
+ export interface LinearMap {
10
+ projectId: string;
11
+ teamId: string;
12
+ mappings: Record<number, string>;
13
+ }
14
+ export declare function readMap(projectRoot: string): LinearMap;
15
+ export declare function writeMap(projectRoot: string, map: LinearMap): void;
16
+ export declare function getLinearId(projectRoot: string, githubNumber: number): string | undefined;
17
+ export declare function getGithubNumber(projectRoot: string, linearId: string): number | undefined;
18
+ export declare function addMapping(projectRoot: string, githubNumber: number, linearId: string): void;
19
+ export declare function removeMapping(projectRoot: string, githubNumber: number): void;
20
+ //# sourceMappingURL=linear-id-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-id-map.d.ts","sourceRoot":"","sources":["../../src/lib/linear-id-map.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAWD,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAWtD;AAED,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAKlE;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzF;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIzF;AAED,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,IAAI,CAIN;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAI7E"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Linear ID Map — Bidirectional Mapping Store
3
+ *
4
+ * Persists GitHub issue number ↔ Linear issue ID mappings
5
+ * in .jfl/linear-map.json. No database required for Phase 1.
6
+ *
7
+ * @purpose Bidirectional ID mapping between GitHub Issues and Linear Issues
8
+ */
9
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
10
+ import { join } from "path";
11
+ function mapPath(projectRoot, dataDir = ".jfl") {
12
+ return join(projectRoot, dataDir, "linear-map.json");
13
+ }
14
+ function detectDataDir(projectRoot) {
15
+ if (existsSync(join(projectRoot, ".tenet", "config.json")))
16
+ return ".tenet";
17
+ return ".jfl";
18
+ }
19
+ export function readMap(projectRoot) {
20
+ const dataDir = detectDataDir(projectRoot);
21
+ const path = mapPath(projectRoot, dataDir);
22
+ if (!existsSync(path)) {
23
+ return { projectId: "", teamId: "", mappings: {} };
24
+ }
25
+ try {
26
+ return JSON.parse(readFileSync(path, "utf-8"));
27
+ }
28
+ catch {
29
+ return { projectId: "", teamId: "", mappings: {} };
30
+ }
31
+ }
32
+ export function writeMap(projectRoot, map) {
33
+ const dataDir = detectDataDir(projectRoot);
34
+ const dir = join(projectRoot, dataDir);
35
+ if (!existsSync(dir))
36
+ mkdirSync(dir, { recursive: true });
37
+ writeFileSync(mapPath(projectRoot, dataDir), JSON.stringify(map, null, 2) + "\n");
38
+ }
39
+ export function getLinearId(projectRoot, githubNumber) {
40
+ return readMap(projectRoot).mappings[githubNumber];
41
+ }
42
+ export function getGithubNumber(projectRoot, linearId) {
43
+ const map = readMap(projectRoot);
44
+ const entry = Object.entries(map.mappings).find(([, lid]) => lid === linearId);
45
+ return entry ? parseInt(entry[0]) : undefined;
46
+ }
47
+ export function addMapping(projectRoot, githubNumber, linearId) {
48
+ const map = readMap(projectRoot);
49
+ map.mappings[githubNumber] = linearId;
50
+ writeMap(projectRoot, map);
51
+ }
52
+ export function removeMapping(projectRoot, githubNumber) {
53
+ const map = readMap(projectRoot);
54
+ delete map.mappings[githubNumber];
55
+ writeMap(projectRoot, map);
56
+ }
57
+ //# sourceMappingURL=linear-id-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-id-map.js","sourceRoot":"","sources":["../../src/lib/linear-id-map.ts"],"names":[],"mappings":"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"}