Full programmatic access to the Descript API for Claude Code: import, Underlord agent edits, publish, jobs, and bulk pipelines via a zero-dependency Node CLI wrapped by skills and an optional MCP shim.
  • TypeScript 99.9%
Find a file
juliandickie bf8c469a51 chore(release): v0.4.1
`descript export --resume <path>` ships. Recovers interrupted or
partial exports by replaying a prior export-report.json without
re-publishing already-published compositions. Implementation follows
the design spec at docs/specs/2026-05-21-export-resume-design.md
(consensus iteration 2, Architect APPROVE, Critic APPROVE via
self-audit during API outage).

Test count: 207 -> 234 (+27 net new).

- New src/workflows/exportResume.ts module - pure-function
  reconstruction logic running the semantics table from the spec.
  reconstructResumeItems, validateRequestedFormatsAgainstReport,
  buildResumeReport. ExportFormat-aware existsSync checks.

- Workflow extensions - ExportPublishedOptions.skipFormats?,
  ExportPublishedResult.skipped[], ExportBatchItem.skipFormats?,
  ExportBatchReportItem.skipped[]. ExportBatchOptions.writeReport?
  for the resume case (so it can write its own resume-report.json
  shape instead of the standard one).

- CLI --resume flag on export. Mutex with positional <project-id>,
  --projects, --composition-ids. Parse-time validation - file exists,
  parses, has items array, format-disjoint check. Mutex violations
  and disjoint formats exit 2 before any API call.

- resume-report.json shape - schema_version: 1, command, ok,
  resumed_from, all_skipped, items. Per-item adds resumed: boolean,
  reason?: string, skipped: ExportFormat[], partially_resumable?: true.
  Distinct filename from export-report.json so the prior report is
  not overwritten.

- Per the design spec Row 4 semantics, ok:false items retry only
  the failed formats via slug. The publish step is skipped because
  the prior run already produced a slug. The fix that caught a
  spec deviation: existsSync checking applies only to ok:true items
  (where files may have been deleted); ok:false items trust the
  prior report's written[] array per the spec's "only the failed
  formats" language.

- Pre-mortem 3 hardening - getPublishedProjectMetadata returns a
  fresh signed download URL on every call, which makes the
  "files deleted, slug-based re-download" path work without
  republishing. The HTTP layer at src/client/http.ts:53,68-86
  retries on 429 via Retry-After.

- Deferred per spec - --formats media alias (no audio use case),
  descript download-published --resume (out of scope, the spec
  covers export resume only).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 01:35:57 +10:00
.claude-plugin chore(release): v0.4.1 2026-05-21 01:35:57 +10:00
bin feat(cli): add CLI, output formatting, bin shim and committed build 2026-05-17 23:18:28 +10:00
dist chore(release): v0.4.1 2026-05-21 01:35:57 +10:00
docs chore(release): v0.4.1 2026-05-21 01:35:57 +10:00
scripts/smoke chore(release): v0.4.0 2026-05-21 00:46:16 +10:00
skills chore(release): v0.4.1 2026-05-21 01:35:57 +10:00
src chore(release): v0.4.1 2026-05-21 01:35:57 +10:00
tests chore(release): v0.4.1 2026-05-21 01:35:57 +10:00
.gitignore feat(scripts): add concurrency smoke test for descript-export 2026-05-20 18:05:21 +10:00
.mcp.json feat(mcp): add optional zero-dependency in-process MCP shim 2026-05-17 23:29:51 +10:00
AGENTS.md chore(release): v0.3.3 2026-05-20 21:52:15 +10:00
CHANGELOG.md chore(release): v0.4.1 2026-05-21 01:35:57 +10:00
CLAUDE.md chore(release): v0.3.3 2026-05-20 21:52:15 +10:00
LICENSE docs: add README, CHANGELOG, LICENSE, plugin CLAUDE.md 2026-05-17 23:54:36 +10:00
package-lock.json chore(release): v0.3.0 2026-05-20 19:12:12 +10:00
package.json chore(release): v0.4.1 2026-05-21 01:35:57 +10:00
README.md chore(release): v0.3.1 2026-05-20 21:22:14 +10:00
tsconfig.json feat(scripts): add concurrency smoke test for descript-export 2026-05-20 18:05:21 +10:00

descript

Full programmatic access to the Descript API for Claude Code. A Node/TypeScript CLI covering all 11 endpoints plus polling, the three-step signed-URL upload, and a bulk pipeline runner, wrapped by skills and an optional MCP shim.

Install (standalone)

/plugin marketplace add juliandickie/descript-plugin
/plugin install descript@descript

Setup

Create a token in Descript Settings, API tokens, then:

descript config set --token <TOKEN> --profile default
descript status

Or set DESCRIPT_API_TOKEN, or the plugin api_token config.

CLI

descript status, config, import, agent, publish, jobs, projects, published, edit-in-descript, batch

Global flags: --json, --no-wait, --token, --profile.

Skills

descript-setup, descript-import, descript-edit, descript-publish, descript-jobs, descript-batch, descript-api-reference. Edit, publish, and batch are cost-gated.

Tip - Per-cue density for chapter generation

For downstream LLM-driven content generation (YouTube descriptions, chapters, summaries), the API-derived per-cue Markdown transcript is denser and more anchor-rich than Descript's UI export. A 30-minute podcast yields ~750 timestamp anchors via this command vs ~50-100 from the UI's paragraph segmentation - useful when the downstream LLM needs many candidate chapter boundaries.

Relationship to the official Descript CLI

Descript publishes its own CLI as @descript/platform-cli (npm install -g @descript/platform-cli@latest, then descript-api config set api-key). It wraps the same API this plugin wraps, with interactive flows for setup, import, and agent prompting. This plugin is parallel, not a replacement. It adds Claude Code skills, an optional MCP shim, a bulk pipeline runner (descript batch), the export workflow (descript export, descript download-published), the partner-gated edit-in-descript, and the published-metadata reader. The two surfaces overlap on the basics (status, config, import, agent, publish, jobs, projects) and can coexist on the same machine. Use the official CLI for standalone terminal work; use this plugin for Claude-mediated work.

Development

npm install
npm test
npm run build

Zero runtime dependencies.