jfl 0.1.0 → 0.2.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 (262) hide show
  1. package/README.md +443 -145
  2. package/clawdbot-plugin/clawdbot.plugin.json +20 -0
  3. package/clawdbot-plugin/index.js +555 -0
  4. package/clawdbot-plugin/index.ts +582 -0
  5. package/clawdbot-skill/SKILL.md +33 -336
  6. package/clawdbot-skill/index.ts +491 -321
  7. package/clawdbot-skill/skill.json +4 -13
  8. package/dist/commands/clawdbot.d.ts +11 -0
  9. package/dist/commands/clawdbot.d.ts.map +1 -0
  10. package/dist/commands/clawdbot.js +215 -0
  11. package/dist/commands/clawdbot.js.map +1 -0
  12. package/dist/commands/context-hub.d.ts +5 -0
  13. package/dist/commands/context-hub.d.ts.map +1 -1
  14. package/dist/commands/context-hub.js +394 -28
  15. package/dist/commands/context-hub.js.map +1 -1
  16. package/dist/commands/gtm-process-update.d.ts +10 -0
  17. package/dist/commands/gtm-process-update.d.ts.map +1 -0
  18. package/dist/commands/gtm-process-update.js +101 -0
  19. package/dist/commands/gtm-process-update.js.map +1 -0
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +278 -4
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/login.d.ts.map +1 -1
  24. package/dist/commands/login.js +32 -33
  25. package/dist/commands/login.js.map +1 -1
  26. package/dist/commands/memory.d.ts +38 -0
  27. package/dist/commands/memory.d.ts.map +1 -0
  28. package/dist/commands/memory.js +229 -0
  29. package/dist/commands/memory.js.map +1 -0
  30. package/dist/commands/migrate-services.d.ts +8 -0
  31. package/dist/commands/migrate-services.d.ts.map +1 -0
  32. package/dist/commands/migrate-services.js +182 -0
  33. package/dist/commands/migrate-services.js.map +1 -0
  34. package/dist/commands/onboard.d.ts +24 -0
  35. package/dist/commands/onboard.d.ts.map +1 -0
  36. package/dist/commands/onboard.js +663 -0
  37. package/dist/commands/onboard.js.map +1 -0
  38. package/dist/commands/openclaw.d.ts +56 -0
  39. package/dist/commands/openclaw.d.ts.map +1 -0
  40. package/dist/commands/openclaw.js +700 -0
  41. package/dist/commands/openclaw.js.map +1 -0
  42. package/dist/commands/orchestrate.d.ts +14 -0
  43. package/dist/commands/orchestrate.d.ts.map +1 -0
  44. package/dist/commands/orchestrate.js +270 -0
  45. package/dist/commands/orchestrate.js.map +1 -0
  46. package/dist/commands/profile.d.ts +46 -0
  47. package/dist/commands/profile.d.ts.map +1 -0
  48. package/dist/commands/profile.js +498 -0
  49. package/dist/commands/profile.js.map +1 -0
  50. package/dist/commands/repair.d.ts.map +1 -1
  51. package/dist/commands/repair.js +37 -0
  52. package/dist/commands/repair.js.map +1 -1
  53. package/dist/commands/service-agent.d.ts +16 -0
  54. package/dist/commands/service-agent.d.ts.map +1 -0
  55. package/dist/commands/service-agent.js +375 -0
  56. package/dist/commands/service-agent.js.map +1 -0
  57. package/dist/commands/service-manager.d.ts +12 -0
  58. package/dist/commands/service-manager.d.ts.map +1 -0
  59. package/dist/commands/service-manager.js +967 -0
  60. package/dist/commands/service-manager.js.map +1 -0
  61. package/dist/commands/service-validate.d.ts +12 -0
  62. package/dist/commands/service-validate.d.ts.map +1 -0
  63. package/dist/commands/service-validate.js +611 -0
  64. package/dist/commands/service-validate.js.map +1 -0
  65. package/dist/commands/services-create.d.ts +15 -0
  66. package/dist/commands/services-create.d.ts.map +1 -0
  67. package/dist/commands/services-create.js +1452 -0
  68. package/dist/commands/services-create.js.map +1 -0
  69. package/dist/commands/services-scan.d.ts +13 -0
  70. package/dist/commands/services-scan.d.ts.map +1 -0
  71. package/dist/commands/services-scan.js +251 -0
  72. package/dist/commands/services-scan.js.map +1 -0
  73. package/dist/commands/services-sync-agents.d.ts +23 -0
  74. package/dist/commands/services-sync-agents.d.ts.map +1 -0
  75. package/dist/commands/services-sync-agents.js +207 -0
  76. package/dist/commands/services-sync-agents.js.map +1 -0
  77. package/dist/commands/services.d.ts +19 -0
  78. package/dist/commands/services.d.ts.map +1 -0
  79. package/dist/commands/services.js +742 -0
  80. package/dist/commands/services.js.map +1 -0
  81. package/dist/commands/session.d.ts +5 -1
  82. package/dist/commands/session.d.ts.map +1 -1
  83. package/dist/commands/session.js +68 -586
  84. package/dist/commands/session.js.map +1 -1
  85. package/dist/commands/status.d.ts.map +1 -1
  86. package/dist/commands/status.js +17 -0
  87. package/dist/commands/status.js.map +1 -1
  88. package/dist/commands/update.d.ts.map +1 -1
  89. package/dist/commands/update.js +75 -21
  90. package/dist/commands/update.js.map +1 -1
  91. package/dist/commands/validate-settings.d.ts +37 -0
  92. package/dist/commands/validate-settings.d.ts.map +1 -0
  93. package/dist/commands/validate-settings.js +197 -0
  94. package/dist/commands/validate-settings.js.map +1 -0
  95. package/dist/commands/voice.d.ts +0 -1
  96. package/dist/commands/voice.d.ts.map +1 -1
  97. package/dist/commands/voice.js +16 -15
  98. package/dist/commands/voice.js.map +1 -1
  99. package/dist/index.js +395 -141
  100. package/dist/index.js.map +1 -1
  101. package/dist/lib/agent-generator.d.ts +26 -0
  102. package/dist/lib/agent-generator.d.ts.map +1 -0
  103. package/dist/lib/agent-generator.js +331 -0
  104. package/dist/lib/agent-generator.js.map +1 -0
  105. package/dist/lib/memory-db.d.ts +102 -0
  106. package/dist/lib/memory-db.d.ts.map +1 -0
  107. package/dist/lib/memory-db.js +313 -0
  108. package/dist/lib/memory-db.js.map +1 -0
  109. package/dist/lib/memory-indexer.d.ts +47 -0
  110. package/dist/lib/memory-indexer.d.ts.map +1 -0
  111. package/dist/lib/memory-indexer.js +215 -0
  112. package/dist/lib/memory-indexer.js.map +1 -0
  113. package/dist/lib/memory-search.d.ts +41 -0
  114. package/dist/lib/memory-search.d.ts.map +1 -0
  115. package/dist/lib/memory-search.js +246 -0
  116. package/dist/lib/memory-search.js.map +1 -0
  117. package/dist/lib/openclaw-registry.d.ts +48 -0
  118. package/dist/lib/openclaw-registry.d.ts.map +1 -0
  119. package/dist/lib/openclaw-registry.js +181 -0
  120. package/dist/lib/openclaw-registry.js.map +1 -0
  121. package/dist/lib/openclaw-sdk.d.ts +107 -0
  122. package/dist/lib/openclaw-sdk.d.ts.map +1 -0
  123. package/dist/lib/openclaw-sdk.js +208 -0
  124. package/dist/lib/openclaw-sdk.js.map +1 -0
  125. package/dist/lib/peer-agent-generator.d.ts +44 -0
  126. package/dist/lib/peer-agent-generator.d.ts.map +1 -0
  127. package/dist/lib/peer-agent-generator.js +286 -0
  128. package/dist/lib/peer-agent-generator.js.map +1 -0
  129. package/dist/lib/service-dependencies.d.ts +44 -0
  130. package/dist/lib/service-dependencies.d.ts.map +1 -0
  131. package/dist/lib/service-dependencies.js +314 -0
  132. package/dist/lib/service-dependencies.js.map +1 -0
  133. package/dist/lib/service-detector.d.ts +61 -0
  134. package/dist/lib/service-detector.d.ts.map +1 -0
  135. package/dist/lib/service-detector.js +521 -0
  136. package/dist/lib/service-detector.js.map +1 -0
  137. package/dist/lib/service-gtm.d.ts +157 -0
  138. package/dist/lib/service-gtm.d.ts.map +1 -0
  139. package/dist/lib/service-gtm.js +786 -0
  140. package/dist/lib/service-gtm.js.map +1 -0
  141. package/dist/lib/service-mcp-base.d.ts +103 -0
  142. package/dist/lib/service-mcp-base.d.ts.map +1 -0
  143. package/dist/lib/service-mcp-base.js +263 -0
  144. package/dist/lib/service-mcp-base.js.map +1 -0
  145. package/dist/lib/service-utils.d.ts +103 -0
  146. package/dist/lib/service-utils.d.ts.map +1 -0
  147. package/dist/lib/service-utils.js +368 -0
  148. package/dist/lib/service-utils.js.map +1 -0
  149. package/dist/lib/skill-generator.d.ts +21 -0
  150. package/dist/lib/skill-generator.d.ts.map +1 -0
  151. package/dist/lib/skill-generator.js +253 -0
  152. package/dist/lib/skill-generator.js.map +1 -0
  153. package/dist/lib/stratus-client.d.ts +100 -0
  154. package/dist/lib/stratus-client.d.ts.map +1 -0
  155. package/dist/lib/stratus-client.js +255 -0
  156. package/dist/lib/stratus-client.js.map +1 -0
  157. package/dist/mcp/context-hub-mcp.js +135 -53
  158. package/dist/mcp/context-hub-mcp.js.map +1 -1
  159. package/dist/mcp/service-mcp-server.d.ts +12 -0
  160. package/dist/mcp/service-mcp-server.d.ts.map +1 -0
  161. package/dist/mcp/service-mcp-server.js +434 -0
  162. package/dist/mcp/service-mcp-server.js.map +1 -0
  163. package/dist/mcp/service-peer-mcp.d.ts +36 -0
  164. package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
  165. package/dist/mcp/service-peer-mcp.js +220 -0
  166. package/dist/mcp/service-peer-mcp.js.map +1 -0
  167. package/dist/mcp/service-registry-mcp.d.ts +13 -0
  168. package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
  169. package/dist/mcp/service-registry-mcp.js +330 -0
  170. package/dist/mcp/service-registry-mcp.js.map +1 -0
  171. package/dist/ui/banner.js +1 -1
  172. package/dist/ui/banner.js.map +1 -1
  173. package/dist/ui/context-hub-logs.d.ts +10 -0
  174. package/dist/ui/context-hub-logs.d.ts.map +1 -0
  175. package/dist/ui/context-hub-logs.js +175 -0
  176. package/dist/ui/context-hub-logs.js.map +1 -0
  177. package/dist/ui/service-dashboard.d.ts +11 -0
  178. package/dist/ui/service-dashboard.d.ts.map +1 -0
  179. package/dist/ui/service-dashboard.js +357 -0
  180. package/dist/ui/service-dashboard.js.map +1 -0
  181. package/dist/ui/services-manager.d.ts +11 -0
  182. package/dist/ui/services-manager.d.ts.map +1 -0
  183. package/dist/ui/services-manager.js +507 -0
  184. package/dist/ui/services-manager.js.map +1 -0
  185. package/dist/utils/auth-guard.d.ts.map +1 -1
  186. package/dist/utils/auth-guard.js +8 -9
  187. package/dist/utils/auth-guard.js.map +1 -1
  188. package/dist/utils/claude-md-generator.d.ts +10 -0
  189. package/dist/utils/claude-md-generator.d.ts.map +1 -0
  190. package/dist/utils/claude-md-generator.js +215 -0
  191. package/dist/utils/claude-md-generator.js.map +1 -0
  192. package/dist/utils/ensure-context-hub.d.ts +20 -0
  193. package/dist/utils/ensure-context-hub.d.ts.map +1 -0
  194. package/dist/utils/ensure-context-hub.js +65 -0
  195. package/dist/utils/ensure-context-hub.js.map +1 -0
  196. package/dist/utils/ensure-project.d.ts.map +1 -1
  197. package/dist/utils/ensure-project.js +3 -4
  198. package/dist/utils/ensure-project.js.map +1 -1
  199. package/dist/utils/jfl-config.d.ts +19 -0
  200. package/dist/utils/jfl-config.d.ts.map +1 -0
  201. package/dist/utils/jfl-config.js +112 -0
  202. package/dist/utils/jfl-config.js.map +1 -0
  203. package/dist/utils/jfl-migration.d.ts +29 -0
  204. package/dist/utils/jfl-migration.d.ts.map +1 -0
  205. package/dist/utils/jfl-migration.js +142 -0
  206. package/dist/utils/jfl-migration.js.map +1 -0
  207. package/dist/utils/jfl-paths.d.ts +55 -0
  208. package/dist/utils/jfl-paths.d.ts.map +1 -0
  209. package/dist/utils/jfl-paths.js +120 -0
  210. package/dist/utils/jfl-paths.js.map +1 -0
  211. package/dist/utils/settings-validator.d.ts +73 -0
  212. package/dist/utils/settings-validator.d.ts.map +1 -0
  213. package/dist/utils/settings-validator.js +222 -0
  214. package/dist/utils/settings-validator.js.map +1 -0
  215. package/package.json +19 -3
  216. package/scripts/commit-gtm.sh +56 -0
  217. package/scripts/commit-product.sh +68 -0
  218. package/scripts/context-query.sh +45 -0
  219. package/scripts/session/auto-commit.sh +297 -0
  220. package/scripts/session/jfl-doctor.sh +707 -0
  221. package/scripts/session/session-cleanup.sh +268 -0
  222. package/scripts/session/session-end.sh +198 -0
  223. package/scripts/session/session-init.sh +350 -0
  224. package/scripts/session/session-init.sh.backup +292 -0
  225. package/scripts/session/session-sync.sh +167 -0
  226. package/scripts/session/test-context-preservation.sh +160 -0
  227. package/scripts/session/test-critical-infrastructure.sh +293 -0
  228. package/scripts/session/test-experience-level.sh +336 -0
  229. package/scripts/session/test-session-cleanup.sh +268 -0
  230. package/scripts/session/test-session-sync.sh +320 -0
  231. package/scripts/voice-start.sh +36 -8
  232. package/scripts/where-am-i.sh +78 -0
  233. package/template/.claude/service-settings.json +32 -0
  234. package/template/.claude/settings.json +14 -1
  235. package/template/.claude/skills/end/SKILL.md +1780 -0
  236. package/template/.jfl/config.json +2 -1
  237. package/template/CLAUDE.md +1039 -134
  238. package/template/CLAUDE.md.bak +1187 -0
  239. package/template/scripts/commit-gtm.sh +56 -0
  240. package/template/scripts/commit-product.sh +68 -0
  241. package/template/scripts/migrate-to-branch-sessions.sh +201 -0
  242. package/template/scripts/session/auto-commit.sh +58 -6
  243. package/template/scripts/session/jfl-doctor.sh +137 -17
  244. package/template/scripts/session/session-cleanup.sh +268 -0
  245. package/template/scripts/session/session-end.sh +4 -0
  246. package/template/scripts/session/session-init.sh +253 -66
  247. package/template/scripts/session/test-critical-infrastructure.sh +293 -0
  248. package/template/scripts/session/test-experience-level.sh +336 -0
  249. package/template/scripts/session/test-session-cleanup.sh +268 -0
  250. package/template/scripts/session/test-session-sync.sh +320 -0
  251. package/template/scripts/where-am-i.sh +78 -0
  252. package/template/templates/service-agent/.claude/settings.json +32 -0
  253. package/template/templates/service-agent/CLAUDE.md +334 -0
  254. package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
  255. package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
  256. package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
  257. package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
  258. package/dist/commands/session-mgmt.d.ts +0 -33
  259. package/dist/commands/session-mgmt.d.ts.map +0 -1
  260. package/dist/commands/session-mgmt.js +0 -404
  261. package/dist/commands/session-mgmt.js.map +0 -1
  262. package/template/scripts/session/auto-merge.sh +0 -325
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Stratus X1 Reasoning API Client
3
+ *
4
+ * Provides reasoning-based analysis and synthesis capabilities
5
+ * for Context Hub journal entries and project documentation.
6
+ *
7
+ * @purpose Client for calling Stratus X1 reasoning API to synthesize context
8
+ */
9
+ interface StratusResponse {
10
+ id: string;
11
+ object: string;
12
+ created: number;
13
+ model: string;
14
+ choices: Array<{
15
+ index: number;
16
+ message: {
17
+ role: string;
18
+ content: string;
19
+ };
20
+ finish_reason: string;
21
+ }>;
22
+ usage?: {
23
+ prompt_tokens: number;
24
+ completion_tokens: number;
25
+ total_tokens: number;
26
+ };
27
+ stratus?: {
28
+ model: string;
29
+ execution_llm: string;
30
+ confidence: number;
31
+ planning_time_ms: number;
32
+ execution_time_ms: number;
33
+ };
34
+ }
35
+ interface JournalEntry {
36
+ v?: number;
37
+ ts?: string;
38
+ session?: string;
39
+ type?: string;
40
+ status?: string;
41
+ title?: string;
42
+ summary?: string;
43
+ detail?: string;
44
+ files?: string[];
45
+ decision?: string;
46
+ incomplete?: string[];
47
+ next?: string;
48
+ learned?: string[];
49
+ }
50
+ interface SynthesisResult {
51
+ summary: string;
52
+ decisions: Array<{
53
+ decision: string;
54
+ rationale: string;
55
+ }>;
56
+ problemsSolved: Array<{
57
+ problem: string;
58
+ solution: string;
59
+ }>;
60
+ incompleteItems: string[];
61
+ nextSteps: string[];
62
+ rawResponse: string;
63
+ confidence?: number;
64
+ executionTime?: number;
65
+ }
66
+ export declare class StratusClient {
67
+ private baseUrl;
68
+ private apiKey;
69
+ private model;
70
+ private timeout;
71
+ constructor(options?: {
72
+ baseUrl?: string;
73
+ apiKey?: string;
74
+ model?: string;
75
+ timeout?: number;
76
+ });
77
+ /**
78
+ * Call Stratus reasoning API with a prompt
79
+ */
80
+ reason(prompt: string, options?: {
81
+ temperature?: number;
82
+ maxTokens?: number;
83
+ }): Promise<StratusResponse>;
84
+ /**
85
+ * Synthesize journal entries into structured summary
86
+ */
87
+ synthesizeJournalEntries(entries: JournalEntry[], options?: {
88
+ focus?: "decisions" | "problems" | "progress" | "all";
89
+ }): Promise<SynthesisResult>;
90
+ /**
91
+ * Parse Stratus response into structured format
92
+ */
93
+ private parseStructuredSummary;
94
+ /**
95
+ * Format synthesis result as human-readable text
96
+ */
97
+ formatSynthesis(synthesis: SynthesisResult): string;
98
+ }
99
+ export {};
100
+ //# sourceMappingURL=stratus-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stratus-client.d.ts","sourceRoot":"","sources":["../../src/lib/stratus-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Stratus X1 Reasoning API Client
3
+ *
4
+ * Provides reasoning-based analysis and synthesis capabilities
5
+ * for Context Hub journal entries and project documentation.
6
+ *
7
+ * @purpose Client for calling Stratus X1 reasoning API to synthesize context
8
+ */
9
+ // ============================================================================
10
+ // Stratus Client
11
+ // ============================================================================
12
+ export class StratusClient {
13
+ baseUrl;
14
+ apiKey;
15
+ model;
16
+ timeout;
17
+ constructor(options = {}) {
18
+ this.baseUrl = options.baseUrl || process.env.STRATUS_API_URL || "http://212.115.124.137:8000";
19
+ this.apiKey = options.apiKey || process.env.STRATUS_API_KEY || "";
20
+ this.model = options.model || "stratus-x1ac-base-claude-sonnet-4";
21
+ this.timeout = options.timeout || 30000; // 30 seconds default
22
+ }
23
+ /**
24
+ * Call Stratus reasoning API with a prompt
25
+ */
26
+ async reason(prompt, options = {}) {
27
+ const controller = new AbortController();
28
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
29
+ try {
30
+ const request = {
31
+ model: this.model,
32
+ messages: [{ role: "user", content: prompt }],
33
+ temperature: options.temperature ?? 0.7,
34
+ max_tokens: options.maxTokens ?? 2000
35
+ };
36
+ const headers = {
37
+ "Content-Type": "application/json"
38
+ };
39
+ if (this.apiKey) {
40
+ headers["Authorization"] = `Bearer ${this.apiKey}`;
41
+ }
42
+ const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
43
+ method: "POST",
44
+ headers,
45
+ body: JSON.stringify(request),
46
+ signal: controller.signal
47
+ });
48
+ if (!response.ok) {
49
+ const errorText = await response.text();
50
+ throw new Error(`Stratus API error (${response.status}): ${errorText}`);
51
+ }
52
+ return await response.json();
53
+ }
54
+ catch (error) {
55
+ if (error.name === "AbortError") {
56
+ throw new Error(`Stratus request timed out after ${this.timeout}ms`);
57
+ }
58
+ throw error;
59
+ }
60
+ finally {
61
+ clearTimeout(timeoutId);
62
+ }
63
+ }
64
+ /**
65
+ * Synthesize journal entries into structured summary
66
+ */
67
+ async synthesizeJournalEntries(entries, options = {}) {
68
+ const focus = options.focus || "all";
69
+ // Build focused prompt based on what user wants
70
+ const focusInstructions = {
71
+ decisions: "Focus on key decisions made, including the options considered and rationale for each choice.",
72
+ problems: "Focus on problems encountered and how they were solved, including root causes and learnings.",
73
+ progress: "Focus on what was accomplished, current status, and momentum toward goals.",
74
+ all: "Provide a comprehensive analysis covering decisions, problems solved, progress made, and next steps."
75
+ };
76
+ const prompt = `Analyze these journal entries from a software project.
77
+
78
+ Journal Entries:
79
+ ${JSON.stringify(entries, null, 2)}
80
+
81
+ ${focusInstructions[focus]}
82
+
83
+ Provide a structured summary in the following format:
84
+
85
+ ## Summary
86
+ {2-3 sentence overview of what happened}
87
+
88
+ ## Key Decisions Made
89
+ {List decisions with brief rationale - format: "Decision: Rationale"}
90
+
91
+ ## Problems Solved
92
+ {List problems and their solutions - format: "Problem: Solution"}
93
+
94
+ ## Incomplete Items
95
+ {List what's stubbed, planned, or not yet done}
96
+
97
+ ## Next Steps
98
+ {What should happen next}
99
+
100
+ Be concise but specific. Cite entry timestamps when referencing specific work.`;
101
+ const startTime = Date.now();
102
+ const response = await this.reason(prompt, {
103
+ temperature: 0.7,
104
+ maxTokens: 2000
105
+ });
106
+ const executionTime = Date.now() - startTime;
107
+ const content = response.choices[0]?.message?.content || "";
108
+ // Parse structured response
109
+ const synthesis = this.parseStructuredSummary(content);
110
+ return {
111
+ ...synthesis,
112
+ rawResponse: content,
113
+ confidence: response.stratus?.confidence,
114
+ executionTime
115
+ };
116
+ }
117
+ /**
118
+ * Parse Stratus response into structured format
119
+ */
120
+ parseStructuredSummary(content) {
121
+ const result = {
122
+ summary: "",
123
+ decisions: [],
124
+ problemsSolved: [],
125
+ incompleteItems: [],
126
+ nextSteps: []
127
+ };
128
+ // Extract summary
129
+ const summaryMatch = content.match(/## Summary\s*\n([\s\S]*?)(?=\n##|$)/i);
130
+ if (summaryMatch) {
131
+ result.summary = summaryMatch[1].trim();
132
+ }
133
+ // Extract decisions
134
+ const decisionsMatch = content.match(/## Key Decisions Made\s*\n([\s\S]*?)(?=\n##|$)/i);
135
+ if (decisionsMatch) {
136
+ const decisionsText = decisionsMatch[1].trim();
137
+ const lines = decisionsText.split('\n').filter(l => l.trim());
138
+ for (const line of lines) {
139
+ const match = line.match(/[-*]\s*(.+?):\s*(.+)/);
140
+ if (match) {
141
+ result.decisions.push({
142
+ decision: match[1].trim(),
143
+ rationale: match[2].trim()
144
+ });
145
+ }
146
+ else if (line.startsWith('-') || line.startsWith('*')) {
147
+ // Fallback for lines without clear separator
148
+ const text = line.replace(/^[-*]\s*/, '').trim();
149
+ result.decisions.push({
150
+ decision: text,
151
+ rationale: ""
152
+ });
153
+ }
154
+ }
155
+ }
156
+ // Extract problems solved
157
+ const problemsMatch = content.match(/## Problems Solved\s*\n([\s\S]*?)(?=\n##|$)/i);
158
+ if (problemsMatch) {
159
+ const problemsText = problemsMatch[1].trim();
160
+ const lines = problemsText.split('\n').filter(l => l.trim());
161
+ for (const line of lines) {
162
+ const match = line.match(/[-*]\s*(.+?):\s*(.+)/);
163
+ if (match) {
164
+ result.problemsSolved.push({
165
+ problem: match[1].trim(),
166
+ solution: match[2].trim()
167
+ });
168
+ }
169
+ else if (line.startsWith('-') || line.startsWith('*')) {
170
+ const text = line.replace(/^[-*]\s*/, '').trim();
171
+ result.problemsSolved.push({
172
+ problem: text,
173
+ solution: ""
174
+ });
175
+ }
176
+ }
177
+ }
178
+ // Extract incomplete items
179
+ const incompleteMatch = content.match(/## Incomplete Items\s*\n([\s\S]*?)(?=\n##|$)/i);
180
+ if (incompleteMatch) {
181
+ const incompleteText = incompleteMatch[1].trim();
182
+ result.incompleteItems = incompleteText
183
+ .split('\n')
184
+ .filter(l => l.trim())
185
+ .map(l => l.replace(/^[-*]\s*/, '').trim());
186
+ }
187
+ // Extract next steps
188
+ const nextStepsMatch = content.match(/## Next Steps\s*\n([\s\S]*?)(?=\n##|$)/i);
189
+ if (nextStepsMatch) {
190
+ const nextStepsText = nextStepsMatch[1].trim();
191
+ result.nextSteps = nextStepsText
192
+ .split('\n')
193
+ .filter(l => l.trim())
194
+ .map(l => l.replace(/^[-*]\s*/, '').trim());
195
+ }
196
+ return result;
197
+ }
198
+ /**
199
+ * Format synthesis result as human-readable text
200
+ */
201
+ formatSynthesis(synthesis) {
202
+ const lines = [];
203
+ lines.push("# Context Synthesis\n");
204
+ if (synthesis.summary) {
205
+ lines.push(synthesis.summary);
206
+ lines.push("");
207
+ }
208
+ if (synthesis.decisions.length > 0) {
209
+ lines.push("## Key Decisions");
210
+ for (const { decision, rationale } of synthesis.decisions) {
211
+ if (rationale) {
212
+ lines.push(`- **${decision}**: ${rationale}`);
213
+ }
214
+ else {
215
+ lines.push(`- ${decision}`);
216
+ }
217
+ }
218
+ lines.push("");
219
+ }
220
+ if (synthesis.problemsSolved.length > 0) {
221
+ lines.push("## Problems Solved");
222
+ for (const { problem, solution } of synthesis.problemsSolved) {
223
+ if (solution) {
224
+ lines.push(`- **${problem}**: ${solution}`);
225
+ }
226
+ else {
227
+ lines.push(`- ${problem}`);
228
+ }
229
+ }
230
+ lines.push("");
231
+ }
232
+ if (synthesis.incompleteItems.length > 0) {
233
+ lines.push("## Incomplete Items");
234
+ for (const item of synthesis.incompleteItems) {
235
+ lines.push(`- ${item}`);
236
+ }
237
+ lines.push("");
238
+ }
239
+ if (synthesis.nextSteps.length > 0) {
240
+ lines.push("## Next Steps");
241
+ for (const step of synthesis.nextSteps) {
242
+ lines.push(`- ${step}`);
243
+ }
244
+ lines.push("");
245
+ }
246
+ if (synthesis.confidence !== undefined) {
247
+ lines.push(`_Confidence: ${(synthesis.confidence * 100).toFixed(0)}%_`);
248
+ }
249
+ if (synthesis.executionTime !== undefined) {
250
+ lines.push(`_Analysis time: ${(synthesis.executionTime / 1000).toFixed(1)}s_`);
251
+ }
252
+ return lines.join("\n");
253
+ }
254
+ }
255
+ //# sourceMappingURL=stratus-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stratus-client.js","sourceRoot":"","sources":["../../src/lib/stratus-client.ts"],"names":[],"mappings":"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"}
@@ -83,7 +83,7 @@ const TOOLS = [
83
83
  },
84
84
  {
85
85
  name: "context_sessions",
86
- description: "See activity from other sessions/worktrees (informational only).",
86
+ description: "See activity from other sessions (informational only).",
87
87
  inputSchema: {
88
88
  type: "object",
89
89
  properties: {
@@ -93,6 +93,64 @@ const TOOLS = [
93
93
  }
94
94
  }
95
95
  }
96
+ },
97
+ {
98
+ name: "memory_search",
99
+ description: "Search through indexed journal entries and memories. Finds relevant past work, decisions, and learnings across all sessions.",
100
+ inputSchema: {
101
+ type: "object",
102
+ properties: {
103
+ query: {
104
+ type: "string",
105
+ description: "Search query (e.g., 'what did we decide about pricing?')"
106
+ },
107
+ type: {
108
+ type: "string",
109
+ enum: ["feature", "fix", "decision", "discovery", "milestone", "all"],
110
+ description: "Filter by entry type (optional)"
111
+ },
112
+ maxItems: {
113
+ type: "number",
114
+ description: "Maximum results to return (default: 10)"
115
+ },
116
+ since: {
117
+ type: "string",
118
+ description: "ISO date - only return entries after this date (optional)"
119
+ }
120
+ },
121
+ required: ["query"]
122
+ }
123
+ },
124
+ {
125
+ name: "memory_add",
126
+ description: "Manually add a memory or note. Useful for capturing insights not in journal.",
127
+ inputSchema: {
128
+ type: "object",
129
+ properties: {
130
+ title: {
131
+ type: "string",
132
+ description: "Short title for the memory"
133
+ },
134
+ content: {
135
+ type: "string",
136
+ description: "Full content/description"
137
+ },
138
+ tags: {
139
+ type: "array",
140
+ items: { type: "string" },
141
+ description: "Tags for categorization (optional)"
142
+ }
143
+ },
144
+ required: ["title", "content"]
145
+ }
146
+ },
147
+ {
148
+ name: "memory_status",
149
+ description: "Get memory system statistics and health.",
150
+ inputSchema: {
151
+ type: "object",
152
+ properties: {}
153
+ }
96
154
  }
97
155
  ];
98
156
  async function callContextHub(endpoint, body) {
@@ -151,6 +209,37 @@ function formatContextItems(items) {
151
209
  }
152
210
  return sections.join("\n\n");
153
211
  }
212
+ function formatMemoryResults(results) {
213
+ if (results.length === 0) {
214
+ return "No memories found.";
215
+ }
216
+ const items = results.map((result, index) => {
217
+ const { memory, score, relevance } = result;
218
+ // Format relevance badge
219
+ const relevanceBadge = relevance === 'high' ? '●' : relevance === 'medium' ? '◐' : '○';
220
+ // Format type
221
+ const type = memory.type || 'unknown';
222
+ // Format date
223
+ const date = new Date(memory.created_at).toISOString().split('T')[0];
224
+ // Extract files from metadata
225
+ let files = '';
226
+ if (memory.metadata) {
227
+ try {
228
+ const metadata = JSON.parse(memory.metadata);
229
+ if (metadata.files && metadata.files.length > 0) {
230
+ files = `\n Files: ${metadata.files.slice(0, 3).join(', ')}${metadata.files.length > 3 ? '...' : ''}`;
231
+ }
232
+ }
233
+ catch {
234
+ // Ignore parse errors
235
+ }
236
+ }
237
+ return `${index + 1}. [${type}] ${memory.title}
238
+ ${date} | ${relevanceBadge} Relevance: ${score.toFixed(2)}
239
+ ${memory.summary || memory.content.slice(0, 150)}${files}`;
240
+ }).join('\n\n');
241
+ return `Found ${results.length} ${results.length === 1 ? 'memory' : 'memories'}:\n\n${items}`;
242
+ }
154
243
  function findRepoRoot() {
155
244
  let dir = process.cwd();
156
245
  const root = path.parse(dir).root;
@@ -223,25 +312,25 @@ function getSessionsActivity(hours) {
223
312
  const currentBranch = execSync('git branch --show-current', { cwd: repoRoot, encoding: 'utf-8' }).trim();
224
313
  const sessions = [];
225
314
  try {
226
- // Get all worktrees
227
- const worktreeOutput = execSync('git worktree list --porcelain', { cwd: repoRoot, encoding: 'utf-8' });
228
- const worktrees = parseWorktrees(worktreeOutput);
315
+ // Get all session branches
316
+ const branchOutput = execSync('git branch --list "session-*"', { cwd: repoRoot, encoding: 'utf-8' });
317
+ const branches = branchOutput.split('\n')
318
+ .map(b => b.trim().replace(/^\*\s+/, ''))
319
+ .filter(b => b.startsWith('session-'));
229
320
  // Get journal directory (should be in main repo)
230
321
  const journalDir = path.join(repoRoot, '.jfl', 'journal');
231
- for (const wt of worktrees) {
232
- if (!wt.branch.startsWith('session-'))
233
- continue;
322
+ for (const branch of branches) {
234
323
  const session = {
235
- name: wt.branch,
236
- path: wt.path,
237
- branch: wt.branch,
238
- isActive: checkIfActive(wt.path),
239
- recentCommits: getRecentCommits(repoRoot, wt.branch, 3),
324
+ name: branch,
325
+ path: repoRoot, // All sessions work in main repo now
326
+ branch: branch,
327
+ isActive: branch === currentBranch, // Active if it's the current branch
328
+ recentCommits: getRecentCommits(repoRoot, branch, 3),
240
329
  journalSummary: '',
241
330
  workingOn: ''
242
331
  };
243
332
  // Read journal for this session
244
- const journalFile = path.join(journalDir, `${wt.branch}.jsonl`);
333
+ const journalFile = path.join(journalDir, `${branch}.jsonl`);
245
334
  if (fs.existsSync(journalFile)) {
246
335
  const entries = readJournalEntries(journalFile, hours);
247
336
  if (entries.length > 0) {
@@ -311,46 +400,7 @@ function getSessionsActivity(hours) {
311
400
  }
312
401
  return lines.join('\n');
313
402
  }
314
- function parseWorktrees(output) {
315
- const worktrees = [];
316
- const lines = output.split('\n');
317
- let currentPath = '';
318
- for (const line of lines) {
319
- if (line.startsWith('worktree ')) {
320
- currentPath = line.substring(9);
321
- }
322
- else if (line.startsWith('branch refs/heads/')) {
323
- const branch = line.substring(18);
324
- if (currentPath) {
325
- worktrees.push({ path: currentPath, branch });
326
- }
327
- }
328
- }
329
- return worktrees;
330
- }
331
- function checkIfActive(worktreePath) {
332
- // Check for auto-commit PID
333
- const pidFile = path.join(worktreePath, '.jfl', 'auto-commit.pid');
334
- if (fs.existsSync(pidFile)) {
335
- try {
336
- const pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
337
- if (pid > 0) {
338
- // Check if process is running
339
- try {
340
- process.kill(pid, 0); // Doesn't kill, just checks if it exists
341
- return true;
342
- }
343
- catch {
344
- // Process not running
345
- }
346
- }
347
- }
348
- catch {
349
- // Ignore read errors
350
- }
351
- }
352
- return false;
353
- }
403
+ // Removed parseWorktrees and checkIfActive functions - no longer needed since we use branches instead of worktrees
354
404
  function getRecentCommits(repoRoot, branch, count) {
355
405
  try {
356
406
  const output = execSync(`git log --oneline -${count} "${branch}" 2>/dev/null`, { cwd: repoRoot, encoding: 'utf-8' });
@@ -431,6 +481,38 @@ async function handleToolCall(name, args) {
431
481
  case "context_sessions": {
432
482
  return getSessionsActivity(args.hours || 24);
433
483
  }
484
+ case "memory_search": {
485
+ if (!args.query) {
486
+ throw new Error("query is required");
487
+ }
488
+ const result = await callContextHub("/api/memory/search", {
489
+ query: args.query,
490
+ type: args.type,
491
+ maxItems: args.maxItems || 10,
492
+ since: args.since
493
+ });
494
+ return formatMemoryResults(result.results);
495
+ }
496
+ case "memory_add": {
497
+ if (!args.title || !args.content) {
498
+ throw new Error("title and content are required");
499
+ }
500
+ const result = await callContextHub("/api/memory/add", {
501
+ title: args.title,
502
+ content: args.content,
503
+ tags: args.tags || []
504
+ });
505
+ return `Memory added successfully (ID: ${result.id})`;
506
+ }
507
+ case "memory_status": {
508
+ const result = await callContextHub("/api/memory/status");
509
+ return `Memory System Status:
510
+ - Total memories: ${result.total_memories}
511
+ - By type: ${Object.entries(result.by_type).map(([k, v]) => `${k}(${v})`).join(', ')}
512
+ - Date range: ${result.date_range.earliest ? new Date(result.date_range.earliest).toISOString().split('T')[0] : 'N/A'} to ${result.date_range.latest ? new Date(result.date_range.latest).toISOString().split('T')[0] : 'N/A'}
513
+ - Embeddings: ${result.embeddings.available ? `✓ ${result.embeddings.count} indexed` : '✗ Not available'}
514
+ - Last index: ${result.last_index ? new Date(result.last_index).toISOString() : 'N/A'}`;
515
+ }
434
516
  default:
435
517
  throw new Error(`Unknown tool: ${name}`);
436
518
  }