How engineers download selected Officeless assets from the active Dev gateway,
edit them locally under officeless-assets/, persist changes with Git,
and promote only the selected items back to the gateway — without Tentacles.
Studio is a localhost-only workbench in Deployment Helper.
It connects to the active Dev gateway from
Gateway settings (stored as GATEWAY_UAT2_*).
Environment and company labels are derived from the host
(e.g. gateway-uat2.smart-cimb.com → CIMB · UAT2).
Browse VP / SEM / MEM / DM from the Dev gateway. Multi-select, download, or open.
Tree under officeless-assets/ with Schema / Diagram / UI / JSON editors, Save & Discard.
Select local files and push them back to Dev (Upload to Dev).
Per-asset page with Save local and Deploy Dev.
officeless-assets/
visual-programming/{id}.json # VP
ui/single/{id}.json # SEM
ui/multiple/{id}.json # MEM
data-manager/{id}.json # DM
manifest.json
http://localhost:3000/studio.
This documentation is published on the Cloud Run domain for the Branching & CI/CD discussion.
git: branch.
flowchart LR GW["Dev gateway
e.g. gateway-uat2.smart-cimb.com"] CAT["Studio Catalog
VP / SEM / MEM / DM"] DISK["Local disk
officeless-assets/"] EDIT["Local workspace
/ Full editor"] GIT["Local Git repo
branch identity"] GW -->|download| CAT CAT -->|write JSON + _meta| DISK DISK <-->|open / Save| EDIT DISK -->|upload / Deploy Dev| GW GIT -.->|branch name → GCS identity| EDIT
There is no continuous sync. Engineers run explicit hops: Dev → local (download), edit & save locally, then local → Dev (upload / deploy).
/studio on localhost. Header shows company · environment (e.g. CIMB · UAT2).officeless-assets/ with a _meta envelope (kind, id, downloadedAt, source).manifest.json._meta before calling the gateway set APIs.
sequenceDiagram
autonumber
actor Eng as Engineer
participant UI as Studio UI
participant API as /api/studio/*
participant GW as Dev Gateway
participant FS as officeless-assets/
Eng->>UI: Select catalog items
Eng->>UI: Download
UI->>API: POST /download {ids}
API->>GW: fetch VP/SEM/MEM/DM
GW-->>API: asset JSON
API->>FS: writeLocalAsset (+ _meta)
API-->>UI: saved paths / counts
UI->>FS: refresh explorer
Eng->>UI: Edit + Save
UI->>API: PUT /local-files/content
API->>FS: overwrite JSON + manifest
Eng->>UI: Upload to Dev / Deploy Dev
UI->>API: POST /local-files or /deploy
API->>FS: read asset, strip _meta
API->>GW: set / structure-data set
GW-->>API: OK
API->>FS: mark lastUploadedAt
API-->>UI: success
| Direction | API | Effect |
|---|---|---|
| Dev → local | POST /api/studio/download |
Write selected assets to disk |
| local edit | PUT /api/studio/local-files/content |
Persist editor buffer to disk |
| local → Dev (batch) | POST /api/studio/local-files |
Upload selected local files |
| local → Dev (single) | POST /api/studio/deploy |
Deploy open asset; update GCS main / branch status |
Studio uses the local Git branch name as the engineer / GCS branch identity.
Source-of-truth for edits is the filesystem under officeless-assets/;
Git is how the team reviews, shares, and rolls back those files.
git rev-parse --abbrev-ref HEAD (or STUDIO_GIT_BRANCH).git: feature/…) and GCS path slug.git add / commit the changed JSON → open PR →
after review, Upload / Deploy Dev from that branch.
sequenceDiagram
autonumber
actor Eng as Engineer
participant Git as Local Git
participant UI as Studio
participant FS as officeless-assets/
participant GCS as GCS Studio store
Eng->>Git: git checkout -b feature/cimb-expense
Eng->>UI: Open /studio (badge: git: feature/cimb-expense)
Eng->>UI: Download selected assets
UI->>FS: write JSON files
Eng->>UI: Edit + Save local
UI->>FS: persist changes
Eng->>Git: git add officeless-assets/... && git commit
Note over Git: PR / review / CI on branch
Eng->>UI: Upload to Dev / Deploy Dev
UI->>GCS: optional branch snapshot (deployed)
officeless-assets/ (and manifest.json if updated).
git: badge, local path, Save local, and Deploy Dev.
| Layer | Role |
|---|---|
| Editor buffer | Unsaved work in the UI (Discard reloads last saved local content) |
| Local disk | Authoritative Studio save target (Save / Save local) |
| Git commit | Team history, review, and rollback of local asset files |
| Dev gateway | Runtime Officeless after Upload / Deploy |
| GCS branch snapshot | Optional Studio branch metadata (identity follows Git branch) |
Download and upload are selection-based. Rollback has two levels: Discard (unsaved editor) and Git commit restore (persisted local files).
_meta so Officeless integrity is preserved.
Reloads the last saved local content. Does not touch Git history or the gateway. Available in Local workspace and full editor when the buffer is dirty.
Because saves live on disk, restore a previous commit of the JSON file(s), then re-open in Studio and Upload / Deploy if the gateway must match.
sequenceDiagram
autonumber
actor Eng as Engineer
participant UI as Studio
participant FS as Disk
participant Git as Git history
participant GW as Dev Gateway
Note over Eng,UI: Unsaved mistake
Eng->>UI: Discard
UI->>UI: Restore last saved buffer
UI-->>Eng: Message: Discarded unsaved changes
Note over Eng,Git: Persisted mistake already Saved
Eng->>Git: git log -- officeless-assets/.../id.json
Eng->>Git: git checkout <commit> -- path
Eng->>FS: file restored
Eng->>UI: Refresh / re-open file
opt Gateway must match restored content
Eng->>UI: Upload to Dev / Deploy Dev
UI->>GW: set asset
end
# Inspect history for one asset git log --oneline -- officeless-assets/ui/multiple/2h08faPDg.json # Restore file content from a known commit (keeps working tree change) git checkout <commit-sha> -- officeless-assets/ui/multiple/2h08faPDg.json # Or restore entire local assets tree from last good commit git checkout <commit-sha> -- officeless-assets/ # Then in Studio: Refresh → verify → Upload / Deploy Dev if needed
Promotion in Studio LOCAL means pushing only the assets you selected to the Dev gateway — not a blind full-environment sync, and not Tentacles cross-env hops.
_meta envelope: local bookkeeping only; stripped before gateway write.
flowchart TD
A["Catalog / Local file list"] --> B{"User selects
specific ids?"}
B -->|No| Z["No download / no upload"]
B -->|Yes| C["Read only selected assets"]
C --> D{"Direction"}
D -->|Download| E["Fetch from Dev gateway"]
E --> F["Write selected JSON + _meta"]
D -->|Upload / Deploy| G["Strip _meta"]
G --> H["Validate payload"]
H --> I["Gateway set for those ids only"]
I --> J["Mark lastUploadedAt / branch deployed"]
F --> K["Local workspace available"]
J --> L["Dev runtime updated
unselected assets untouched"]
| Action | Selection | Integrity outcome |
|---|---|---|
| Download | Catalog checkboxes | Only chosen ids land on disk |
| Upload to Dev | Local file checkboxes | Only chosen local files update Dev |
| Deploy Dev | Current open asset | Single-item promote from editor |
| Git PR | Diff of committed JSON | Reviewers see exactly which assets changed |
git checkout -b feature/… before downloading.git checkout <sha> -- path then re-upload if needed.
flowchart LR
A[Feature branch] --> B[Select + Download]
B --> C[Edit + Save local]
C --> D[Git commit / PR]
D --> E[Upload / Deploy Dev]
C -.->|unsaved| X[Discard]
D -.->|bad commit| Y[git checkout file]
Y --> E