@plazmodium/odin 0.3.2-beta

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 (219) hide show
  1. package/README.md +306 -0
  2. package/dist/adapters/archive/supabase.d.ts +19 -0
  3. package/dist/adapters/archive/supabase.d.ts.map +1 -0
  4. package/dist/adapters/archive/supabase.js +121 -0
  5. package/dist/adapters/archive/supabase.js.map +1 -0
  6. package/dist/adapters/archive/types.d.ts +26 -0
  7. package/dist/adapters/archive/types.d.ts.map +1 -0
  8. package/dist/adapters/archive/types.js +6 -0
  9. package/dist/adapters/archive/types.js.map +1 -0
  10. package/dist/adapters/formal-verification/tla-precheck.d.ts +22 -0
  11. package/dist/adapters/formal-verification/tla-precheck.d.ts.map +1 -0
  12. package/dist/adapters/formal-verification/tla-precheck.js +270 -0
  13. package/dist/adapters/formal-verification/tla-precheck.js.map +1 -0
  14. package/dist/adapters/formal-verification/types.d.ts +37 -0
  15. package/dist/adapters/formal-verification/types.d.ts.map +1 -0
  16. package/dist/adapters/formal-verification/types.js +6 -0
  17. package/dist/adapters/formal-verification/types.js.map +1 -0
  18. package/dist/adapters/review/semgrep.d.ts +12 -0
  19. package/dist/adapters/review/semgrep.d.ts.map +1 -0
  20. package/dist/adapters/review/semgrep.js +175 -0
  21. package/dist/adapters/review/semgrep.js.map +1 -0
  22. package/dist/adapters/review/types.d.ts +14 -0
  23. package/dist/adapters/review/types.d.ts.map +1 -0
  24. package/dist/adapters/review/types.js +6 -0
  25. package/dist/adapters/review/types.js.map +1 -0
  26. package/dist/adapters/skills/filesystem.d.ts +18 -0
  27. package/dist/adapters/skills/filesystem.d.ts.map +1 -0
  28. package/dist/adapters/skills/filesystem.js +398 -0
  29. package/dist/adapters/skills/filesystem.js.map +1 -0
  30. package/dist/adapters/skills/types.d.ts +19 -0
  31. package/dist/adapters/skills/types.d.ts.map +1 -0
  32. package/dist/adapters/skills/types.js +6 -0
  33. package/dist/adapters/skills/types.js.map +1 -0
  34. package/dist/adapters/sql-executor/direct-postgres.d.ts +15 -0
  35. package/dist/adapters/sql-executor/direct-postgres.d.ts.map +1 -0
  36. package/dist/adapters/sql-executor/direct-postgres.js +33 -0
  37. package/dist/adapters/sql-executor/direct-postgres.js.map +1 -0
  38. package/dist/adapters/sql-executor/supabase-management-api.d.ts +17 -0
  39. package/dist/adapters/sql-executor/supabase-management-api.d.ts.map +1 -0
  40. package/dist/adapters/sql-executor/supabase-management-api.js +40 -0
  41. package/dist/adapters/sql-executor/supabase-management-api.js.map +1 -0
  42. package/dist/adapters/sql-executor/types.d.ts +15 -0
  43. package/dist/adapters/sql-executor/types.d.ts.map +1 -0
  44. package/dist/adapters/sql-executor/types.js +6 -0
  45. package/dist/adapters/sql-executor/types.js.map +1 -0
  46. package/dist/adapters/workflow-state/in-memory.d.ts +69 -0
  47. package/dist/adapters/workflow-state/in-memory.d.ts.map +1 -0
  48. package/dist/adapters/workflow-state/in-memory.js +444 -0
  49. package/dist/adapters/workflow-state/in-memory.js.map +1 -0
  50. package/dist/adapters/workflow-state/supabase.d.ts +55 -0
  51. package/dist/adapters/workflow-state/supabase.d.ts.map +1 -0
  52. package/dist/adapters/workflow-state/supabase.js +823 -0
  53. package/dist/adapters/workflow-state/supabase.js.map +1 -0
  54. package/dist/adapters/workflow-state/types.d.ts +55 -0
  55. package/dist/adapters/workflow-state/types.d.ts.map +1 -0
  56. package/dist/adapters/workflow-state/types.js +6 -0
  57. package/dist/adapters/workflow-state/types.js.map +1 -0
  58. package/dist/cli.d.ts +3 -0
  59. package/dist/cli.d.ts.map +1 -0
  60. package/dist/cli.js +52 -0
  61. package/dist/cli.js.map +1 -0
  62. package/dist/config.d.ts +44 -0
  63. package/dist/config.d.ts.map +1 -0
  64. package/dist/config.js +115 -0
  65. package/dist/config.js.map +1 -0
  66. package/dist/domain/actors.d.ts +10 -0
  67. package/dist/domain/actors.d.ts.map +1 -0
  68. package/dist/domain/actors.js +60 -0
  69. package/dist/domain/actors.js.map +1 -0
  70. package/dist/domain/development-evals.d.ts +9 -0
  71. package/dist/domain/development-evals.d.ts.map +1 -0
  72. package/dist/domain/development-evals.js +164 -0
  73. package/dist/domain/development-evals.js.map +1 -0
  74. package/dist/domain/matching.d.ts +8 -0
  75. package/dist/domain/matching.d.ts.map +1 -0
  76. package/dist/domain/matching.js +24 -0
  77. package/dist/domain/matching.js.map +1 -0
  78. package/dist/domain/phases.d.ts +10 -0
  79. package/dist/domain/phases.d.ts.map +1 -0
  80. package/dist/domain/phases.js +165 -0
  81. package/dist/domain/phases.js.map +1 -0
  82. package/dist/domain/quality-gates.d.ts +7 -0
  83. package/dist/domain/quality-gates.d.ts.map +1 -0
  84. package/dist/domain/quality-gates.js +8 -0
  85. package/dist/domain/quality-gates.js.map +1 -0
  86. package/dist/domain/resonance.d.ts +33 -0
  87. package/dist/domain/resonance.d.ts.map +1 -0
  88. package/dist/domain/resonance.js +100 -0
  89. package/dist/domain/resonance.js.map +1 -0
  90. package/dist/domain/tasks.d.ts +9 -0
  91. package/dist/domain/tasks.d.ts.map +1 -0
  92. package/dist/domain/tasks.js +57 -0
  93. package/dist/domain/tasks.js.map +1 -0
  94. package/dist/init.d.ts +7 -0
  95. package/dist/init.d.ts.map +1 -0
  96. package/dist/init.js +387 -0
  97. package/dist/init.js.map +1 -0
  98. package/dist/schemas.d.ts +366 -0
  99. package/dist/schemas.d.ts.map +1 -0
  100. package/dist/schemas.js +184 -0
  101. package/dist/schemas.js.map +1 -0
  102. package/dist/server.d.ts +7 -0
  103. package/dist/server.d.ts.map +1 -0
  104. package/dist/server.js +243 -0
  105. package/dist/server.js.map +1 -0
  106. package/dist/tools/apply-migrations.d.ts +21 -0
  107. package/dist/tools/apply-migrations.d.ts.map +1 -0
  108. package/dist/tools/apply-migrations.js +286 -0
  109. package/dist/tools/apply-migrations.js.map +1 -0
  110. package/dist/tools/archive-feature-release.d.ts +13 -0
  111. package/dist/tools/archive-feature-release.d.ts.map +1 -0
  112. package/dist/tools/archive-feature-release.js +182 -0
  113. package/dist/tools/archive-feature-release.js.map +1 -0
  114. package/dist/tools/capture-learning.d.ts +9 -0
  115. package/dist/tools/capture-learning.d.ts.map +1 -0
  116. package/dist/tools/capture-learning.js +53 -0
  117. package/dist/tools/capture-learning.js.map +1 -0
  118. package/dist/tools/explore-knowledge.d.ts +9 -0
  119. package/dist/tools/explore-knowledge.d.ts.map +1 -0
  120. package/dist/tools/explore-knowledge.js +142 -0
  121. package/dist/tools/explore-knowledge.js.map +1 -0
  122. package/dist/tools/get-claims-needing-review.d.ts +8 -0
  123. package/dist/tools/get-claims-needing-review.d.ts.map +1 -0
  124. package/dist/tools/get-claims-needing-review.js +21 -0
  125. package/dist/tools/get-claims-needing-review.js.map +1 -0
  126. package/dist/tools/get-development-eval-status.d.ts +8 -0
  127. package/dist/tools/get-development-eval-status.d.ts.map +1 -0
  128. package/dist/tools/get-development-eval-status.js +49 -0
  129. package/dist/tools/get-development-eval-status.js.map +1 -0
  130. package/dist/tools/get-feature-status.d.ts +8 -0
  131. package/dist/tools/get-feature-status.d.ts.map +1 -0
  132. package/dist/tools/get-feature-status.js +68 -0
  133. package/dist/tools/get-feature-status.js.map +1 -0
  134. package/dist/tools/get-next-phase.d.ts +8 -0
  135. package/dist/tools/get-next-phase.d.ts.map +1 -0
  136. package/dist/tools/get-next-phase.js +26 -0
  137. package/dist/tools/get-next-phase.js.map +1 -0
  138. package/dist/tools/prepare-phase-context.d.ts +9 -0
  139. package/dist/tools/prepare-phase-context.d.ts.map +1 -0
  140. package/dist/tools/prepare-phase-context.js +151 -0
  141. package/dist/tools/prepare-phase-context.js.map +1 -0
  142. package/dist/tools/record-commit.d.ts +8 -0
  143. package/dist/tools/record-commit.d.ts.map +1 -0
  144. package/dist/tools/record-commit.js +28 -0
  145. package/dist/tools/record-commit.js.map +1 -0
  146. package/dist/tools/record-eval-plan.d.ts +8 -0
  147. package/dist/tools/record-eval-plan.d.ts.map +1 -0
  148. package/dist/tools/record-eval-plan.js +40 -0
  149. package/dist/tools/record-eval-plan.js.map +1 -0
  150. package/dist/tools/record-eval-run.d.ts +8 -0
  151. package/dist/tools/record-eval-run.d.ts.map +1 -0
  152. package/dist/tools/record-eval-run.js +42 -0
  153. package/dist/tools/record-eval-run.js.map +1 -0
  154. package/dist/tools/record-merge.d.ts +8 -0
  155. package/dist/tools/record-merge.d.ts.map +1 -0
  156. package/dist/tools/record-merge.js +16 -0
  157. package/dist/tools/record-merge.js.map +1 -0
  158. package/dist/tools/record-phase-artifact.d.ts +8 -0
  159. package/dist/tools/record-phase-artifact.d.ts.map +1 -0
  160. package/dist/tools/record-phase-artifact.js +26 -0
  161. package/dist/tools/record-phase-artifact.js.map +1 -0
  162. package/dist/tools/record-phase-result.d.ts +9 -0
  163. package/dist/tools/record-phase-result.d.ts.map +1 -0
  164. package/dist/tools/record-phase-result.js +122 -0
  165. package/dist/tools/record-phase-result.js.map +1 -0
  166. package/dist/tools/record-pull-request.d.ts +8 -0
  167. package/dist/tools/record-pull-request.d.ts.map +1 -0
  168. package/dist/tools/record-pull-request.js +16 -0
  169. package/dist/tools/record-pull-request.js.map +1 -0
  170. package/dist/tools/record-quality-gate.d.ts +8 -0
  171. package/dist/tools/record-quality-gate.d.ts.map +1 -0
  172. package/dist/tools/record-quality-gate.js +26 -0
  173. package/dist/tools/record-quality-gate.js.map +1 -0
  174. package/dist/tools/record-watcher-review.d.ts +8 -0
  175. package/dist/tools/record-watcher-review.d.ts.map +1 -0
  176. package/dist/tools/record-watcher-review.js +18 -0
  177. package/dist/tools/record-watcher-review.js.map +1 -0
  178. package/dist/tools/run-policy-checks.d.ts +8 -0
  179. package/dist/tools/run-policy-checks.d.ts.map +1 -0
  180. package/dist/tools/run-policy-checks.js +38 -0
  181. package/dist/tools/run-policy-checks.js.map +1 -0
  182. package/dist/tools/run-review-checks.d.ts +9 -0
  183. package/dist/tools/run-review-checks.d.ts.map +1 -0
  184. package/dist/tools/run-review-checks.js +45 -0
  185. package/dist/tools/run-review-checks.js.map +1 -0
  186. package/dist/tools/start-feature.d.ts +8 -0
  187. package/dist/tools/start-feature.d.ts.map +1 -0
  188. package/dist/tools/start-feature.js +33 -0
  189. package/dist/tools/start-feature.js.map +1 -0
  190. package/dist/tools/submit-claim.d.ts +8 -0
  191. package/dist/tools/submit-claim.d.ts.map +1 -0
  192. package/dist/tools/submit-claim.js +45 -0
  193. package/dist/tools/submit-claim.js.map +1 -0
  194. package/dist/tools/verify-claims.d.ts +8 -0
  195. package/dist/tools/verify-claims.d.ts.map +1 -0
  196. package/dist/tools/verify-claims.js +39 -0
  197. package/dist/tools/verify-claims.js.map +1 -0
  198. package/dist/tools/verify-design.d.ts +8 -0
  199. package/dist/tools/verify-design.d.ts.map +1 -0
  200. package/dist/tools/verify-design.js +31 -0
  201. package/dist/tools/verify-design.js.map +1 -0
  202. package/dist/types.d.ts +333 -0
  203. package/dist/types.d.ts.map +1 -0
  204. package/dist/types.js +52 -0
  205. package/dist/types.js.map +1 -0
  206. package/dist/utils.d.ts +24 -0
  207. package/dist/utils.d.ts.map +1 -0
  208. package/dist/utils.js +50 -0
  209. package/dist/utils.js.map +1 -0
  210. package/migrations/001_schema.sql +795 -0
  211. package/migrations/002_functions.sql +2126 -0
  212. package/migrations/003_views.sql +599 -0
  213. package/migrations/004_seed.sql +106 -0
  214. package/migrations/005_odin_v2_schema.sql +217 -0
  215. package/migrations/006_odin_v2_functions.sql +671 -0
  216. package/migrations/007_odin_v2_phase_alignment.sql +554 -0
  217. package/migrations/008_related_learnings.sql +80 -0
  218. package/migrations/README.md +23 -0
  219. package/package.json +63 -0
package/README.md ADDED
@@ -0,0 +1,306 @@
1
+ # Odin Runtime
2
+
3
+ A single-install MCP server that gives your AI coding agent an 11-phase development workflow with built-in quality gates, skill resolution, review checks, learnings, and release archival.
4
+
5
+ ## Quick Start
6
+
7
+ ### 1. Install
8
+
9
+ Preferred published-package flow after the first npm publish:
10
+
11
+ ```bash
12
+ npx -y @plazmodium/odin init --project-root /path/to/your/project --tool opencode --write-mcp
13
+ ```
14
+
15
+ Current repo-checkout flow that works today:
16
+
17
+ ```bash
18
+ cd runtime
19
+ npm install
20
+ npm run build
21
+ ```
22
+
23
+ ### 2. Bootstrap your project
24
+
25
+ ```bash
26
+ # Published-package MCP command snippets after the first npm publish
27
+ npx -y @plazmodium/odin init --project-root /path/to/your/project --tool amp --write-mcp
28
+ npx -y @plazmodium/odin init --project-root /path/to/your/project --tool opencode --write-mcp
29
+
30
+ # Source-checkout snippets while working from odin-workflow today
31
+ npm run init:project -- --project-root /path/to/your/project --tool amp --distribution source --write-mcp
32
+ npm run init:project -- --project-root /path/to/your/project --tool codex --distribution source --write-mcp
33
+ ```
34
+
35
+ This creates:
36
+ - `.odin/config.yaml` — runtime configuration (commit this)
37
+ - `.odin/skills/` — project-local skill overrides (commit this)
38
+ - `.env.example` — required environment variables (commit this)
39
+ - Your harness config file (`opencode.json`, `.mcp.json`, or `.codex/config.toml`, depending on tool)
40
+
41
+ Important: Odin bootstraps with `runtime.mode: in_memory` by default so MCP wiring can work without external services. Switch `.odin/config.yaml` to `runtime.mode: supabase` when you are ready for persistent workflow state.
42
+
43
+ Until `@plazmodium/odin` is actually published, use the repo-checkout `--distribution source` flow shown above.
44
+
45
+ If you are the maintainer preparing that publish, use [`../docs/guides/NPM-PUBLISH.md`](../docs/guides/NPM-PUBLISH.md).
46
+
47
+ ### 3. Add your database credentials
48
+
49
+ ```bash
50
+ cp .env.example .env
51
+ # Edit .env with your database credentials
52
+ ```
53
+
54
+ Use the project root `.env` or `.env.local` file that lives next to `opencode.json` / `.mcp.json` / `.odin/`. Odin does not read env files from nested app directories.
55
+
56
+ Runtime config is loaded once at server startup. If you change `.env`, `.env.local`, or `.odin/config.yaml`, restart the Odin MCP server before retrying tools.
57
+
58
+ Odin uses two database paths today:
59
+
60
+ - **Direct PostgreSQL** (any provider — Neon, Railway, self-hosted, local Supabase Postgres, etc.) for `odin.apply_migrations`:
61
+ ```env
62
+ DATABASE_URL=postgresql://user:password@host:5432/dbname
63
+ ```
64
+
65
+ - **Supabase runtime + management API** for full persistent Odin workflow state plus archival:
66
+ ```env
67
+ SUPABASE_URL=https://your-project.supabase.co
68
+ SUPABASE_SECRET_KEY=your-secret-key
69
+ SUPABASE_ACCESS_TOKEN=your-management-api-access-token
70
+ ```
71
+
72
+ `DATABASE_URL` takes priority inside `odin.apply_migrations`. It does not replace Supabase-backed workflow state for the main runtime.
73
+
74
+ ### 4. Start using Odin
75
+
76
+ Your AI agent now has these tools available:
77
+
78
+ | Tool | Purpose |
79
+ |------|---------|
80
+ | `odin.start_feature` | Create a feature in the workflow |
81
+ | `odin.get_next_phase` | Ask "what should happen next?" |
82
+ | `odin.prepare_phase_context` | Get the full working bundle for a phase |
83
+ | `odin.get_development_eval_status` | Inspect focused development-eval state for a feature |
84
+ | `odin.record_phase_artifact` | Register a phase output (PRD, spec, tasks, etc.) |
85
+ | `odin.submit_claim` | Submit a watched-agent claim for policy and watcher verification |
86
+ | `odin.record_commit` | Persist git commit metadata for a feature |
87
+ | `odin.record_pr` | Persist pull request metadata for dashboard/git tracking |
88
+ | `odin.record_merge` | Persist that a human merged the feature PR |
89
+ | `odin.record_quality_gate` | Persist an explicit workflow quality gate decision |
90
+ | `odin.record_eval_plan` | Persist a structured Architect `eval_plan` artifact |
91
+ | `odin.record_eval_run` | Persist a structured Reviewer/Integrator `eval_run` artifact |
92
+ | `odin.record_phase_result` | Record phase completion, blocking, or rework |
93
+ | `odin.run_review_checks` | Run security/review scans via Semgrep |
94
+ | `odin.run_policy_checks` | Run deterministic policy checks for submitted claims |
95
+ | `odin.verify_design` | Run formal design verification (TLA+ model checking) on a `.machine.ts` DSL file |
96
+ | `odin.capture_learning` | Capture a reusable learning with semantic domain matching |
97
+ | `odin.get_feature_status` | Inspect feature state with workflow details |
98
+ | `odin.verify_claims` | Check claim verification status |
99
+ | `odin.get_claims_needing_review` | List claims waiting for watcher review |
100
+ | `odin.record_watcher_review` | Record the watcher verdict for an escalated claim |
101
+ | `odin.archive_feature_release` | Archive release artifacts to Supabase Storage |
102
+ | `odin.explore_knowledge` | Explore knowledge clusters, cross-domain bridges, and domain stats |
103
+ | `odin.apply_migrations` | Apply pending database migrations (auto-detects existing schema) |
104
+
105
+ ## Configuration
106
+
107
+ Odin uses two files:
108
+
109
+ **`.odin/config.yaml`** (committed) — project-level config with env var interpolation:
110
+
111
+ ```yaml
112
+ runtime:
113
+ mode: in_memory # quick-start mode; switch to "supabase" for persistent workflow state
114
+
115
+ database:
116
+ url: ${DATABASE_URL} # used by odin.apply_migrations for direct PostgreSQL
117
+
118
+ supabase:
119
+ url: ${SUPABASE_URL}
120
+ secret_key: ${SUPABASE_SECRET_KEY}
121
+
122
+ skills:
123
+ paths:
124
+ - .odin/skills
125
+ auto_detect: true
126
+
127
+ review:
128
+ provider: semgrep
129
+
130
+ formal_verification:
131
+ provider: none # set to "tla-precheck" after installing Java 17+ and `npm install -D tla-precheck`
132
+ timeout_seconds: 120
133
+
134
+ archive:
135
+ provider: none
136
+ ```
137
+
138
+ **`.env`** (uncommitted) — secret values:
139
+
140
+ ```env
141
+ # Option A: Direct PostgreSQL for odin.apply_migrations
142
+ DATABASE_URL=postgresql://user:password@host:5432/dbname
143
+
144
+ # Option B: Supabase runtime + management API
145
+ SUPABASE_URL=https://your-project.supabase.co
146
+ SUPABASE_SECRET_KEY=your-secret-key
147
+ SUPABASE_ACCESS_TOKEN=your-management-api-access-token
148
+ ```
149
+
150
+ ### Runtime Modes
151
+
152
+ - **`supabase`** — Full persistent workflow state backed by Supabase. Requires `SUPABASE_URL` and `SUPABASE_SECRET_KEY`. Enable `archive.provider: supabase` when you want release archival too.
153
+ - **`in_memory`** — Zero-dependency smoke-test mode. State is lost when the process exits. Useful for testing MCP wiring and prompt flow before provisioning Supabase.
154
+
155
+ > **Note on `DATABASE_URL`**: today it powers `odin.apply_migrations`, including local PostgreSQL or local Supabase Postgres access. The main Odin workflow runtime still uses the Supabase workflow-state adapter when `runtime.mode: supabase`.
156
+
157
+ ## Optional: TLA+ Design Verification
158
+
159
+ `odin.verify_design` is optional and stays disabled while `formal_verification.provider` is `none`.
160
+
161
+ Install it in the **target project Odin runs against**, not in the runtime package:
162
+
163
+ ```bash
164
+ # In your target project root
165
+ npm install -D tla-precheck
166
+ ```
167
+
168
+ Requirements and setup:
169
+
170
+ - Install **Java 17+** locally for the TLC model checker
171
+ - Install `tla-precheck` as a dev dependency in the target project so Odin can resolve it from `node_modules/.bin`
172
+ - Enable it in `.odin/config.yaml`
173
+
174
+ ```yaml
175
+ formal_verification:
176
+ provider: tla-precheck
177
+ timeout_seconds: 120
178
+ ```
179
+
180
+ Typical usage:
181
+
182
+ 1. Create a state-machine file such as `specs/BILLING-001/subscription.machine.ts`
183
+ 2. Ask Odin to run `odin.verify_design` with that relative `machine_path`
184
+ 3. Review the result in Architect/Guardian before implementation
185
+
186
+ If Java or `tla-precheck` is missing, Odin returns an `UNAVAILABLE` / `NOT_CONFIGURED` result for design verification instead of enabling it silently.
187
+
188
+ ## Development Evals
189
+
190
+ Odin also supports a lightweight **Development Evals** workflow track:
191
+
192
+ - Architect records `eval_plan` via `odin.record_eval_plan` (or `odin.record_phase_artifact`)
193
+ - Guardian records `eval_readiness` via `odin.record_quality_gate`
194
+ - Reviewer records `eval_run` via `odin.record_eval_run` (or `odin.record_phase_artifact`)
195
+ - Integrator may append a later `eval_run` via `odin.record_eval_run` when runtime verification materially changes the result
196
+
197
+ These artifacts are surfaced in `odin.prepare_phase_context` and `odin.get_feature_status`.
198
+
199
+ When Development Evals are relevant, `odin.prepare_phase_context` returns a richer `development_evals` block with:
200
+
201
+ - `expected_artifacts` — which eval artifact(s) this phase is expected to produce now
202
+ - `expected_gate` — which eval gate this phase is expected to decide now
203
+ - `status_summary` — current eval state the harness should keep visible
204
+ - `harness_prompt_block` — phase-specific prompt lines the harness should append verbatim to the active agent prompt
205
+
206
+ Recommended harness behavior:
207
+
208
+ ```text
209
+ 1. Call odin.prepare_phase_context(...)
210
+ 2. Build the agent prompt from:
211
+ - context.agent.role_summary
212
+ - context.agent.constraints
213
+ - context.development_evals.harness_prompt_block
214
+ 3. Keep context.development_evals.status_summary visible to the operator
215
+ 4. Do not treat eval instructions as a replacement for formal verification, Semgrep, tests, runtime checks, or watcher checks
216
+ ```
217
+
218
+ Canonical eval-aware orchestration snippet:
219
+
220
+ ```text
221
+ When orchestrating Odin phases:
222
+ 1. Call odin.prepare_phase_context({ feature_id, phase, agent_name }).
223
+ 2. Build the active agent prompt from:
224
+ - context.agent.role_summary
225
+ - context.agent.constraints
226
+ - context.development_evals.harness_prompt_block
227
+ 3. Use odin.get_development_eval_status({ feature_id }) when you need focused eval state.
228
+ 4. Record eval artifacts/gates with odin.record_eval_plan, odin.record_eval_run, and odin.record_quality_gate.
229
+ 5. Never let Development Evals override odin.verify_design, odin.run_review_checks, tests, runtime verification, or watcher checks.
230
+ ```
231
+
232
+ If the harness wants a focused eval-only read path instead of parsing `odin.get_feature_status`, call:
233
+
234
+ ```text
235
+ odin.get_development_eval_status({ feature_id: "FEAT-001" })
236
+ ```
237
+
238
+ This returns the current Development Eval mode, latest `eval_plan`, latest `eval_run`, open `eval_readiness` gate (if any), and recent eval artifact history.
239
+
240
+ **Important**: Development Evals are additive. They do **not** replace `odin.verify_design`, `odin.run_review_checks`, Builder/Integrator test verification, or watched-claim verification.
241
+
242
+ ## Project-Local Skills
243
+
244
+ Drop skill files into `.odin/skills/` to override or extend built-in skills:
245
+
246
+ ```text
247
+ .odin/skills/
248
+ my-framework/
249
+ SKILL.md
250
+ ```
251
+
252
+ Odin resolves project-local skills with higher precedence than built-in skills when names match.
253
+
254
+ ## Memory Palace: Semantic Learning Propagation
255
+
256
+ Odin's learning system uses **semantic domain matching** to automatically route learnings to the right knowledge targets (skills, agent definitions, AGENTS.md).
257
+
258
+ ### How it works
259
+
260
+ 1. **Capture with tags**: When calling `odin.capture_learning`, agents provide `domain_tags` — conceptual keywords describing what the learning is about (e.g., `["nextjs", "fetch-cache", "supabase"]`)
261
+ 2. **Domain matching**: The runtime matches tags against a **knowledge domain registry** derived from skill frontmatter. Each skill's `name`, `compatible_with`, `depends_on`, `category`, and `description` generate keyword tiers (strong + weak)
262
+ 3. **Auto-targeting**: Matches passing both gates (≥ 1 strong keyword hit AND ≥ 0.60 relevance) are auto-declared as propagation targets. Weaker matches are returned as suggestions
263
+ 4. **Cross-feature corridors**: `odin.prepare_phase_context` retrieves related learnings from other features that share propagation targets, with tag intersection fallback
264
+ 5. **Resonance ranking**: Related learnings are ranked by domain density, corroboration (same-category learnings from different features), and recency — never modifying `confidence_score`
265
+
266
+ ### Exploration
267
+
268
+ Use `odin.explore_knowledge` to inspect knowledge clusters:
269
+ - Learnings grouped by domain
270
+ - Cross-domain bridges (learnings appearing in multiple domains)
271
+ - Domain density stats
272
+ - Unmatched tags (tags that matched zero domains)
273
+
274
+ ### Adding a domain
275
+
276
+ Adding a new skill with proper frontmatter (`name`, `description`, `category`, `compatible_with`, `depends_on`) **automatically creates a new knowledge domain** — zero configuration, zero migration.
277
+
278
+ ## Development
279
+
280
+ ```bash
281
+ npm run type-check # Check types without emitting
282
+ npm run build # Compile TypeScript to dist/
283
+ npm test # Run tests
284
+ npm start # Start the MCP server (stdio)
285
+ npm run dev # Watch mode
286
+ ```
287
+
288
+ ## Architecture
289
+
290
+ Odin presents **one MCP server** (`odin`) to your AI agent. Internally it uses adapter seams for different concerns:
291
+
292
+ - **WorkflowStateAdapter** — Supabase-backed feature/phase state
293
+ - **SqlExecutor** — Provider-agnostic SQL execution (direct PostgreSQL or Supabase Management API)
294
+ - **ArchiveAdapter** — Supabase Storage for release archives (direct upload, no Edge Function needed)
295
+ - **ReviewAdapter** — Semgrep for security/code review
296
+ - **FormalVerificationAdapter** — TLA+ model checking via [tla-precheck](https://github.com/kingbootoshi/tla-precheck) (opt-in)
297
+ - **SkillAdapter** — Filesystem-based skill resolution (built-in + project-local)
298
+
299
+ Providers are internal implementation details — your agent only sees `odin.*` tools.
300
+
301
+ ## Requirements
302
+
303
+ - Node.js >= 18
304
+ - PostgreSQL database — any provider: Supabase, Neon, Railway, self-hosted, etc. (for `supabase` runtime mode)
305
+ - Semgrep (optional, for review checks — falls back to Docker if local binary not found)
306
+ - Java 17+ and [tla-precheck](https://github.com/kingbootoshi/tla-precheck) (optional, for formal design verification — install as a devDependency in your target project)
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Supabase Archive Adapter
3
+ * Version: 0.2.0
4
+ *
5
+ * Uploads archive files directly to Supabase Storage using the service_role
6
+ * client. No Edge Function required.
7
+ */
8
+ import type { RuntimeConfig } from '../../config.js';
9
+ import type { ArchiveUploadResult, FeatureArchiveRecord } from '../../types.js';
10
+ import type { ArchiveAdapter, RecordArchiveInput, UploadArchiveInput } from './types.js';
11
+ export declare class SupabaseArchiveAdapter implements ArchiveAdapter {
12
+ private readonly db;
13
+ constructor(config: RuntimeConfig);
14
+ uploadArchive(input: UploadArchiveInput): Promise<ArchiveUploadResult>;
15
+ recordArchive(input: RecordArchiveInput): Promise<FeatureArchiveRecord>;
16
+ listArchives(feature_id: string): Promise<FeatureArchiveRecord[]>;
17
+ private ensureBucket;
18
+ }
19
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../../src/adapters/archive/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAwCzF,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAiB;gBAExB,MAAM,EAAE,aAAa;IAW3B,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAoCtE,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2BvE,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;YAczD,YAAY;CAY3B"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Supabase Archive Adapter
3
+ * Version: 0.2.0
4
+ *
5
+ * Uploads archive files directly to Supabase Storage using the service_role
6
+ * client. No Edge Function required.
7
+ */
8
+ import { createClient } from '@supabase/supabase-js';
9
+ const STORAGE_BUCKET = 'feature-archives';
10
+ function requireArchiveConfig(config) {
11
+ const url = config.supabase?.url;
12
+ const secret_key = config.supabase?.secret_key;
13
+ if (!url || !secret_key) {
14
+ throw new Error('Supabase archive adapter requires SUPABASE_URL and SUPABASE_SECRET_KEY.');
15
+ }
16
+ return { url, secret_key };
17
+ }
18
+ function toArchiveRecord(row) {
19
+ return {
20
+ id: String(row.id),
21
+ feature_id: String(row.feature_id),
22
+ storage_path: String(row.storage_path),
23
+ summary: String(row.summary),
24
+ files_archived: Array.isArray(row.files_archived)
25
+ ? row.files_archived.map((value) => String(value))
26
+ : [],
27
+ total_size_bytes: Number(row.total_size_bytes ?? 0),
28
+ spec_snapshot: row.spec_snapshot,
29
+ release_version: row.release_version == null ? undefined : String(row.release_version),
30
+ release_notes: row.release_notes == null ? undefined : String(row.release_notes),
31
+ archived_at: String(row.archived_at),
32
+ archived_by: String(row.archived_by),
33
+ };
34
+ }
35
+ export class SupabaseArchiveAdapter {
36
+ db;
37
+ constructor(config) {
38
+ const { url, secret_key } = requireArchiveConfig(config);
39
+ this.db = createClient(url, secret_key, {
40
+ auth: {
41
+ autoRefreshToken: false,
42
+ persistSession: false,
43
+ },
44
+ });
45
+ }
46
+ async uploadArchive(input) {
47
+ await this.ensureBucket();
48
+ const folder = `${input.feature_id}`;
49
+ const files_uploaded = [];
50
+ const errors = [];
51
+ let total_size_bytes = 0;
52
+ for (const file of input.files) {
53
+ const path = `${folder}/${file.name}`;
54
+ const content = new TextEncoder().encode(file.content);
55
+ total_size_bytes += content.byteLength;
56
+ const { error } = await this.db.storage
57
+ .from(STORAGE_BUCKET)
58
+ .upload(path, content, {
59
+ contentType: 'text/markdown',
60
+ upsert: true,
61
+ });
62
+ if (error != null) {
63
+ errors.push(`${file.name}: ${error.message}`);
64
+ }
65
+ else {
66
+ files_uploaded.push(file.name);
67
+ }
68
+ }
69
+ return {
70
+ success: errors.length === 0,
71
+ storage_path: folder,
72
+ files_uploaded,
73
+ total_size_bytes,
74
+ errors: errors.length > 0 ? errors : undefined,
75
+ };
76
+ }
77
+ async recordArchive(input) {
78
+ const { data, error } = await this.db
79
+ .from('feature_archives')
80
+ .upsert({
81
+ feature_id: input.feature_id,
82
+ storage_path: input.storage_path,
83
+ summary: input.summary,
84
+ files_archived: input.files_archived,
85
+ total_size_bytes: input.total_size_bytes,
86
+ spec_snapshot: input.spec_snapshot,
87
+ release_version: input.release_version ?? null,
88
+ release_notes: input.release_notes ?? null,
89
+ archived_by: input.archived_by,
90
+ }, { onConflict: 'feature_id' })
91
+ .select('*')
92
+ .single();
93
+ if (error != null || data == null) {
94
+ throw new Error(`Failed to record feature archive: ${error?.message ?? 'No result returned.'}`);
95
+ }
96
+ return toArchiveRecord(data);
97
+ }
98
+ async listArchives(feature_id) {
99
+ const { data, error } = await this.db
100
+ .from('feature_archives')
101
+ .select('*')
102
+ .eq('feature_id', feature_id)
103
+ .order('archived_at', { ascending: false });
104
+ if (error != null || data == null) {
105
+ return [];
106
+ }
107
+ return data.map(toArchiveRecord);
108
+ }
109
+ async ensureBucket() {
110
+ const { data } = await this.db.storage.getBucket(STORAGE_BUCKET);
111
+ if (data != null)
112
+ return;
113
+ const { error } = await this.db.storage.createBucket(STORAGE_BUCKET, {
114
+ public: false,
115
+ });
116
+ if (error != null && !error.message.includes('already exists')) {
117
+ throw new Error(`Failed to create storage bucket "${STORAGE_BUCKET}": ${error.message}`);
118
+ }
119
+ }
120
+ }
121
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../../src/adapters/archive/supabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Archive Adapter Types
3
+ * Version: 0.1.0
4
+ */
5
+ import type { ArchiveFile, ArchiveUploadResult, FeatureArchiveRecord } from '../../types.js';
6
+ export interface UploadArchiveInput {
7
+ feature_id: string;
8
+ files: ArchiveFile[];
9
+ }
10
+ export interface RecordArchiveInput {
11
+ feature_id: string;
12
+ storage_path: string;
13
+ summary: string;
14
+ files_archived: string[];
15
+ total_size_bytes: number;
16
+ spec_snapshot: unknown;
17
+ release_version?: string;
18
+ release_notes?: string;
19
+ archived_by: string;
20
+ }
21
+ export interface ArchiveAdapter {
22
+ uploadArchive(input: UploadArchiveInput): Promise<ArchiveUploadResult>;
23
+ recordArchive(input: RecordArchiveInput): Promise<FeatureArchiveRecord>;
24
+ listArchives(feature_id: string): Promise<FeatureArchiveRecord[]>;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/archive/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE7F,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACvE,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxE,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;CACnE"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Archive Adapter Types
3
+ * Version: 0.1.0
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/archive/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * TLA+ PreCheck Adapter
3
+ * Version: 0.1.0
4
+ */
5
+ import type { FormalVerificationAdapter, MachineVerificationResult, VerifyDesignRequest } from './types.js';
6
+ /**
7
+ * tla-precheck `check` writes two JSON blobs to stdout separated by a text line.
8
+ * Extract the last valid JSON object (the verification result).
9
+ */
10
+ export declare function extractLastJson(stdout: string): string | null;
11
+ export declare function parseCliOutput(stdout: string, machine_path: string): MachineVerificationResult;
12
+ export declare class TlaPreCheckAdapter implements FormalVerificationAdapter {
13
+ private readonly project_root;
14
+ private readonly timeout_ms;
15
+ private readonly trace_dir;
16
+ constructor(project_root: string, timeout_seconds?: number);
17
+ isAvailable(): Promise<boolean>;
18
+ verifyDesign(request: VerifyDesignRequest): Promise<MachineVerificationResult>;
19
+ private resolveBinaryPath;
20
+ private writeTraceLogs;
21
+ }
22
+ //# sourceMappingURL=tla-precheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tla-precheck.d.ts","sourceRoot":"","sources":["../../../src/adapters/formal-verification/tla-precheck.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EACV,yBAAyB,EAEzB,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAuEpB;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB7D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,yBAAyB,CAmE9F;AAED,qBAAa,kBAAmB,YAAW,yBAAyB;IAClE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,YAAY,EAAE,MAAM,EAAE,eAAe,GAAE,MAAY;IAMzD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAsB/B,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAkHpF,OAAO,CAAC,iBAAiB;YAIX,cAAc;CAS7B"}