@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.
- package/README.md +306 -0
- package/dist/adapters/archive/supabase.d.ts +19 -0
- package/dist/adapters/archive/supabase.d.ts.map +1 -0
- package/dist/adapters/archive/supabase.js +121 -0
- package/dist/adapters/archive/supabase.js.map +1 -0
- package/dist/adapters/archive/types.d.ts +26 -0
- package/dist/adapters/archive/types.d.ts.map +1 -0
- package/dist/adapters/archive/types.js +6 -0
- package/dist/adapters/archive/types.js.map +1 -0
- package/dist/adapters/formal-verification/tla-precheck.d.ts +22 -0
- package/dist/adapters/formal-verification/tla-precheck.d.ts.map +1 -0
- package/dist/adapters/formal-verification/tla-precheck.js +270 -0
- package/dist/adapters/formal-verification/tla-precheck.js.map +1 -0
- package/dist/adapters/formal-verification/types.d.ts +37 -0
- package/dist/adapters/formal-verification/types.d.ts.map +1 -0
- package/dist/adapters/formal-verification/types.js +6 -0
- package/dist/adapters/formal-verification/types.js.map +1 -0
- package/dist/adapters/review/semgrep.d.ts +12 -0
- package/dist/adapters/review/semgrep.d.ts.map +1 -0
- package/dist/adapters/review/semgrep.js +175 -0
- package/dist/adapters/review/semgrep.js.map +1 -0
- package/dist/adapters/review/types.d.ts +14 -0
- package/dist/adapters/review/types.d.ts.map +1 -0
- package/dist/adapters/review/types.js +6 -0
- package/dist/adapters/review/types.js.map +1 -0
- package/dist/adapters/skills/filesystem.d.ts +18 -0
- package/dist/adapters/skills/filesystem.d.ts.map +1 -0
- package/dist/adapters/skills/filesystem.js +398 -0
- package/dist/adapters/skills/filesystem.js.map +1 -0
- package/dist/adapters/skills/types.d.ts +19 -0
- package/dist/adapters/skills/types.d.ts.map +1 -0
- package/dist/adapters/skills/types.js +6 -0
- package/dist/adapters/skills/types.js.map +1 -0
- package/dist/adapters/sql-executor/direct-postgres.d.ts +15 -0
- package/dist/adapters/sql-executor/direct-postgres.d.ts.map +1 -0
- package/dist/adapters/sql-executor/direct-postgres.js +33 -0
- package/dist/adapters/sql-executor/direct-postgres.js.map +1 -0
- package/dist/adapters/sql-executor/supabase-management-api.d.ts +17 -0
- package/dist/adapters/sql-executor/supabase-management-api.d.ts.map +1 -0
- package/dist/adapters/sql-executor/supabase-management-api.js +40 -0
- package/dist/adapters/sql-executor/supabase-management-api.js.map +1 -0
- package/dist/adapters/sql-executor/types.d.ts +15 -0
- package/dist/adapters/sql-executor/types.d.ts.map +1 -0
- package/dist/adapters/sql-executor/types.js +6 -0
- package/dist/adapters/sql-executor/types.js.map +1 -0
- package/dist/adapters/workflow-state/in-memory.d.ts +69 -0
- package/dist/adapters/workflow-state/in-memory.d.ts.map +1 -0
- package/dist/adapters/workflow-state/in-memory.js +444 -0
- package/dist/adapters/workflow-state/in-memory.js.map +1 -0
- package/dist/adapters/workflow-state/supabase.d.ts +55 -0
- package/dist/adapters/workflow-state/supabase.d.ts.map +1 -0
- package/dist/adapters/workflow-state/supabase.js +823 -0
- package/dist/adapters/workflow-state/supabase.js.map +1 -0
- package/dist/adapters/workflow-state/types.d.ts +55 -0
- package/dist/adapters/workflow-state/types.d.ts.map +1 -0
- package/dist/adapters/workflow-state/types.js +6 -0
- package/dist/adapters/workflow-state/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +115 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/actors.d.ts +10 -0
- package/dist/domain/actors.d.ts.map +1 -0
- package/dist/domain/actors.js +60 -0
- package/dist/domain/actors.js.map +1 -0
- package/dist/domain/development-evals.d.ts +9 -0
- package/dist/domain/development-evals.d.ts.map +1 -0
- package/dist/domain/development-evals.js +164 -0
- package/dist/domain/development-evals.js.map +1 -0
- package/dist/domain/matching.d.ts +8 -0
- package/dist/domain/matching.d.ts.map +1 -0
- package/dist/domain/matching.js +24 -0
- package/dist/domain/matching.js.map +1 -0
- package/dist/domain/phases.d.ts +10 -0
- package/dist/domain/phases.d.ts.map +1 -0
- package/dist/domain/phases.js +165 -0
- package/dist/domain/phases.js.map +1 -0
- package/dist/domain/quality-gates.d.ts +7 -0
- package/dist/domain/quality-gates.d.ts.map +1 -0
- package/dist/domain/quality-gates.js +8 -0
- package/dist/domain/quality-gates.js.map +1 -0
- package/dist/domain/resonance.d.ts +33 -0
- package/dist/domain/resonance.d.ts.map +1 -0
- package/dist/domain/resonance.js +100 -0
- package/dist/domain/resonance.js.map +1 -0
- package/dist/domain/tasks.d.ts +9 -0
- package/dist/domain/tasks.d.ts.map +1 -0
- package/dist/domain/tasks.js +57 -0
- package/dist/domain/tasks.js.map +1 -0
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +387 -0
- package/dist/init.js.map +1 -0
- package/dist/schemas.d.ts +366 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +184 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +243 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/apply-migrations.d.ts +21 -0
- package/dist/tools/apply-migrations.d.ts.map +1 -0
- package/dist/tools/apply-migrations.js +286 -0
- package/dist/tools/apply-migrations.js.map +1 -0
- package/dist/tools/archive-feature-release.d.ts +13 -0
- package/dist/tools/archive-feature-release.d.ts.map +1 -0
- package/dist/tools/archive-feature-release.js +182 -0
- package/dist/tools/archive-feature-release.js.map +1 -0
- package/dist/tools/capture-learning.d.ts +9 -0
- package/dist/tools/capture-learning.d.ts.map +1 -0
- package/dist/tools/capture-learning.js +53 -0
- package/dist/tools/capture-learning.js.map +1 -0
- package/dist/tools/explore-knowledge.d.ts +9 -0
- package/dist/tools/explore-knowledge.d.ts.map +1 -0
- package/dist/tools/explore-knowledge.js +142 -0
- package/dist/tools/explore-knowledge.js.map +1 -0
- package/dist/tools/get-claims-needing-review.d.ts +8 -0
- package/dist/tools/get-claims-needing-review.d.ts.map +1 -0
- package/dist/tools/get-claims-needing-review.js +21 -0
- package/dist/tools/get-claims-needing-review.js.map +1 -0
- package/dist/tools/get-development-eval-status.d.ts +8 -0
- package/dist/tools/get-development-eval-status.d.ts.map +1 -0
- package/dist/tools/get-development-eval-status.js +49 -0
- package/dist/tools/get-development-eval-status.js.map +1 -0
- package/dist/tools/get-feature-status.d.ts +8 -0
- package/dist/tools/get-feature-status.d.ts.map +1 -0
- package/dist/tools/get-feature-status.js +68 -0
- package/dist/tools/get-feature-status.js.map +1 -0
- package/dist/tools/get-next-phase.d.ts +8 -0
- package/dist/tools/get-next-phase.d.ts.map +1 -0
- package/dist/tools/get-next-phase.js +26 -0
- package/dist/tools/get-next-phase.js.map +1 -0
- package/dist/tools/prepare-phase-context.d.ts +9 -0
- package/dist/tools/prepare-phase-context.d.ts.map +1 -0
- package/dist/tools/prepare-phase-context.js +151 -0
- package/dist/tools/prepare-phase-context.js.map +1 -0
- package/dist/tools/record-commit.d.ts +8 -0
- package/dist/tools/record-commit.d.ts.map +1 -0
- package/dist/tools/record-commit.js +28 -0
- package/dist/tools/record-commit.js.map +1 -0
- package/dist/tools/record-eval-plan.d.ts +8 -0
- package/dist/tools/record-eval-plan.d.ts.map +1 -0
- package/dist/tools/record-eval-plan.js +40 -0
- package/dist/tools/record-eval-plan.js.map +1 -0
- package/dist/tools/record-eval-run.d.ts +8 -0
- package/dist/tools/record-eval-run.d.ts.map +1 -0
- package/dist/tools/record-eval-run.js +42 -0
- package/dist/tools/record-eval-run.js.map +1 -0
- package/dist/tools/record-merge.d.ts +8 -0
- package/dist/tools/record-merge.d.ts.map +1 -0
- package/dist/tools/record-merge.js +16 -0
- package/dist/tools/record-merge.js.map +1 -0
- package/dist/tools/record-phase-artifact.d.ts +8 -0
- package/dist/tools/record-phase-artifact.d.ts.map +1 -0
- package/dist/tools/record-phase-artifact.js +26 -0
- package/dist/tools/record-phase-artifact.js.map +1 -0
- package/dist/tools/record-phase-result.d.ts +9 -0
- package/dist/tools/record-phase-result.d.ts.map +1 -0
- package/dist/tools/record-phase-result.js +122 -0
- package/dist/tools/record-phase-result.js.map +1 -0
- package/dist/tools/record-pull-request.d.ts +8 -0
- package/dist/tools/record-pull-request.d.ts.map +1 -0
- package/dist/tools/record-pull-request.js +16 -0
- package/dist/tools/record-pull-request.js.map +1 -0
- package/dist/tools/record-quality-gate.d.ts +8 -0
- package/dist/tools/record-quality-gate.d.ts.map +1 -0
- package/dist/tools/record-quality-gate.js +26 -0
- package/dist/tools/record-quality-gate.js.map +1 -0
- package/dist/tools/record-watcher-review.d.ts +8 -0
- package/dist/tools/record-watcher-review.d.ts.map +1 -0
- package/dist/tools/record-watcher-review.js +18 -0
- package/dist/tools/record-watcher-review.js.map +1 -0
- package/dist/tools/run-policy-checks.d.ts +8 -0
- package/dist/tools/run-policy-checks.d.ts.map +1 -0
- package/dist/tools/run-policy-checks.js +38 -0
- package/dist/tools/run-policy-checks.js.map +1 -0
- package/dist/tools/run-review-checks.d.ts +9 -0
- package/dist/tools/run-review-checks.d.ts.map +1 -0
- package/dist/tools/run-review-checks.js +45 -0
- package/dist/tools/run-review-checks.js.map +1 -0
- package/dist/tools/start-feature.d.ts +8 -0
- package/dist/tools/start-feature.d.ts.map +1 -0
- package/dist/tools/start-feature.js +33 -0
- package/dist/tools/start-feature.js.map +1 -0
- package/dist/tools/submit-claim.d.ts +8 -0
- package/dist/tools/submit-claim.d.ts.map +1 -0
- package/dist/tools/submit-claim.js +45 -0
- package/dist/tools/submit-claim.js.map +1 -0
- package/dist/tools/verify-claims.d.ts +8 -0
- package/dist/tools/verify-claims.d.ts.map +1 -0
- package/dist/tools/verify-claims.js +39 -0
- package/dist/tools/verify-claims.js.map +1 -0
- package/dist/tools/verify-design.d.ts +8 -0
- package/dist/tools/verify-design.d.ts.map +1 -0
- package/dist/tools/verify-design.js +31 -0
- package/dist/tools/verify-design.js.map +1 -0
- package/dist/types.d.ts +333 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +52 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +24 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +50 -0
- package/dist/utils.js.map +1 -0
- package/migrations/001_schema.sql +795 -0
- package/migrations/002_functions.sql +2126 -0
- package/migrations/003_views.sql +599 -0
- package/migrations/004_seed.sql +106 -0
- package/migrations/005_odin_v2_schema.sql +217 -0
- package/migrations/006_odin_v2_functions.sql +671 -0
- package/migrations/007_odin_v2_phase_alignment.sql +554 -0
- package/migrations/008_related_learnings.sql +80 -0
- package/migrations/README.md +23 -0
- 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 @@
|
|
|
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"}
|