@dboio/cli 0.20.3 → 0.20.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dboio/cli",
3
- "version": "0.20.3",
3
+ "version": "0.20.4",
4
4
  "description": "CLI for the DBO.io framework",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dbo",
3
- "version": "0.8.3",
3
+ "version": "0.8.4",
4
4
  "description": "DBO.io CLI integration for Claude Code",
5
5
  "author": {
6
6
  "name": "DBO.io"
@@ -64,6 +64,204 @@ Once installed, use `/dbo` in Claude Code:
64
64
 
65
65
  The plugin source lives in `plugins/claude/dbo/` at the repository root. Installed copies in `.claude/plugins/` are gitignored and managed by `dbo install`. Each plugin's installation scope (project or global) is stored in `~/.dbo/settings.json`.
66
66
 
67
+ ### "Add / Create `<file>` **" — decision tree
68
+
69
+ When a user says **"add `<file>` "**, **"create `<file>`"**, **"push `<file>`"**, or **"upload `<file>`"**, use this decision tree to determine the correct command sequence. The words **add** and **create** are treated identically here — both refer to the CREATE step of CRUD.
70
+
71
+ #### Step 1 — Find the companion metadata file
72
+
73
+ Companion `.metadata.json` files are usually co-located with the content file, but there is one notable exception:
74
+
75
+ | Content file | Where to look for metadata |
76
+ |---|---|
77
+ | `lib/bins/**/*` | Same directory as the file |
78
+ | `lib/extension/**/*` | Same directory as the file |
79
+ | `docs/*.md` | `lib/extension/documentation/<filename>.metadata.json` (when `ExtensionDocumentationMDPlacement` = `"root"`) |
80
+ | Root-level files listed in `.app/config.json` `rootContentFiles` | Default bin directory (e.g., `lib/bins/app/<filename>.metadata.json`); the metadata's `@reference` uses `@/<filename>` to point back to the root |
81
+ | Any other file | Same directory first; if not found, search for `"@<filename>"` or `"@/<filename>"` across all `.metadata.json` files — a `@reference` entry pointing to the file identifies its companion |
82
+
83
+ > **Edge cases where metadata is not co-located with the file:**
84
+ > - `docs/Chat.md` → metadata in `lib/extension/documentation/Chat.metadata.json`
85
+ > - `CLAUDE.md` (root) → metadata in `lib/bins/app/CLAUDE.metadata.json` (or `CLAUDE.md.metadata.json` for newly-adopted files)
86
+ >
87
+ > When you can't find a `.metadata.json` beside a file, grep for `"@<filename>"` or `"@/<filename>"` across the project before concluding the file is untracked.
88
+
89
+ #### Step 2 — Check server presence
90
+
91
+ ```
92
+ Does <file>.metadata.json exist?
93
+
94
+ ├─ YES → Does it contain "_CreatedOn" or "_LastUpdated"?
95
+ │ │
96
+ │ ├─ YES → Record exists on server
97
+ │ │ → dbo push <file> [--ticket <id>]
98
+ │ │
99
+ │ └─ NO → Metadata was adopted locally but never pushed (no UID yet)
100
+ │ → dbo push <file> [--ticket <id>]
101
+ │ (push detects missing UID and routes to insert)
102
+
103
+ └─ NO → Does the local file exist?
104
+
105
+ ├─ YES → File is untracked — create metadata first
106
+ │ → dbo adopt <file> -e <entity>
107
+ │ → dbo push <file> [--ticket <id>]
108
+
109
+ └─ NO → File doesn't exist locally — create it on the server first
110
+ → POST /api/input/submit (create record via REST API)
111
+ → dbo pull (sync new record to local)
112
+ ```
113
+
114
+ **User says "add" or "create" with no file specified:**
115
+ → Use REST API `/api/input/submit` to create the record on the server, then `dbo pull` to sync locally.
116
+
117
+ #### Ticket ID
118
+
119
+ Include `--ticket <id>` when the project has `RepositoryIntegrationID` configured (ticketing integration is active) and a ticket ID is known for the change. If omitted, the CLI will prompt interactively when the server requires one. A stored ticket in `.app/ticketing.local.json` is applied automatically — check there first if you're unsure whether one exists.
120
+
121
+ ### "Read / view `<record>`" — decision tree
122
+
123
+ When a user says **"read"**, **"show"**, **"view"**, **"what's on the server for `<file>`"**, or **"get `<record>`"**, they are in the READ step of CRUD. There are two distinct layers:
124
+
125
+ #### Layer 1 — Query what's on the server (REST)
126
+
127
+ Use the raw REST output to inspect live server data without touching local files:
128
+
129
+ ```bash
130
+ # Output by entity
131
+ GET /api/o/e/<entityUid>
132
+ # Output direct
133
+ GET /api/o/<outputUid>
134
+ ```
135
+
136
+ Alternatively the CLI `output` command returns clean stylized JSON:
137
+
138
+ ```bash
139
+ # Query records for an entity
140
+ dbo output -e <entity>
141
+
142
+ # Query a specific record by UID
143
+ dbo output -e <entity>/<uid>
144
+
145
+ # Run a named output query
146
+ dbo output <uid>
147
+ ```
148
+
149
+ Use this when you want to inspect current server state, compare values, or look up a UID before pulling.
150
+
151
+ #### Layer 2 — Sync server state to local files
152
+
153
+ The local `.metadata.json` file is a representation of the server record — it reflects what was on the server at the time of the last `dbo clone` or `dbo pull`. Use these commands to bring local files in sync with the server:
154
+
155
+ > **After any REST API add/insert/create** (`/api/input/submit`): always follow with `dbo pull` (or `dbo pull <uid>`) so the new record's `.metadata.json` and companion content files are written locally. The REST API only creates the record server-side — local files do not exist until a pull is performed.
156
+
157
+ ```
158
+ Is this the first time cloning this app, or do you need a full reset?
159
+
160
+ ├─ YES → dbo clone
161
+ │ Pulls all records for the app, writes .metadata.json + companion
162
+ │ content files, and moves any local records deleted server-side to trash/.
163
+
164
+ └─ NO → Already have local files, just want to refresh a specific record or entity?
165
+
166
+ ├─ Specific file/UID → dbo pull <file> or dbo pull <uid>
167
+ │ (also use after REST API insert to create local files)
168
+
169
+ └─ All records for an entity → dbo pull -e <entity>
170
+ or just: dbo pull (entire app)
171
+ ```
172
+
173
+ > **What `.metadata.json` represents**: each `.metadata.json` is a snapshot of the server record at last sync — column values, UIDs, `_CreatedOn`, `_LastUpdated`, and `@reference` pointers to companion content files. It is the local source of truth for push/diff operations, not an independent copy. If local metadata diverges from the server (another user edited the record), `dbo push` will detect the conflict via `_LastUpdated` comparison.
174
+
175
+ ### "Update / Edit `<file>`" — decision tree
176
+
177
+ When a user says **"edit `<file>`"**, **"update `<file>`"**, **"change `<column>` on `<record>`"**, or **"modify `<file>`"**, they are in the UPDATE step of CRUD.
178
+
179
+ #### File given (local edit + push)
180
+
181
+ This is the standard path. Make changes locally, then push:
182
+
183
+ 1. **Edit the companion content file** — modify the file itself (e.g. `docs/readme.md`, `lib/bins/app/app.js`)
184
+ 2. **Edit the `.metadata.json`** — update any column values that should change (e.g. `Name`, `Status`, `Type`). Valid columns for each entity are listed in `.app/<appname>.metadata_schema.json`. Do not modify `_CreatedOn`, `_LastUpdated`, `UID`, or `ID` — these are server-managed.
185
+ 3. **Push**:
186
+ ```bash
187
+ dbo push <file> [--ticket <id>]
188
+ ```
189
+
190
+ > Only modify the fields that need to change. Leave all other columns in `.metadata.json` as-is — push sends a diff, not a full replace.
191
+
192
+ > If you only need to update content (not column values), you can skip editing `.metadata.json` and push the content file directly. If you only need to update column values (not content), edit `.metadata.json` and use `--meta-only`:
193
+ > ```bash
194
+ > dbo push <file> --meta-only [--ticket <id>]
195
+ > ```
196
+
197
+ #### No file given (server-side edit via REST)
198
+
199
+ When editing column values only and no local file needs to change, use the REST API directly:
200
+
201
+ ```bash
202
+ # Update a specific record
203
+ POST /api/input/submit
204
+ RowID:<rowId>;column:<entity>.<column>=<value>
205
+ RowID:<rowId>;column:<entity>.<column>=<value>
206
+ ```
207
+
208
+ Always follow with a pull to keep local files in sync:
209
+
210
+ ```bash
211
+ dbo pull <uid> # sync a single record
212
+ # or
213
+ dbo pull # sync all (if multiple records changed)
214
+ ```
215
+
216
+ > **Never** skip the `dbo pull` after a REST update — the local `.metadata.json` will be stale and the next `dbo push` may overwrite the server change with old values.
217
+
218
+ ### "Remove / Delete `<file>`" — decision tree
219
+
220
+ When a user says **"delete `<file>`"**, **"remove `<record>`"**, **"rm `<file>`"**, or **"drop `<record>`"**, they are in the DELETE step of CRUD.
221
+
222
+ #### File given (local + server delete)
223
+
224
+ This is the standard path. The CLI stages the deletion and renames local files before the server is touched:
225
+
226
+ ```bash
227
+ dbo rm <file> [--ticket <id>]
228
+ dbo push [--ticket <id>]
229
+ ```
230
+
231
+ What `dbo rm` does:
232
+ 1. Reads the companion `.metadata.json` to identify the entity and row ID
233
+ 2. Stages the delete expression in `.dbo/synchronize.json`
234
+ 3. Removes the record from `app.json`
235
+ 4. Renames local files to `__WILL_DELETE__<filename>` (default) so they are excluded from future operations but not immediately gone
236
+ - `--hard` — immediately deletes local files instead of renaming
237
+ - `--keep-local` — only stages the server deletion; leaves local files untouched
238
+
239
+ `dbo push` then sends the staged delete to the server and removes the `__WILL_DELETE__` files.
240
+
241
+ #### No file given (server-side delete via REST)
242
+
243
+ When deleting a record that has no local representation, use the REST API:
244
+
245
+ ```bash
246
+ POST /api/input/submit
247
+ RowID:del<rowId>;entity:<entity>=true
248
+ ```
249
+
250
+ Follow with a pull to confirm local state is consistent — though if the record had local files, `dbo pull` will **not** remove them (see note below):
251
+
252
+ ```bash
253
+ dbo pull -e <entity> # re-sync the entity (does not delete local orphans)
254
+ ```
255
+
256
+ For local orphaned files after a server-side delete, run `dbo rm <file>` without the subsequent `dbo push` (the server record is already gone) — or use `--keep-local` to skip local file changes and only update `synchronize.json`.
257
+
258
+ > **Server-side deletions and local sync**: `dbo clone` and `dbo pull` handle server-side deletions in two ways:
259
+ >
260
+ > 1. **Explicit `deleted` list** — when the server response includes a `deleted` map (keyed by entity, each containing `UID`, `Name`, and `AssetLastUpdated`), matching local files are automatically moved to `trash/`. This is the authoritative path and works correctly in delta/pull mode.
261
+ > 2. **UID diff fallback** — after processing the deleted list, clone compares all remaining local UIDs against all server UIDs. Any local record whose UID is absent from the server (and not already staged in `synchronize.json`) is also moved to `trash/`.
262
+ >
263
+ > In both cases the files are moved to `trash/` — not permanently deleted. For records that have no local files at all, nothing happens. If you need to force-clean a local orphan that neither path caught, run `dbo rm <file>` manually.
264
+
67
265
  ---
68
266
 
69
267
  ## Upgrading
@@ -156,9 +354,7 @@ my-project/
156
354
  ├── test/ # Project-level tests
157
355
  ├── trash/ # Staged soft-deleted files from dbo rm
158
356
  ├── docs/ # Project documentation and docs entities
159
- ├── manifest.json # PWA web app manifest (root content file — server-tracked)
160
- ├── CLAUDE.md # Claude Code instructions (root content file — server-tracked)
161
- ├── README.md # Project readme (root content file — server-tracked)
357
+ ├── manifest.json # PWA web app manifest (auto-generated from app metadata)
162
358
  ├── .gitignore # Tells Git to ignore files in the repo sync
163
359
  ├── .dboignore # Tells dbo cli to ignore files in commands
164
360
  ├── package.json # Metadata, scripts, and dependency list
@@ -247,7 +443,6 @@ Use `dbo status` to see how many pending migrations exist.
247
443
  | `TicketSuggestionOutput` | string | Output UID for ticket suggestions (auto-set during init, default `ojaie9t3o0kfvliahnuuda`) |
248
444
  | `cloneSource` | `"default"` \| file path \| URL | Where the last `dbo clone` fetched app JSON from. `"default"` = server fetch via `AppShortName`; any other value = the explicit local file path or URL used. Set automatically after each successful clone. |
249
445
  | `ContentPlacement` | `bin` \| `path` | Where to place content files during clone (default: `bin`) |
250
- | `UserMedia` | `true` \| `false` | Whether to download user media (`/media/<app>/user/...`) during clone. Set on first clone via prompt (or `false` in non-interactive mode). |
251
446
  | `<Entity>FilenameCol` | column name | Filename column for entity-dir records (e.g., `ExtensionFilenameCol`) |
252
447
  | `dependencies` | string[] | Array of app short-names to auto-clone as read-only local checkouts. Default: `["_system"]` |
253
448
  | `dependencyLastUpdated` | object | Map of dependency short-name to last-cloned `_LastUpdated` ISO string |
@@ -290,49 +485,20 @@ Clone of the original app JSON from the server with entity entries replaced by `
290
485
 
291
486
  The `_domain` field in the app metadata file stores the project's reference domain (set during `dbo clone`). This is committed to git and used for domain-change detection when running `dbo init --force` or `dbo clone --domain`. It provides a stable cross-user baseline — all collaborators share the same reference domain.
292
487
 
293
- #### Root content files (`manifest.json`, `CLAUDE.md`, `README.md`)
294
-
295
- Certain files live at the **project root** (not inside `lib/`) but are still tracked and synced to the server as `content` entities. Their metadata companions live in `lib/bins/app/` with a root-relative `@/` reference (`Content: "@/manifest.json"`).
296
-
297
- | File | Server entity | Public | Description |
298
- |------|--------------|--------|-------------|
299
- | `manifest.json` | content | Yes | [PWA web app manifest](https://developer.mozilla.org/en-US/docs/Web/Manifest) |
300
- | `CLAUDE.md` | content | No | Claude Code project instructions |
301
- | `README.md` | content | Yes | Project readme |
302
- | `package.json` | content | No | Node.js package metadata and scripts |
303
- | `.dboignore` | content | No | DBO CLI ignore patterns |
304
- | `.gitignore` | content | No | Git ignore patterns |
305
-
306
- **`dbo clone`** writes all six to the project root. If the server has no record for a file, a stub is generated automatically (`manifest.json` from app metadata, `CLAUDE.md` and `README.md` from app name/description, `package.json` as a minimal stub). Matching works regardless of the server record's `BinID`: records are matched by name, `@`-reference, or `Path`, then relocated to the root — whether they live in `lib/bins/app/`, another bin, or have `BinID=null`. Records with `BinID=null` that aren't in the configured list are also promoted to the project root automatically.
307
-
308
- **`dbo push`** auto-creates the companion metadata in `lib/bins/app/` for any listed root file that exists locally but has no tracked metadata yet — no manual `dbo adopt` needed before the first push.
309
-
310
- **`dbo adopt <filename>`** called from the project root also works for any root content file: it bypasses the `.dboignore` check and entity inference, and writes the metadata directly to `lib/bins/app/`.
488
+ #### `manifest.json`
311
489
 
312
- **`manifest.json`** generated fields (when produced as a stub):
490
+ A [PWA web app manifest](https://developer.mozilla.org/en-US/docs/Web/Manifest) auto-generated during scaffolding (`dbo init` or `dbo clone`). Values are derived from `app.json` when available:
313
491
 
314
492
  | Field | Source |
315
493
  |-------|--------|
316
- | `name` | `AppName` |
494
+ | `name` | `<AppName> \| <domain>` |
317
495
  | `short_name` | `AppShortName` |
318
496
  | `description` | `App.Description` |
319
497
  | `start_url` / `scope` | `/app/<ShortName>/ui/` |
320
- | `background_color` | Extracted from the `widget` extension matching `ShortName` (field `String4`), defaults to `#ffffff` |
498
+ | `background_color` | Extracted from the `widget` extension matching the app's `ShortName` (field `String4`), defaults to `#ffffff` |
321
499
  | `theme_color` | `#000000` |
322
500
 
323
- #### `rootContentFiles` config
324
-
325
- The list of root content files is stored in `.app/config.json` under `rootContentFiles`:
326
-
327
- ```json
328
- {
329
- "rootContentFiles": ["CLAUDE.md", "README.md", "manifest.json", "package.json", ".dboignore", ".gitignore"]
330
- }
331
- ```
332
-
333
- - **Absent**: defaults are written on the first `dbo push` — `["CLAUDE.md", "README.md", "manifest.json", "package.json", ".dboignore", ".gitignore"]`
334
- - **`[]`, `false`, or `null`**: feature disabled — no root content files are auto-managed
335
- - **Custom list**: any filename can be added; metadata is derived from the file extension
501
+ The file is only created if absent — it is never overwritten by subsequent clones, so local edits (icons, screenshots, display overrides) are preserved. A companion `manifest.metadata.json` is auto-created by `dbo push` if missing, allowing the manifest to be pushed to the server as a content record.
336
502
 
337
503
  ### `.dboignore`
338
504
 
@@ -493,11 +659,11 @@ The project's reference domain is stored in `.app/<shortName>.metadata.json._dom
493
659
  6. **Creates directories** — processes `children.bin` to build the directory hierarchy based on `ParentBinID` relationships
494
660
  7. **Saves `.app/directories.json`** — maps BinIDs to directory paths for file placement
495
661
  8. **Writes content files** — decodes base64 content, creates `*.metadata.json` + content files in the correct bin directory. Filename columns and companion file extraction preferences are auto-applied with sensible defaults on first clone (use `--configure` to re-prompt)
496
- 9. **Downloads media files** — classifies records into three scopes before downloading: `app` (`/media/<app>/app/...` or no FullPath — always downloaded), `user` (`/media/<app>/user/...` — opt-in, preference saved as `UserMedia` in `config.json`), and `foreign` (`/media/<other_app>/...` — silently skipped with stale metadata written). Fetches using a fallback chain: `FullPath` directly (`/media/{app}/{path}`) → `/dir/` route → `/api/media/{uid}`. 404 errors create stale metadata to prevent re-prompting. Errors are logged to `.app/errors.log`
662
+ 9. **Downloads media files** — fetches binary files (images, CSS, fonts) from the server using a fallback chain: `FullPath` directly (`/media/{app}/{path}`) → `/dir/` route → `/api/media/{uid}`, and saves with metadata. 404 errors create stale metadata to prevent re-prompting. Errors are logged to `.app/errors.log`
497
663
  10. **Processes entity-dir records** — entities matching project directories (`extension`, `app_version`, `data_source`, `entity`, `site`, `group`, `integration`, `automation`) are saved as `.metadata.json` files in their corresponding directory. Note: `entity` (table definitions) shares `lib/data_source/` with `data_source` records rather than using a separate directory
498
664
  11. **Processes other entities** — remaining entities with a `BinID` are placed in the corresponding bin directory
499
665
  12. **Saves `.app/<shortName>.metadata.json`** — clone of the original JSON with processed entries replaced by `@path/to/*.metadata.json` references
500
- 13. **Orphan cleanup** — any local `.metadata.json` files whose UID is absent from the server response are automatically moved to `trash/` along with their companion content and media files. This prevents stale records (deleted server-side) from causing false positives in `dbo push`. Skipped during `--entity-filter` clones
666
+ 13. **Orphan cleanup** — server-deleted records are moved to `trash/` in two passes: first via the explicit `deleted` map in the server response (authoritative; works in delta/pull mode), then via a full UID diff of all local `.metadata.json` files against the server response (fallback for anything not in the deleted list). Companion content and media files are moved alongside their metadata. Skipped during `--entity-filter` clones
501
667
 
502
668
  #### Clone source tracking
503
669
 
@@ -559,24 +725,6 @@ This helps keep your app clean by removing database records for media files that
559
725
 
560
726
  In non-interactive mode (`-y`), stale cleanup is skipped (conservative default).
561
727
 
562
- #### Media scope filtering
563
-
564
- During `dbo clone`, media records are classified by their `FullPath` relative to the app short name:
565
-
566
- | Scope | Path pattern | Behavior |
567
- |-------|-------------|----------|
568
- | `app` | `/media/<app>/app/...` or no `FullPath` | Always downloaded |
569
- | `user` | `/media/<app>/user/...` | Downloaded only if `UserMedia=true` in `.app/config.json` |
570
- | `foreign` | `/media/<other_app>/...` | Never downloaded — stale metadata written to prevent re-prompts |
571
-
572
- On the first clone with user media present, you'll be prompted once:
573
-
574
- ```
575
- App has 14 user media file(s) (e.g. "avatar.jpg"). Download user media? (saves preference)
576
- ```
577
-
578
- The answer is saved as `UserMedia` in `.app/config.json` and reused on subsequent clones. In non-interactive mode (`-y`), user media defaults to skipped (`UserMedia=false`).
579
-
580
728
  #### Path resolution
581
729
 
582
730
  When a content record has both `Path` and `BinID`, the CLI prompts:
@@ -1594,11 +1742,18 @@ Files matching `.dboignore` patterns are skipped — both in directory mode (`db
1594
1742
 
1595
1743
  #### Single file
1596
1744
 
1597
- ```bash
1598
- # Single file — entity inferred from directory
1599
- dbo adopt lib/bins/app/assets/css/colors.css
1745
+ > **Always pass `-e <entity>`.**
1746
+ > Auto-inference via `resolveDirective()` only works when the file's directory path exactly matches a registered directive template. For files in `lib/bins/` (HTML, CSS, JS, SQL), inference commonly fails because `lib/bins/` maps to multiple entity types the CLI cannot determine whether the file should be `content`, `media`, or another entity without an explicit flag. Omitting `-e` for these files will cause `adopt` to fail with an "entity cannot be inferred" error.
1747
+ >
1748
+ > | File type | Correct `-e` flag |
1749
+ > |-----------|-------------------|
1750
+ > | HTML, CSS, JS, SQL in `lib/bins/` | `-e content` |
1751
+ > | Images, fonts, binaries in `lib/bins/` | `-e media` |
1752
+ > | Files in `lib/extension/` | `-e extension` (or `-e extension.{Column}`) |
1753
+ > | Files in `docs/` | `-e content` |
1600
1754
 
1601
- # Single file — explicit entity
1755
+ ```bash
1756
+ # Single file — explicit entity (recommended, always works)
1602
1757
  dbo adopt lib/bins/app/assets/css/colors.css -e content
1603
1758
 
1604
1759
  # Extension with explicit column
@@ -1606,9 +1761,10 @@ dbo adopt lib/extension/widget/button.html -e extension.String5
1606
1761
 
1607
1762
  # Skip all confirmation prompts
1608
1763
  dbo adopt lib/bins/app/assets/css/colors.css -e content -y
1609
- ```
1610
1764
 
1611
- If the file lives in a recognized directory (e.g. `lib/bins/`, `lib/extension/`, `docs/`), the entity is auto-inferred via `resolveDirective()`. Otherwise, pass `-e <entity>` or follow the interactive wizard.
1765
+ # Single file entity inferred from directory (only works for exact directive matches)
1766
+ dbo adopt lib/bins/app/assets/css/colors.css
1767
+ ```
1612
1768
 
1613
1769
  #### Attach to existing record (`--into`)
1614
1770
 
@@ -1791,6 +1947,20 @@ Stores ticket IDs for automatic application during submissions:
1791
1947
  - `records` — Per-record tickets (auto-cleared after successful submission)
1792
1948
  - `--ticket` flag always takes precedence over stored tickets
1793
1949
 
1950
+ #### Commands that accept `--ticket`
1951
+
1952
+ The `--ticket <id>` flag is available on all submission commands:
1953
+
1954
+ | Command | Flag effect |
1955
+ |---------|-------------|
1956
+ | `dbo push [path]` | Attaches ticket ID to all records pushed in this invocation |
1957
+ | `dbo add` | Attaches ticket ID to the new record being created |
1958
+ | `dbo content deploy <uid> <file>` | Attaches ticket ID to the content deploy submission |
1959
+ | `dbo deploy <target>` | Attaches ticket ID to the deploy submission |
1960
+ | `dbo input -d <expr>` | Passes `_OverrideTicketID` directly to `/api/input/submit` |
1961
+
1962
+ When `--ticket` is provided it bypasses both the stored ticket prompt and any interactive ticket prompt on server error.
1963
+
1794
1964
  #### ModifyKey protection (locked/production apps)
1795
1965
 
1796
1966
  When an app has a `ModifyKey` set (production/locked mode), the CLI guards all submission commands (`push`, `input`, `add`, `content deploy`, `deploy`) with an interactive prompt:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "track",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Changelog and Track API logging for Claude Code — automatically logs changes to changelog.md and the remote Track task_log on every session",
5
5
  "author": {
6
6
  "name": "DBO.io"