feat: Tool Workshop manifest editor (PR 2)

- Add tool_definitions API client with types for manifests
- Add ManifestEditor component: base image selector, package editors
  (apt/npm/pip/node), script editors (build/startup), mount schema
  designer, runtime config, and live preview panel
- Integrate ManifestEditor into Tool Workshop as 'Manifest (Declarative)'
  definition type alongside Compose and Dockerfile
- Update ToolType API types to include manifest_id and 'manifest'
  definition_type
- Frontend builds clean, TypeScript typecheck passes
This commit is contained in:
Alex Blank
2026-05-28 14:35:04 +02:00
parent 5deee8c65c
commit e46b4f9249
6 changed files with 3006 additions and 1524 deletions
@@ -94,7 +94,9 @@ def upgrade() -> None:
op.drop_constraint("chk_definition_type", "tool_types", type_="check")
op.execute("ALTER TABLE tool_types ALTER COLUMN definition_type TYPE VARCHAR(16)")
op.execute("ALTER TABLE tool_types ALTER COLUMN definition_type SET DEFAULT 'legacy'")
op.execute(
"ALTER TABLE tool_types ALTER COLUMN definition_type SET DEFAULT 'legacy'"
)
# ── Add columns to tool_instances ────────────────────────────────
result = conn.execute(
@@ -106,7 +108,9 @@ def upgrade() -> None:
if not result.fetchone():
op.add_column(
"tool_instances",
sa.Column("manifest_compiled_at", sa.TIMESTAMP(timezone=True), nullable=True),
sa.Column(
"manifest_compiled_at", sa.TIMESTAMP(timezone=True), nullable=True
),
)
result = conn.execute(
@@ -369,7 +373,9 @@ CMD ["/bin/bash"]
op.drop_column("tool_instances", "manifest_compiled_at")
if has_manifest_id:
op.drop_constraint("fk_tool_types_manifest_id", "tool_types", type_="foreignkey")
op.drop_constraint(
"fk_tool_types_manifest_id", "tool_types", type_="foreignkey"
)
op.drop_column("tool_types", "manifest_id")
op.drop_table("tool_definition_manifests")