drivethrough-cli 0.1.21 → 0.1.23

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.
Files changed (2) hide show
  1. package/dist/main.mjs +14 -8
  2. package/package.json +1 -1
package/dist/main.mjs CHANGED
@@ -24209,7 +24209,7 @@ function registerTools(server, ctx) {
24209
24209
  {
24210
24210
  title: "Read site files & history",
24211
24211
  description: 'Read back a deployed site: file manifest, file contents, drivethrough.json \u2014 and the site\'s version history. Use this to resume work on a site from an earlier conversation. Read the minimum you need: `find` locates text without returning file contents, `manifest_only` lists what exists, `paths` fetches only named files \u2014 a bare call inlines every text file, so reserve it for genuinely reading a whole small site. Versions: every deploy is a numbered version the platform keeps. `history: true` lists them with what each one changed (the map for revert_site), `compare: {from, to}` returns line diffs between two versions ("what did v9\u2192v10 change?"), and `version` pins any read mode to a prior version instead of the live one. Modes are exclusive per call \u2014 compare wins over history, history over find/manifest_only. Entries come back deploy_site-compatible ({path, content, encoding}); binary files are listed but only inlined when named in `paths`. For small text changes you may not need this at all \u2014 edit_site applies find/replace to the deployed files directly.',
24212
- annotations: { readOnlyHint: true, openWorldHint: false },
24212
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
24213
24213
  inputSchema: {
24214
24214
  site: external_exports.string().describe("Site name or id"),
24215
24215
  paths: external_exports.array(external_exports.string()).optional().describe(
@@ -24285,7 +24285,7 @@ function registerTools(server, ctx) {
24285
24285
  {
24286
24286
  title: "Preview site (screenshot)",
24287
24287
  description: "See a deployed site the way a visitor does: renders the page in a real browser server-side and returns a screenshot image you can look at directly. You have no browser of your own \u2014 this is your only view of rendered results, so use it to verify visual work (layout, styling, animations, responsive behavior) actually shipped correctly instead of assuming it did, and to eyeball a prior `version` before reverting to it. Works on private sites; nothing becomes public. Takes a few seconds \u2014 look once after a coherent batch of changes, not after every edit. Animations: the capture happens at page load; pass wait_ms to let one settle or reach mid-cycle.",
24288
- annotations: { readOnlyHint: true, openWorldHint: false },
24288
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
24289
24289
  inputSchema: {
24290
24290
  site: external_exports.string().describe("Site name or id"),
24291
24291
  path: external_exports.string().optional().describe('Page to render, like "/about.html" (default "/")'),
@@ -24367,7 +24367,7 @@ function registerTools(server, ctx) {
24367
24367
  {
24368
24368
  title: "Query site database",
24369
24369
  description: 'Read the site\'s database as its owner (read-only \u2014 writes go through write_db). Same query surface the site\'s own pages use, so what works here works there. Every row is {seq, type, parent_seq, json, created_at, updated_at}: `seq` is the row number and its permanent identity (never reused, even after a delete), `json` is the document. Newest-first is the default and always free. Filtering, sorting and search need a matching entry in the site\'s "query" block in drivethrough.json \u2014 an undeclared query is refused with the exact line to add. As the owner you get a bounded 5,000-row scan instead of a refusal, marked "partial": true, so you can look at data you have not modelled yet; a visitor page gets the refusal.',
24370
- annotations: { readOnlyHint: true, openWorldHint: false },
24370
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
24371
24371
  inputSchema: {
24372
24372
  site: external_exports.string().describe("Site name or id"),
24373
24373
  action: external_exports.enum(["types", "list", "get"]).describe("types = row counts per type; list = rows of a type; get = one row by seq"),
@@ -24453,7 +24453,9 @@ function registerTools(server, ctx) {
24453
24453
  {
24454
24454
  title: "Write site database",
24455
24455
  description: "Write to the site's database as its owner: insert one row, import many, update, or delete (reads go through query_db). Rows are addressed by `seq`, the row number query_db returns. To change a few fields of a row, `update` with `merge` \u2014 only the fields that change, no fetch needed. Reserve `json` (wholesale replacement) for rewriting the whole document. To load a catalogue, use `rows` for a handful and `rows_url` for thousands \u2014 never loop insert, and never try to emit 100,000 rows yourself. Writes are validated against the types declared in the site's drivethrough.json (unknown types and mismatched fields are rejected, and a bulk import is checked in full BEFORE the first row is written, so it is all-or-nothing); pass validate: false only for a deliberate migration. Deleted and overwritten rows are gone for good \u2014 there is no version history for data, so read a row (query_db) before destructive rewrites you might need to undo. Deleting a row also deletes its children. Every write counts against the account's monthly write allowance, and an import larger than what remains is refused before anything is written.",
24456
- annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
24456
+ // Open-world for the same reason deploy_site is: rows_url makes the
24457
+ // platform fetch an arbitrary external URL server-side.
24458
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
24457
24459
  inputSchema: {
24458
24460
  site: external_exports.string().describe("Site name or id"),
24459
24461
  action: external_exports.enum(["insert", "update", "delete"]).describe("What to do with the row"),
@@ -24630,7 +24632,7 @@ function registerTools(server, ctx) {
24630
24632
  {
24631
24633
  title: "List sites",
24632
24634
  description: "List the authenticated account's sites with their addresses, visibility, and status. Pass include_deleted to also see recently deleted sites (recoverable for 30 days via restore_site).",
24633
- annotations: { readOnlyHint: true, openWorldHint: false },
24635
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
24634
24636
  inputSchema: {
24635
24637
  include_deleted: external_exports.boolean().optional().describe("Also list deleted sites still inside their 30-day recovery window")
24636
24638
  }
@@ -24688,7 +24690,10 @@ function registerTools(server, ctx) {
24688
24690
  {
24689
24691
  title: "Attach/detach custom domain",
24690
24692
  description: 'Attach or detach a custom domain the user already owns (paid plans). "attach": connect the domain to the site \u2014 returns the exact DNS records to add; afterwards use check_domain {action: "connect"} for a one-click registrar link and check_domain {action: "status"} to poll until active. "detach": remove the domain from the site. The site keeps its drivethrough.site address throughout.',
24691
- annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
24693
+ // Open-world like check_domain: attach initiates certificate issuance
24694
+ // with an external CA — the pipeline check_domain "status" then polls —
24695
+ // and detach changes what the public domain serves.
24696
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
24692
24697
  inputSchema: {
24693
24698
  action: external_exports.enum(["attach", "detach"]).describe("Connect the domain, or remove it"),
24694
24699
  site: external_exports.string().describe("Site name or id"),
@@ -28157,9 +28162,10 @@ no repo (built in chat).
28157
28162
  CLI limit errors are machine-readable and include an \`url\` to relay:
28158
28163
  \`\`\`json
28159
28164
  { "ok": false, "error": { "code": "plan_limit_public_sites",
28160
- "message": "...", "next": "...", "url": "https://drivethrough.dev/upgrade?reason=public_sites" } }
28165
+ "message": "...", "next": "...", "url": "https://drivethrough.dev/pricing?reason=public_sites" } }
28161
28166
  \`\`\`
28162
- Relay that upgrade link once, at the moment of intent \u2014 don't nag.
28167
+ Relay that link once, at the moment of intent \u2014 don't nag. It describes the
28168
+ plans; upgrading itself happens from the user's dashboard.
28163
28169
  Custom domain (one the user already owns): \`drivethrough domain add <site> example.com\`,
28164
28170
  then \`drivethrough domain connect <site>\` for one-click setup where supported.
28165
28171
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drivethrough-cli",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "description": "Agent-first hosting CLI. Say what you want. Stay in the car.",
5
5
  "type": "module",
6
6
  "license": "MIT",