Skip to content

Plan related commands#313

Open
daniel-de-vera wants to merge 2 commits intomainfrom
feature-plan
Open

Plan related commands#313
daniel-de-vera wants to merge 2 commits intomainfrom
feature-plan

Conversation

@daniel-de-vera
Copy link
Copy Markdown
Contributor

@daniel-de-vera daniel-de-vera commented Apr 6, 2026

Summary

Adds the full signadot plan CLI command surface — plan lifecycle management, tagging, execution control, log streaming, and real-time event attachment.

This PR consolidates the following stacked branches (all squash-merged into feature-plan):

PR Branch Description
#306 feature-plan-crud Plan CRUD commands: compile, create, list, get, delete, recompile
#307 feature-plan-tags Plan tag commands: tag list, tag get, tag apply, tag delete
#308 feature-plan-exec-crud Plan execution commands (x get, x cancel, x outputs) and plan run
#309 feature-plan-logs Plan execution log streaming: x logs and logs --plan
#310 feature-plan-exec-list Plan execution list with filtering (--plan, --tag, --phase) and pagination
#311 feature-plan-run-attach plan run --attach for structured SSE event streaming (text + JSON modes)
#312 feature-plan-outputs-fixes Plan outputs list fixes: show plan-level + step-level outputs, add SCOPE column

New commands

Plan management (signadot plan)

  • plan compile -f <prompt-file> [--tag <name>] — compile a prompt into a plan
  • plan create -f <spec.yaml> [--set var=val] — create a plan from spec
  • plan list — list plans
  • plan get <plan-id> — get plan details
  • plan delete <plan-id> — delete a plan
  • plan recompile <plan-id> — recompile an existing plan

Plan tags (signadot plan tag)

  • plan tag list — list all tags
  • plan tag get <name> — get tag details
  • plan tag apply -f <spec> — create/update a tag
  • plan tag delete <name> — delete a tag

Plan executions (signadot plan x)

  • plan x get <exec-id> — execution details with step status
  • plan x cancel <exec-id> — cancel a running execution
  • plan x list [--plan <id>] [--tag <name>] [--phase <phase>] — list executions with filters
  • plan x outputs <exec-id> — list outputs (plan-level + step-level) with SCOPE column
  • plan x logs <exec-id> [step-id] — stream execution logs via SSE

Plan run (signadot plan run)

  • plan run -f <spec> [--set var=val] — create + execute a plan
  • plan run --attach — stream execution events in real-time (text/JSON modes)

Extended existing commands

  • signadot logs --plan <exec-id> [--step <step-id>] — plan log streaming via the existing logs command

Changed files

  • 34 files changed, +2652 / -167 lines
  • New packages: internal/command/plan/, internal/command/planexec/, internal/command/plantag/
  • New configs: internal/config/plan.go, planexec.go, planrun.go, plantag.go
  • New print utilities: internal/print/attach.go, sse.go, text.go
  • Modified: internal/command/command.go (register plan commands), internal/command/logs/command.go (add --plan flag)

Dependencies

* Add plan CRUD commands (compile, create, list, get, delete)

Phase 1 of the plan CLI: basic plan management against the API.

Commands:
  signadot plan compile -f <prompt-file> [--tag <name>]
  signadot plan create -f <spec.yaml> [--set var=val]
  signadot plan list
  signadot plan get <plan-id>
  signadot plan delete <plan-id>

All commands support -o json and -o yaml output formats.
Compile supports -f - for stdin. Create supports --set template
substitution via the existing LoadUnstructuredTemplate path.
Compile --tag compiles then tags the plan via PutPlanTag.

Depends on go-sdk with plan CRUD client (signadot/signadot#6825).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add plan tag commands (list, get, apply, delete) (#307)

* Add plan tag commands (list, get, apply, delete)

Phase 2 of the plan CLI: named references to plans.

Commands:
  signadot plan tag list
  signadot plan tag get <tag-name>
  signadot plan tag apply <tag-name> --plan <plan-id>
  signadot plan tag delete <tag-name>

Alias: signadot plan t <subcommand>

ApplyTag is exported from the plantag package so compile --tag
can reuse it. The local plan/tag.go wrapper is removed.

Also extracts print.FirstLine as a shared helper, and improves
command help text for agent discoverability.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add plan execution commands and plan run (#308)

* Add plan execution commands and plan run

Plan execution management (signadot plan x / plan execution):
  - get <exec-id>: show execution details with step status table
  - cancel <exec-id>: cancel a running execution
  - outputs <exec-id>: list output metadata (inline/artifact, size, ready)
  - get-output <exec-id> <name>: download output to stdout
  - get-output <exec-id> <step>/<name>: download step-level output

Plan run (signadot plan run):
  - Creates execution, polls until terminal phase, prints results
  - Resolve by plan ID or --tag
  - --param key=value for execution parameters
  - --wait=false for fire-and-forget
  - --timeout for poll timeout
  - --output-dir to export all outputs on completion
  - Exit codes: 0=completed, 1=failed, 2=cancelled
  - Ctrl+C cancels the execution via API

Also adds --tag flag to plan create (matching compile --tag).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Remove plan list and add tag history rendering

- Remove plan list command — tags are now the sole discovery
  mechanism per the plan lifecycle redesign.
- Remove printPlanTable and PlanList config (dead code after removal).
- Render tag-to-plan mapping history in plan tag get detail view.
  History table shows PLAN ID, TAGGED, UNTAGGED columns. Only
  displayed when there are previous mappings (len > 1).
- 409 on plan delete (tagged plans) passes through as a clear
  API error message — no special handling needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add plan recompile command

signadot plan recompile <plan-id> [--tag <name>]

Recompiles a plan from its original prompt, producing a new plan.
Supports --tag to tag the result in one command. Shows the
Compiled From field linking back to the source plan.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Update go-sdk and adapt to param renames

Update go-sdk to latest feature-plan branch which normalises
swagger parameter names:
  - WithPlanExecutionID → WithExecutionID
  - WithStepOutputName → WithOutputName

Also adds PlanExecutionLogs client for streaming log endpoints.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add plan execution log streaming (#309)

* Add plan execution log streaming

Two ways to stream plan execution logs:

  signadot plan x logs <exec-id> [step-id]
  signadot logs --plan <exec-id> [--step <step-id>]

Without a step ID, streams aggregated logs for all steps.
With a step ID, streams stdout or stderr (--stream flag) for that step.

Extracts ParseSSEStream from the logs package into internal/print/sse.go
to avoid an import cycle between logs and planexec packages.

Also adds --plan and --step flags to the existing signadot logs command
(previously job-only), making --job and --plan mutually exclusive.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add plan execution list command (#310)

* Add plan execution list command

signadot plan x list [--plan <id>] [--tag <name>] [--phase <phase>]

Lists plan executions with pagination support. Filters:
  --plan: filter by plan ID
  --tag: filter by tag name (resolved server-side)
  --phase: filter by execution phase

Also unexports ShowPlanLogs (unused cross-package after import cycle fix).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add plan run --attach for structured event streaming (#311)

* Add plan run --attach for structured event streaming

Streams execution events (logs, outputs, result) to stdout in real-time.

Text mode (default):
  time=12:08:18 type=log step=greet stream=stdout msg="step starting"
  time=12:08:23 type=output name=greeting value="hello world"
  time=12:08:23 type=result id=abc123 phase=completed

JSON mode (-o json):
  {"time":"...","type":"log","step":"greet","stream":"stdout","msg":"step starting\n"}

Pipe-friendly: plan run --attach | grep type=output
stderr reserved for CLI messages (Created execution...).

Also fixes non-attach mode to write failure/cancellation details to
stderr so stdout stays clean, and rejects -o yaml with --attach.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Plan outputs list fixes (#312)

- Show both plan-level and step-level outputs in plan x outputs
  (previously only plan-level, which was often empty)
- Add SCOPE column (plan/step) and rename TYPE to STORAGE
- Compute inline output size from value length
- Show READY as true for inline outputs (always available)
- Deduplicate: step outputs already shown as plan outputs are skipped

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The getAllOutputs() function only iterated over plan-level outputs
(resp.Payload.Status.Outputs), causing "No outputs." when only
step-scoped outputs existed. Now also collects outputs from
resp.Payload.Status.Steps[*].Outputs, downloads them via the
GetStepOutput API, and writes them into <dir>/<stepID>/<name>
subdirectories to avoid name collisions.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants