@amoree-code/ocean 0.0.0-stage → 1.1.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 (304) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +284 -2
  3. package/dist/application/auth/auth-orchestrator.js +77 -0
  4. package/dist/application/clients/clients.js +646 -0
  5. package/dist/application/clients/editors.js +398 -0
  6. package/dist/application/clients/hooks.js +335 -0
  7. package/dist/application/clients/native.js +410 -0
  8. package/dist/application/clients/opencode-plugin.js +158 -0
  9. package/dist/application/clients/registry.js +188 -0
  10. package/dist/application/gateway/webhook-gateway.js +137 -0
  11. package/dist/application/install/provider-installer.js +184 -0
  12. package/dist/application/integrations/charter-copies.js +76 -0
  13. package/dist/application/integrations/claude-vscode.js +106 -0
  14. package/dist/application/integrations/engine-entry-repair.js +105 -0
  15. package/dist/application/integrations/skill-filter.js +254 -0
  16. package/dist/application/layout/layout-apply.js +443 -0
  17. package/dist/application/layout/layout-plan.js +236 -0
  18. package/dist/application/layout/workspace-template.js +34 -0
  19. package/dist/application/onboarding/state.js +23 -0
  20. package/dist/application/onboarding/steps.js +249 -0
  21. package/dist/application/profiles/profile-distribution.js +53 -0
  22. package/dist/application/profiles/profile-suggestion.js +39 -0
  23. package/dist/application/profiles/profile-upgrade-service.js +208 -0
  24. package/dist/application/pull/history-index.js +476 -0
  25. package/dist/application/pull/project-match.js +132 -0
  26. package/dist/application/pull/pull.js +202 -0
  27. package/dist/application/pull/server-capture.js +307 -0
  28. package/dist/application/scheduler/local-scheduler.js +210 -0
  29. package/dist/composition/runtime.js +64 -0
  30. package/dist/engine-root.js +9 -0
  31. package/dist/infrastructure/filesystem/profile-loader.js +46 -0
  32. package/dist/infrastructure/filesystem/runtime-config-loader.js +29 -0
  33. package/dist/infrastructure/filesystem/skill-loader.js +84 -0
  34. package/dist/infrastructure/filesystem/workspace-capability.js +37 -0
  35. package/dist/infrastructure/observability/runtime-logger.js +16 -0
  36. package/dist/infrastructure/process/agent-tool-executor.js +99 -0
  37. package/dist/infrastructure/process/cli-process.js +49 -0
  38. package/dist/infrastructure/process/interactive-process.js +145 -0
  39. package/dist/infrastructure/process/process-supervisor.js +194 -0
  40. package/dist/infrastructure/process/service.js +252 -0
  41. package/dist/infrastructure/providers/browser-provider.js +2 -0
  42. package/dist/infrastructure/providers/claude-sdk.js +137 -0
  43. package/dist/infrastructure/providers/client-home.js +14 -0
  44. package/dist/infrastructure/providers/fake-browser-provider.js +146 -0
  45. package/dist/infrastructure/providers/ollama-embedder.js +74 -0
  46. package/dist/infrastructure/providers/openai-compatible.js +268 -0
  47. package/dist/infrastructure/providers/playwright-browser-provider.js +380 -0
  48. package/dist/infrastructure/providers/provider-capabilities.js +50 -0
  49. package/dist/infrastructure/providers/provider-invocation.js +184 -0
  50. package/dist/infrastructure/providers/provider-registry.js +77 -0
  51. package/dist/infrastructure/providers/providers.js +134 -0
  52. package/dist/infrastructure/wrappers/wrapper-manager.js +374 -0
  53. package/dist/interfaces/cli/auth-command.js +54 -0
  54. package/dist/interfaces/cli/browser-bridge-command.js +93 -0
  55. package/dist/interfaces/cli/browser-command.js +119 -0
  56. package/dist/interfaces/cli/capture-command.js +125 -0
  57. package/dist/interfaces/cli/client-test-command.js +133 -0
  58. package/dist/interfaces/cli/clients-command.js +129 -0
  59. package/dist/interfaces/cli/command-registry.js +1211 -0
  60. package/dist/interfaces/cli/context-command.js +172 -0
  61. package/dist/interfaces/cli/daily-command.js +131 -0
  62. package/dist/interfaces/cli/governance-command.js +55 -0
  63. package/dist/interfaces/cli/handoff-command.js +35 -0
  64. package/dist/interfaces/cli/help-command.js +207 -0
  65. package/dist/interfaces/cli/idea-command.js +47 -0
  66. package/dist/interfaces/cli/intercept-command.js +317 -0
  67. package/dist/interfaces/cli/layout-command.js +27 -0
  68. package/dist/interfaces/cli/market-command.js +52 -0
  69. package/dist/interfaces/cli/mcp-gateway-command.js +30 -0
  70. package/dist/interfaces/cli/memory-command.js +317 -0
  71. package/dist/interfaces/cli/migrate-command.js +26 -0
  72. package/dist/interfaces/cli/observe-command.js +78 -0
  73. package/dist/interfaces/cli/onboard-command.js +123 -0
  74. package/dist/interfaces/cli/operate-command.js +59 -0
  75. package/dist/interfaces/cli/profiles-command.js +70 -0
  76. package/dist/interfaces/cli/pull-command.js +54 -0
  77. package/dist/interfaces/cli/setup-command.js +143 -0
  78. package/dist/interfaces/cli/tasks-command.js +249 -0
  79. package/dist/main.js +49 -0
  80. package/dist/node-warnings.js +17 -0
  81. package/dist/version.js +8 -0
  82. package/market/mcp/chrome-devtools/ocean.capability.json +28 -0
  83. package/market/mcp/gateway/ocean.capability.json +21 -0
  84. package/market/mcp/obsidian/ocean.capability.json +21 -0
  85. package/market/mcp/ocean/ocean.capability.json +21 -0
  86. package/market/mcp/playwright/ocean.capability.json +23 -0
  87. package/node_modules/@ocean/brain/dist/brain/brain-eval.js +29 -0
  88. package/node_modules/@ocean/brain/dist/brain/brain-markdown.js +226 -0
  89. package/node_modules/@ocean/brain/dist/brain/brain-reindex.js +247 -0
  90. package/node_modules/@ocean/brain/dist/brain/brain-service.js +320 -0
  91. package/node_modules/@ocean/brain/dist/capture/inbox-sync.js +22 -0
  92. package/node_modules/@ocean/brain/dist/evidence/verification-report.js +13 -0
  93. package/node_modules/@ocean/brain/dist/infrastructure/brain/brain-index.js +285 -0
  94. package/node_modules/@ocean/brain/dist/memory/brain-dump.js +145 -0
  95. package/node_modules/@ocean/brain/dist/memory/daily-narrative.js +142 -0
  96. package/node_modules/@ocean/brain/dist/memory/index-sync.js +124 -0
  97. package/node_modules/@ocean/brain/dist/memory/lesson-activation.js +93 -0
  98. package/node_modules/@ocean/brain/dist/memory/lesson-learning.js +188 -0
  99. package/node_modules/@ocean/brain/dist/memory/lessons.js +321 -0
  100. package/node_modules/@ocean/brain/dist/memory/memory-audit.js +100 -0
  101. package/node_modules/@ocean/brain/dist/memory/memory-digest.js +49 -0
  102. package/node_modules/@ocean/brain/dist/memory/memory-harvest.js +345 -0
  103. package/node_modules/@ocean/brain/dist/memory/memory-paths.js +174 -0
  104. package/node_modules/@ocean/brain/dist/memory/memory-review.js +278 -0
  105. package/node_modules/@ocean/brain/dist/memory/memory-trash.js +152 -0
  106. package/node_modules/@ocean/brain/dist/memory/memory-write.js +216 -0
  107. package/node_modules/@ocean/brain/dist/memory/model-narrative.js +129 -0
  108. package/node_modules/@ocean/brain/dist/memory/profile-facts.js +103 -0
  109. package/node_modules/@ocean/brain/dist/memory/session-promotion.js +61 -0
  110. package/node_modules/@ocean/brain/dist/memory/session-summary.js +113 -0
  111. package/node_modules/@ocean/brain/dist/memory/signal-detection.js +66 -0
  112. package/node_modules/@ocean/brain/package.json +11 -0
  113. package/node_modules/@ocean/context/dist/context/context-compression.js +66 -0
  114. package/node_modules/@ocean/context/dist/context/context-cost.js +587 -0
  115. package/node_modules/@ocean/context/dist/context/context-ladder.js +363 -0
  116. package/node_modules/@ocean/context/dist/context/context-packet.js +213 -0
  117. package/node_modules/@ocean/context/dist/context/context-references.js +255 -0
  118. package/node_modules/@ocean/context/dist/context/intent-router.js +259 -0
  119. package/node_modules/@ocean/context/dist/context/resource-injection.js +36 -0
  120. package/node_modules/@ocean/context/package.json +11 -0
  121. package/node_modules/@ocean/core/dist/domain/brain/brain-record.js +22 -0
  122. package/node_modules/@ocean/core/dist/domain/brain/record-scope.js +22 -0
  123. package/node_modules/@ocean/core/dist/domain/capabilities/browser-contract.js +64 -0
  124. package/node_modules/@ocean/core/dist/domain/capabilities/capability-contract.js +16 -0
  125. package/node_modules/@ocean/core/dist/domain/capabilities/capability-manifest.js +72 -0
  126. package/node_modules/@ocean/core/dist/domain/context/context-validator.js +5 -0
  127. package/node_modules/@ocean/core/dist/domain/context/context.js +34 -0
  128. package/node_modules/@ocean/core/dist/domain/context/project-id.js +30 -0
  129. package/node_modules/@ocean/core/dist/domain/evidence/evidence.js +16 -0
  130. package/node_modules/@ocean/core/dist/domain/mcp/mcp-contract.js +36 -0
  131. package/node_modules/@ocean/core/dist/domain/mcp/memory-contract.js +41 -0
  132. package/node_modules/@ocean/core/dist/domain/ports/brain-index-port.js +7 -0
  133. package/node_modules/@ocean/core/dist/domain/ports/browser-port.js +8 -0
  134. package/node_modules/@ocean/core/dist/domain/ports/embedder-port.js +2 -0
  135. package/node_modules/@ocean/core/dist/domain/ports/platform-ports.js +2 -0
  136. package/node_modules/@ocean/core/dist/domain/ports/runtime-ports.js +2 -0
  137. package/node_modules/@ocean/core/dist/domain/ports/session-store-port.js +2 -0
  138. package/node_modules/@ocean/core/dist/domain/process/process-events.js +5 -0
  139. package/node_modules/@ocean/core/dist/domain/profiles/profile-distribution.js +19 -0
  140. package/node_modules/@ocean/core/dist/domain/profiles/profile-policy.js +34 -0
  141. package/node_modules/@ocean/core/dist/domain/profiles/profile-selection.js +73 -0
  142. package/node_modules/@ocean/core/dist/domain/profiles/profile-upgrade.js +123 -0
  143. package/node_modules/@ocean/core/dist/domain/profiles/profile-validator.js +5 -0
  144. package/node_modules/@ocean/core/dist/domain/profiles/profile.js +218 -0
  145. package/node_modules/@ocean/core/dist/domain/profiles/runtime-config.js +30 -0
  146. package/node_modules/@ocean/core/dist/domain/providers/provider-capability.js +28 -0
  147. package/node_modules/@ocean/core/dist/domain/providers/provider.js +2 -0
  148. package/node_modules/@ocean/core/dist/domain/redaction/redaction.js +86 -0
  149. package/node_modules/@ocean/core/dist/domain/runs/agent-tools.js +92 -0
  150. package/node_modules/@ocean/core/dist/domain/runs/execution-plan.js +71 -0
  151. package/node_modules/@ocean/core/dist/domain/runs/run-contract.js +38 -0
  152. package/node_modules/@ocean/core/dist/domain/sessions/entry-contract.js +31 -0
  153. package/node_modules/@ocean/core/dist/domain/sessions/handoff.js +78 -0
  154. package/node_modules/@ocean/core/dist/domain/sessions/session.js +58 -0
  155. package/node_modules/@ocean/core/dist/domain/skills/default-skills.js +29 -0
  156. package/node_modules/@ocean/core/dist/domain/skills/skill-validator.js +5 -0
  157. package/node_modules/@ocean/core/dist/domain/skills/skill.js +11 -0
  158. package/node_modules/@ocean/core/dist/domain/tasks/task-id.js +85 -0
  159. package/node_modules/@ocean/core/dist/shared/fs-utils.js +212 -0
  160. package/node_modules/@ocean/core/dist/shared/local-date.js +16 -0
  161. package/node_modules/@ocean/core/dist/shared/paths.js +324 -0
  162. package/node_modules/@ocean/core/dist/shared/project-resolution.js +1065 -0
  163. package/node_modules/@ocean/core/dist/shared/task-reference.js +133 -0
  164. package/node_modules/@ocean/core/package.json +14 -0
  165. package/node_modules/@ocean/loop/dist/handoff/handoff-service.js +133 -0
  166. package/node_modules/@ocean/loop/dist/hooks/lifecycle-hooks.js +15 -0
  167. package/node_modules/@ocean/loop/dist/hooks/session-end-hook.js +183 -0
  168. package/node_modules/@ocean/loop/dist/hooks/session-start-hook.js +237 -0
  169. package/node_modules/@ocean/loop/dist/infrastructure/persistence/session-store.js +690 -0
  170. package/node_modules/@ocean/loop/dist/infrastructure/persistence/session-validator.js +5 -0
  171. package/node_modules/@ocean/loop/dist/loops/iteration-graph.js +147 -0
  172. package/node_modules/@ocean/loop/dist/loops/task-loop-record.js +2 -0
  173. package/node_modules/@ocean/loop/dist/loops/task-loop.js +281 -0
  174. package/node_modules/@ocean/loop/dist/operations/memory-knowledge-operations.js +263 -0
  175. package/node_modules/@ocean/loop/dist/operations/operation-contract.js +227 -0
  176. package/node_modules/@ocean/loop/dist/operations/operation-scope.js +28 -0
  177. package/node_modules/@ocean/loop/dist/operations/project-operations.js +93 -0
  178. package/node_modules/@ocean/loop/dist/operations/record-io.js +65 -0
  179. package/node_modules/@ocean/loop/dist/operations/record-operations.js +45 -0
  180. package/node_modules/@ocean/loop/dist/operations/task-linker.js +40 -0
  181. package/node_modules/@ocean/loop/dist/operations/task-operations.js +279 -0
  182. package/node_modules/@ocean/loop/dist/operations/write-guard.js +157 -0
  183. package/node_modules/@ocean/loop/dist/runs/prompt-assembly.js +112 -0
  184. package/node_modules/@ocean/loop/dist/runs/run-agent.js +425 -0
  185. package/node_modules/@ocean/loop/dist/runs/run-authorization.js +24 -0
  186. package/node_modules/@ocean/loop/dist/runs/tool-loop.js +173 -0
  187. package/node_modules/@ocean/loop/dist/sessions/session-closeout.js +150 -0
  188. package/node_modules/@ocean/loop/dist/sessions/session-pointer.js +133 -0
  189. package/node_modules/@ocean/loop/dist/sessions/session-projects.js +26 -0
  190. package/node_modules/@ocean/loop/dist/sessions/session-retention.js +132 -0
  191. package/node_modules/@ocean/loop/dist/tasks/archive-tasks.js +210 -0
  192. package/node_modules/@ocean/loop/dist/tasks/checkpoint-task.js +31 -0
  193. package/node_modules/@ocean/loop/dist/tasks/claim-task.js +126 -0
  194. package/node_modules/@ocean/loop/dist/tasks/list-tasks.js +113 -0
  195. package/node_modules/@ocean/loop/dist/tasks/new-task.js +42 -0
  196. package/node_modules/@ocean/loop/dist/tasks/renumber-tasks.js +134 -0
  197. package/node_modules/@ocean/loop/dist/tasks/verification-readiness.js +78 -0
  198. package/node_modules/@ocean/loop/dist/tasks/verify-task.js +234 -0
  199. package/node_modules/@ocean/loop/package.json +11 -0
  200. package/node_modules/@ocean/market/dist/adapters/mcp-adapter.js +64 -0
  201. package/node_modules/@ocean/market/dist/adapters/owned-directory.js +89 -0
  202. package/node_modules/@ocean/market/dist/adapters/plugin-adapter.js +39 -0
  203. package/node_modules/@ocean/market/dist/adapters/skill-adapter.js +32 -0
  204. package/node_modules/@ocean/market/dist/capability/adapter.js +2 -0
  205. package/node_modules/@ocean/market/dist/capability/catalog.js +63 -0
  206. package/node_modules/@ocean/market/dist/capability/content-digest.js +40 -0
  207. package/node_modules/@ocean/market/dist/capability/registry.js +81 -0
  208. package/node_modules/@ocean/market/dist/install/default-marketplace.js +47 -0
  209. package/node_modules/@ocean/market/dist/install/lock.js +34 -0
  210. package/node_modules/@ocean/market/dist/install/marketplace-service.js +165 -0
  211. package/node_modules/@ocean/market/dist/mcp/browser-bridge.js +263 -0
  212. package/node_modules/@ocean/market/dist/mcp/mcp-connection.js +67 -0
  213. package/node_modules/@ocean/market/dist/mcp/mcp-gateway.js +317 -0
  214. package/node_modules/@ocean/market/dist/mcp/mcp-launch.js +102 -0
  215. package/node_modules/@ocean/market/dist/mcp/mcp-runner.js +32 -0
  216. package/node_modules/@ocean/market/dist/security/description-scan.js +45 -0
  217. package/node_modules/@ocean/market/dist/security/permissions.js +57 -0
  218. package/node_modules/@ocean/market/dist/security/sandbox.js +74 -0
  219. package/node_modules/@ocean/market/dist/skills/core-skill-sync.js +113 -0
  220. package/node_modules/@ocean/market/dist/skills/signal-detection.js +84 -0
  221. package/node_modules/@ocean/market/dist/skills/skill-curation.js +123 -0
  222. package/node_modules/@ocean/market/dist/skills/skill-hub.js +220 -0
  223. package/node_modules/@ocean/market/dist/skills/task-observer.js +165 -0
  224. package/node_modules/@ocean/market/package.json +11 -0
  225. package/node_modules/@ocean/services/dist/browser/browser-service.js +124 -0
  226. package/node_modules/@ocean/services/dist/browser/browser-session.js +287 -0
  227. package/node_modules/@ocean/services/dist/browser/browser-task-runner.js +70 -0
  228. package/node_modules/@ocean/services/dist/doctor/workspace-doctor.js +547 -0
  229. package/node_modules/@ocean/services/dist/infrastructure/mcp/call-ledger.js +114 -0
  230. package/node_modules/@ocean/services/dist/infrastructure/mcp/mcp-client.js +162 -0
  231. package/node_modules/@ocean/services/dist/infrastructure/mcp/obsidian-server.js +251 -0
  232. package/node_modules/@ocean/services/dist/infrastructure/mcp/ocean-server.js +880 -0
  233. package/node_modules/@ocean/services/dist/infrastructure/mcp/server-version.js +20 -0
  234. package/node_modules/@ocean/services/dist/infrastructure/mcp/tool-registry.js +29 -0
  235. package/node_modules/@ocean/services/dist/obsidian/conflict-log.js +68 -0
  236. package/node_modules/@ocean/services/dist/obsidian/inbox-promotion.js +80 -0
  237. package/node_modules/@ocean/services/dist/obsidian/vault-discovery.js +113 -0
  238. package/node_modules/@ocean/services/dist/obsidian/vault-ingestion.js +77 -0
  239. package/node_modules/@ocean/services/dist/obsidian/vault-sync.js +73 -0
  240. package/node_modules/@ocean/services/dist/obsidian/vault-writer.js +75 -0
  241. package/node_modules/@ocean/services/package.json +11 -0
  242. package/ocean-marketplace.json +415 -0
  243. package/package.json +67 -4
  244. package/skills/core/business-logic/SKILL.md +22 -0
  245. package/skills/core/catch-up/SKILL.md +17 -0
  246. package/skills/core/core-thinking/SKILL.md +11 -0
  247. package/skills/core/design-thinking/SKILL.md +19 -0
  248. package/skills/core/graft/SKILL.md +156 -0
  249. package/skills/core/loop/SKILL.md +20 -0
  250. package/skills/core/session-handoff/SKILL.md +15 -0
  251. package/skills/core/use-browser/SKILL.md +69 -0
  252. package/skills/core/verification/SKILL.md +11 -0
  253. package/skills/index.json +56 -0
  254. package/templates/README.md +4 -0
  255. package/templates/profiles/default.json +51 -0
  256. package/templates/profiles/developer.json +51 -0
  257. package/templates/profiles/reviewer.json +51 -0
  258. package/templates/profiles/strategist.json +51 -0
  259. package/templates/workspace/00-inbox/INBOX.md +7 -0
  260. package/templates/workspace/00-inbox/candidates/.gitkeep +0 -0
  261. package/templates/workspace/00-inbox/native/.gitkeep +0 -0
  262. package/templates/workspace/01-daily/.gitkeep +0 -0
  263. package/templates/workspace/02-personal/CONFLICTS.md +7 -0
  264. package/templates/workspace/02-personal/MEMORY.md +15 -0
  265. package/templates/workspace/02-personal/goals/.gitkeep +0 -0
  266. package/templates/workspace/02-personal/identity/.gitkeep +0 -0
  267. package/templates/workspace/02-personal/preferences/.gitkeep +0 -0
  268. package/templates/workspace/03-professional/.gitkeep +0 -0
  269. package/templates/workspace/04-projects/PROJECTS.md +5 -0
  270. package/templates/workspace/04-projects/_template/docs/.gitkeep +0 -0
  271. package/templates/workspace/04-projects/_template/memory/.gitkeep +0 -0
  272. package/templates/workspace/04-projects/_template/tasks/.gitkeep +0 -0
  273. package/templates/workspace/05-knowledge/KNOWLEDGE.md +8 -0
  274. package/templates/workspace/05-knowledge/decisions/.gitkeep +0 -0
  275. package/templates/workspace/05-knowledge/lessons/.gitkeep +0 -0
  276. package/templates/workspace/06-templates/TEMPLATES.md +25 -0
  277. package/templates/workspace/06-templates/decision.md +8 -0
  278. package/templates/workspace/06-templates/intelligence.md +32 -0
  279. package/templates/workspace/06-templates/project-claude.md +48 -0
  280. package/templates/workspace/06-templates/session.md +38 -0
  281. package/templates/workspace/06-templates/task.md +42 -0
  282. package/templates/workspace/MANIFEST.json +51 -0
  283. package/templates/workspace/bridge/config/CONFIG.md +21 -0
  284. package/templates/workspace/bridge/config/runtime.json +4 -0
  285. package/templates/workspace/charter/core.md +104 -0
  286. package/templates/workspace/charter/policies/README.md +31 -0
  287. package/templates/workspace/charter/policies/claude-code-context.md +90 -0
  288. package/templates/workspace/charter/policies/concise-output.md +29 -0
  289. package/templates/workspace/charter/policies/context.md +91 -0
  290. package/templates/workspace/charter/policies/contracts/task.md +189 -0
  291. package/templates/workspace/charter/policies/git.md +60 -0
  292. package/templates/workspace/charter/policies/graph.md +47 -0
  293. package/templates/workspace/charter/policies/knowledge.md +33 -0
  294. package/templates/workspace/charter/policies/lifecycle.md +119 -0
  295. package/templates/workspace/charter/policies/memory.md +67 -0
  296. package/templates/workspace/charter/policies/minimal-change.md +43 -0
  297. package/templates/workspace/charter/policies/models.md +57 -0
  298. package/templates/workspace/charter/policies/privacy-terms.txt +3 -0
  299. package/templates/workspace/charter/policies/response.md +39 -0
  300. package/templates/workspace/charter/policies/skill-observer.md +44 -0
  301. package/templates/workspace/charter/policies/stack.md +23 -0
  302. package/templates/workspace/charter/policies/task.md +139 -0
  303. package/templates/workspace/charter/policies/verification.md +29 -0
  304. package/templates/workspace/sessions/.gitkeep +0 -0
@@ -0,0 +1,237 @@
1
+ import { readFile, realpath } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { buildOceanBootstrap } from "@ocean/context/context/resource-injection.js";
5
+ import { truncateUtf8 } from "@ocean/core/shared/fs-utils.js";
6
+ import { oceanRoot, SYSTEM_DIR } from "@ocean/core/shared/paths.js";
7
+ import { autoRegisterProject, gitChangedFiles, projectRules, readProjectManifest, resolveProject, scanProjectManifests, } from "@ocean/core/shared/project-resolution.js";
8
+ const MAX_STDIN_BYTES = 65_536;
9
+ export async function readBoundedStdin(stream = process.stdin, maxBytes = MAX_STDIN_BYTES) {
10
+ if (stream.isTTY)
11
+ return "";
12
+ const chunks = [];
13
+ let bytes = 0;
14
+ for await (const chunk of stream) {
15
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
16
+ bytes += buffer.length;
17
+ if (bytes > maxBytes)
18
+ throw new Error(`Session-start hook payload exceeds the ${maxBytes}-byte bound`);
19
+ chunks.push(buffer);
20
+ }
21
+ return Buffer.concat(chunks).toString("utf8");
22
+ }
23
+ export const WORKTREE_WARNING_MAX_BYTES = 200;
24
+ // Sessions share the Ocean working tree, so one session's `git add -A` can capture another's
25
+ // in-progress files (T-257). When a session starts inside the Ocean workspace and its repo
26
+ // already has uncommitted changes, say so in one bounded line, beside — not inside — the
27
+ // 256-byte bootstrap. The line points at `ocean tasks claim`, not at a worktree (owner decision
28
+ // 2026-10-16: no worktrees; changes must stay visible in the one folder). Anything that goes wrong here means no warning, never a failed hook.
29
+ export async function oceanWorktreeWarning(cwd) {
30
+ try {
31
+ const root = await realpath(oceanRoot());
32
+ const here = await realpath(cwd);
33
+ if (here !== root && !here.startsWith(`${root}${path.sep}`))
34
+ return null;
35
+ const changed = (await gitChangedFiles(here, 3_000)).length;
36
+ if (!changed)
37
+ return null;
38
+ // Those changes are another live session's: never stash, commit or `git add -A` them. The
39
+ // way to avoid colliding is to claim the task (and the dirs) before editing (T-270).
40
+ const line = `ocean-dirty=${changed}: other sessions' uncommitted changes here; never stash/commit/add -A them. Claim first: ocean tasks claim <ID> --by <you> --paths <dirs>`;
41
+ return truncateUtf8(line, WORKTREE_WARNING_MAX_BYTES);
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ // The first session in an unregistered repo under a code root registers it (T-256 phase 2).
48
+ // Best-effort: a failure here leaves the session unbound, never fails the hook.
49
+ async function registerIfUnbound(cwd, resolved) {
50
+ if (resolved.status !== "unbound")
51
+ return resolved;
52
+ try {
53
+ return (await autoRegisterProject(cwd, { resolution: resolved }))
54
+ .resolution;
55
+ }
56
+ catch {
57
+ return resolved;
58
+ }
59
+ }
60
+ // The bound project's manifest, read best-effort: a broken manifest costs the session its
61
+ // rules, never its bootstrap (the same contract as the registry above) — and says so.
62
+ export async function boundProjectManifest(project) {
63
+ if (project.status !== "bound")
64
+ return { manifest: null, problem: null };
65
+ try {
66
+ return {
67
+ manifest: await readProjectManifest(project.projectId),
68
+ problem: null,
69
+ };
70
+ }
71
+ catch (error) {
72
+ return {
73
+ manifest: null,
74
+ problem: error instanceof Error ? error.message : String(error),
75
+ };
76
+ }
77
+ }
78
+ // An unbound session may be unbound only because its project's manifest does not parse; its
79
+ // rules would then vanish without a word. Name the unreadable manifests (at most three).
80
+ async function unreadableManifestsWarning() {
81
+ try {
82
+ const { errors } = await scanProjectManifests();
83
+ if (!errors.length)
84
+ return null;
85
+ const named = errors
86
+ .slice(0, 3)
87
+ .map(({ file, error }) => `${path.relative(oceanRoot(), file)} (${error})`)
88
+ .join("; ");
89
+ return `Ocean: ${errors.length} project manifest(s) unreadable, those projects are unbound and their rules not loaded: ${named}`;
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ // Hard constraints must hold from turn one, so the rules themselves ride beside the bootstrap
96
+ // (at most 10 lines of 200 bytes), not just a count.
97
+ export function projectRulesBlock(projectId, rules) {
98
+ return `Project rules (${projectId}):\n${rules.map((rule) => `- ${rule}`).join("\n")}`;
99
+ }
100
+ export async function claudeSessionStartHook(payload) {
101
+ // `||`, not `??`: Hermes sends cwd "" when its own cwd is unreadable.
102
+ const cwd = payload.cwd || process.env.CLAUDE_PROJECT_DIR || process.cwd();
103
+ const [resolved, warning] = await Promise.all([
104
+ // A broken registry must cost this session its project, never its bootstrap.
105
+ resolveProject(cwd).catch(() => ({
106
+ status: "unbound",
107
+ cwd: path.resolve(cwd),
108
+ gitRoot: null,
109
+ confidence: "none",
110
+ })),
111
+ oceanWorktreeWarning(cwd),
112
+ ]);
113
+ const project = await registerIfUnbound(cwd, resolved);
114
+ const { manifest, problem } = await boundProjectManifest(project);
115
+ let rules = [];
116
+ let rulesProblem = problem;
117
+ if (manifest)
118
+ try {
119
+ rules = projectRules(manifest);
120
+ }
121
+ catch (error) {
122
+ rulesProblem = error instanceof Error ? error.message : String(error);
123
+ }
124
+ const bootstrap = buildOceanBootstrap(project, { rules: rules.length });
125
+ const parts = [bootstrap.content];
126
+ if (project.status === "bound" && rules.length)
127
+ parts.push(projectRulesBlock(project.projectId, rules));
128
+ // Fail visible: rules that cannot be read are said so, never silently dropped.
129
+ if (project.status === "bound" && rulesProblem)
130
+ parts.push(`Project rules (${project.projectId}) unreadable: ${rulesProblem} — fix 04-projects/${project.projectId}/project.json`);
131
+ if (project.status !== "bound") {
132
+ const unreadable = await unreadableManifestsWarning();
133
+ if (unreadable)
134
+ parts.push(unreadable);
135
+ }
136
+ if (warning)
137
+ parts.push(warning);
138
+ return {
139
+ hookSpecificOutput: {
140
+ hookEventName: "SessionStart",
141
+ additionalContext: parts.join("\n"),
142
+ },
143
+ };
144
+ }
145
+ // The same bounded bootstrap line a session-start hook gives, for clients without hooks (T-307).
146
+ // Read-only: it never registers a project, and it carries no rules, records or warnings.
147
+ export async function oceanContext(cwd) {
148
+ const project = await resolveProject(cwd).catch(() => ({
149
+ status: "unbound",
150
+ cwd: path.resolve(cwd),
151
+ gitRoot: null,
152
+ confidence: "none",
153
+ }));
154
+ return buildOceanBootstrap(project).content;
155
+ }
156
+ // Clients that take the bootstrap through their own hooks instead of a same-name shim (T-266).
157
+ // Codex and Gemini CLI (0.58: fireSessionStartEvent → getAdditionalContext, T-296) read Claude
158
+ // Code's hookSpecificOutput shape. Hermes injects context only from a pre_llm_call shell hook,
159
+ // as {"context": "..."} (hermes agent/shell_hooks.py _parse_response); that hook fires on every
160
+ // turn, so only the first turn gets the bootstrap. Qwen Code reads Claude's shape too; Cursor's
161
+ // sessionStart reads `additional_context` and sends `workspace_roots` instead of cwd; OpenCode's
162
+ // Ocean plugin reads Claude's shape (T-307).
163
+ export const SESSION_START_CLIENTS = [
164
+ "claude",
165
+ "codex",
166
+ "gemini",
167
+ "hermes",
168
+ "qwen",
169
+ "cursor",
170
+ "opencode",
171
+ ];
172
+ export function isSessionStartClient(value) {
173
+ return SESSION_START_CLIENTS.includes(value);
174
+ }
175
+ // Cursor names its folder in `workspace_roots`, not `cwd`. Nothing else in a payload is kept.
176
+ export function payloadCwd(payload) {
177
+ if (payload.cwd)
178
+ return payload.cwd;
179
+ const roots = payload.workspace_roots;
180
+ return Array.isArray(roots) && typeof roots[0] === "string"
181
+ ? roots[0]
182
+ : undefined;
183
+ }
184
+ export async function sessionStartHookForClient(client, payload) {
185
+ if (client === "cursor") {
186
+ const result = await claudeSessionStartHook({
187
+ ...payload,
188
+ cwd: payloadCwd(payload),
189
+ });
190
+ return { additional_context: result.hookSpecificOutput.additionalContext };
191
+ }
192
+ if (client !== "hermes")
193
+ return claudeSessionStartHook(payload);
194
+ // Later turns: no context and no git/project work on Hermes' per-turn hot path.
195
+ if (payload.extra?.is_first_turn === false)
196
+ return {};
197
+ const result = await claudeSessionStartHook(payload);
198
+ return { context: result.hookSpecificOutput.additionalContext };
199
+ }
200
+ // The hook script and its registration are named after the product.
201
+ const HOOK_NAMES = ["ocean-session-bootstrap"];
202
+ const WORKSPACE_FOLDERS = ["ocean"];
203
+ // Read-only status check: does the hook script exist on disk, and is it actually registered
204
+ // under hooks.SessionStart in the live Claude Code settings? Registration is never done
205
+ // automatically here (see kernel/bridge/integrations/claude-code/hooks/ for the manual-copy
206
+ // convention) — this only reports the truth, it never assumes it.
207
+ export async function claudeNativeHookStatus(homeDir = os.homedir()) {
208
+ const candidates = WORKSPACE_FOLDERS.flatMap((folder) => HOOK_NAMES.map((hook) => path.join(homeDir, folder, SYSTEM_DIR, "integrations", "claude-code", "hooks", hook)));
209
+ let scriptPath = candidates[0];
210
+ let scriptInstalled = false;
211
+ for (const candidate of candidates) {
212
+ try {
213
+ await readFile(candidate, "utf8");
214
+ scriptPath = candidate;
215
+ scriptInstalled = true;
216
+ break;
217
+ }
218
+ catch {
219
+ // try the next known location
220
+ }
221
+ }
222
+ const settingsPath = path.join(homeDir, ".claude", "settings.json");
223
+ let registered = false;
224
+ try {
225
+ const settings = JSON.parse(await readFile(settingsPath, "utf8"));
226
+ const entries = settings.hooks?.SessionStart ?? [];
227
+ // When a script is installed, only a registration of that very script counts: a command
228
+ // naming the other hook name would point at a file that is not there and silently fail.
229
+ const wanted = scriptInstalled ? [path.basename(scriptPath)] : HOOK_NAMES;
230
+ registered = entries.some((entry) => (entry.hooks ?? []).some((hook) => wanted.some((name) => hook.command?.includes(name))));
231
+ }
232
+ catch {
233
+ registered = false;
234
+ }
235
+ return { scriptPath, scriptInstalled, settingsPath, registered };
236
+ }
237
+ //# sourceMappingURL=session-start-hook.js.map