molecule-core/platform/migrations
Molecule AI Backend Engineer 3bcb2b21a5 feat(platform): Cloudflare Artifacts demo integration (#595)
Add a minimal but complete integration with the Cloudflare Artifacts API
(private beta Apr 2026, public beta May 2026) — "Git for agents" versioned
workspace-snapshot storage.

## What's included

**`platform/internal/artifacts/client.go`** — typed Go HTTP client for the
CF Artifacts REST API:
- CreateRepo, GetRepo, ForkRepo, ImportRepo, DeleteRepo
- CreateToken, RevokeToken
- CF v4 response-envelope decoding; *APIError with StatusCode + Message

**`platform/internal/handlers/artifacts.go`** — four workspace-scoped
Gin handlers (all behind WorkspaceAuth middleware):
- POST /workspaces/:id/artifacts — attach or import a CF Artifacts repo
- GET  /workspaces/:id/artifacts — get linked repo info (DB + live CF)
- POST /workspaces/:id/artifacts/fork — fork the workspace's repo
- POST /workspaces/:id/artifacts/token — mint a short-lived git credential

**`platform/migrations/028_workspace_artifacts.up.sql`** — `workspace_artifacts`
table: one-to-one link between a workspace and its CF Artifacts repo.
Credentials are never stored; only the credential-stripped remote URL.

**`platform/internal/router/router.go`** — wire the four routes into the
existing wsAuth group.

## Configuration
Two env vars gate the feature (returns 503 when either is absent):
- CF_ARTIFACTS_API_TOKEN — Cloudflare API token with Artifacts write perms
- CF_ARTIFACTS_NAMESPACE — Cloudflare Artifacts namespace name

## Tests
- 10 client-level tests (httptest.Server + CF v4 envelope mocks)
- 14 handler-level tests (sqlmock DB + mock CF server)
- Helper unit tests for stripCredentials, cfErrToHTTP

All 21 packages pass (go test ./...).

Closes #595

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 06:28:58 +00:00
..
001_workspaces.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
002_agents.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
003_events.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
004_secrets.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
005_canvas_layouts.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
006_workspace_config_memory.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
007_approvals.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
008_agent_memories.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
009_activity_logs.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
010_workspace_awareness.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
011_workspace_runtime.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
012_global_secrets.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
013_workspace_dir.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
014_indexes.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
015_workspace_schedules.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
016_workspace_channels.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
017_memories_fts_namespace.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
017_memories_fts_namespace.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
018_secrets_encryption_version.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
018_secrets_encryption_version.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
019_workspace_access.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
019_workspace_access.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
020_workspace_auth_tokens.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
020_workspace_auth_tokens.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
021_delegation_idempotency.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
021_delegation_idempotency.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
022_workspace_schedules_source.down.sql fix(schedules): backfill legacy rows to 'template' + extract import SQL const 2026-04-14 14:30:22 -07:00
022_workspace_schedules_source.up.sql fix(schedules): backfill legacy rows to 'template' + extract import SQL const 2026-04-14 14:30:22 -07:00
023_workspace_memory_version.down.sql feat(memory): optimistic-locking via if_match_version on workspace_memory writes 2026-04-16 02:32:46 -07:00
023_workspace_memory_version.up.sql feat(channels): Lark / Feishu adapter (outbound webhook + Events API inbound) 2026-04-16 07:10:58 -07:00
024_channel_budget.down.sql feat(channels): per-channel message budget with 429 enforcement (#368) 2026-04-16 11:17:14 +00:00
024_channel_budget.up.sql feat(channels): per-channel message budget with 429 enforcement (#368) 2026-04-16 11:17:14 +00:00
025_workspace_token_usage.down.sql fix(migrations): close 024→026 gap — rename 026→025 token_usage, 027→026 allowlist (#631) 2026-04-17 06:17:36 +00:00
025_workspace_token_usage.up.sql fix(migrations): close 024→026 gap — rename 026→025 token_usage, 027→026 allowlist (#631) 2026-04-17 06:17:36 +00:00
026_org_plugin_allowlist.down.sql fix(migrations): close 024→026 gap — rename 026→025 token_usage, 027→026 allowlist (#631) 2026-04-17 06:17:36 +00:00
026_org_plugin_allowlist.up.sql fix(migrations): close 024→026 gap — rename 026→025 token_usage, 027→026 allowlist (#631) 2026-04-17 06:17:36 +00:00
027_workspace_budget.down.sql fix(migrations): renumber budget migration 025→027 to follow gap fix (#631) 2026-04-17 06:22:09 +00:00
027_workspace_budget.up.sql fix(migrations): renumber budget migration 025→027 to follow gap fix (#631) 2026-04-17 06:22:09 +00:00
028_workspace_artifacts.down.sql feat(platform): Cloudflare Artifacts demo integration (#595) 2026-04-17 06:28:58 +00:00
028_workspace_artifacts.up.sql feat(platform): Cloudflare Artifacts demo integration (#595) 2026-04-17 06:28:58 +00:00