claude-code-swarm 0.0.1 → 0.3.3

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 (1176) hide show
  1. package/.claude-plugin/marketplace.json +15 -0
  2. package/.claude-plugin/plugin.json +8 -0
  3. package/CLAUDE.md +266 -0
  4. package/README.md +108 -1
  5. package/docs/design.md +1181 -0
  6. package/docs/implementation-plan.md +635 -0
  7. package/e2e/helpers/assertions.mjs +162 -0
  8. package/e2e/helpers/cleanup.mjs +48 -0
  9. package/e2e/helpers/cli.mjs +327 -0
  10. package/e2e/helpers/map-mock-server.mjs +121 -0
  11. package/e2e/helpers/workspace.mjs +72 -0
  12. package/e2e/tier1-hooks.test.mjs +176 -0
  13. package/e2e/tier2-skill.test.mjs +146 -0
  14. package/e2e/tier3-coordination.test.mjs +88 -0
  15. package/e2e/tier4-map.test.mjs +203 -0
  16. package/e2e/vitest.config.e2e.mjs +19 -0
  17. package/hooks/hooks.json +107 -0
  18. package/package.json +45 -14
  19. package/plan.md +214 -0
  20. package/references/multi-agent-protocol/.sudocode/issues.jsonl +120 -0
  21. package/references/multi-agent-protocol/.sudocode/specs.jsonl +15 -0
  22. package/references/multi-agent-protocol/LICENSE +21 -0
  23. package/references/multi-agent-protocol/README.md +113 -0
  24. package/references/multi-agent-protocol/docs/00-design-specification.md +496 -0
  25. package/references/multi-agent-protocol/docs/01-open-questions.md +1050 -0
  26. package/references/multi-agent-protocol/docs/02-wire-protocol.md +296 -0
  27. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +252 -0
  28. package/references/multi-agent-protocol/docs/04-error-handling.md +231 -0
  29. package/references/multi-agent-protocol/docs/05-connection-model.md +244 -0
  30. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +243 -0
  31. package/references/multi-agent-protocol/docs/07-federation.md +335 -0
  32. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +253 -0
  33. package/references/multi-agent-protocol/docs/09-authentication.md +748 -0
  34. package/references/multi-agent-protocol/docs/10-environment-awareness.md +242 -0
  35. package/references/multi-agent-protocol/docs/10-mail-protocol.md +553 -0
  36. package/references/multi-agent-protocol/docs/11-anp-inspired-improvements.md +1079 -0
  37. package/references/multi-agent-protocol/docs/11-trajectory-protocol.md +292 -0
  38. package/references/multi-agent-protocol/docs/12-anp-implementation-plan.md +641 -0
  39. package/references/multi-agent-protocol/docs/agent-iam-integration.md +877 -0
  40. package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +459 -0
  41. package/references/multi-agent-protocol/docs/git-transport-draft.md +251 -0
  42. package/references/multi-agent-protocol/docs-site/Gemfile +22 -0
  43. package/references/multi-agent-protocol/docs-site/README.md +82 -0
  44. package/references/multi-agent-protocol/docs-site/_config.yml +91 -0
  45. package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +20 -0
  46. package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +42 -0
  47. package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +34 -0
  48. package/references/multi-agent-protocol/docs-site/examples/full-integration.md +510 -0
  49. package/references/multi-agent-protocol/docs-site/examples/index.md +138 -0
  50. package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +282 -0
  51. package/references/multi-agent-protocol/docs-site/examples/task-queue.md +399 -0
  52. package/references/multi-agent-protocol/docs-site/getting-started/index.md +98 -0
  53. package/references/multi-agent-protocol/docs-site/getting-started/installation.md +219 -0
  54. package/references/multi-agent-protocol/docs-site/getting-started/overview.md +172 -0
  55. package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +237 -0
  56. package/references/multi-agent-protocol/docs-site/index.md +136 -0
  57. package/references/multi-agent-protocol/docs-site/protocol/authentication.md +391 -0
  58. package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +376 -0
  59. package/references/multi-agent-protocol/docs-site/protocol/design.md +284 -0
  60. package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +312 -0
  61. package/references/multi-agent-protocol/docs-site/protocol/federation.md +449 -0
  62. package/references/multi-agent-protocol/docs-site/protocol/index.md +129 -0
  63. package/references/multi-agent-protocol/docs-site/protocol/permissions.md +398 -0
  64. package/references/multi-agent-protocol/docs-site/protocol/streaming.md +353 -0
  65. package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +369 -0
  66. package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +357 -0
  67. package/references/multi-agent-protocol/docs-site/sdk/api/client.md +380 -0
  68. package/references/multi-agent-protocol/docs-site/sdk/api/index.md +62 -0
  69. package/references/multi-agent-protocol/docs-site/sdk/api/server.md +453 -0
  70. package/references/multi-agent-protocol/docs-site/sdk/api/types.md +468 -0
  71. package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +375 -0
  72. package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +405 -0
  73. package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +352 -0
  74. package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +89 -0
  75. package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +360 -0
  76. package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +446 -0
  77. package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +363 -0
  78. package/references/multi-agent-protocol/docs-site/sdk/index.md +206 -0
  79. package/references/multi-agent-protocol/package-lock.json +4230 -0
  80. package/references/multi-agent-protocol/package.json +56 -0
  81. package/references/multi-agent-protocol/schema/meta.json +584 -0
  82. package/references/multi-agent-protocol/schema/schema.json +3067 -0
  83. package/references/openhive/.claude/settings.json +6 -0
  84. package/references/openhive/.dockerignore +54 -0
  85. package/references/openhive/.github/workflows/docker.yml +52 -0
  86. package/references/openhive/.sudocode/issues.jsonl +24 -0
  87. package/references/openhive/.sudocode/specs.jsonl +4 -0
  88. package/references/openhive/CLAUDE.md +88 -0
  89. package/references/openhive/Dockerfile +105 -0
  90. package/references/openhive/README.md +745 -0
  91. package/references/openhive/bin/openhive.js +6 -0
  92. package/references/openhive/cloudbuild.yaml +80 -0
  93. package/references/openhive/deploy/cloud-run.sh +106 -0
  94. package/references/openhive/deploy/openhive.env.example +80 -0
  95. package/references/openhive/deploy/openhive.service +91 -0
  96. package/references/openhive/docker-compose.yml +67 -0
  97. package/references/openhive/docker-entrypoint.sh +117 -0
  98. package/references/openhive/docs/API_MIGRATION.md +176 -0
  99. package/references/openhive/docs/DEPLOYMENT.md +847 -0
  100. package/references/openhive/docs/DESIGN_v1.md +489 -0
  101. package/references/openhive/docs/DESIGN_v2.md +564 -0
  102. package/references/openhive/docs/HEADSCALE_HOSTING_SPEC.md +513 -0
  103. package/references/openhive/docs/HIVE_SYNC_DESIGN.md +2362 -0
  104. package/references/openhive/docs/HIVE_SYNC_IMPLEMENTATION_PLAN.md +1169 -0
  105. package/references/openhive/docs/HOSTING.md +601 -0
  106. package/references/openhive/docs/IMPLEMENTATION_PLAN.md +428 -0
  107. package/references/openhive/docs/LOCAL_SETUP.md +506 -0
  108. package/references/openhive/docs/MACRO_AGENT_ATLAS_EXTENSION.md +351 -0
  109. package/references/openhive/docs/MEMORY_BANK_SYNC_SPEC.md +909 -0
  110. package/references/openhive/docs/PLAN_v1.md +471 -0
  111. package/references/openhive/docs/PLAN_v2.md +623 -0
  112. package/references/openhive/docs/WEBSOCKET.md +267 -0
  113. package/references/openhive/docs/openswarm-bootstrap-token-spec.md +240 -0
  114. package/references/openhive/ecosystem.config.cjs +76 -0
  115. package/references/openhive/fly.toml +63 -0
  116. package/references/openhive/package-lock.json +17640 -0
  117. package/references/openhive/package.json +128 -0
  118. package/references/openhive/packages/openhive-types/package-lock.json +1473 -0
  119. package/references/openhive/packages/openhive-types/package.json +42 -0
  120. package/references/openhive/packages/openhive-types/src/index.ts +36 -0
  121. package/references/openhive/packages/openhive-types/src/map-coordination.ts +92 -0
  122. package/references/openhive/packages/openhive-types/src/map-session-sync.ts +50 -0
  123. package/references/openhive/packages/openhive-types/src/map-sync.ts +68 -0
  124. package/references/openhive/packages/openhive-types/tsconfig.json +15 -0
  125. package/references/openhive/packages/openhive-types/tsconfig.tsbuildinfo +1 -0
  126. package/references/openhive/packages/openhive-types/tsup.config.ts +12 -0
  127. package/references/openhive/railway.json +13 -0
  128. package/references/openhive/railway.toml +24 -0
  129. package/references/openhive/render.yaml +51 -0
  130. package/references/openhive/src/__tests__/auth.test.ts +148 -0
  131. package/references/openhive/src/__tests__/bridge/credentials.test.ts +65 -0
  132. package/references/openhive/src/__tests__/bridge/dal.test.ts +279 -0
  133. package/references/openhive/src/__tests__/bridge/inbound.test.ts +349 -0
  134. package/references/openhive/src/__tests__/bridge/manager.test.ts +419 -0
  135. package/references/openhive/src/__tests__/bridge/mentions.test.ts +83 -0
  136. package/references/openhive/src/__tests__/bridge/outbound.test.ts +209 -0
  137. package/references/openhive/src/__tests__/bridge/slack-adapter.test.ts +276 -0
  138. package/references/openhive/src/__tests__/cli.test.ts +342 -0
  139. package/references/openhive/src/__tests__/config.test.ts +205 -0
  140. package/references/openhive/src/__tests__/coordination/coordination.test.ts +1072 -0
  141. package/references/openhive/src/__tests__/coordination/cross-instance.test.ts +540 -0
  142. package/references/openhive/src/__tests__/coordination/e2e.test.ts +780 -0
  143. package/references/openhive/src/__tests__/data-dir.test.ts +332 -0
  144. package/references/openhive/src/__tests__/db.test.ts +258 -0
  145. package/references/openhive/src/__tests__/discovery.test.ts +288 -0
  146. package/references/openhive/src/__tests__/events/dal.test.ts +371 -0
  147. package/references/openhive/src/__tests__/events/dispatch.test.ts +202 -0
  148. package/references/openhive/src/__tests__/events/e2e.test.ts +528 -0
  149. package/references/openhive/src/__tests__/events/normalizers.test.ts +263 -0
  150. package/references/openhive/src/__tests__/events/router.test.ts +314 -0
  151. package/references/openhive/src/__tests__/events/routes.test.ts +407 -0
  152. package/references/openhive/src/__tests__/follows.test.ts +328 -0
  153. package/references/openhive/src/__tests__/helpers/test-dirs.ts +44 -0
  154. package/references/openhive/src/__tests__/ingest-keys.test.ts +925 -0
  155. package/references/openhive/src/__tests__/map/sync-client-content.test.ts +288 -0
  156. package/references/openhive/src/__tests__/map/sync-client.test.ts +500 -0
  157. package/references/openhive/src/__tests__/map/sync-listener.test.ts +504 -0
  158. package/references/openhive/src/__tests__/middleware/hostname-guard.test.ts +73 -0
  159. package/references/openhive/src/__tests__/migrations.test.ts +260 -0
  160. package/references/openhive/src/__tests__/opentasks/client.test.ts +497 -0
  161. package/references/openhive/src/__tests__/opentasks/discovery.test.ts +283 -0
  162. package/references/openhive/src/__tests__/opentasks/e2e.test.ts +767 -0
  163. package/references/openhive/src/__tests__/routes/agents.test.ts +417 -0
  164. package/references/openhive/src/__tests__/routes/opentasks-content.test.ts +493 -0
  165. package/references/openhive/src/__tests__/routes/resource-content.test.ts +1741 -0
  166. package/references/openhive/src/__tests__/sessions/adapters.test.ts +524 -0
  167. package/references/openhive/src/__tests__/sessions/routes.test.ts +1053 -0
  168. package/references/openhive/src/__tests__/sessions/storage.test.ts +545 -0
  169. package/references/openhive/src/__tests__/sessions/trajectory-checkpoints.test.ts +349 -0
  170. package/references/openhive/src/__tests__/sessions/trajectory-routes.test.ts +290 -0
  171. package/references/openhive/src/__tests__/swarm/config.test.ts +125 -0
  172. package/references/openhive/src/__tests__/swarm/credentials.test.ts +254 -0
  173. package/references/openhive/src/__tests__/swarm/dal.test.ts +290 -0
  174. package/references/openhive/src/__tests__/swarm/e2e.test.ts +827 -0
  175. package/references/openhive/src/__tests__/swarm/fixtures/exit-immediately.js +3 -0
  176. package/references/openhive/src/__tests__/swarm/fixtures/map-server.js +147 -0
  177. package/references/openhive/src/__tests__/swarm/fixtures/sleep-server.js +52 -0
  178. package/references/openhive/src/__tests__/swarm/local-provider.test.ts +279 -0
  179. package/references/openhive/src/__tests__/swarm/manager.test.ts +305 -0
  180. package/references/openhive/src/__tests__/swarm/routes.test.ts +396 -0
  181. package/references/openhive/src/__tests__/swarm/workspace.test.ts +257 -0
  182. package/references/openhive/src/__tests__/swarmhub/client.test.ts +324 -0
  183. package/references/openhive/src/__tests__/swarmhub/config.test.ts +213 -0
  184. package/references/openhive/src/__tests__/swarmhub/connector.test.ts +581 -0
  185. package/references/openhive/src/__tests__/swarmhub/routes.test.ts +639 -0
  186. package/references/openhive/src/__tests__/swarmhub/slack-client.test.ts +164 -0
  187. package/references/openhive/src/__tests__/swarmhub/slack-connector.test.ts +164 -0
  188. package/references/openhive/src/__tests__/swarmhub/slack-routes.test.ts +373 -0
  189. package/references/openhive/src/__tests__/swarmhub/webhook-handler.test.ts +295 -0
  190. package/references/openhive/src/__tests__/sync/resource-sync.test.ts +1418 -0
  191. package/references/openhive/src/__tests__/sync/sync.test.ts +800 -0
  192. package/references/openhive/src/api/index.ts +65 -0
  193. package/references/openhive/src/api/middleware/auth.ts +227 -0
  194. package/references/openhive/src/api/middleware/hostname-guard.ts +38 -0
  195. package/references/openhive/src/api/routes/admin.ts +366 -0
  196. package/references/openhive/src/api/routes/agents.ts +223 -0
  197. package/references/openhive/src/api/routes/auth.ts +164 -0
  198. package/references/openhive/src/api/routes/bridges.ts +384 -0
  199. package/references/openhive/src/api/routes/comments.ts +294 -0
  200. package/references/openhive/src/api/routes/coordination.ts +312 -0
  201. package/references/openhive/src/api/routes/events.ts +158 -0
  202. package/references/openhive/src/api/routes/federation.ts +367 -0
  203. package/references/openhive/src/api/routes/feed.ts +212 -0
  204. package/references/openhive/src/api/routes/hives.ts +264 -0
  205. package/references/openhive/src/api/routes/map.ts +674 -0
  206. package/references/openhive/src/api/routes/memory-banks.ts +971 -0
  207. package/references/openhive/src/api/routes/posts.ts +342 -0
  208. package/references/openhive/src/api/routes/resource-content.ts +727 -0
  209. package/references/openhive/src/api/routes/resources.ts +1013 -0
  210. package/references/openhive/src/api/routes/search.ts +45 -0
  211. package/references/openhive/src/api/routes/sessions.ts +1187 -0
  212. package/references/openhive/src/api/routes/swarm-hosting.ts +313 -0
  213. package/references/openhive/src/api/routes/sync-protocol.ts +168 -0
  214. package/references/openhive/src/api/routes/sync.ts +279 -0
  215. package/references/openhive/src/api/routes/uploads.ts +174 -0
  216. package/references/openhive/src/api/routes/webhooks.ts +603 -0
  217. package/references/openhive/src/api/schemas/agents.ts +26 -0
  218. package/references/openhive/src/api/schemas/comments.ts +22 -0
  219. package/references/openhive/src/api/schemas/hives.ts +33 -0
  220. package/references/openhive/src/api/schemas/posts.ts +37 -0
  221. package/references/openhive/src/api/schemas/sync.ts +56 -0
  222. package/references/openhive/src/auth/index.ts +2 -0
  223. package/references/openhive/src/auth/jwks.ts +58 -0
  224. package/references/openhive/src/bridge/adapters/slack.ts +306 -0
  225. package/references/openhive/src/bridge/credentials.ts +72 -0
  226. package/references/openhive/src/bridge/inbound.ts +288 -0
  227. package/references/openhive/src/bridge/index.ts +42 -0
  228. package/references/openhive/src/bridge/manager.ts +425 -0
  229. package/references/openhive/src/bridge/mentions.ts +42 -0
  230. package/references/openhive/src/bridge/outbound.ts +103 -0
  231. package/references/openhive/src/bridge/schema.ts +82 -0
  232. package/references/openhive/src/bridge/types.ts +238 -0
  233. package/references/openhive/src/cli/network.ts +480 -0
  234. package/references/openhive/src/cli.ts +620 -0
  235. package/references/openhive/src/config.ts +611 -0
  236. package/references/openhive/src/coordination/index.ts +43 -0
  237. package/references/openhive/src/coordination/listener.ts +92 -0
  238. package/references/openhive/src/coordination/schema.ts +79 -0
  239. package/references/openhive/src/coordination/service.ts +233 -0
  240. package/references/openhive/src/coordination/types.ts +177 -0
  241. package/references/openhive/src/data-dir.ts +105 -0
  242. package/references/openhive/src/db/adapters/index.ts +21 -0
  243. package/references/openhive/src/db/adapters/postgres.ts +310 -0
  244. package/references/openhive/src/db/adapters/sqlite.ts +56 -0
  245. package/references/openhive/src/db/adapters/types.ts +65 -0
  246. package/references/openhive/src/db/dal/agents.ts +430 -0
  247. package/references/openhive/src/db/dal/bridge.ts +336 -0
  248. package/references/openhive/src/db/dal/comments.ts +213 -0
  249. package/references/openhive/src/db/dal/coordination.ts +361 -0
  250. package/references/openhive/src/db/dal/events.ts +381 -0
  251. package/references/openhive/src/db/dal/follows.ts +96 -0
  252. package/references/openhive/src/db/dal/hives.ts +198 -0
  253. package/references/openhive/src/db/dal/ingest-keys.ts +176 -0
  254. package/references/openhive/src/db/dal/instances.ts +196 -0
  255. package/references/openhive/src/db/dal/invites.ts +123 -0
  256. package/references/openhive/src/db/dal/map.ts +750 -0
  257. package/references/openhive/src/db/dal/posts.ts +274 -0
  258. package/references/openhive/src/db/dal/remote-agents.ts +56 -0
  259. package/references/openhive/src/db/dal/search.ts +238 -0
  260. package/references/openhive/src/db/dal/sync-events.ts +160 -0
  261. package/references/openhive/src/db/dal/sync-groups.ts +100 -0
  262. package/references/openhive/src/db/dal/sync-peer-configs.ts +216 -0
  263. package/references/openhive/src/db/dal/sync-peers.ts +145 -0
  264. package/references/openhive/src/db/dal/syncable-resources.ts +888 -0
  265. package/references/openhive/src/db/dal/trajectory-checkpoints.ts +291 -0
  266. package/references/openhive/src/db/dal/uploads.ts +124 -0
  267. package/references/openhive/src/db/dal/votes.ts +124 -0
  268. package/references/openhive/src/db/index.ts +293 -0
  269. package/references/openhive/src/db/providers/index.ts +75 -0
  270. package/references/openhive/src/db/providers/postgres.ts +529 -0
  271. package/references/openhive/src/db/providers/sqlite.ts +1383 -0
  272. package/references/openhive/src/db/providers/turso.ts +1360 -0
  273. package/references/openhive/src/db/providers/types.ts +516 -0
  274. package/references/openhive/src/db/schema.ts +641 -0
  275. package/references/openhive/src/discovery/index.ts +403 -0
  276. package/references/openhive/src/events/dispatch.ts +106 -0
  277. package/references/openhive/src/events/index.ts +17 -0
  278. package/references/openhive/src/events/normalizers/github.ts +133 -0
  279. package/references/openhive/src/events/normalizers/index.ts +62 -0
  280. package/references/openhive/src/events/normalizers/slack.ts +50 -0
  281. package/references/openhive/src/events/router.ts +156 -0
  282. package/references/openhive/src/events/schema.ts +66 -0
  283. package/references/openhive/src/events/types.ts +130 -0
  284. package/references/openhive/src/federation/index.ts +1 -0
  285. package/references/openhive/src/federation/service.ts +776 -0
  286. package/references/openhive/src/headscale/client.ts +256 -0
  287. package/references/openhive/src/headscale/config.ts +212 -0
  288. package/references/openhive/src/headscale/index.ts +23 -0
  289. package/references/openhive/src/headscale/manager.ts +249 -0
  290. package/references/openhive/src/headscale/sync.ts +272 -0
  291. package/references/openhive/src/headscale/types.ts +231 -0
  292. package/references/openhive/src/index.ts +225 -0
  293. package/references/openhive/src/map/client-entry.ts +26 -0
  294. package/references/openhive/src/map/index.ts +76 -0
  295. package/references/openhive/src/map/schema.ts +119 -0
  296. package/references/openhive/src/map/service.ts +323 -0
  297. package/references/openhive/src/map/sync-client.ts +696 -0
  298. package/references/openhive/src/map/sync-listener.ts +409 -0
  299. package/references/openhive/src/map/types.ts +290 -0
  300. package/references/openhive/src/network/factory.ts +118 -0
  301. package/references/openhive/src/network/headscale-provider.ts +437 -0
  302. package/references/openhive/src/network/index.ts +43 -0
  303. package/references/openhive/src/network/tailscale-client.ts +289 -0
  304. package/references/openhive/src/network/tailscale-provider.ts +287 -0
  305. package/references/openhive/src/network/types.ts +178 -0
  306. package/references/openhive/src/opentasks-client/client.ts +374 -0
  307. package/references/openhive/src/opentasks-client/index.ts +7 -0
  308. package/references/openhive/src/realtime/index.ts +282 -0
  309. package/references/openhive/src/server.ts +1069 -0
  310. package/references/openhive/src/services/email.ts +177 -0
  311. package/references/openhive/src/services/sitemap.ts +135 -0
  312. package/references/openhive/src/sessions/adapters/claude.ts +466 -0
  313. package/references/openhive/src/sessions/adapters/codex.ts +265 -0
  314. package/references/openhive/src/sessions/adapters/index.ts +263 -0
  315. package/references/openhive/src/sessions/adapters/raw.ts +144 -0
  316. package/references/openhive/src/sessions/adapters/types.ts +83 -0
  317. package/references/openhive/src/sessions/index.ts +50 -0
  318. package/references/openhive/src/sessions/storage/adapters/gcs.ts +277 -0
  319. package/references/openhive/src/sessions/storage/adapters/local.ts +240 -0
  320. package/references/openhive/src/sessions/storage/adapters/s3.ts +321 -0
  321. package/references/openhive/src/sessions/storage/index.ts +231 -0
  322. package/references/openhive/src/sessions/storage/types.ts +189 -0
  323. package/references/openhive/src/sessions/types.ts +415 -0
  324. package/references/openhive/src/shared/types/index.ts +45 -0
  325. package/references/openhive/src/shared/types/map-coordination.ts +92 -0
  326. package/references/openhive/src/shared/types/map-session-sync.ts +170 -0
  327. package/references/openhive/src/shared/types/map-sync.ts +68 -0
  328. package/references/openhive/src/skill.ts +203 -0
  329. package/references/openhive/src/storage/adapters/local.ts +169 -0
  330. package/references/openhive/src/storage/adapters/s3.ts +195 -0
  331. package/references/openhive/src/storage/index.ts +64 -0
  332. package/references/openhive/src/storage/types.ts +69 -0
  333. package/references/openhive/src/swarm/credentials.ts +98 -0
  334. package/references/openhive/src/swarm/dal.ts +206 -0
  335. package/references/openhive/src/swarm/index.ts +28 -0
  336. package/references/openhive/src/swarm/manager.ts +917 -0
  337. package/references/openhive/src/swarm/providers/local.ts +338 -0
  338. package/references/openhive/src/swarm/providers/sandboxed-local.ts +478 -0
  339. package/references/openhive/src/swarm/providers/workspace.ts +52 -0
  340. package/references/openhive/src/swarm/schema.ts +43 -0
  341. package/references/openhive/src/swarm/types.ts +333 -0
  342. package/references/openhive/src/swarmhub/client.ts +279 -0
  343. package/references/openhive/src/swarmhub/connector.ts +463 -0
  344. package/references/openhive/src/swarmhub/index.ts +43 -0
  345. package/references/openhive/src/swarmhub/routes.ts +296 -0
  346. package/references/openhive/src/swarmhub/types.ts +213 -0
  347. package/references/openhive/src/swarmhub/webhook-handler.ts +126 -0
  348. package/references/openhive/src/sync/compaction.ts +193 -0
  349. package/references/openhive/src/sync/coordination-hooks.ts +154 -0
  350. package/references/openhive/src/sync/crypto.ts +79 -0
  351. package/references/openhive/src/sync/gossip.ts +136 -0
  352. package/references/openhive/src/sync/hooks.ts +202 -0
  353. package/references/openhive/src/sync/materializer-repo.ts +256 -0
  354. package/references/openhive/src/sync/materializer.ts +682 -0
  355. package/references/openhive/src/sync/middleware.ts +140 -0
  356. package/references/openhive/src/sync/peer-resolver.ts +157 -0
  357. package/references/openhive/src/sync/resource-hooks.ts +161 -0
  358. package/references/openhive/src/sync/schema.ts +158 -0
  359. package/references/openhive/src/sync/service.ts +990 -0
  360. package/references/openhive/src/sync/types.ts +369 -0
  361. package/references/openhive/src/terminal/index.ts +4 -0
  362. package/references/openhive/src/terminal/pty-manager.ts +337 -0
  363. package/references/openhive/src/terminal/resolve-tui.ts +44 -0
  364. package/references/openhive/src/terminal/terminal-ws.ts +251 -0
  365. package/references/openhive/src/types.ts +442 -0
  366. package/references/openhive/src/utils/git-remote.ts +329 -0
  367. package/references/openhive/src/web/App.tsx +77 -0
  368. package/references/openhive/src/web/__tests__/components/dashboard/RecentActivity.test.tsx +77 -0
  369. package/references/openhive/src/web/__tests__/components/dashboard/StatsOverview.test.tsx +62 -0
  370. package/references/openhive/src/web/__tests__/components/dashboard/SwarmStatusSummary.test.tsx +122 -0
  371. package/references/openhive/src/web/__tests__/components/dashboard/SyncResourcesStatus.test.tsx +104 -0
  372. package/references/openhive/src/web/__tests__/components/layout/Sidebar.test.tsx +110 -0
  373. package/references/openhive/src/web/__tests__/components/swarm/StatusBadges.test.tsx +65 -0
  374. package/references/openhive/src/web/__tests__/components/terminal/query-responses.test.ts +143 -0
  375. package/references/openhive/src/web/__tests__/components/terminal/terminal-mouse.test.ts +509 -0
  376. package/references/openhive/src/web/__tests__/hooks/useEventsApi.test.ts +378 -0
  377. package/references/openhive/src/web/__tests__/pages/Dashboard.test.tsx +57 -0
  378. package/references/openhive/src/web/__tests__/pages/Events.test.tsx +886 -0
  379. package/references/openhive/src/web/__tests__/pages/Explore.test.tsx +63 -0
  380. package/references/openhive/src/web/__tests__/routing.test.tsx +79 -0
  381. package/references/openhive/src/web/__tests__/setup.ts +37 -0
  382. package/references/openhive/src/web/__tests__/stores/dashboard.test.ts +49 -0
  383. package/references/openhive/src/web/components/common/AgentBadge.tsx +58 -0
  384. package/references/openhive/src/web/components/common/Avatar.tsx +78 -0
  385. package/references/openhive/src/web/components/common/ErrorBoundary.tsx +76 -0
  386. package/references/openhive/src/web/components/common/Highlight.tsx +79 -0
  387. package/references/openhive/src/web/components/common/ImageUpload.tsx +209 -0
  388. package/references/openhive/src/web/components/common/LoadingSpinner.tsx +37 -0
  389. package/references/openhive/src/web/components/common/Logo.tsx +21 -0
  390. package/references/openhive/src/web/components/common/Markdown.tsx +53 -0
  391. package/references/openhive/src/web/components/common/ProtectedRoute.tsx +18 -0
  392. package/references/openhive/src/web/components/common/ThemeToggle.tsx +38 -0
  393. package/references/openhive/src/web/components/common/TimeAgo.tsx +17 -0
  394. package/references/openhive/src/web/components/common/Toast.tsx +70 -0
  395. package/references/openhive/src/web/components/common/VoteButtons.tsx +100 -0
  396. package/references/openhive/src/web/components/dashboard/RecentActivity.tsx +100 -0
  397. package/references/openhive/src/web/components/dashboard/StatsOverview.tsx +40 -0
  398. package/references/openhive/src/web/components/dashboard/SwarmStatusSummary.tsx +89 -0
  399. package/references/openhive/src/web/components/dashboard/SyncResourcesStatus.tsx +81 -0
  400. package/references/openhive/src/web/components/feed/FeedControls.tsx +38 -0
  401. package/references/openhive/src/web/components/feed/NewPostsIndicator.tsx +75 -0
  402. package/references/openhive/src/web/components/feed/PostCard.tsx +129 -0
  403. package/references/openhive/src/web/components/feed/PostList.tsx +83 -0
  404. package/references/openhive/src/web/components/layout/Footer.tsx +5 -0
  405. package/references/openhive/src/web/components/layout/Layout.tsx +29 -0
  406. package/references/openhive/src/web/components/layout/Sidebar.tsx +348 -0
  407. package/references/openhive/src/web/components/post/CommentForm.tsx +59 -0
  408. package/references/openhive/src/web/components/post/CommentTree.tsx +145 -0
  409. package/references/openhive/src/web/components/resources/MemoryBrowser.tsx +208 -0
  410. package/references/openhive/src/web/components/resources/OpenTasksSummary.tsx +138 -0
  411. package/references/openhive/src/web/components/resources/SkillBrowser.tsx +284 -0
  412. package/references/openhive/src/web/components/swarm/StatusBadges.tsx +56 -0
  413. package/references/openhive/src/web/components/terminal/TerminalPanel.tsx +485 -0
  414. package/references/openhive/src/web/components/terminal/index.ts +2 -0
  415. package/references/openhive/src/web/components/terminal/query-responses.ts +70 -0
  416. package/references/openhive/src/web/components/terminal/terminal-mouse.ts +222 -0
  417. package/references/openhive/src/web/hooks/useApi.ts +740 -0
  418. package/references/openhive/src/web/hooks/useDocumentTitle.ts +49 -0
  419. package/references/openhive/src/web/hooks/useInfiniteScroll.ts +58 -0
  420. package/references/openhive/src/web/hooks/useRealtimeUpdates.ts +154 -0
  421. package/references/openhive/src/web/hooks/useWebSocket.ts +225 -0
  422. package/references/openhive/src/web/index.html +73 -0
  423. package/references/openhive/src/web/lib/api.ts +518 -0
  424. package/references/openhive/src/web/main.tsx +32 -0
  425. package/references/openhive/src/web/pages/About.tsx +131 -0
  426. package/references/openhive/src/web/pages/Agent.tsx +130 -0
  427. package/references/openhive/src/web/pages/Agents.tsx +69 -0
  428. package/references/openhive/src/web/pages/AuthCallback.tsx +75 -0
  429. package/references/openhive/src/web/pages/Dashboard.tsx +41 -0
  430. package/references/openhive/src/web/pages/Events.tsx +1025 -0
  431. package/references/openhive/src/web/pages/Explore.tsx +43 -0
  432. package/references/openhive/src/web/pages/Hive.tsx +134 -0
  433. package/references/openhive/src/web/pages/Hives.tsx +64 -0
  434. package/references/openhive/src/web/pages/Home.tsx +43 -0
  435. package/references/openhive/src/web/pages/Login.tsx +122 -0
  436. package/references/openhive/src/web/pages/Post.tsx +216 -0
  437. package/references/openhive/src/web/pages/ResourceDetail.tsx +426 -0
  438. package/references/openhive/src/web/pages/Resources.tsx +276 -0
  439. package/references/openhive/src/web/pages/Search.tsx +234 -0
  440. package/references/openhive/src/web/pages/SessionDetail.tsx +703 -0
  441. package/references/openhive/src/web/pages/Sessions.tsx +129 -0
  442. package/references/openhive/src/web/pages/Settings.tsx +826 -0
  443. package/references/openhive/src/web/pages/SwarmCraft.tsx +16 -0
  444. package/references/openhive/src/web/pages/Swarms.tsx +981 -0
  445. package/references/openhive/src/web/pages/Terminal.tsx +69 -0
  446. package/references/openhive/src/web/postcss.config.js +5 -0
  447. package/references/openhive/src/web/public/favicon.svg +11 -0
  448. package/references/openhive/src/web/public/manifest.json +21 -0
  449. package/references/openhive/src/web/stores/auth.ts +207 -0
  450. package/references/openhive/src/web/stores/dashboard.ts +23 -0
  451. package/references/openhive/src/web/stores/realtime.ts +90 -0
  452. package/references/openhive/src/web/stores/theme.ts +70 -0
  453. package/references/openhive/src/web/stores/toast.ts +63 -0
  454. package/references/openhive/src/web/styles/globals.css +503 -0
  455. package/references/openhive/src/web/sw.ts +228 -0
  456. package/references/openhive/src/web/utils/serviceWorker.ts +86 -0
  457. package/references/openhive/src/web/vite.config.ts +81 -0
  458. package/references/openhive/tsconfig.json +32 -0
  459. package/references/openhive/tsup.config.ts +17 -0
  460. package/references/openhive/vitest.config.ts +30 -0
  461. package/references/openhive/vitest.web.config.ts +20 -0
  462. package/references/opentasks/.claude/settings.json +6 -0
  463. package/references/opentasks/.claude-plugin/plugin.json +20 -0
  464. package/references/opentasks/.lintstagedrc.json +4 -0
  465. package/references/opentasks/.prettierignore +4 -0
  466. package/references/opentasks/.prettierrc.json +11 -0
  467. package/references/opentasks/.sudocode/issues.jsonl +89 -0
  468. package/references/opentasks/.sudocode/specs.jsonl +24 -0
  469. package/references/opentasks/README.md +401 -0
  470. package/references/opentasks/docs/ARCHITECTURE.md +841 -0
  471. package/references/opentasks/docs/DESIGN.md +689 -0
  472. package/references/opentasks/docs/INTERFACE.md +670 -0
  473. package/references/opentasks/docs/PERSISTENCE.md +1638 -0
  474. package/references/opentasks/docs/PROVIDERS.md +1412 -0
  475. package/references/opentasks/docs/SCHEMA.md +815 -0
  476. package/references/opentasks/docs/TESTING.md +1081 -0
  477. package/references/opentasks/eslint.config.js +58 -0
  478. package/references/opentasks/package-lock.json +4348 -0
  479. package/references/opentasks/package.json +81 -0
  480. package/references/opentasks/skills/opentasks/SKILL.md +139 -0
  481. package/references/opentasks/skills/opentasks/dependency-management.md +119 -0
  482. package/references/opentasks/skills/opentasks/feedback-and-review.md +100 -0
  483. package/references/opentasks/skills/opentasks/linking-external-data.md +103 -0
  484. package/references/opentasks/skills/opentasks/spec-to-implementation.md +98 -0
  485. package/references/opentasks/src/__tests__/cli-tools.test.ts +800 -0
  486. package/references/opentasks/src/__tests__/cli.test.ts +97 -0
  487. package/references/opentasks/src/__tests__/p1-p3-gaps.test.ts +635 -0
  488. package/references/opentasks/src/cli.ts +929 -0
  489. package/references/opentasks/src/client/__tests__/client-crud.test.ts +546 -0
  490. package/references/opentasks/src/client/__tests__/client.test.ts +658 -0
  491. package/references/opentasks/src/client/__tests__/socket-discovery.test.ts +122 -0
  492. package/references/opentasks/src/client/client.ts +560 -0
  493. package/references/opentasks/src/client/index.ts +32 -0
  494. package/references/opentasks/src/config/__tests__/defaults.test.ts +66 -0
  495. package/references/opentasks/src/config/__tests__/env.test.ts +155 -0
  496. package/references/opentasks/src/config/__tests__/index.test.ts +148 -0
  497. package/references/opentasks/src/config/__tests__/loader.test.ts +173 -0
  498. package/references/opentasks/src/config/__tests__/merge.test.ts +121 -0
  499. package/references/opentasks/src/config/__tests__/schema.test.ts +446 -0
  500. package/references/opentasks/src/config/defaults.ts +18 -0
  501. package/references/opentasks/src/config/env.ts +170 -0
  502. package/references/opentasks/src/config/errors.ts +33 -0
  503. package/references/opentasks/src/config/index.ts +63 -0
  504. package/references/opentasks/src/config/loader.ts +90 -0
  505. package/references/opentasks/src/config/merge.ts +64 -0
  506. package/references/opentasks/src/config/schema.ts +767 -0
  507. package/references/opentasks/src/core/__tests__/conditional-redirects.test.ts +116 -0
  508. package/references/opentasks/src/core/__tests__/connections.test.ts +194 -0
  509. package/references/opentasks/src/core/__tests__/hash.test.ts +161 -0
  510. package/references/opentasks/src/core/__tests__/id.test.ts +175 -0
  511. package/references/opentasks/src/core/__tests__/init.test.ts +115 -0
  512. package/references/opentasks/src/core/__tests__/location.test.ts +94 -0
  513. package/references/opentasks/src/core/__tests__/merge-driver.test.ts +300 -0
  514. package/references/opentasks/src/core/__tests__/redirects.test.ts +169 -0
  515. package/references/opentasks/src/core/__tests__/resolve-location-target.test.ts +468 -0
  516. package/references/opentasks/src/core/__tests__/uri.test.ts +228 -0
  517. package/references/opentasks/src/core/__tests__/worktree.test.ts +160 -0
  518. package/references/opentasks/src/core/conditional-redirects.ts +100 -0
  519. package/references/opentasks/src/core/connections.ts +217 -0
  520. package/references/opentasks/src/core/discover.ts +195 -0
  521. package/references/opentasks/src/core/hash.ts +74 -0
  522. package/references/opentasks/src/core/id.ts +174 -0
  523. package/references/opentasks/src/core/index.ts +108 -0
  524. package/references/opentasks/src/core/init.ts +66 -0
  525. package/references/opentasks/src/core/location.ts +139 -0
  526. package/references/opentasks/src/core/merge-driver.ts +280 -0
  527. package/references/opentasks/src/core/redirects.ts +182 -0
  528. package/references/opentasks/src/core/uri.ts +270 -0
  529. package/references/opentasks/src/core/worktree.ts +504 -0
  530. package/references/opentasks/src/daemon/__tests__/e2e-live-agent.test.ts +344 -0
  531. package/references/opentasks/src/daemon/__tests__/e2e-session-pipeline.test.ts +447 -0
  532. package/references/opentasks/src/daemon/__tests__/e2e-watch.test.ts +279 -0
  533. package/references/opentasks/src/daemon/__tests__/entire-linker.test.ts +1074 -0
  534. package/references/opentasks/src/daemon/__tests__/entire-watcher.test.ts +659 -0
  535. package/references/opentasks/src/daemon/__tests__/flush.test.ts +306 -0
  536. package/references/opentasks/src/daemon/__tests__/integration.test.ts +338 -0
  537. package/references/opentasks/src/daemon/__tests__/ipc.test.ts +406 -0
  538. package/references/opentasks/src/daemon/__tests__/lifecycle.test.ts +378 -0
  539. package/references/opentasks/src/daemon/__tests__/lock.test.ts +240 -0
  540. package/references/opentasks/src/daemon/__tests__/methods/graph.test.ts +372 -0
  541. package/references/opentasks/src/daemon/__tests__/methods/provider.test.ts +238 -0
  542. package/references/opentasks/src/daemon/__tests__/methods/tools.test.ts +690 -0
  543. package/references/opentasks/src/daemon/__tests__/multi-location.test.ts +945 -0
  544. package/references/opentasks/src/daemon/__tests__/registry.test.ts +268 -0
  545. package/references/opentasks/src/daemon/__tests__/watcher.test.ts +329 -0
  546. package/references/opentasks/src/daemon/entire-linker.ts +615 -0
  547. package/references/opentasks/src/daemon/entire-watcher.ts +415 -0
  548. package/references/opentasks/src/daemon/factory.ts +133 -0
  549. package/references/opentasks/src/daemon/flush.ts +168 -0
  550. package/references/opentasks/src/daemon/index.ts +120 -0
  551. package/references/opentasks/src/daemon/ipc.ts +491 -0
  552. package/references/opentasks/src/daemon/lifecycle.ts +1106 -0
  553. package/references/opentasks/src/daemon/location-state.ts +481 -0
  554. package/references/opentasks/src/daemon/lock.ts +168 -0
  555. package/references/opentasks/src/daemon/methods/__tests__/graph.test.ts +359 -0
  556. package/references/opentasks/src/daemon/methods/__tests__/provider.test.ts +227 -0
  557. package/references/opentasks/src/daemon/methods/__tests__/tools.test.ts +360 -0
  558. package/references/opentasks/src/daemon/methods/__tests__/watch.test.ts +656 -0
  559. package/references/opentasks/src/daemon/methods/archive.ts +193 -0
  560. package/references/opentasks/src/daemon/methods/graph.ts +274 -0
  561. package/references/opentasks/src/daemon/methods/lifecycle.ts +112 -0
  562. package/references/opentasks/src/daemon/methods/location.ts +118 -0
  563. package/references/opentasks/src/daemon/methods/provider.ts +159 -0
  564. package/references/opentasks/src/daemon/methods/tools.ts +221 -0
  565. package/references/opentasks/src/daemon/methods/watch.ts +206 -0
  566. package/references/opentasks/src/daemon/registry.ts +244 -0
  567. package/references/opentasks/src/daemon/types.ts +163 -0
  568. package/references/opentasks/src/daemon/watcher.ts +248 -0
  569. package/references/opentasks/src/entire/__tests__/agent-registry.test.ts +127 -0
  570. package/references/opentasks/src/entire/__tests__/claude-generator.test.ts +49 -0
  571. package/references/opentasks/src/entire/__tests__/commit-msg.test.ts +89 -0
  572. package/references/opentasks/src/entire/__tests__/cursor-agent.test.ts +224 -0
  573. package/references/opentasks/src/entire/__tests__/flush-sentinel.test.ts +93 -0
  574. package/references/opentasks/src/entire/__tests__/gemini-agent.test.ts +375 -0
  575. package/references/opentasks/src/entire/__tests__/git-hooks.test.ts +85 -0
  576. package/references/opentasks/src/entire/__tests__/hook-managers.test.ts +128 -0
  577. package/references/opentasks/src/entire/__tests__/opencode-agent.test.ts +329 -0
  578. package/references/opentasks/src/entire/__tests__/redaction.test.ts +143 -0
  579. package/references/opentasks/src/entire/__tests__/session-store.test.ts +83 -0
  580. package/references/opentasks/src/entire/__tests__/summarize.test.ts +346 -0
  581. package/references/opentasks/src/entire/__tests__/transcript-timestamp.test.ts +127 -0
  582. package/references/opentasks/src/entire/__tests__/types.test.ts +112 -0
  583. package/references/opentasks/src/entire/__tests__/utils.test.ts +296 -0
  584. package/references/opentasks/src/entire/__tests__/validation.test.ts +103 -0
  585. package/references/opentasks/src/entire/__tests__/worktree.test.ts +66 -0
  586. package/references/opentasks/src/entire/agent/registry.ts +143 -0
  587. package/references/opentasks/src/entire/agent/session-types.ts +117 -0
  588. package/references/opentasks/src/entire/agent/types.ts +217 -0
  589. package/references/opentasks/src/entire/commands/clean.ts +134 -0
  590. package/references/opentasks/src/entire/commands/disable.ts +85 -0
  591. package/references/opentasks/src/entire/commands/doctor.ts +152 -0
  592. package/references/opentasks/src/entire/commands/enable.ts +149 -0
  593. package/references/opentasks/src/entire/commands/explain.ts +271 -0
  594. package/references/opentasks/src/entire/commands/reset.ts +105 -0
  595. package/references/opentasks/src/entire/commands/resume.ts +194 -0
  596. package/references/opentasks/src/entire/commands/rewind.ts +204 -0
  597. package/references/opentasks/src/entire/commands/status.ts +150 -0
  598. package/references/opentasks/src/entire/config.ts +153 -0
  599. package/references/opentasks/src/entire/git-operations.ts +485 -0
  600. package/references/opentasks/src/entire/hooks/git-hooks.ts +171 -0
  601. package/references/opentasks/src/entire/hooks/lifecycle.ts +224 -0
  602. package/references/opentasks/src/entire/index.ts +644 -0
  603. package/references/opentasks/src/entire/security/redaction.ts +263 -0
  604. package/references/opentasks/src/entire/session/state-machine.ts +463 -0
  605. package/references/opentasks/src/entire/store/checkpoint-store.ts +489 -0
  606. package/references/opentasks/src/entire/store/native-store.ts +178 -0
  607. package/references/opentasks/src/entire/store/provider-types.ts +99 -0
  608. package/references/opentasks/src/entire/store/session-store.ts +233 -0
  609. package/references/opentasks/src/entire/strategy/attribution.ts +300 -0
  610. package/references/opentasks/src/entire/strategy/common.ts +222 -0
  611. package/references/opentasks/src/entire/strategy/content-overlap.ts +242 -0
  612. package/references/opentasks/src/entire/strategy/manual-commit.ts +1008 -0
  613. package/references/opentasks/src/entire/strategy/types.ts +285 -0
  614. package/references/opentasks/src/entire/summarize/claude-generator.ts +119 -0
  615. package/references/opentasks/src/entire/summarize/summarize.ts +432 -0
  616. package/references/opentasks/src/entire/types.ts +408 -0
  617. package/references/opentasks/src/entire/utils/chunk-files.ts +49 -0
  618. package/references/opentasks/src/entire/utils/commit-message.ts +65 -0
  619. package/references/opentasks/src/entire/utils/detect-agent.ts +36 -0
  620. package/references/opentasks/src/entire/utils/hook-managers.ts +118 -0
  621. package/references/opentasks/src/entire/utils/ide-tags.ts +32 -0
  622. package/references/opentasks/src/entire/utils/paths.ts +59 -0
  623. package/references/opentasks/src/entire/utils/preview-rewind.ts +86 -0
  624. package/references/opentasks/src/entire/utils/rewind-conflict.ts +121 -0
  625. package/references/opentasks/src/entire/utils/shadow-branch.ts +113 -0
  626. package/references/opentasks/src/entire/utils/string-utils.ts +46 -0
  627. package/references/opentasks/src/entire/utils/todo-extract.ts +193 -0
  628. package/references/opentasks/src/entire/utils/trailers.ts +190 -0
  629. package/references/opentasks/src/entire/utils/transcript-parse.ts +177 -0
  630. package/references/opentasks/src/entire/utils/transcript-timestamp.ts +61 -0
  631. package/references/opentasks/src/entire/utils/tree-ops.ts +227 -0
  632. package/references/opentasks/src/entire/utils/tty.ts +72 -0
  633. package/references/opentasks/src/entire/utils/validation.ts +67 -0
  634. package/references/opentasks/src/entire/utils/worktree.ts +58 -0
  635. package/references/opentasks/src/graph/EdgeTypeRegistry.ts +330 -0
  636. package/references/opentasks/src/graph/FederatedGraph.ts +796 -0
  637. package/references/opentasks/src/graph/GraphologyAdapter.ts +374 -0
  638. package/references/opentasks/src/graph/HydratingFederatedGraph.ts +533 -0
  639. package/references/opentasks/src/graph/__tests__/EdgeTypeRegistry.test.ts +263 -0
  640. package/references/opentasks/src/graph/__tests__/FederatedGraph.test.ts +821 -0
  641. package/references/opentasks/src/graph/__tests__/GraphologyAdapter.test.ts +408 -0
  642. package/references/opentasks/src/graph/__tests__/HydratingFederatedGraph.test.ts +735 -0
  643. package/references/opentasks/src/graph/__tests__/debounce.test.ts +276 -0
  644. package/references/opentasks/src/graph/__tests__/e2e-store-roundtrip.test.ts +349 -0
  645. package/references/opentasks/src/graph/__tests__/edge-cases.test.ts +595 -0
  646. package/references/opentasks/src/graph/__tests__/expansion.test.ts +304 -0
  647. package/references/opentasks/src/graph/__tests__/git-graph-syncer.test.ts +572 -0
  648. package/references/opentasks/src/graph/__tests__/provider-store.test.ts +1091 -0
  649. package/references/opentasks/src/graph/__tests__/query.test.ts +991 -0
  650. package/references/opentasks/src/graph/__tests__/store.test.ts +998 -0
  651. package/references/opentasks/src/graph/__tests__/sync.test.ts +178 -0
  652. package/references/opentasks/src/graph/__tests__/validation.test.ts +657 -0
  653. package/references/opentasks/src/graph/coordination.ts +454 -0
  654. package/references/opentasks/src/graph/debounce.ts +154 -0
  655. package/references/opentasks/src/graph/expansion.ts +364 -0
  656. package/references/opentasks/src/graph/git-graph-syncer.ts +321 -0
  657. package/references/opentasks/src/graph/history.ts +438 -0
  658. package/references/opentasks/src/graph/index.ts +145 -0
  659. package/references/opentasks/src/graph/provider-store.ts +1077 -0
  660. package/references/opentasks/src/graph/query.ts +651 -0
  661. package/references/opentasks/src/graph/store.ts +861 -0
  662. package/references/opentasks/src/graph/sync.ts +116 -0
  663. package/references/opentasks/src/graph/types.ts +420 -0
  664. package/references/opentasks/src/graph/validation.ts +520 -0
  665. package/references/opentasks/src/index.ts +270 -0
  666. package/references/opentasks/src/materialization/CLAUDE.md +88 -0
  667. package/references/opentasks/src/materialization/README.md +187 -0
  668. package/references/opentasks/src/materialization/__tests__/archive-methods.test.ts +194 -0
  669. package/references/opentasks/src/materialization/__tests__/archiver.test.ts +528 -0
  670. package/references/opentasks/src/materialization/__tests__/config.test.ts +123 -0
  671. package/references/opentasks/src/materialization/__tests__/git-remote-store.test.ts +533 -0
  672. package/references/opentasks/src/materialization/__tests__/graph-id.test.ts +82 -0
  673. package/references/opentasks/src/materialization/__tests__/http-remote-store.test.ts +263 -0
  674. package/references/opentasks/src/materialization/__tests__/materialize-before-archive.test.ts +246 -0
  675. package/references/opentasks/src/materialization/__tests__/remote-store-factory.test.ts +152 -0
  676. package/references/opentasks/src/materialization/__tests__/snapshot.test.ts +209 -0
  677. package/references/opentasks/src/materialization/archiver.ts +318 -0
  678. package/references/opentasks/src/materialization/git-archive-store.ts +568 -0
  679. package/references/opentasks/src/materialization/git-remote-store.ts +551 -0
  680. package/references/opentasks/src/materialization/graph-id.ts +173 -0
  681. package/references/opentasks/src/materialization/http-remote-store.ts +190 -0
  682. package/references/opentasks/src/materialization/index.ts +62 -0
  683. package/references/opentasks/src/materialization/remote-store-factory.ts +55 -0
  684. package/references/opentasks/src/materialization/snapshot.ts +230 -0
  685. package/references/opentasks/src/materialization/types.ts +410 -0
  686. package/references/opentasks/src/providers/__tests__/beads.test.ts +752 -0
  687. package/references/opentasks/src/providers/__tests__/claude-tasks.test.ts +485 -0
  688. package/references/opentasks/src/providers/__tests__/entire-e2e.test.ts +692 -0
  689. package/references/opentasks/src/providers/__tests__/entire-sessionlog-e2e.test.ts +1113 -0
  690. package/references/opentasks/src/providers/__tests__/entire.test.ts +1016 -0
  691. package/references/opentasks/src/providers/__tests__/from-config.test.ts +183 -0
  692. package/references/opentasks/src/providers/__tests__/global.test.ts +515 -0
  693. package/references/opentasks/src/providers/__tests__/materialization.test.ts +567 -0
  694. package/references/opentasks/src/providers/__tests__/native.test.ts +693 -0
  695. package/references/opentasks/src/providers/__tests__/registry.test.ts +232 -0
  696. package/references/opentasks/src/providers/beads.ts +1155 -0
  697. package/references/opentasks/src/providers/claude-tasks.ts +402 -0
  698. package/references/opentasks/src/providers/entire.ts +608 -0
  699. package/references/opentasks/src/providers/from-config.ts +210 -0
  700. package/references/opentasks/src/providers/global.ts +460 -0
  701. package/references/opentasks/src/providers/index.ts +147 -0
  702. package/references/opentasks/src/providers/location.ts +237 -0
  703. package/references/opentasks/src/providers/materialization.ts +346 -0
  704. package/references/opentasks/src/providers/native.ts +725 -0
  705. package/references/opentasks/src/providers/registry.ts +114 -0
  706. package/references/opentasks/src/providers/sudocode.ts +1292 -0
  707. package/references/opentasks/src/providers/sync.ts +485 -0
  708. package/references/opentasks/src/providers/traits/RelationshipQueryable.ts +169 -0
  709. package/references/opentasks/src/providers/traits/TaskManageable.ts +211 -0
  710. package/references/opentasks/src/providers/traits/Watchable.ts +260 -0
  711. package/references/opentasks/src/providers/traits/__tests__/RelationshipQueryable.test.ts +217 -0
  712. package/references/opentasks/src/providers/traits/__tests__/TaskManageable.test.ts +241 -0
  713. package/references/opentasks/src/providers/traits/index.ts +42 -0
  714. package/references/opentasks/src/providers/types.ts +439 -0
  715. package/references/opentasks/src/schema/__tests__/validation.test.ts +283 -0
  716. package/references/opentasks/src/schema/base.ts +88 -0
  717. package/references/opentasks/src/schema/edges.ts +78 -0
  718. package/references/opentasks/src/schema/index.ts +37 -0
  719. package/references/opentasks/src/schema/nodes.ts +119 -0
  720. package/references/opentasks/src/schema/storage.ts +130 -0
  721. package/references/opentasks/src/schema/validation.ts +209 -0
  722. package/references/opentasks/src/storage/__tests__/atomic-write.test.ts +227 -0
  723. package/references/opentasks/src/storage/__tests__/file-lock.test.ts +120 -0
  724. package/references/opentasks/src/storage/__tests__/jsonl.test.ts +267 -0
  725. package/references/opentasks/src/storage/__tests__/locked-writer.test.ts +134 -0
  726. package/references/opentasks/src/storage/__tests__/sqlite.test.ts +572 -0
  727. package/references/opentasks/src/storage/atomic-write.ts +86 -0
  728. package/references/opentasks/src/storage/file-lock.ts +215 -0
  729. package/references/opentasks/src/storage/index.ts +24 -0
  730. package/references/opentasks/src/storage/interface.ts +289 -0
  731. package/references/opentasks/src/storage/jsonl.ts +264 -0
  732. package/references/opentasks/src/storage/locked-writer.ts +140 -0
  733. package/references/opentasks/src/storage/sqlite-schema.ts +177 -0
  734. package/references/opentasks/src/storage/sqlite.ts +791 -0
  735. package/references/opentasks/src/tools/__tests__/annotate.test.ts +381 -0
  736. package/references/opentasks/src/tools/__tests__/link.test.ts +299 -0
  737. package/references/opentasks/src/tools/__tests__/query.test.ts +350 -0
  738. package/references/opentasks/src/tools/__tests__/task.test.ts +218 -0
  739. package/references/opentasks/src/tools/annotate.ts +277 -0
  740. package/references/opentasks/src/tools/index.ts +57 -0
  741. package/references/opentasks/src/tools/link.ts +163 -0
  742. package/references/opentasks/src/tools/query.ts +468 -0
  743. package/references/opentasks/src/tools/task.ts +213 -0
  744. package/references/opentasks/src/tools/types.ts +451 -0
  745. package/references/opentasks/src/tracking/__tests__/claude-tool-categorizer.test.ts +223 -0
  746. package/references/opentasks/src/tracking/__tests__/transcript-extractor.test.ts +262 -0
  747. package/references/opentasks/src/tracking/claude-tool-categorizer.ts +155 -0
  748. package/references/opentasks/src/tracking/index.ts +32 -0
  749. package/references/opentasks/src/tracking/skill-tracker.ts +322 -0
  750. package/references/opentasks/src/tracking/transcript-extractor.ts +225 -0
  751. package/references/opentasks/tests/e2e/helpers/assertions.ts +211 -0
  752. package/references/opentasks/tests/e2e/helpers/beads-helpers.ts +487 -0
  753. package/references/opentasks/tests/e2e/helpers/fixtures.ts +236 -0
  754. package/references/opentasks/tests/e2e/helpers/index.ts +122 -0
  755. package/references/opentasks/tests/e2e/helpers/sudocode-helpers.ts +341 -0
  756. package/references/opentasks/tests/e2e/helpers/system-setup.ts +504 -0
  757. package/references/opentasks/tests/e2e/helpers/test-agent.ts +504 -0
  758. package/references/opentasks/tests/e2e/infrastructure.e2e.test.ts +521 -0
  759. package/references/opentasks/tests/e2e/skill-tracking.e2e.test.ts +625 -0
  760. package/references/opentasks/tests/e2e/workflows/feedback-loop.e2e.test.ts +279 -0
  761. package/references/opentasks/tests/e2e/workflows/multi-agent.e2e.test.ts +304 -0
  762. package/references/opentasks/tests/e2e/workflows/provider-sync/background-sync.e2e.test.ts +292 -0
  763. package/references/opentasks/tests/e2e/workflows/provider-sync/beads-provider-compat.e2e.test.ts +249 -0
  764. package/references/opentasks/tests/e2e/workflows/provider-sync/cross-provider-edges.e2e.test.ts +407 -0
  765. package/references/opentasks/tests/e2e/workflows/provider-sync/federated-ready.e2e.test.ts +504 -0
  766. package/references/opentasks/tests/e2e/workflows/provider-sync/hydration.e2e.test.ts +340 -0
  767. package/references/opentasks/tests/e2e/workflows/provider-sync/materialization.e2e.test.ts +370 -0
  768. package/references/opentasks/tests/e2e/workflows/provider-sync/sudocode-provider-compat.e2e.test.ts +683 -0
  769. package/references/opentasks/tests/e2e/workflows/provider-sync/watchable-beads.e2e.test.ts +573 -0
  770. package/references/opentasks/tests/e2e/workflows/spec-driven.e2e.test.ts +244 -0
  771. package/references/opentasks/tests/e2e/worktree-location.e2e.test.ts +699 -0
  772. package/references/opentasks/tests/integration/daemon/helpers.ts +147 -0
  773. package/references/opentasks/tests/integration/daemon/ipc.integration.test.ts +343 -0
  774. package/references/opentasks/tests/integration/daemon/lifecycle.integration.test.ts +407 -0
  775. package/references/opentasks/tests/integration/graph/federated-graph.integration.test.ts +660 -0
  776. package/references/opentasks/tests/integration/helpers/flags.ts +28 -0
  777. package/references/opentasks/tests/integration/helpers/index.ts +47 -0
  778. package/references/opentasks/tests/integration/helpers/process.ts +133 -0
  779. package/references/opentasks/tests/integration/helpers/temp.ts +105 -0
  780. package/references/opentasks/tests/integration/helpers/wait.ts +133 -0
  781. package/references/opentasks/tests/integration/helpers.test.ts +120 -0
  782. package/references/opentasks/tests/integration/providers/beads-task-manageable.integration.test.ts +450 -0
  783. package/references/opentasks/tests/integration/providers/beads.integration.test.ts +388 -0
  784. package/references/opentasks/tests/integration/providers/native-task-manageable.integration.test.ts +667 -0
  785. package/references/opentasks/tests/integration/providers/sudocode-task-manageable.integration.test.ts +406 -0
  786. package/references/opentasks/tests/integration/providers/sudocode.integration.test.ts +342 -0
  787. package/references/opentasks/tests/integration/storage/jsonl-durability.integration.test.ts +390 -0
  788. package/references/opentasks/tests/integration/storage/sqlite-durability.integration.test.ts +527 -0
  789. package/references/opentasks/tests/integration/worktree/redirect-location-resolution.integration.test.ts +578 -0
  790. package/references/opentasks/tests/integration/worktree/worktree-flow.integration.test.ts +656 -0
  791. package/references/opentasks/tsconfig.json +18 -0
  792. package/references/opentasks/vitest.config.ts +27 -0
  793. package/references/opentasks/vitest.e2e.config.ts +35 -0
  794. package/references/opentasks/vitest.integration.config.ts +19 -0
  795. package/references/openteams/.claude/settings.json +6 -0
  796. package/references/openteams/CLAUDE.md +98 -0
  797. package/references/openteams/README.md +508 -0
  798. package/references/openteams/SKILL.md +198 -0
  799. package/references/openteams/design.md +250 -0
  800. package/references/openteams/docs/visual-editor-design.md +1225 -0
  801. package/references/openteams/editor/index.html +15 -0
  802. package/references/openteams/editor/package.json +39 -0
  803. package/references/openteams/editor/src/App.tsx +48 -0
  804. package/references/openteams/editor/src/components/canvas/Canvas.tsx +131 -0
  805. package/references/openteams/editor/src/components/canvas/QuickAddMenu.tsx +134 -0
  806. package/references/openteams/editor/src/components/edges/PeerRouteEdge.tsx +82 -0
  807. package/references/openteams/editor/src/components/edges/SignalFlowEdge.tsx +77 -0
  808. package/references/openteams/editor/src/components/edges/SpawnEdge.tsx +54 -0
  809. package/references/openteams/editor/src/components/inspector/ChannelInspector.tsx +158 -0
  810. package/references/openteams/editor/src/components/inspector/EdgeInspector.tsx +168 -0
  811. package/references/openteams/editor/src/components/inspector/Inspector.tsx +46 -0
  812. package/references/openteams/editor/src/components/inspector/RoleInspector.tsx +508 -0
  813. package/references/openteams/editor/src/components/inspector/TeamInspector.tsx +126 -0
  814. package/references/openteams/editor/src/components/nodes/ChannelNode.tsx +103 -0
  815. package/references/openteams/editor/src/components/nodes/RoleNode.tsx +157 -0
  816. package/references/openteams/editor/src/components/nodes/node-styles.ts +101 -0
  817. package/references/openteams/editor/src/components/sidebar/Sidebar.tsx +227 -0
  818. package/references/openteams/editor/src/components/toolbar/ExportModal.tsx +110 -0
  819. package/references/openteams/editor/src/components/toolbar/ImportModal.tsx +139 -0
  820. package/references/openteams/editor/src/components/toolbar/Toolbar.tsx +190 -0
  821. package/references/openteams/editor/src/hooks/use-autosave.ts +126 -0
  822. package/references/openteams/editor/src/hooks/use-keyboard.ts +106 -0
  823. package/references/openteams/editor/src/hooks/use-validation.ts +45 -0
  824. package/references/openteams/editor/src/index.css +245 -0
  825. package/references/openteams/editor/src/lib/auto-layout.ts +51 -0
  826. package/references/openteams/editor/src/lib/bundled-templates.ts +42 -0
  827. package/references/openteams/editor/src/lib/compiler.ts +75 -0
  828. package/references/openteams/editor/src/lib/load-template.ts +103 -0
  829. package/references/openteams/editor/src/lib/rebuild-edges.ts +104 -0
  830. package/references/openteams/editor/src/lib/serializer.ts +408 -0
  831. package/references/openteams/editor/src/lib/signal-catalog.ts +50 -0
  832. package/references/openteams/editor/src/lib/validator.ts +172 -0
  833. package/references/openteams/editor/src/main.tsx +10 -0
  834. package/references/openteams/editor/src/stores/canvas-store.ts +80 -0
  835. package/references/openteams/editor/src/stores/config-store.ts +243 -0
  836. package/references/openteams/editor/src/stores/history-store.ts +143 -0
  837. package/references/openteams/editor/src/stores/theme-store.ts +66 -0
  838. package/references/openteams/editor/src/stores/ui-store.ts +46 -0
  839. package/references/openteams/editor/src/stores/validation-store.ts +27 -0
  840. package/references/openteams/editor/src/types/editor.ts +74 -0
  841. package/references/openteams/editor/src/vite-env.d.ts +1 -0
  842. package/references/openteams/editor/tests/compiler.test.ts +151 -0
  843. package/references/openteams/editor/tests/e2e-add-remove.test.ts +386 -0
  844. package/references/openteams/editor/tests/e2e-components.test.tsx +424 -0
  845. package/references/openteams/editor/tests/e2e-export-roundtrip.test.ts +299 -0
  846. package/references/openteams/editor/tests/e2e-template-load.test.ts +204 -0
  847. package/references/openteams/editor/tests/e2e-ui-store.test.ts +126 -0
  848. package/references/openteams/editor/tests/e2e-undo-redo.test.ts +203 -0
  849. package/references/openteams/editor/tests/e2e-validation.test.ts +307 -0
  850. package/references/openteams/editor/tests/serializer.test.ts +142 -0
  851. package/references/openteams/editor/tests/setup.ts +52 -0
  852. package/references/openteams/editor/tests/validator.test.ts +92 -0
  853. package/references/openteams/editor/tsconfig.json +21 -0
  854. package/references/openteams/editor/tsconfig.tsbuildinfo +1 -0
  855. package/references/openteams/editor/vite.config.ts +28 -0
  856. package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +16 -0
  857. package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +5 -0
  858. package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +24 -0
  859. package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +5 -0
  860. package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +25 -0
  861. package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +5 -0
  862. package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +21 -0
  863. package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +5 -0
  864. package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +20 -0
  865. package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +5 -0
  866. package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +17 -0
  867. package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +5 -0
  868. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +23 -0
  869. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +5 -0
  870. package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +27 -0
  871. package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +5 -0
  872. package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +21 -0
  873. package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +5 -0
  874. package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +16 -0
  875. package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +5 -0
  876. package/references/openteams/examples/bmad-method/roles/analyst.yaml +9 -0
  877. package/references/openteams/examples/bmad-method/roles/architect.yaml +9 -0
  878. package/references/openteams/examples/bmad-method/roles/developer.yaml +8 -0
  879. package/references/openteams/examples/bmad-method/roles/master.yaml +8 -0
  880. package/references/openteams/examples/bmad-method/roles/pm.yaml +9 -0
  881. package/references/openteams/examples/bmad-method/roles/qa.yaml +8 -0
  882. package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +8 -0
  883. package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +9 -0
  884. package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +8 -0
  885. package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +8 -0
  886. package/references/openteams/examples/bmad-method/team.yaml +161 -0
  887. package/references/openteams/examples/bug-fix-pipeline/roles/fixer.yaml +9 -0
  888. package/references/openteams/examples/bug-fix-pipeline/roles/investigator.yaml +8 -0
  889. package/references/openteams/examples/bug-fix-pipeline/roles/pr-creator.yaml +6 -0
  890. package/references/openteams/examples/bug-fix-pipeline/roles/triager.yaml +7 -0
  891. package/references/openteams/examples/bug-fix-pipeline/roles/verifier.yaml +8 -0
  892. package/references/openteams/examples/bug-fix-pipeline/team.yaml +88 -0
  893. package/references/openteams/examples/codebase-migration/roles/assessor.yaml +7 -0
  894. package/references/openteams/examples/codebase-migration/roles/migrator.yaml +9 -0
  895. package/references/openteams/examples/codebase-migration/roles/planner.yaml +5 -0
  896. package/references/openteams/examples/codebase-migration/roles/test-extractor.yaml +9 -0
  897. package/references/openteams/examples/codebase-migration/roles/validator.yaml +7 -0
  898. package/references/openteams/examples/codebase-migration/team.yaml +81 -0
  899. package/references/openteams/examples/docs-sync/roles/adr-writer.yaml +7 -0
  900. package/references/openteams/examples/docs-sync/roles/api-doc-writer.yaml +7 -0
  901. package/references/openteams/examples/docs-sync/roles/change-detector.yaml +7 -0
  902. package/references/openteams/examples/docs-sync/roles/doc-reviewer.yaml +7 -0
  903. package/references/openteams/examples/docs-sync/roles/guide-writer.yaml +7 -0
  904. package/references/openteams/examples/docs-sync/team.yaml +84 -0
  905. package/references/openteams/examples/gsd/prompts/codebase-mapper/ROLE.md +17 -0
  906. package/references/openteams/examples/gsd/prompts/codebase-mapper/SOUL.md +5 -0
  907. package/references/openteams/examples/gsd/prompts/debugger/ROLE.md +25 -0
  908. package/references/openteams/examples/gsd/prompts/debugger/SOUL.md +5 -0
  909. package/references/openteams/examples/gsd/prompts/executor/ROLE.md +34 -0
  910. package/references/openteams/examples/gsd/prompts/executor/SOUL.md +5 -0
  911. package/references/openteams/examples/gsd/prompts/integration-checker/ROLE.md +18 -0
  912. package/references/openteams/examples/gsd/prompts/integration-checker/SOUL.md +3 -0
  913. package/references/openteams/examples/gsd/prompts/orchestrator/ROLE.md +42 -0
  914. package/references/openteams/examples/gsd/prompts/orchestrator/SOUL.md +5 -0
  915. package/references/openteams/examples/gsd/prompts/phase-researcher/ROLE.md +15 -0
  916. package/references/openteams/examples/gsd/prompts/phase-researcher/SOUL.md +3 -0
  917. package/references/openteams/examples/gsd/prompts/plan-checker/ROLE.md +17 -0
  918. package/references/openteams/examples/gsd/prompts/plan-checker/SOUL.md +3 -0
  919. package/references/openteams/examples/gsd/prompts/planner/ROLE.md +28 -0
  920. package/references/openteams/examples/gsd/prompts/planner/SOUL.md +5 -0
  921. package/references/openteams/examples/gsd/prompts/project-researcher/ROLE.md +16 -0
  922. package/references/openteams/examples/gsd/prompts/project-researcher/SOUL.md +3 -0
  923. package/references/openteams/examples/gsd/prompts/research-synthesizer/ROLE.md +13 -0
  924. package/references/openteams/examples/gsd/prompts/research-synthesizer/SOUL.md +3 -0
  925. package/references/openteams/examples/gsd/prompts/roadmapper/ROLE.md +14 -0
  926. package/references/openteams/examples/gsd/prompts/roadmapper/SOUL.md +3 -0
  927. package/references/openteams/examples/gsd/prompts/verifier/ROLE.md +19 -0
  928. package/references/openteams/examples/gsd/prompts/verifier/SOUL.md +5 -0
  929. package/references/openteams/examples/gsd/roles/codebase-mapper.yaml +8 -0
  930. package/references/openteams/examples/gsd/roles/debugger.yaml +8 -0
  931. package/references/openteams/examples/gsd/roles/executor.yaml +8 -0
  932. package/references/openteams/examples/gsd/roles/integration-checker.yaml +8 -0
  933. package/references/openteams/examples/gsd/roles/orchestrator.yaml +9 -0
  934. package/references/openteams/examples/gsd/roles/phase-researcher.yaml +7 -0
  935. package/references/openteams/examples/gsd/roles/plan-checker.yaml +8 -0
  936. package/references/openteams/examples/gsd/roles/planner.yaml +8 -0
  937. package/references/openteams/examples/gsd/roles/project-researcher.yaml +8 -0
  938. package/references/openteams/examples/gsd/roles/research-synthesizer.yaml +7 -0
  939. package/references/openteams/examples/gsd/roles/roadmapper.yaml +7 -0
  940. package/references/openteams/examples/gsd/roles/verifier.yaml +8 -0
  941. package/references/openteams/examples/gsd/team.yaml +154 -0
  942. package/references/openteams/examples/incident-response/roles/communicator.yaml +5 -0
  943. package/references/openteams/examples/incident-response/roles/fix-proposer.yaml +7 -0
  944. package/references/openteams/examples/incident-response/roles/incident-triager.yaml +8 -0
  945. package/references/openteams/examples/incident-response/roles/investigator.yaml +8 -0
  946. package/references/openteams/examples/incident-response/team.yaml +68 -0
  947. package/references/openteams/examples/pr-review-checks/roles/code-reviewer.yaml +7 -0
  948. package/references/openteams/examples/pr-review-checks/roles/security-scanner.yaml +6 -0
  949. package/references/openteams/examples/pr-review-checks/roles/summarizer.yaml +6 -0
  950. package/references/openteams/examples/pr-review-checks/roles/test-checker.yaml +8 -0
  951. package/references/openteams/examples/pr-review-checks/team.yaml +64 -0
  952. package/references/openteams/examples/security-audit/roles/code-analyzer.yaml +6 -0
  953. package/references/openteams/examples/security-audit/roles/dep-scanner.yaml +7 -0
  954. package/references/openteams/examples/security-audit/roles/fixer.yaml +9 -0
  955. package/references/openteams/examples/security-audit/roles/pr-creator.yaml +6 -0
  956. package/references/openteams/examples/security-audit/roles/prioritizer.yaml +6 -0
  957. package/references/openteams/examples/security-audit/roles/secrets-scanner.yaml +6 -0
  958. package/references/openteams/examples/security-audit/roles/verifier.yaml +8 -0
  959. package/references/openteams/examples/security-audit/team.yaml +102 -0
  960. package/references/openteams/media/banner.png +0 -0
  961. package/references/openteams/media/editor.png +0 -0
  962. package/references/openteams/package-lock.json +4804 -0
  963. package/references/openteams/package.json +58 -0
  964. package/references/openteams/schema/role.schema.json +147 -0
  965. package/references/openteams/schema/team.schema.json +311 -0
  966. package/references/openteams/src/cli/editor.ts +170 -0
  967. package/references/openteams/src/cli/generate.test.ts +191 -0
  968. package/references/openteams/src/cli/generate.ts +220 -0
  969. package/references/openteams/src/cli/prompt-utils.ts +42 -0
  970. package/references/openteams/src/cli/template.test.ts +365 -0
  971. package/references/openteams/src/cli/template.ts +205 -0
  972. package/references/openteams/src/cli.ts +22 -0
  973. package/references/openteams/src/generators/agent-prompt-generator.test.ts +332 -0
  974. package/references/openteams/src/generators/agent-prompt-generator.ts +527 -0
  975. package/references/openteams/src/generators/package-generator.test.ts +129 -0
  976. package/references/openteams/src/generators/package-generator.ts +102 -0
  977. package/references/openteams/src/generators/skill-generator.test.ts +246 -0
  978. package/references/openteams/src/generators/skill-generator.ts +388 -0
  979. package/references/openteams/src/index.ts +84 -0
  980. package/references/openteams/src/template/builtins.test.ts +74 -0
  981. package/references/openteams/src/template/builtins.ts +108 -0
  982. package/references/openteams/src/template/install-service.test.ts +452 -0
  983. package/references/openteams/src/template/install-service.ts +332 -0
  984. package/references/openteams/src/template/loader.test.ts +1696 -0
  985. package/references/openteams/src/template/loader.ts +804 -0
  986. package/references/openteams/src/template/resolver.test.ts +304 -0
  987. package/references/openteams/src/template/resolver.ts +251 -0
  988. package/references/openteams/src/template/types.ts +229 -0
  989. package/references/openteams/tsconfig.cjs.json +7 -0
  990. package/references/openteams/tsconfig.esm.json +8 -0
  991. package/references/openteams/tsconfig.json +16 -0
  992. package/references/openteams/vitest.config.ts +9 -0
  993. package/references/sessionlog/.husky/pre-commit +1 -0
  994. package/references/sessionlog/.lintstagedrc.json +4 -0
  995. package/references/sessionlog/.prettierignore +4 -0
  996. package/references/sessionlog/.prettierrc.json +11 -0
  997. package/references/sessionlog/LICENSE +21 -0
  998. package/references/sessionlog/README.md +453 -0
  999. package/references/sessionlog/eslint.config.js +58 -0
  1000. package/references/sessionlog/package-lock.json +3672 -0
  1001. package/references/sessionlog/package.json +65 -0
  1002. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
  1003. package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
  1004. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
  1005. package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
  1006. package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
  1007. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
  1008. package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
  1009. package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
  1010. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
  1011. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
  1012. package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
  1013. package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
  1014. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
  1015. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
  1016. package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
  1017. package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
  1018. package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
  1019. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
  1020. package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
  1021. package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
  1022. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
  1023. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
  1024. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
  1025. package/references/sessionlog/src/__tests__/types.test.ts +166 -0
  1026. package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
  1027. package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
  1028. package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
  1029. package/references/sessionlog/src/agent/registry.ts +143 -0
  1030. package/references/sessionlog/src/agent/session-types.ts +113 -0
  1031. package/references/sessionlog/src/agent/types.ts +220 -0
  1032. package/references/sessionlog/src/cli.ts +597 -0
  1033. package/references/sessionlog/src/commands/clean.ts +133 -0
  1034. package/references/sessionlog/src/commands/disable.ts +84 -0
  1035. package/references/sessionlog/src/commands/doctor.ts +145 -0
  1036. package/references/sessionlog/src/commands/enable.ts +202 -0
  1037. package/references/sessionlog/src/commands/explain.ts +261 -0
  1038. package/references/sessionlog/src/commands/reset.ts +105 -0
  1039. package/references/sessionlog/src/commands/resume.ts +180 -0
  1040. package/references/sessionlog/src/commands/rewind.ts +195 -0
  1041. package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
  1042. package/references/sessionlog/src/commands/status.ts +172 -0
  1043. package/references/sessionlog/src/config.ts +165 -0
  1044. package/references/sessionlog/src/events/event-log.ts +126 -0
  1045. package/references/sessionlog/src/git-operations.ts +558 -0
  1046. package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
  1047. package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
  1048. package/references/sessionlog/src/index.ts +650 -0
  1049. package/references/sessionlog/src/security/redaction.ts +283 -0
  1050. package/references/sessionlog/src/session/state-machine.ts +452 -0
  1051. package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
  1052. package/references/sessionlog/src/store/native-store.ts +173 -0
  1053. package/references/sessionlog/src/store/provider-types.ts +99 -0
  1054. package/references/sessionlog/src/store/session-store.ts +266 -0
  1055. package/references/sessionlog/src/strategy/attribution.ts +296 -0
  1056. package/references/sessionlog/src/strategy/common.ts +207 -0
  1057. package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
  1058. package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
  1059. package/references/sessionlog/src/strategy/types.ts +279 -0
  1060. package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
  1061. package/references/sessionlog/src/summarize/summarize.ts +432 -0
  1062. package/references/sessionlog/src/types.ts +508 -0
  1063. package/references/sessionlog/src/utils/chunk-files.ts +49 -0
  1064. package/references/sessionlog/src/utils/commit-message.ts +65 -0
  1065. package/references/sessionlog/src/utils/detect-agent.ts +36 -0
  1066. package/references/sessionlog/src/utils/hook-managers.ts +125 -0
  1067. package/references/sessionlog/src/utils/ide-tags.ts +32 -0
  1068. package/references/sessionlog/src/utils/paths.ts +79 -0
  1069. package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
  1070. package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
  1071. package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
  1072. package/references/sessionlog/src/utils/string-utils.ts +46 -0
  1073. package/references/sessionlog/src/utils/todo-extract.ts +188 -0
  1074. package/references/sessionlog/src/utils/trailers.ts +187 -0
  1075. package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
  1076. package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
  1077. package/references/sessionlog/src/utils/tree-ops.ts +219 -0
  1078. package/references/sessionlog/src/utils/tty.ts +72 -0
  1079. package/references/sessionlog/src/utils/validation.ts +65 -0
  1080. package/references/sessionlog/src/utils/worktree.ts +58 -0
  1081. package/references/sessionlog/src/wire-types.ts +59 -0
  1082. package/references/sessionlog/templates/setup-env.sh +153 -0
  1083. package/references/sessionlog/tsconfig.json +18 -0
  1084. package/references/sessionlog/vitest.config.ts +12 -0
  1085. package/references/swarmkit/LICENSE +21 -0
  1086. package/references/swarmkit/README.md +130 -0
  1087. package/references/swarmkit/docs/design.md +453 -0
  1088. package/references/swarmkit/docs/package-setup-reference.md +519 -0
  1089. package/references/swarmkit/package-lock.json +1938 -0
  1090. package/references/swarmkit/package.json +43 -0
  1091. package/references/swarmkit/src/cli.ts +41 -0
  1092. package/references/swarmkit/src/commands/add.ts +126 -0
  1093. package/references/swarmkit/src/commands/doctor.ts +117 -0
  1094. package/references/swarmkit/src/commands/hive.ts +279 -0
  1095. package/references/swarmkit/src/commands/init/phases/configure.ts +96 -0
  1096. package/references/swarmkit/src/commands/init/phases/global-setup.ts +102 -0
  1097. package/references/swarmkit/src/commands/init/phases/packages.ts +44 -0
  1098. package/references/swarmkit/src/commands/init/phases/project.ts +81 -0
  1099. package/references/swarmkit/src/commands/init/phases/use-case.ts +47 -0
  1100. package/references/swarmkit/src/commands/init/state.test.ts +23 -0
  1101. package/references/swarmkit/src/commands/init/state.ts +22 -0
  1102. package/references/swarmkit/src/commands/init/wizard.ts +160 -0
  1103. package/references/swarmkit/src/commands/init.ts +17 -0
  1104. package/references/swarmkit/src/commands/login.ts +106 -0
  1105. package/references/swarmkit/src/commands/logout.ts +22 -0
  1106. package/references/swarmkit/src/commands/remove.ts +72 -0
  1107. package/references/swarmkit/src/commands/status.ts +101 -0
  1108. package/references/swarmkit/src/commands/update.ts +62 -0
  1109. package/references/swarmkit/src/commands/whoami.ts +41 -0
  1110. package/references/swarmkit/src/config/global.test.ts +258 -0
  1111. package/references/swarmkit/src/config/global.ts +141 -0
  1112. package/references/swarmkit/src/config/keys.test.ts +109 -0
  1113. package/references/swarmkit/src/config/keys.ts +49 -0
  1114. package/references/swarmkit/src/doctor/checks.test.ts +366 -0
  1115. package/references/swarmkit/src/doctor/checks.ts +292 -0
  1116. package/references/swarmkit/src/doctor/types.ts +33 -0
  1117. package/references/swarmkit/src/hub/auth-flow.test.ts +127 -0
  1118. package/references/swarmkit/src/hub/auth-flow.ts +144 -0
  1119. package/references/swarmkit/src/hub/client.test.ts +224 -0
  1120. package/references/swarmkit/src/hub/client.ts +185 -0
  1121. package/references/swarmkit/src/hub/credentials.test.ts +132 -0
  1122. package/references/swarmkit/src/hub/credentials.ts +51 -0
  1123. package/references/swarmkit/src/index.ts +116 -0
  1124. package/references/swarmkit/src/packages/installer.test.ts +365 -0
  1125. package/references/swarmkit/src/packages/installer.ts +206 -0
  1126. package/references/swarmkit/src/packages/plugin.test.ts +141 -0
  1127. package/references/swarmkit/src/packages/plugin.ts +46 -0
  1128. package/references/swarmkit/src/packages/registry.test.ts +235 -0
  1129. package/references/swarmkit/src/packages/registry.ts +209 -0
  1130. package/references/swarmkit/src/packages/setup.test.ts +1349 -0
  1131. package/references/swarmkit/src/packages/setup.ts +635 -0
  1132. package/references/swarmkit/src/utils/ui.test.ts +115 -0
  1133. package/references/swarmkit/src/utils/ui.ts +62 -0
  1134. package/references/swarmkit/tsconfig.json +17 -0
  1135. package/references/swarmkit/vitest.config.ts +9 -0
  1136. package/scripts/bootstrap.mjs +26 -0
  1137. package/scripts/generate-agents.mjs +32 -0
  1138. package/scripts/map-hook.mjs +187 -0
  1139. package/scripts/map-sidecar.mjs +115 -0
  1140. package/scripts/sync-version.mjs +22 -0
  1141. package/scripts/team-loader.mjs +87 -0
  1142. package/settings.json +13 -0
  1143. package/skills/swarm/SKILL.md +71 -0
  1144. package/src/__tests__/agent-generator.test.mjs +299 -0
  1145. package/src/__tests__/bootstrap.test.mjs +353 -0
  1146. package/src/__tests__/config.test.mjs +286 -0
  1147. package/src/__tests__/context-output.test.mjs +138 -0
  1148. package/src/__tests__/helpers.mjs +136 -0
  1149. package/src/__tests__/inbox.test.mjs +174 -0
  1150. package/src/__tests__/index.test.mjs +90 -0
  1151. package/src/__tests__/map-connection.test.mjs +134 -0
  1152. package/src/__tests__/map-events.test.mjs +325 -0
  1153. package/src/__tests__/paths.test.mjs +70 -0
  1154. package/src/__tests__/roles.test.mjs +112 -0
  1155. package/src/__tests__/sessionlog.test.mjs +139 -0
  1156. package/src/__tests__/sidecar-client.test.mjs +73 -0
  1157. package/src/__tests__/sidecar-server.test.mjs +318 -0
  1158. package/src/__tests__/template.test.mjs +109 -0
  1159. package/src/agent-generator.mjs +325 -0
  1160. package/src/bootstrap.mjs +237 -0
  1161. package/src/config.mjs +86 -0
  1162. package/src/context-output.mjs +150 -0
  1163. package/src/inbox.mjs +105 -0
  1164. package/src/index.mjs +98 -0
  1165. package/src/map-connection.mjs +121 -0
  1166. package/src/map-events.mjs +175 -0
  1167. package/src/paths.mjs +74 -0
  1168. package/src/roles.mjs +72 -0
  1169. package/src/sessionlog.mjs +161 -0
  1170. package/src/sidecar-client.mjs +131 -0
  1171. package/src/sidecar-server.mjs +247 -0
  1172. package/src/swarmkit-resolver.mjs +111 -0
  1173. package/src/template.mjs +163 -0
  1174. package/vitest.config.mjs +17 -0
  1175. package/dist/index.d.ts +0 -1
  1176. package/dist/index.js +0 -6
@@ -0,0 +1,1412 @@
1
+ # OpenTasks Providers
2
+
3
+ This document defines the provider architecture for OpenTasks.
4
+
5
+ See also:
6
+ - [DESIGN.md](./DESIGN.md) — Design rationale and core concepts
7
+ - [SCHEMA.md](./SCHEMA.md) — Data model and types
8
+ - [PERSISTENCE.md](./PERSISTENCE.md) — Storage and sync
9
+ - [ARCHITECTURE.md](./ARCHITECTURE.md) — Location hierarchy and daemon
10
+ - [INTERFACE.md](./INTERFACE.md) — API
11
+
12
+ ---
13
+
14
+ ## Overview
15
+
16
+ OpenTasks uses a **federated graph model** where:
17
+
18
+ - **OpenTasks owns the graph structure** — edges, relationships, and node references
19
+ - **Providers own node content** — the actual context and task data
20
+ - **Daemon coordinates access** — all provider operations go through the location daemon
21
+ - **Location isolation** — each `.opentasks/` location has its own provider configuration
22
+
23
+ This separation allows OpenTasks to integrate with existing tools (Beads, Taskmaster, Linear) without duplicating data or creating sync conflicts.
24
+
25
+ ### Integration Patterns
26
+
27
+ OpenTasks supports multiple integration patterns depending on the external system:
28
+
29
+ | Pattern | Direction | Use Case | Example |
30
+ |---------|-----------|----------|---------|
31
+ | **Provider** | Read-heavy | External system is source of truth | Beads, Jira (read-only) |
32
+ | **Adapter** | Bidirectional | Full sync between systems | Linear ↔ OpenTasks |
33
+ | **SyncTarget** | Write-heavy | OpenTasks is source of truth | Export to GitHub Issues |
34
+
35
+ The Provider interface (described below) is the foundation. Adapters and SyncTargets extend it with additional capabilities.
36
+
37
+ ```
38
+ ┌─────────────────────────────────────────────────────────────────┐
39
+ │ OpenTasks Location (graph.jsonl) │
40
+ │ │
41
+ │ ┌────────────────────────────────────────────────────────────┐ │
42
+ │ │ Native Nodes │ │
43
+ │ │ Context (c-a2b3) Task (t-x7k9) Feedback (f-m4n5) │ │
44
+ │ └────────────────────────────────────────────────────────────┘ │
45
+ │ │
46
+ │ ┌────────────────────────────────────────────────────────────┐ │
47
+ │ │ ExternalNodes (cached) │ │
48
+ │ │ e-bd1: beads://./bd-123 (materialized) │ │
49
+ │ │ e-tm1: taskmaster://./prd-1 (materialized) │ │
50
+ │ │ e-jir: jira://PROJ-456 (phantom, not yet fetched) │ │
51
+ │ └────────────────────────────────────────────────────────────┘ │
52
+ │ │
53
+ │ ┌────────────────────────────────────────────────────────────┐ │
54
+ │ │ Edges │ │
55
+ │ │ t-x7k9 ──implements──▶ c-a2b3 │ │
56
+ │ │ t-x7k9 ──blocks──▶ beads://./bd-456 │ │
57
+ │ │ e-bd1 ──discovered-from──▶ e-tm1 │ │
58
+ │ └────────────────────────────────────────────────────────────┘ │
59
+ └─────────────────────────────────────────────────────────────────┘
60
+
61
+ Daemon (IPC)
62
+
63
+ ┌─────────────────┼─────────────────┐
64
+ ▼ ▼ ▼
65
+ ┌───────────────────┐ ┌───────────────┐ ┌───────────────────┐
66
+ │ Task Providers │ │ Context Providers│ │ Other Locations │
67
+ │ │ │ │ │ │
68
+ │ • Beads CLI │ │ • Taskmaster │ │ opentasks://~ │
69
+ │ • Linear API │ │ • spec-kit │ │ opentasks://../ │
70
+ │ • Jira API │ │ │ │ │
71
+ └───────────────────┘ └───────────────┘ └───────────────────┘
72
+ ```
73
+
74
+ ---
75
+
76
+ ## Design Principles
77
+
78
+ ### 1. Separation of Concerns
79
+
80
+ | Component | Owner | Storage |
81
+ |-----------|-------|---------|
82
+ | **Graph Structure** | OpenTasks | `.opentasks/graph.jsonl` |
83
+ | ↳ Edges/Relationships | OpenTasks | (in graph.jsonl) |
84
+ | ↳ Native Nodes | OpenTasks | (in graph.jsonl) |
85
+ | ↳ ExternalNodes (cache) | OpenTasks | (in graph.jsonl) |
86
+ | ↳ Feedback | OpenTasks | (in graph.jsonl) |
87
+ | **External Task Content** | Task Provider | Provider's storage |
88
+ | **External Context Content** | Context Provider | Provider's storage |
89
+
90
+ See [PERSISTENCE.md](./PERSISTENCE.md) for details on the unified graph storage.
91
+
92
+ ### 2. Provider Authority
93
+
94
+ Providers are the **source of truth** for their content. OpenTasks:
95
+
96
+ - **Reads** content from providers on demand
97
+ - **Caches** metadata for display (title, status)
98
+ - **Never duplicates** full content
99
+ - **Delegates** CRUD operations to providers
100
+
101
+ ### 3. URI-Based References
102
+
103
+ OpenTasks uses two URI schemes:
104
+
105
+ **Provider URIs** — References to external system content:
106
+ ```
107
+ beads://[workspace]/[id] # Beads issue
108
+ taskmaster://[project]/[id] # Taskmaster PRD/task
109
+ linear://[team]/[id] # Linear issue
110
+ jira://[project]/[key] # Jira issue
111
+ github://[owner]/[repo]/[num] # GitHub issue
112
+ ```
113
+
114
+ **OpenTasks URIs** — Cross-location references (see [ARCHITECTURE.md](./ARCHITECTURE.md)):
115
+ ```
116
+ opentasks://~/.opentasks/c-a2b3 # User location
117
+ opentasks://./t-x7k9 # Current location
118
+ opentasks://../.opentasks/c-c4d5 # Parent directory
119
+ opentasks:///abs/path/.opentasks/t-e6f7 # Absolute path
120
+ ```
121
+
122
+ **URI Resolution Priority:**
123
+ 1. Local ID lookup (if no scheme prefix, e.g., `c-a2b3`)
124
+ 2. OpenTasks URI resolution (for `opentasks://` scheme)
125
+ 3. Provider URI resolution (for provider schemes like `beads://`, `jira://`)
126
+
127
+ ### 4. Graceful Degradation & Phantom Nodes
128
+
129
+ OpenTasks supports **progressive materialization** for external references:
130
+
131
+ ```
132
+ URI Reference → Phantom Node → Materialized Node
133
+ │ │ │
134
+ │ │ └── Full data fetched, cached
135
+ │ └── ExternalNode exists, materialized=false
136
+ └── Just a string in an edge target
137
+ ```
138
+
139
+ **Degradation chain:**
140
+ 1. **Provider available**: Fetch fresh data, cache it
141
+ 2. **Provider unavailable**: Use cached data (with `stale: true`)
142
+ 3. **No cache**: Return phantom node (just URI and type)
143
+ 4. **No ExternalNode**: Edge still valid, target resolves to URI string
144
+
145
+ This aligns with the `ExternalNode` type in [SCHEMA.md](./SCHEMA.md):
146
+ ```typescript
147
+ interface ExternalNode {
148
+ type: 'external'
149
+ uri: string // Canonical URI (e.g., "jira://PROJ-123")
150
+ source: string // Provider name
151
+ materialized: boolean // Has data been fetched?
152
+ cached_at?: string // When last fetched
153
+ stale?: boolean // Needs refresh
154
+ external_data?: Record<string, unknown>
155
+ }
156
+ ```
157
+
158
+ ---
159
+
160
+ ## Provider Interface
161
+
162
+ ### Base Provider
163
+
164
+ ```typescript
165
+ /**
166
+ * Base interface for all content providers
167
+ */
168
+ interface ContentProvider {
169
+ /** Unique provider identifier */
170
+ readonly name: string
171
+
172
+ /** URI scheme(s) this provider handles */
173
+ readonly schemes: string[]
174
+
175
+ /** Node types this provider manages */
176
+ readonly nodeTypes: ('context' | 'task')[]
177
+
178
+ /** Provider capabilities */
179
+ readonly capabilities: ProviderCapabilities
180
+
181
+ // === Lifecycle ===
182
+
183
+ /** Initialize provider (called once on startup) */
184
+ initialize?(config: ProviderConfig): Promise<void>
185
+
186
+ /** Check if provider is available/healthy */
187
+ healthCheck?(): Promise<HealthStatus>
188
+
189
+ // === Read Operations ===
190
+
191
+ /** Get a single node by ID */
192
+ get(id: string): Promise<ProviderNode | null>
193
+
194
+ /** List nodes with optional filtering */
195
+ list(filter?: ProviderFilter): Promise<ProviderNode[]>
196
+
197
+ /** Search nodes by query string */
198
+ search?(query: string): Promise<ProviderNode[]>
199
+
200
+ /** Get nodes ready for work (no blockers) */
201
+ ready?(): Promise<ProviderNode[]>
202
+
203
+ // === Write Operations (optional) ===
204
+
205
+ /** Create a new node */
206
+ create?(input: CreateNodeInput): Promise<ProviderNode>
207
+
208
+ /** Update an existing node */
209
+ update?(id: string, updates: UpdateNodeInput): Promise<ProviderNode>
210
+
211
+ /** Close/complete a node */
212
+ close?(id: string, reason?: string): Promise<ProviderNode>
213
+
214
+ /** Delete a node */
215
+ delete?(id: string): Promise<void>
216
+
217
+ // === Sync Operations (optional) ===
218
+
219
+ /** Watch for changes (real-time updates) */
220
+ watch?(callback: (event: ProviderEvent) => void): Unsubscribe
221
+
222
+ /** Pull changes since last sync */
223
+ pullChanges?(since?: string): Promise<ChangeSet>
224
+
225
+ // === Mapping ===
226
+
227
+ /** Convert provider-native format to OpenTasks node */
228
+ toOpenTasks(native: unknown): ProviderNode
229
+
230
+ /** Convert OpenTasks node to provider-native format */
231
+ fromOpenTasks(node: ProviderNode): unknown
232
+ }
233
+
234
+ interface ProviderCapabilities {
235
+ read: boolean
236
+ write: boolean
237
+ delete: boolean
238
+ search: boolean
239
+ watch: boolean
240
+ ready: boolean // supports "ready" query
241
+ }
242
+
243
+ interface ProviderNode {
244
+ /** Provider-specific ID */
245
+ id: string
246
+
247
+ /** Full URI for this node */
248
+ uri: string
249
+
250
+ /** Node type */
251
+ type: 'context' | 'task'
252
+
253
+ /** Display title */
254
+ title: string
255
+
256
+ /** Full content (markdown) */
257
+ content?: string
258
+
259
+ /** Provider's status value */
260
+ status?: string
261
+
262
+ /** Priority (0-4) */
263
+ priority?: number
264
+
265
+ /** Tags/labels */
266
+ tags?: string[]
267
+
268
+ /** Assignment */
269
+ assignee?: string
270
+
271
+ /** Timestamps */
272
+ created_at: string
273
+ updated_at: string
274
+
275
+ /** Provider-specific data */
276
+ provider_data?: Record<string, unknown>
277
+ }
278
+
279
+ interface ProviderEvent {
280
+ type: 'created' | 'updated' | 'deleted'
281
+ uri: string
282
+ node?: ProviderNode
283
+ timestamp: string
284
+ }
285
+
286
+ type Unsubscribe = () => void
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Daemon Integration
292
+
293
+ All provider operations are coordinated through the location daemon. This ensures:
294
+ - Consistent caching across clients
295
+ - Proper lock management
296
+ - Event propagation to watchers
297
+ - Cross-location resolution
298
+
299
+ ### Provider Registration Flow
300
+
301
+ ```
302
+ ┌───────────────────────────────────────────────────────────────────┐
303
+ │ Daemon Startup │
304
+ │ │
305
+ │ 1. Read .opentasks/config.json for provider config │
306
+ │ 2. Initialize configured providers │
307
+ │ 3. Register providers in ProviderRegistry │
308
+ │ 4. Start watchers for providers with watch capability │
309
+ └───────────────────────────────────────────────────────────────────┘
310
+ ```
311
+
312
+ ### Request Flow
313
+
314
+ ```typescript
315
+ // Client makes request
316
+ const node = await client.get('beads://./bd-x7k9')
317
+
318
+ // Daemon handles:
319
+ // 1. Parse URI to determine provider
320
+ // 2. Check ExternalNode cache
321
+ // 3. If stale or missing, delegate to provider
322
+ // 4. Update ExternalNode with fetched data
323
+ // 5. Return to client
324
+ ```
325
+
326
+ ### IPC Methods for Providers
327
+
328
+ The daemon exposes these provider-related IPC methods:
329
+
330
+ | Method | Description |
331
+ |--------|-------------|
332
+ | `provider.resolve` | Resolve URI to node (with caching) |
333
+ | `provider.list` | List nodes from a provider |
334
+ | `provider.search` | Search across providers |
335
+ | `provider.ready` | Get ready items (with cross-provider blocking) |
336
+ | `provider.create` | Create via provider (if writable) |
337
+ | `provider.update` | Update via provider (if writable) |
338
+ | `provider.refresh` | Force refresh from provider |
339
+
340
+ ### Cross-Location Provider Resolution
341
+
342
+ When an edge references a node in another location:
343
+
344
+ ```typescript
345
+ // Edge in ~/projects/app-a/.opentasks/
346
+ {
347
+ from_id: "t-local",
348
+ to_id: "opentasks://~/projects/app-b/.opentasks/t-x7k9",
349
+ type: "blocks"
350
+ }
351
+
352
+ // Resolution:
353
+ // 1. Parse opentasks:// URI
354
+ // 2. Find daemon for ~/projects/app-b/.opentasks/
355
+ // 3. Request node from that daemon
356
+ // 4. That daemon may further resolve to a provider URI
357
+ ```
358
+
359
+ This enables multi-hop resolution:
360
+ ```
361
+ opentasks://location-b/e-ext1 → beads://./bd-123 → Beads CLI
362
+ ```
363
+
364
+ ---
365
+
366
+ ## Task Providers
367
+
368
+ ### Beads Provider
369
+
370
+ [Beads](https://github.com/steveyegge/beads) is a distributed, git-backed issue tracker designed for AI agents.
371
+
372
+ ```typescript
373
+ interface BeadsProvider extends ContentProvider {
374
+ name: 'beads'
375
+ schemes: ['beads']
376
+ nodeTypes: ['task']
377
+
378
+ capabilities: {
379
+ read: true,
380
+ write: true,
381
+ delete: true,
382
+ search: true,
383
+ watch: true, // via file watcher on .beads/issues.jsonl
384
+ ready: true // `bd ready` command
385
+ }
386
+ }
387
+ ```
388
+
389
+ #### URI Format
390
+
391
+ ```
392
+ beads://[workspace]/[id]
393
+
394
+ Examples:
395
+ beads://./bd-x7k9 # Current workspace
396
+ beads:///path/to/repo/bd-y8 # Absolute path
397
+ beads://bd-z9a1 # Implicit current workspace
398
+ ```
399
+
400
+ #### Field Mapping
401
+
402
+ | Beads Field | OpenTasks Field | Notes |
403
+ |-------------|-----------------|-------|
404
+ | `id` | `id` | Hash-based (bd-xxxx) |
405
+ | `title` | `title` | Direct mapping |
406
+ | `description` | `content` | Primary content |
407
+ | `design`, `acceptance_criteria`, `notes` | `content` | Concatenated with separators |
408
+ | `status` | `status` | open, in_progress, blocked, closed, etc. |
409
+ | `priority` | `priority` | 0-4 (same semantics) |
410
+ | `labels` | `tags` | Direct mapping |
411
+ | `assignee` | `assignee` | Direct mapping |
412
+ | `dependencies` | Edges | Converted to OpenTasks edges |
413
+ | `comments` | Feedback nodes | Each comment becomes feedback |
414
+
415
+ #### Dependency Mapping
416
+
417
+ Beads dependencies map to OpenTasks edges:
418
+
419
+ | Beads Dependency | OpenTasks Edge | Direction |
420
+ |------------------|----------------|-----------|
421
+ | `blocks` | `blocks` | from → to |
422
+ | `parent-child` | `parent-of` | parent → child |
423
+ | `related` | `related` | bidirectional |
424
+ | `discovered-from` | `discovered-from` | from → to |
425
+
426
+ #### Implementation
427
+
428
+ ```typescript
429
+ class BeadsProvider implements ContentProvider {
430
+ private workspace: string
431
+
432
+ constructor(config: { workspace?: string }) {
433
+ this.workspace = config.workspace || process.cwd()
434
+ }
435
+
436
+ async get(id: string): Promise<ProviderNode | null> {
437
+ // Use `bd show <id> --json` or read directly from .beads/
438
+ const result = await exec(`bd show ${id} --json`, {
439
+ cwd: this.workspace
440
+ })
441
+ if (!result) return null
442
+ return this.toOpenTasks(JSON.parse(result))
443
+ }
444
+
445
+ async list(filter?: ProviderFilter): Promise<ProviderNode[]> {
446
+ // Use `bd list --json` with filters
447
+ const args = this.buildListArgs(filter)
448
+ const result = await exec(`bd list ${args} --json`, {
449
+ cwd: this.workspace
450
+ })
451
+ return JSON.parse(result).map(this.toOpenTasks)
452
+ }
453
+
454
+ async ready(): Promise<ProviderNode[]> {
455
+ // Use `bd ready --json`
456
+ const result = await exec('bd ready --json', {
457
+ cwd: this.workspace
458
+ })
459
+ return JSON.parse(result).map(this.toOpenTasks)
460
+ }
461
+
462
+ async create(input: CreateNodeInput): Promise<ProviderNode> {
463
+ // Use `bd new`
464
+ const result = await exec(
465
+ `bd new -t "${input.title}" -d "${input.content || ''}"`,
466
+ { cwd: this.workspace }
467
+ )
468
+ const id = this.parseCreatedId(result)
469
+ return this.get(id)
470
+ }
471
+
472
+ async update(id: string, updates: UpdateNodeInput): Promise<ProviderNode> {
473
+ // Use `bd update`
474
+ const args = this.buildUpdateArgs(updates)
475
+ await exec(`bd update ${id} ${args}`, { cwd: this.workspace })
476
+ return this.get(id)
477
+ }
478
+
479
+ watch(callback: (event: ProviderEvent) => void): Unsubscribe {
480
+ // Watch .beads/issues.jsonl for changes
481
+ const watcher = fs.watch(
482
+ path.join(this.workspace, '.beads', 'issues.jsonl'),
483
+ () => callback({ type: 'updated', uri: 'beads://*', timestamp: new Date().toISOString() })
484
+ )
485
+ return () => watcher.close()
486
+ }
487
+
488
+ toOpenTasks(bead: BeadsIssue): ProviderNode {
489
+ // Concatenate content fields
490
+ const contentParts = [
491
+ bead.description,
492
+ bead.design && `## Design\n\n${bead.design}`,
493
+ bead.acceptance_criteria && `## Acceptance Criteria\n\n${bead.acceptance_criteria}`,
494
+ bead.notes && `## Notes\n\n${bead.notes}`,
495
+ ].filter(Boolean)
496
+
497
+ return {
498
+ id: bead.id,
499
+ uri: `beads://${this.workspace}/${bead.id}`,
500
+ type: 'task',
501
+ title: bead.title,
502
+ content: contentParts.join('\n\n---\n\n'),
503
+ status: this.mapStatus(bead.status),
504
+ priority: bead.priority,
505
+ tags: bead.labels,
506
+ assignee: bead.assignee,
507
+ created_at: bead.created_at,
508
+ updated_at: bead.updated_at,
509
+ provider_data: {
510
+ issue_type: bead.issue_type,
511
+ estimated_minutes: bead.estimated_minutes,
512
+ dependencies: bead.dependencies,
513
+ }
514
+ }
515
+ }
516
+
517
+ private mapStatus(beadsStatus: string): string {
518
+ // Beads has more statuses; map to OpenTasks core set
519
+ const mapping: Record<string, string> = {
520
+ 'open': 'open',
521
+ 'in_progress': 'in_progress',
522
+ 'blocked': 'blocked',
523
+ 'deferred': 'blocked',
524
+ 'closed': 'closed',
525
+ 'tombstone': 'closed',
526
+ 'pinned': 'open',
527
+ 'hooked': 'blocked',
528
+ }
529
+ return mapping[beadsStatus] || beadsStatus
530
+ }
531
+ }
532
+ ```
533
+
534
+ #### Configuration
535
+
536
+ ```json
537
+ // .opentasks/config.json
538
+ {
539
+ "providers": {
540
+ "issues": {
541
+ "primary": "beads",
542
+ "beads": {
543
+ "workspace": ".",
544
+ "cli": "bd"
545
+ }
546
+ }
547
+ }
548
+ }
549
+ ```
550
+
551
+ ---
552
+
553
+ ### Linear Provider
554
+
555
+ [Linear](https://linear.app) is a project management tool with a GraphQL API.
556
+
557
+ ```typescript
558
+ interface LinearProvider extends ContentProvider {
559
+ name: 'linear'
560
+ schemes: ['linear']
561
+ nodeTypes: ['task']
562
+
563
+ capabilities: {
564
+ read: true,
565
+ write: true,
566
+ delete: false, // Linear doesn't support hard delete
567
+ search: true,
568
+ watch: true, // via webhooks
569
+ ready: false // no native "ready" concept
570
+ }
571
+ }
572
+ ```
573
+
574
+ #### URI Format
575
+
576
+ ```
577
+ linear://[team]/[id]
578
+
579
+ Examples:
580
+ linear://ENG/ENG-123
581
+ linear://PROD/PROD-456
582
+ ```
583
+
584
+ #### Field Mapping
585
+
586
+ | Linear Field | OpenTasks Field |
587
+ |--------------|-----------------|
588
+ | `id` | `id` |
589
+ | `identifier` | URI path (`ENG-123`) |
590
+ | `title` | `title` |
591
+ | `description` | `content` |
592
+ | `state.name` | `status` |
593
+ | `priority` | `priority` (mapped 0-4) |
594
+ | `labels` | `tags` |
595
+ | `assignee.name` | `assignee` |
596
+
597
+ ---
598
+
599
+ ### Native Task Provider
600
+
601
+ Fallback provider when no external task tracker is configured. Unlike external providers, native nodes are stored directly in `graph.jsonl` as `Task` type (not `ExternalNode`).
602
+
603
+ ```typescript
604
+ interface NativeTaskProvider extends ContentProvider {
605
+ name: 'native'
606
+ schemes: ['native', 'opentasks']
607
+ nodeTypes: ['task']
608
+
609
+ capabilities: {
610
+ read: true,
611
+ write: true,
612
+ delete: true,
613
+ search: true,
614
+ watch: true, // file watcher on graph.jsonl
615
+ ready: true // computed from edges
616
+ }
617
+ }
618
+ ```
619
+
620
+ **Storage**: Native tasks use the `Task` type directly in `graph.jsonl`:
621
+ ```json
622
+ {
623
+ "id": "t-x7k9",
624
+ "type": "task",
625
+ "title": "Implement feature",
626
+ "status": "open",
627
+ ...
628
+ }
629
+ ```
630
+
631
+ This is different from external providers, which create `ExternalNode` wrappers.
632
+
633
+ ---
634
+
635
+ ## Context Providers
636
+
637
+ ### Taskmaster Provider
638
+
639
+ [Taskmaster](https://github.com/eyaltoledano/claude-task-master) manages PRDs and breaks them into subtasks.
640
+
641
+ ```typescript
642
+ interface TaskmasterProvider extends ContentProvider {
643
+ name: 'taskmaster'
644
+ schemes: ['taskmaster', 'tm']
645
+ nodeTypes: ['context']
646
+
647
+ capabilities: {
648
+ read: true,
649
+ write: true,
650
+ delete: true,
651
+ search: true,
652
+ watch: true, // file watcher on tasks/
653
+ ready: false
654
+ }
655
+ }
656
+ ```
657
+
658
+ #### URI Format
659
+
660
+ ```
661
+ taskmaster://[project]/[id]
662
+
663
+ Examples:
664
+ taskmaster://./prd # Root PRD
665
+ taskmaster://./task-1 # Subtask
666
+ tm://task-1 # Short form
667
+ ```
668
+
669
+ #### Field Mapping
670
+
671
+ | Taskmaster Field | OpenTasks Field |
672
+ |------------------|-----------------|
673
+ | `id` | `id` |
674
+ | `title` | `title` |
675
+ | `description` | `content` |
676
+ | `status` | `status` |
677
+ | `priority` | `priority` |
678
+ | `dependencies` | Edges (`depends-on`) |
679
+ | `subtasks` | Child specs via `parent-of` edges |
680
+
681
+ #### Directory Structure
682
+
683
+ ```
684
+ tasks/
685
+ ├── tasks.json # Task definitions
686
+ ├── prd.txt # Product requirements document
687
+ └── complexity-report.json
688
+ ```
689
+
690
+ ---
691
+
692
+ ### Native Context Provider
693
+
694
+ Fallback provider for context when no external context tool is configured. Like native tasks, these are stored directly as `Context` type in `graph.jsonl`.
695
+
696
+ ```typescript
697
+ interface NativeContextProvider extends ContentProvider {
698
+ name: 'native'
699
+ schemes: ['native', 'opentasks']
700
+ nodeTypes: ['context']
701
+
702
+ capabilities: {
703
+ read: true,
704
+ write: true,
705
+ delete: true,
706
+ search: true,
707
+ watch: true, // file watcher on graph.jsonl
708
+ ready: false
709
+ }
710
+ }
711
+ ```
712
+
713
+ **Storage**: Native context use the `Context` type directly in `graph.jsonl`:
714
+ ```json
715
+ {
716
+ "id": "c-a2b3",
717
+ "type": "context",
718
+ "title": "Authentication requirements",
719
+ "content": "## Overview\n...",
720
+ ...
721
+ }
722
+ ```
723
+
724
+ ---
725
+
726
+ ## Provider Registry
727
+
728
+ The provider registry manages configured providers and routes operations.
729
+
730
+ ```typescript
731
+ interface ProviderRegistry {
732
+ /** Register a provider */
733
+ register(provider: ContentProvider): void
734
+
735
+ /** Get provider for a URI */
736
+ getProvider(uri: string): ContentProvider | null
737
+
738
+ /** Get provider by name */
739
+ getByName(name: string): ContentProvider | null
740
+
741
+ /** Get primary provider for a node type */
742
+ getPrimary(nodeType: 'context' | 'task'): ContentProvider
743
+
744
+ /** Get fallback provider for a node type */
745
+ getFallback(nodeType: 'context' | 'task'): ContentProvider
746
+
747
+ /** Resolve a URI to a node (with caching) */
748
+ resolve(uri: string, options?: ResolveOptions): Promise<ProviderNode | null>
749
+
750
+ /** List all registered providers */
751
+ list(): ContentProvider[]
752
+ }
753
+
754
+ interface ResolveOptions {
755
+ /** Skip cache and fetch fresh */
756
+ fresh?: boolean
757
+
758
+ /** Return cached even if stale */
759
+ allowStale?: boolean
760
+
761
+ /** Timeout for fetch */
762
+ timeout?: number
763
+ }
764
+ ```
765
+
766
+ ### Resolution Flow
767
+
768
+ ```typescript
769
+ async function resolve(uri: string, options?: ResolveOptions): Promise<ProviderNode | null> {
770
+ // 1. Check cache (unless fresh requested)
771
+ if (!options?.fresh) {
772
+ const cached = await cache.get(uri)
773
+ if (cached && (!cached.stale || options?.allowStale)) {
774
+ return cached.node
775
+ }
776
+ }
777
+
778
+ // 2. Find provider for URI scheme
779
+ const provider = registry.getProvider(uri)
780
+ if (!provider) {
781
+ // Return cached if available, even without provider
782
+ return cache.get(uri)?.node || null
783
+ }
784
+
785
+ // 3. Fetch from provider
786
+ const id = parseIdFromUri(uri)
787
+ const node = await provider.get(id)
788
+
789
+ // 4. Update cache
790
+ if (node) {
791
+ await cache.set(uri, node)
792
+ }
793
+
794
+ return node
795
+ }
796
+ ```
797
+
798
+ ---
799
+
800
+ ## Adapter Pattern
801
+
802
+ Adapters extend Providers with bidirectional sync capabilities. Use adapters when:
803
+ - Changes in OpenTasks should propagate to the external system
804
+ - The external system and OpenTasks need to stay in sync
805
+
806
+ ### Adapter Interface
807
+
808
+ ```typescript
809
+ /**
810
+ * Adapter extends Provider with write-back capabilities
811
+ */
812
+ interface ContentAdapter extends ContentProvider {
813
+ /** Adapter-specific capabilities */
814
+ readonly adapterCapabilities: AdapterCapabilities
815
+
816
+ // === Sync Operations ===
817
+
818
+ /** Push local changes to external system */
819
+ push(changes: ChangeSet): Promise<PushResult>
820
+
821
+ /** Pull and merge external changes */
822
+ pull(): Promise<PullResult>
823
+
824
+ /** Resolve sync conflicts */
825
+ resolveConflict?(conflict: SyncConflict): Promise<Resolution>
826
+
827
+ /** Get sync status */
828
+ syncStatus(): Promise<SyncStatus>
829
+ }
830
+
831
+ interface AdapterCapabilities {
832
+ /** Can push changes to external system */
833
+ pushEnabled: boolean
834
+
835
+ /** Can handle conflicts */
836
+ conflictResolution: boolean
837
+
838
+ /** Supports incremental sync */
839
+ incrementalSync: boolean
840
+
841
+ /** Supports webhooks for real-time sync */
842
+ webhooks: boolean
843
+ }
844
+
845
+ interface SyncConflict {
846
+ uri: string
847
+ localVersion: ProviderNode
848
+ remoteVersion: ProviderNode
849
+ conflictType: 'update' | 'delete' | 'create'
850
+ }
851
+
852
+ interface Resolution {
853
+ winner: 'local' | 'remote' | 'merged'
854
+ mergedNode?: ProviderNode
855
+ }
856
+
857
+ interface SyncStatus {
858
+ lastSync: string
859
+ pendingPush: number
860
+ pendingPull: number
861
+ conflicts: SyncConflict[]
862
+ }
863
+ ```
864
+
865
+ ### Conflict Resolution Strategies
866
+
867
+ | Strategy | Description | Use Case |
868
+ |----------|-------------|----------|
869
+ | `local-wins` | Local changes overwrite remote | OpenTasks is authoritative |
870
+ | `remote-wins` | Remote changes overwrite local | External system is authoritative |
871
+ | `last-write-wins` | Most recent `updated_at` wins | Simple merge |
872
+ | `manual` | Queue for user resolution | Critical data |
873
+ | `content-hash` | Skip if content identical | Avoid false conflicts |
874
+
875
+ ### Example: Linear Adapter
876
+
877
+ ```typescript
878
+ class LinearAdapter extends LinearProvider implements ContentAdapter {
879
+ readonly adapterCapabilities = {
880
+ pushEnabled: true,
881
+ conflictResolution: true,
882
+ incrementalSync: true,
883
+ webhooks: true
884
+ }
885
+
886
+ async push(changes: ChangeSet): Promise<PushResult> {
887
+ const results: PushResult = { success: [], failed: [] }
888
+
889
+ for (const change of changes.updates) {
890
+ try {
891
+ await this.linearClient.updateIssue(change.id, {
892
+ title: change.title,
893
+ description: change.content,
894
+ state: this.mapStatusToLinear(change.status)
895
+ })
896
+ results.success.push(change.uri)
897
+ } catch (err) {
898
+ results.failed.push({ uri: change.uri, error: err })
899
+ }
900
+ }
901
+
902
+ return results
903
+ }
904
+
905
+ async pull(): Promise<PullResult> {
906
+ const since = await this.getLastSyncTimestamp()
907
+ const remoteChanges = await this.linearClient.issues({
908
+ filter: { updatedAt: { gte: since } }
909
+ })
910
+
911
+ return {
912
+ changes: remoteChanges.map(this.toOpenTasks),
913
+ syncTimestamp: new Date().toISOString()
914
+ }
915
+ }
916
+ }
917
+ ```
918
+
919
+ ---
920
+
921
+ ## SyncTarget Pattern
922
+
923
+ SyncTargets are write-only integrations where OpenTasks is the source of truth.
924
+
925
+ ```typescript
926
+ interface SyncTarget {
927
+ readonly name: string
928
+ readonly schemes: string[]
929
+
930
+ /** Export nodes to target system */
931
+ export(nodes: Node[]): Promise<ExportResult>
932
+
933
+ /** Map OpenTasks node to target format */
934
+ toTargetFormat(node: Node): unknown
935
+
936
+ /** Get export status */
937
+ exportStatus(): Promise<ExportStatus>
938
+ }
939
+ ```
940
+
941
+ Use SyncTargets for:
942
+ - Exporting to read-only systems (static sites, docs)
943
+ - One-way mirroring to backup systems
944
+ - Publishing to external trackers
945
+
946
+ ---
947
+
948
+ ## Node Registry & ExternalNodes
949
+
950
+ The node registry bridges provider URIs to the OpenTasks graph. When an edge references an external URI, the registry manages the corresponding `ExternalNode`.
951
+
952
+ ### Relationship to ExternalNode
953
+
954
+ ```
955
+ ┌─────────────────────────────────────────────────────────────────┐
956
+ │ Edge │
957
+ │ { from_id: "t-local", to_id: "beads://./bd-123", type: "..." } │
958
+ └─────────────────────────────────────────────────────────────────┘
959
+
960
+
961
+ ┌─────────────────────────────────────────────────────────────────┐
962
+ │ Node Registry │
963
+ │ - Looks up or creates ExternalNode for "beads://./bd-123" │
964
+ │ - Manages materialization state │
965
+ │ - Coordinates with Provider for fetching │
966
+ └─────────────────────────────────────────────────────────────────┘
967
+
968
+
969
+ ┌─────────────────────────────────────────────────────────────────┐
970
+ │ ExternalNode (in graph.jsonl) │
971
+ │ { │
972
+ │ "id": "e-p6q7", │
973
+ │ "type": "external", │
974
+ │ "uri": "beads://./bd-123", │
975
+ │ "source": "beads", │
976
+ │ "materialized": true, │
977
+ │ "title": "Fix login bug", // cached from provider │
978
+ │ "external_data": { ... } // provider-specific data │
979
+ │ } │
980
+ └─────────────────────────────────────────────────────────────────┘
981
+ ```
982
+
983
+ ### Registry Interface
984
+
985
+ ```typescript
986
+ interface NodeRegistry {
987
+ /** Get or create ExternalNode for a URI */
988
+ ensureNode(uri: string): Promise<ExternalNode>
989
+
990
+ /** Get ExternalNode by URI (returns null if not registered) */
991
+ get(uri: string): Promise<ExternalNode | null>
992
+
993
+ /** Materialize a phantom node (fetch from provider) */
994
+ materialize(uri: string, options?: MaterializeOptions): Promise<ExternalNode>
995
+
996
+ /** Mark node as stale (needs refresh) */
997
+ markStale(uri: string): Promise<void>
998
+
999
+ /** List all external nodes */
1000
+ list(filter?: RegistryFilter): Promise<ExternalNode[]>
1001
+
1002
+ /** Remove ExternalNode (and its edges) */
1003
+ remove(uri: string): Promise<void>
1004
+ }
1005
+
1006
+ interface MaterializeOptions {
1007
+ /** Force refresh even if cached */
1008
+ force?: boolean
1009
+
1010
+ /** Timeout for provider fetch */
1011
+ timeout?: number
1012
+
1013
+ /** Depth to follow nested references */
1014
+ depth?: number
1015
+ }
1016
+
1017
+ interface RegistryFilter {
1018
+ /** Filter by provider */
1019
+ provider?: string
1020
+
1021
+ /** Filter by materialization state */
1022
+ materialized?: boolean
1023
+
1024
+ /** Filter by stale state */
1025
+ stale?: boolean
1026
+
1027
+ /** Filter by source type */
1028
+ source?: string
1029
+ }
1030
+ ```
1031
+
1032
+ ### Storage
1033
+
1034
+ ExternalNodes are stored in `graph.jsonl` alongside other node types (see [SCHEMA.md](./SCHEMA.md)):
1035
+
1036
+ ```jsonl
1037
+ {"id":"e-x7k9","uuid":"...","type":"external","title":"Implement auth","uri":"beads://./bd-x7k9","source":"beads","materialized":true,"cached_at":"2025-01-26T12:00:00Z","external_data":{"status":"in_progress"},"created_at":"2025-01-26T10:00:00Z","updated_at":"2025-01-26T12:00:00Z"}
1038
+ {"id":"e-prd1","uuid":"...","type":"external","title":"Authentication PRD","uri":"taskmaster://./prd-1","source":"taskmaster","materialized":true,"cached_at":"2025-01-26T12:00:00Z","created_at":"2025-01-26T10:00:00Z","updated_at":"2025-01-26T12:00:00Z"}
1039
+ {"id":"e-jira","uuid":"...","type":"external","title":"","uri":"jira://PROJ-123","source":"jira","materialized":false,"created_at":"2025-01-26T10:00:00Z","updated_at":"2025-01-26T10:00:00Z"}
1040
+ ```
1041
+
1042
+ **Key points:**
1043
+ - `materialized: false` indicates a phantom node (just the reference, no data)
1044
+ - `external_data` contains provider-specific fields
1045
+ - `cached_at` tracks freshness
1046
+ - Standard `id`, `uuid`, `created_at`, `updated_at` fields like other nodes
1047
+
1048
+ ---
1049
+
1050
+ ## Cache Strategy
1051
+
1052
+ ### Cache Layers
1053
+
1054
+ ```
1055
+ ┌─────────────────────────────────────────────────────────────────┐
1056
+ │ Application / Client │
1057
+ └─────────────────────────────────────────────────────────────────┘
1058
+
1059
+
1060
+ ┌─────────────────────────────────────────────────────────────────┐
1061
+ │ Daemon (coordinator) │
1062
+ │ - Routes requests to appropriate cache/provider │
1063
+ │ - Manages materialization │
1064
+ │ - Handles cross-location resolution │
1065
+ └─────────────────────────────────────────────────────────────────┘
1066
+
1067
+
1068
+ ┌─────────────────────────────────────────────────────────────────┐
1069
+ │ ExternalNodes (in graph.jsonl) │
1070
+ │ - Persistent cache of external data │
1071
+ │ - Title, external_data for display │
1072
+ │ - Tracked materialization/stale state │
1073
+ └─────────────────────────────────────────────────────────────────┘
1074
+
1075
+
1076
+ ┌─────────────────────────────────────────────────────────────────┐
1077
+ │ SQLite Index (cache.db) │
1078
+ │ - Fast lookups and queries │
1079
+ │ - Query indexes over graph.jsonl │
1080
+ │ - Gitignored (can be rebuilt) │
1081
+ └─────────────────────────────────────────────────────────────────┘
1082
+
1083
+
1084
+ ┌─────────────────────────────────────────────────────────────────┐
1085
+ │ Provider (source of truth) │
1086
+ │ - Beads: .beads/issues.jsonl │
1087
+ │ - Taskmaster: tasks/tasks.json │
1088
+ │ - Linear: GraphQL API │
1089
+ └─────────────────────────────────────────────────────────────────┘
1090
+ ```
1091
+
1092
+ **Important**: ExternalNodes in `graph.jsonl` are the persistent cache. The SQLite `cache.db` is an index/query accelerator that can be rebuilt from the JSONL files.
1093
+
1094
+ ### Cache Invalidation
1095
+
1096
+ ```typescript
1097
+ interface CacheConfig {
1098
+ /** Default TTL for cached nodes (ms) */
1099
+ defaultTtl: number // default: 300000 (5 minutes)
1100
+
1101
+ /** TTL overrides per provider */
1102
+ providerTtl?: Record<string, number>
1103
+
1104
+ /** Stale-while-revalidate window (ms) */
1105
+ staleWhileRevalidate: number // default: 60000 (1 minute)
1106
+
1107
+ /** Maximum cache size (entries) */
1108
+ maxSize: number // default: 10000
1109
+ }
1110
+
1111
+ // Invalidation triggers:
1112
+ // 1. TTL expiry
1113
+ // 2. Provider watch event
1114
+ // 3. Manual invalidation (user request)
1115
+ // 4. Write operation to same node
1116
+ ```
1117
+
1118
+ ### Watch-Based Invalidation
1119
+
1120
+ When a provider supports `watch()`, OpenTasks subscribes to changes:
1121
+
1122
+ ```typescript
1123
+ // On startup, subscribe to provider changes
1124
+ for (const provider of registry.list()) {
1125
+ if (provider.capabilities.watch && provider.watch) {
1126
+ provider.watch((event) => {
1127
+ // Invalidate cache for changed node
1128
+ cache.markStale(event.uri)
1129
+
1130
+ // Optionally refresh immediately
1131
+ if (config.eagerRefresh) {
1132
+ registry.resolve(event.uri, { fresh: true })
1133
+ }
1134
+ })
1135
+ }
1136
+ }
1137
+ ```
1138
+
1139
+ ---
1140
+
1141
+ ## Configuration
1142
+
1143
+ ### Provider Configuration
1144
+
1145
+ ```json
1146
+ // .opentasks/config.json
1147
+ {
1148
+ "version": "1.0",
1149
+
1150
+ "providers": {
1151
+ "issues": {
1152
+ "primary": "beads",
1153
+ "fallback": "native",
1154
+ "beads": {
1155
+ "workspace": ".",
1156
+ "cli": "bd"
1157
+ },
1158
+ "linear": {
1159
+ "api_key": "${LINEAR_API_KEY}",
1160
+ "team": "ENG"
1161
+ }
1162
+ },
1163
+ "context": {
1164
+ "primary": "taskmaster",
1165
+ "fallback": "native",
1166
+ "taskmaster": {
1167
+ "project": "."
1168
+ }
1169
+ }
1170
+ },
1171
+
1172
+ "cache": {
1173
+ "default_ttl": 300000,
1174
+ "stale_while_revalidate": 60000,
1175
+ "max_size": 10000,
1176
+ "provider_ttl": {
1177
+ "linear": 60000,
1178
+ "beads": 0
1179
+ }
1180
+ },
1181
+
1182
+ "sync": {
1183
+ "watch": true,
1184
+ "debounce": 1000
1185
+ }
1186
+ }
1187
+ ```
1188
+
1189
+ ### Environment Variables
1190
+
1191
+ ```bash
1192
+ # Provider API keys
1193
+ export LINEAR_API_KEY=lin_api_xxxxx
1194
+ export JIRA_API_TOKEN=xxxxx
1195
+
1196
+ # Override primary providers
1197
+ export OPENTASKS_ISSUE_PROVIDER=linear
1198
+ export OPENTASKS_SPEC_PROVIDER=native
1199
+
1200
+ # Disable caching (for debugging)
1201
+ export OPENTASKS_NO_CACHE=1
1202
+ ```
1203
+
1204
+ ---
1205
+
1206
+ ## Cross-Provider Edges
1207
+
1208
+ Edges can connect nodes from different providers:
1209
+
1210
+ ```typescript
1211
+ // Context from Taskmaster implements Task from Beads
1212
+ {
1213
+ id: "x-abc123",
1214
+ from_id: "beads://./bd-x7k9",
1215
+ to_id: "taskmaster://./prd-1",
1216
+ type: "implements"
1217
+ }
1218
+
1219
+ // Native context blocks Beads issue
1220
+ {
1221
+ id: "x-def456",
1222
+ from_id: "native://c-local",
1223
+ to_id: "beads://./bd-y8z9",
1224
+ type: "blocks"
1225
+ }
1226
+ ```
1227
+
1228
+ ### Cross-Provider Queries
1229
+
1230
+ ```typescript
1231
+ // Get all tasks implementing a context (across providers)
1232
+ async function getImplementingIssues(specUri: string): Promise<ProviderNode[]> {
1233
+ // 1. Get edges from this context
1234
+ const edges = await edgeStore.query({
1235
+ to_id: specUri,
1236
+ type: 'implements'
1237
+ })
1238
+
1239
+ // 2. Resolve each source node (may be from different providers)
1240
+ return Promise.all(
1241
+ edges.map(edge => registry.resolve(edge.from_id))
1242
+ )
1243
+ }
1244
+
1245
+ // Get blockers for a task (may include context and tasks)
1246
+ async function getBlockers(issueUri: string): Promise<ProviderNode[]> {
1247
+ const edges = await edgeStore.query({
1248
+ to_id: issueUri,
1249
+ type: 'blocks'
1250
+ })
1251
+
1252
+ return Promise.all(
1253
+ edges.map(edge => registry.resolve(edge.from_id))
1254
+ )
1255
+ }
1256
+ ```
1257
+
1258
+ ---
1259
+
1260
+ ## Ready Query
1261
+
1262
+ The `ready()` query finds nodes that are ready to work on. This requires checking cross-provider blocking relationships.
1263
+
1264
+ ```typescript
1265
+ async function ready(): Promise<ProviderNode[]> {
1266
+ // 1. Get all open tasks from primary provider
1267
+ const provider = registry.getPrimary('task')
1268
+ let candidates: ProviderNode[]
1269
+
1270
+ if (provider.capabilities.ready && provider.ready) {
1271
+ // Provider has native ready support (e.g., Beads `bd ready`)
1272
+ candidates = await provider.ready()
1273
+ } else {
1274
+ // Fall back to listing open tasks
1275
+ candidates = await provider.list({ status: 'open' })
1276
+ }
1277
+
1278
+ // 2. Filter by OpenTasks edges (cross-provider blockers)
1279
+ const ready: ProviderNode[] = []
1280
+
1281
+ for (const candidate of candidates) {
1282
+ const blockers = await edgeStore.query({
1283
+ to_id: candidate.uri,
1284
+ type: 'blocks'
1285
+ })
1286
+
1287
+ // Check if all blockers are resolved
1288
+ const unresolvedBlockers = await Promise.all(
1289
+ blockers.map(async (edge) => {
1290
+ const blocker = await registry.resolve(edge.from_id)
1291
+ return blocker && blocker.status !== 'closed'
1292
+ })
1293
+ )
1294
+
1295
+ if (!unresolvedBlockers.some(Boolean)) {
1296
+ ready.push(candidate)
1297
+ }
1298
+ }
1299
+
1300
+ return ready
1301
+ }
1302
+ ```
1303
+
1304
+ ---
1305
+
1306
+ ## Adding a New Provider
1307
+
1308
+ To add a new provider:
1309
+
1310
+ 1. **Implement the interface**
1311
+
1312
+ ```typescript
1313
+ class MyProvider implements ContentProvider {
1314
+ name = 'myprovider'
1315
+ schemes = ['myprovider', 'mp']
1316
+ nodeTypes = ['task'] // or ['context'] or both
1317
+
1318
+ capabilities = {
1319
+ read: true,
1320
+ write: true,
1321
+ delete: false,
1322
+ search: true,
1323
+ watch: false,
1324
+ ready: false
1325
+ }
1326
+
1327
+ async get(id: string): Promise<ProviderNode | null> {
1328
+ // Implement fetching
1329
+ }
1330
+
1331
+ async list(filter?: ProviderFilter): Promise<ProviderNode[]> {
1332
+ // Implement listing
1333
+ }
1334
+
1335
+ toOpenTasks(native: MyNativeFormat): ProviderNode {
1336
+ // Implement mapping
1337
+ }
1338
+
1339
+ fromOpenTasks(node: ProviderNode): MyNativeFormat {
1340
+ // Implement reverse mapping
1341
+ }
1342
+ }
1343
+ ```
1344
+
1345
+ 2. **Register the provider**
1346
+
1347
+ ```typescript
1348
+ import { registry } from 'opentasks'
1349
+
1350
+ registry.register(new MyProvider())
1351
+ ```
1352
+
1353
+ 3. **Configure in config.json**
1354
+
1355
+ ```json
1356
+ {
1357
+ "providers": {
1358
+ "issues": {
1359
+ "primary": "myprovider",
1360
+ "myprovider": {
1361
+ "api_key": "${MY_API_KEY}"
1362
+ }
1363
+ }
1364
+ }
1365
+ }
1366
+ ```
1367
+
1368
+ ---
1369
+
1370
+ ## Analogous Systems
1371
+
1372
+ The federated graph model draws inspiration from:
1373
+
1374
+ | System | Pattern | Similarity |
1375
+ |--------|---------|------------|
1376
+ | **RDF/Linked Data** | URIs reference external resources | Node URIs can point anywhere |
1377
+ | **GraphQL Federation** | Gateway stitches across services | OpenTasks stitches across providers |
1378
+ | **Git Object Model** | Trees (structure) separate from blobs (content) | Edges separate from node content |
1379
+ | **Neo4j + MongoDB** | Graph DB for relationships, doc DB for content | OpenTasks for graph, providers for content |
1380
+ | **Kubernetes + External Secrets** | K8s references, external systems own data | OpenTasks references, providers own data |
1381
+
1382
+ ---
1383
+
1384
+ ## Open Questions
1385
+
1386
+ ### Resolved
1387
+ - [x] **Provider discovery**: Providers configured in `.opentasks/config.json`; auto-detection is optional enhancement
1388
+ - [x] **Bidirectional edges**: Providers don't need to know about OpenTasks edges; edges are OpenTasks-owned
1389
+
1390
+ ### Open
1391
+ - [ ] **Multi-workspace**: How to handle multiple Beads workspaces in same project? Multiple provider instances?
1392
+ - [ ] **Conflict resolution**: When edge says "blocks" but provider says "closed"? Trust provider status, mark edge stale?
1393
+ - [ ] **Provider versioning**: How to handle provider schema changes? Migration scripts per provider?
1394
+ - [ ] **Adapter sync frequency**: How often should adapters sync? Event-driven vs polling vs manual?
1395
+ - [ ] **Cross-location providers**: Can a provider span multiple locations? Or one provider instance per location?
1396
+ - [ ] **Provider health checks**: Should daemon periodically verify provider availability?
1397
+ - [ ] **Materialization depth**: When materializing, how deep to follow nested external references?
1398
+
1399
+ ---
1400
+
1401
+ ## References
1402
+
1403
+ ### External
1404
+ - [Beads Documentation](https://github.com/steveyegge/beads)
1405
+ - [Taskmaster Documentation](https://github.com/eyaltoledano/claude-task-master)
1406
+ - [Linear API](https://developers.linear.app/docs)
1407
+
1408
+ ### Internal
1409
+ - [DESIGN.md](./DESIGN.md) — Design rationale and core concepts
1410
+ - [SCHEMA.md](./SCHEMA.md) — Data model (ExternalNode, edges)
1411
+ - [PERSISTENCE.md](./PERSISTENCE.md) — Storage layer and sync
1412
+ - [ARCHITECTURE.md](./ARCHITECTURE.md) — Daemon, locations, URIs