orizu 0.4.1 → 0.5.0

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 (76) hide show
  1. package/README.md +22 -13
  2. package/dist/artifact-archive.js +152 -0
  3. package/dist/connectors-cli.js +80 -0
  4. package/dist/credentials.js +4 -1
  5. package/dist/daytona-slice-rehearsal.js +255 -0
  6. package/dist/daytona-slice.js +441 -0
  7. package/dist/egress-allowlist-cli.js +132 -0
  8. package/dist/egress-policy.js +159 -0
  9. package/dist/git-credential.js +131 -0
  10. package/dist/github-setup.js +226 -0
  11. package/dist/help.js +271 -16
  12. package/dist/hosted-bootstrap-rehearsal.js +235 -0
  13. package/dist/hosted-bootstrap.js +365 -0
  14. package/dist/hosted-broker-server.js +220 -0
  15. package/dist/hosted-git-http-server.js +136 -0
  16. package/dist/hosted-harness-claude.js +493 -0
  17. package/dist/hosted-harness-opencode.js +729 -0
  18. package/dist/hosted-harness.js +60 -0
  19. package/dist/hosted-loop.js +477 -0
  20. package/dist/hosted-run-event-sink.js +499 -0
  21. package/dist/hosted-runtime-assets.js +216 -0
  22. package/dist/hosted-session-cli.js +642 -0
  23. package/dist/index.js +855 -237
  24. package/dist/kill-switch-cli.js +89 -0
  25. package/dist/manifests-cli.js +143 -0
  26. package/dist/preview-runtime.js +4 -1
  27. package/dist/sandbox-provider.js +238 -0
  28. package/dist/secret-redaction.js +112 -0
  29. package/dist/session-timeline.js +103 -0
  30. package/dist/setup-prompt.js +4 -2
  31. package/dist/skill-installer.js +9 -1
  32. package/dist/smoke.js +250 -0
  33. package/dist/task-assignment-manifest.js +39 -2
  34. package/dist/vercel-sandbox-provider.js +260 -0
  35. package/dist/workbench-cli.js +493 -0
  36. package/dist/workspace-sync.js +924 -0
  37. package/dist/workspace.js +868 -57
  38. package/package.json +4 -1
  39. package/src/artifact-archive.ts +182 -0
  40. package/src/connectors-cli.ts +115 -0
  41. package/src/credentials.ts +6 -2
  42. package/src/daytona-slice-rehearsal.ts +320 -0
  43. package/src/daytona-slice.ts +598 -0
  44. package/src/egress-allowlist-cli.ts +147 -0
  45. package/src/egress-policy.ts +188 -0
  46. package/src/git-credential.ts +155 -0
  47. package/src/github-setup.ts +366 -0
  48. package/src/help.ts +272 -16
  49. package/src/hosted-bootstrap-rehearsal.ts +312 -0
  50. package/src/hosted-bootstrap.ts +571 -0
  51. package/src/hosted-broker-server.ts +278 -0
  52. package/src/hosted-git-http-server.ts +164 -0
  53. package/src/hosted-harness-claude.ts +621 -0
  54. package/src/hosted-harness-opencode.ts +823 -0
  55. package/src/hosted-harness.ts +124 -0
  56. package/src/hosted-loop.ts +680 -0
  57. package/src/hosted-run-event-sink.ts +632 -0
  58. package/src/hosted-runtime-assets.ts +272 -0
  59. package/src/hosted-session-cli.ts +844 -0
  60. package/src/index.ts +987 -296
  61. package/src/kill-switch-cli.ts +113 -0
  62. package/src/manifests-cli.ts +168 -0
  63. package/src/preview-runtime.ts +14 -9
  64. package/src/sandbox-provider.ts +440 -0
  65. package/src/secret-redaction.ts +124 -0
  66. package/src/session-timeline.ts +152 -0
  67. package/src/setup-prompt.ts +4 -2
  68. package/src/skill-installer.ts +13 -1
  69. package/src/smoke.ts +342 -0
  70. package/src/task-assignment-manifest.ts +70 -2
  71. package/src/vercel-sandbox-provider.ts +388 -0
  72. package/src/workbench-cli.ts +701 -0
  73. package/src/workspace-sync.ts +1148 -0
  74. package/src/workspace.ts +1051 -64
  75. package/vendor/skills/orizu-cli/SKILL.md +3 -1
  76. package/vendor/skills/orizu-cli/references/cli-reference.md +3 -3
package/src/help.ts CHANGED
@@ -40,6 +40,11 @@ const GROUPS: CliGroupDoc[] = [
40
40
  { name: 'Apps', summary: 'Create, preview, update, inspect, and export review apps.' },
41
41
  { name: 'Tasks', summary: 'Create review tasks, mutate task status, assign reviewers, and export labels.' },
42
42
  { name: 'Datasets', summary: 'Upload, version, split, mutate, export, lock, clone, and delete datasets.' },
43
+ { name: 'Workspace', summary: 'Metadata-first sync of the workbench contract: inspect status, reconcile, pull, and apply.' },
44
+ { name: 'Sessions', summary: 'Start, inspect, and end durable workspace sessions for agent/operator work.' },
45
+ { name: 'Workbench runs', summary: 'Start, inspect, tail, and finish resumable workbench runs.' },
46
+ { name: 'Connectors', summary: 'Inspect project connector/integration readiness (read-only; secrets redacted).' },
47
+ { name: 'Promotion manifests', summary: 'List, inspect, approve, reject, and idempotently apply promotion manifests.' },
43
48
  ]
44
49
 
45
50
  export const COMMAND_DOCS: CliCommandDoc[] = [
@@ -79,28 +84,36 @@ export const COMMAND_DOCS: CliCommandDoc[] = [
79
84
  },
80
85
  {
81
86
  path: ['setup'],
82
- usage: 'orizu setup [--agent <claude|codex>]... [--scope global|project] [--mode auto|link|copy] [--workspace|--no-workspace] [--no-install] [--no-handoff] [--launch <claude|codex>] [--skip-login] [--yes] [--dry-run] [--no-input] [--json]',
83
- summary: 'Guided onboarding: sign in, set up your coding agents, create a local workspace, and hand off to your agent.',
87
+ usage: 'orizu setup [--team <slug>] [--agent <claude|codex>]... [--workspace [path]|--no-workspace] [--validate] [--fix] [--no-symlinks] [--verbose] [--no-install] [--handoff|--no-handoff] [--launch <claude|codex>] [--skip-login] [--yes] [--dry-run] [--no-input|--non-interactive] [--json]',
88
+ summary: 'Guided onboarding: sign in, initialize the workbench contract, and install agent skills.',
84
89
  group: 'Agent setup',
85
90
  options: [
86
- { name: '--agent <agent>', help: 'Coding agent to set up. Repeat for multiple agents.', repeatable: true, choices: ['claude', 'codex'] },
87
- { name: '--scope <scope>', help: 'global (default) installs for you across all projects; project installs into the current repo.', choices: ['global', 'project'] },
88
- { name: '--mode <mode>', help: 'Skill install sync mode (auto, link, copy).', choices: ['auto', 'link', 'copy'] },
89
- { name: '--workspace', help: 'Create the gitignored .orizu/ workspace without prompting.' },
90
- { name: '--no-workspace', help: 'Skip workspace creation.' },
91
- { name: '--no-install', help: 'Skip the agent integration phase.' },
92
- { name: '--no-handoff', help: 'Skip printing the coding-agent setup prompt.' },
91
+ { name: '--team <slug>', help: 'Team/workbench slug. Authenticated setup materializes all projects in this team.' },
92
+ { name: '--workspace [path]', help: 'Initialize or validate a workspace path, or the current directory when no path is provided. If provided, the value must be a filesystem path.' },
93
+ { name: '--service-origin <url>', help: 'Service origin written to setup metadata. Defaults to the active CLI server.' },
94
+ { name: '--attach-workspace <id>', help: 'Record an existing Orizu workspace id for future attachment.' },
95
+ { name: '--validate', help: 'Inspect the workspace contract without writing files.' },
96
+ { name: '--fix', help: 'Apply safe idempotent repairs only.' },
97
+ { name: '--no-symlinks', help: 'Write CLAUDE.md as a pointer file instead of a symlink to AGENTS.md.' },
98
+ { name: '--verbose', help: 'Show per-file setup actions. Default setup output is summary-oriented.' },
99
+ { name: '--agent <agent>', help: 'Install the global Orizu skill for this coding agent after workspace setup. Repeat for multiple agents.', repeatable: true, choices: ['claude', 'codex'] },
100
+ { name: '--no-workspace', help: 'Skip workspace creation during guided setup. `--validate` and `--fix` still inspect or repair the workspace contract.' },
101
+ { name: '--no-install', help: 'Skip the coding-agent skill install step.' },
102
+ { name: '--handoff', help: 'Print the coding-agent setup prompt after setup. By default, setup points to `orizu setup prompt` instead of printing it inline.' },
103
+ { name: '--no-handoff', help: 'Compatibility flag; suppresses --handoff/--launch. Setup does not print the handoff prompt by default.' },
93
104
  { name: '--launch <agent>', help: 'Launch a detected coding agent with the setup prompt (interactive terminals only).', choices: ['claude', 'codex'] },
94
105
  { name: '--skip-login', help: 'Skip the authentication phase.' },
95
- { name: '--yes', help: 'Apply changes without per-step confirmation prompts.' },
106
+ { name: '--yes', help: 'Replace existing managed skill links without prompting.' },
96
107
  { name: '--dry-run', help: 'Preview every planned change without writing.' },
97
108
  { name: '--no-input', help: 'Never prompt; behave as in a non-interactive terminal.' },
109
+ { name: '--non-interactive', help: 'Alias for --no-input.' },
98
110
  { name: '--json', help: 'Emit the setup summary as JSON.' },
99
111
  ],
100
112
  examples: [
101
113
  'orizu setup',
102
- 'orizu setup --agent claude --agent codex --yes',
103
- 'orizu setup --skip-login --no-workspace --dry-run',
114
+ 'orizu setup --team highlight',
115
+ 'orizu setup --team highlight --agent codex --agent claude --non-interactive --yes',
116
+ 'orizu setup --validate --workspace ./workbench',
104
117
  ],
105
118
  },
106
119
  {
@@ -113,7 +126,7 @@ export const COMMAND_DOCS: CliCommandDoc[] = [
113
126
  {
114
127
  path: ['install-skill'],
115
128
  usage: 'orizu install-skill [--agent <claude|codex>]... [--scope global|project] [--mode auto|link|copy] [--target <target>]... [--yes] [--dry-run]',
116
- summary: 'Set up the Orizu skill for your coding agents (Claude Code, Codex/Open Agent Skills, or project instructions).',
129
+ summary: 'Install or repair the Orizu coding-agent skill.',
117
130
  group: 'Agent setup',
118
131
  aliases: [['skills', 'install']],
119
132
  options: [
@@ -137,7 +150,7 @@ export const COMMAND_DOCS: CliCommandDoc[] = [
137
150
  name: '--target <target>',
138
151
  help: 'Advanced: explicit install destination ID. Repeat for multiple targets.',
139
152
  repeatable: true,
140
- choices: ['agent-user', 'agents-project', 'codex-project', 'claude-user', 'claude-project', 'agents-md'],
153
+ choices: ['codex-user', 'agent-user', 'agents-project', 'codex-project', 'claude-user', 'claude-project', 'agents-md'],
141
154
  },
142
155
  { name: '--yes', help: 'Replace an existing managed skill or AGENTS.md section without prompting.' },
143
156
  { name: '--dry-run', help: 'Show planned writes without changing files.' },
@@ -226,7 +239,7 @@ export const COMMAND_DOCS: CliCommandDoc[] = [
226
239
  },
227
240
  {
228
241
  path: ['teams', 'members', 'role'],
229
- usage: 'orizu teams members role --team <teamSlug> --email <email> --role <admin|member>',
242
+ usage: 'orizu teams members role --team <teamSlug> --email <email> --role <admin|curator|judge>',
230
243
  summary: 'Change a member role.',
231
244
  group: 'Teams',
232
245
  },
@@ -479,6 +492,18 @@ export const COMMAND_DOCS: CliCommandDoc[] = [
479
492
  summary: 'Create a draft review task by default, with auto distribution or an explicit row-assignment JSONL file.',
480
493
  group: 'Tasks',
481
494
  },
495
+ {
496
+ path: ['tasks', 'update'],
497
+ usage: 'orizu tasks update --task <taskId> [--title <text>] [--description <text>|--description-file <path>] [--instructions <text>|--instructions-file <path>] [--dataset <datasetId>] [--app <appId> [--version <n>]] [--labels-per-item <n>] [--assignees <userIdOrEmail1,userIdOrEmail2> | --assignment-file <path>] [--json]',
498
+ summary: 'Update a draft review task before publishing.',
499
+ group: 'Tasks',
500
+ },
501
+ {
502
+ path: ['tasks', 'discard'],
503
+ usage: 'orizu tasks discard --task <taskId> [--yes] [--json]',
504
+ summary: 'Permanently discard a draft review task.',
505
+ group: 'Tasks',
506
+ },
482
507
  {
483
508
  path: ['tasks', 'publish'],
484
509
  usage: 'orizu tasks publish --task <taskId> (--assignees <userId1,userId2> | --assignment-file <path>) [--json]',
@@ -526,6 +551,12 @@ export const COMMAND_DOCS: CliCommandDoc[] = [
526
551
  summary: 'Resume a paused task.',
527
552
  group: 'Tasks',
528
553
  },
554
+ {
555
+ path: ['tasks', 'complete'],
556
+ usage: 'orizu tasks complete --task <taskId>',
557
+ summary: 'Mark an active or paused task completed.',
558
+ group: 'Tasks',
559
+ },
529
560
  {
530
561
  path: ['tasks', 'export'],
531
562
  usage: 'orizu tasks export [--task <taskId>] [--format <csv|json|jsonl>] [--out <path>]',
@@ -604,6 +635,231 @@ export const COMMAND_DOCS: CliCommandDoc[] = [
604
635
  summary: 'Clone a dataset.',
605
636
  group: 'Datasets',
606
637
  },
638
+ {
639
+ path: ['workspace', 'status'],
640
+ usage: 'orizu workspace status [--remote] [--json]',
641
+ summary: 'Show tracked-resource status: local dirtiness vs the last-sync cache, plus missing and untracked files; --remote adds server statuses via a server-side reconciliation.',
642
+ group: 'Workspace',
643
+ options: [
644
+ { name: '--remote', help: 'Attach server statuses. This performs the same server-side reconciliation as `orizu workspace sync` — it registers and updates tracked-resource records; there is no read-only remote status in v0. The local cache is never advanced.' },
645
+ { name: '--json', help: 'Emit the machine-readable status result.' },
646
+ ],
647
+ examples: ['orizu workspace status', 'orizu workspace status --remote --json'],
648
+ },
649
+ {
650
+ path: ['workspace', 'sync'],
651
+ usage: 'orizu workspace sync [--json]',
652
+ summary: 'Metadata-first reconcile of the whole workbench. Attaches the workspace on first run; advances the cache base only on a clean convergence.',
653
+ group: 'Workspace',
654
+ options: [
655
+ { name: '--json', help: 'Emit the machine-readable per-resource status list.' },
656
+ ],
657
+ examples: ['orizu workspace sync', 'orizu workspace sync --json'],
658
+ },
659
+ {
660
+ path: ['workspace', 'pull'],
661
+ usage: 'orizu workspace pull <path> [--json]',
662
+ summary: 'Fast-forward a resource to the server truth (v0: manifest canonical block + cache only). Refuses when local edits are ahead and no-ops when the server has no truth (local-only/stale). Bulk content materializes via the primitive command (e.g. orizu prompts pull).',
663
+ group: 'Workspace',
664
+ options: [
665
+ { name: '--json', help: 'Emit the machine-readable pull result.' },
666
+ ],
667
+ examples: ['orizu workspace pull projects/hip/prompts/judge/orizu.prompt.json'],
668
+ },
669
+ {
670
+ path: ['workspace', 'apply'],
671
+ usage: 'orizu workspace apply <path> [--json]',
672
+ summary: 'Promote a repo-owned resource to the server, addressed by the row id recorded by sync. Refuses (409) DB-native/object-storage owners, conflicts, remote-newer, and lost compare-and-set races — on any refusal, run `orizu workspace sync`, converge, then retry.',
673
+ group: 'Workspace',
674
+ options: [
675
+ { name: '--json', help: 'Emit the machine-readable apply result.' },
676
+ ],
677
+ examples: ['orizu workspace apply projects/hip/prompts/judge/orizu.prompt.json'],
678
+ },
679
+ {
680
+ path: ['session', 'start'],
681
+ usage: 'orizu session start [--project <team/project>] [--json]',
682
+ summary: 'Start a durable workspace session for the attached workspace and print the session id for later resume.',
683
+ group: 'Sessions',
684
+ options: [
685
+ { name: '--project <team/project>', help: 'Optionally scope the session to a project in the attached workspace.' },
686
+ { name: '--json', help: 'Emit the machine-readable session payload.' },
687
+ ],
688
+ examples: ['orizu session start', 'orizu session start --project highlight/hip --json'],
689
+ },
690
+ {
691
+ path: ['session', 'status'],
692
+ usage: 'orizu session status [--session <id> | --status active|ended] [--json]',
693
+ summary: 'Inspect one session by id, including run summaries, or list sessions for the attached workspace.',
694
+ group: 'Sessions',
695
+ options: [
696
+ { name: '--session <id>', help: 'Resume by session id; does not require the original terminal.' },
697
+ { name: '--status <status>', help: 'Filter attached-workspace sessions when --session is omitted.', choices: ['active', 'ended'] },
698
+ { name: '--json', help: 'Emit the machine-readable session or session-list payload.' },
699
+ ],
700
+ examples: ['orizu session status --session sess_123 --json', 'orizu session status --status active'],
701
+ },
702
+ {
703
+ path: ['session', 'end'],
704
+ usage: 'orizu session end --session <id> [--json]',
705
+ summary: 'Mark a durable workspace session ended.',
706
+ group: 'Sessions',
707
+ options: [
708
+ { name: '--session <id>', help: 'Session id to end.', required: true },
709
+ { name: '--json', help: 'Emit the machine-readable ended session payload.' },
710
+ ],
711
+ examples: ['orizu session end --session sess_123'],
712
+ },
713
+ {
714
+ path: ['session', 'finish'],
715
+ usage: 'orizu session finish --session <id> [--project <team/project>] [--json]',
716
+ summary:
717
+ 'Finish a hosted session branch: no changes deletes the branch; changes create a repo_merge promotion manifest to review and approve (no GitHub PR).',
718
+ group: 'Sessions',
719
+ options: [
720
+ { name: '--session <id>', help: 'Session id whose branch to finish.', required: true },
721
+ { name: '--project <team/project>', help: 'Project scope for the manifest when the session is not already project-scoped.' },
722
+ { name: '--json', help: 'Emit the machine-readable outcome (no-changes or the created manifest).' },
723
+ ],
724
+ examples: ['orizu session finish --session sess_123', 'orizu session finish --session sess_123 --project highlight/hip --json'],
725
+ },
726
+ {
727
+ path: ['run', 'start'],
728
+ usage: 'orizu run start --session <id> --title <title> [--project <team/project>] [--json]',
729
+ summary: 'Start a resumable workbench run inside a workspace session and print the run id.',
730
+ group: 'Workbench runs',
731
+ options: [
732
+ { name: '--session <id>', help: 'Workspace session id.', required: true },
733
+ { name: '--title <title>', help: 'Human-readable run title.', required: true },
734
+ { name: '--project <team/project>', help: 'Optionally override the session project scope.' },
735
+ { name: '--json', help: 'Emit the machine-readable run payload.' },
736
+ ],
737
+ examples: ['orizu run start --session sess_123 --title "Fix evaluator drift" --json'],
738
+ },
739
+ {
740
+ path: ['run', 'status'],
741
+ usage: 'orizu run status --run <id> [--json]',
742
+ summary: 'Inspect a workbench run by id, including evidence and latest event sequence.',
743
+ group: 'Workbench runs',
744
+ options: [
745
+ { name: '--run <id>', help: 'Workbench run id.', required: true },
746
+ { name: '--json', help: 'Emit the machine-readable run payload.' },
747
+ ],
748
+ examples: ['orizu run status --run run_123 --json'],
749
+ },
750
+ {
751
+ path: ['run', 'tail'],
752
+ usage: 'orizu run tail --run <id> [--after <seq>] [--interval <seconds>] [--once] [--json]',
753
+ summary: 'Cursor-poll a workbench run event log; JSON mode emits one event object per line.',
754
+ group: 'Workbench runs',
755
+ options: [
756
+ { name: '--run <id>', help: 'Workbench run id.', required: true },
757
+ { name: '--after <seq>', help: 'Start after this event sequence. Defaults to 0.' },
758
+ { name: '--interval <seconds>', help: 'Polling interval for non-terminal runs. Defaults to 2.' },
759
+ { name: '--once', help: 'Fetch one page and exit; useful for tests and agents.' },
760
+ { name: '--json', help: 'Emit JSONL, one event object per line.' },
761
+ ],
762
+ examples: ['orizu run tail --run run_123', 'orizu run tail --run run_123 --after 42 --once --json'],
763
+ },
764
+ {
765
+ path: ['run', 'complete'],
766
+ usage: 'orizu run complete --run <id> [--summary <text>] [--json]',
767
+ summary: 'Mark a workbench run succeeded.',
768
+ group: 'Workbench runs',
769
+ options: [
770
+ { name: '--run <id>', help: 'Workbench run id.', required: true },
771
+ { name: '--summary <text>', help: 'Optional note stored in the run summary.' },
772
+ { name: '--json', help: 'Emit the machine-readable run payload.' },
773
+ ],
774
+ examples: ['orizu run complete --run run_123 --summary "All gates passed"'],
775
+ },
776
+ {
777
+ path: ['run', 'fail'],
778
+ usage: 'orizu run fail --run <id> [--summary <text>] [--json]',
779
+ summary: 'Mark a workbench run failed.',
780
+ group: 'Workbench runs',
781
+ options: [
782
+ { name: '--run <id>', help: 'Workbench run id.', required: true },
783
+ { name: '--summary <text>', help: 'Optional note stored in the run summary.' },
784
+ { name: '--json', help: 'Emit the machine-readable run payload.' },
785
+ ],
786
+ examples: ['orizu run fail --run run_123 --summary "Lint failed"'],
787
+ },
788
+ {
789
+ path: ['run', 'cancel'],
790
+ usage: 'orizu run cancel --run <id> [--summary <text>] [--json]',
791
+ summary: 'Mark a workbench run cancelled.',
792
+ group: 'Workbench runs',
793
+ options: [
794
+ { name: '--run <id>', help: 'Workbench run id.', required: true },
795
+ { name: '--summary <text>', help: 'Optional note stored in the run summary.' },
796
+ { name: '--json', help: 'Emit the machine-readable run payload.' },
797
+ ],
798
+ examples: ['orizu run cancel --run run_123 --summary "Superseded by run_456"'],
799
+ },
800
+ {
801
+ path: ['connectors', 'status'],
802
+ usage: 'orizu connectors [status] [--project <team/project>] [--json]',
803
+ summary: 'Show project connector readiness (configured/missing/stale/unauthorized/unsupported/unknown) derived read-only from stored integration state. Secrets are always redacted.',
804
+ group: 'Connectors',
805
+ options: [
806
+ { name: '--project <team/project>', help: 'Project whose connector readiness to inspect.' },
807
+ { name: '--json', help: 'Emit the machine-readable connector readiness payload.' },
808
+ ],
809
+ examples: ['orizu connectors', 'orizu connectors status --project highlight/hip --json'],
810
+ },
811
+ {
812
+ path: ['manifests', 'list'],
813
+ usage: 'orizu manifests list [--project <team/project>] [--status <status>] [--json]',
814
+ summary: 'List promotion manifests for a project, newest first, optionally filtered by status.',
815
+ group: 'Promotion manifests',
816
+ options: [
817
+ { name: '--project <team/project>', help: 'Project whose manifests to list.' },
818
+ { name: '--status <status>', help: 'Filter by status.', choices: ['draft', 'pending_approval', 'approved', 'applied', 'rejected'] },
819
+ { name: '--json', help: 'Emit the machine-readable manifest list.' },
820
+ ],
821
+ examples: ['orizu manifests list --project highlight/hip --status pending_approval'],
822
+ },
823
+ {
824
+ path: ['manifests', 'show'],
825
+ usage: 'orizu manifests show <id> [--json]',
826
+ summary: 'Show one promotion manifest, including current/proposed state, evidence, outcome, and approver.',
827
+ group: 'Promotion manifests',
828
+ options: [
829
+ { name: '--json', help: 'Emit the machine-readable manifest payload.' },
830
+ ],
831
+ examples: ['orizu manifests show manifest_123 --json'],
832
+ },
833
+ {
834
+ path: ['manifests', 'approve'],
835
+ usage: 'orizu manifests approve <id> [--json]',
836
+ summary: 'Approve a draft or pending_approval manifest; records the approver principal separately from the author.',
837
+ group: 'Promotion manifests',
838
+ options: [
839
+ { name: '--json', help: 'Emit the machine-readable manifest payload.' },
840
+ ],
841
+ examples: ['orizu manifests approve manifest_123'],
842
+ },
843
+ {
844
+ path: ['manifests', 'reject'],
845
+ usage: 'orizu manifests reject <id> [--json]',
846
+ summary: 'Reject a manifest so it can no longer be applied.',
847
+ group: 'Promotion manifests',
848
+ options: [
849
+ { name: '--json', help: 'Emit the machine-readable manifest payload.' },
850
+ ],
851
+ examples: ['orizu manifests reject manifest_123'],
852
+ },
853
+ {
854
+ path: ['manifests', 'apply'],
855
+ usage: 'orizu manifests apply <id> [--json]',
856
+ summary: 'Apply an approved manifest. Idempotent: re-applying returns the stored outcome with no second effect. v0 records the outcome and links evidence; content promotion still flows through the primitive commands.',
857
+ group: 'Promotion manifests',
858
+ options: [
859
+ { name: '--json', help: 'Emit the machine-readable manifest payload.' },
860
+ ],
861
+ examples: ['orizu manifests apply manifest_123 --json'],
862
+ },
607
863
  ]
608
864
 
609
865
  function groupByName(name: string): CliGroupDoc | undefined {
@@ -667,7 +923,7 @@ export function renderRootHelp(): string {
667
923
  lines.push(
668
924
  '',
669
925
  'Examples:',
670
- ' orizu install-skill --target agent-user --yes',
926
+ ' orizu install-skill --target codex-user --yes',
671
927
  ' orizu apps preview --file ./App.tsx --input-schema ./input.json --output-schema ./output.json --sample-row ./row.json --screenshot ./preview.png',
672
928
  ' orizu tasks create --project core/evals --dataset <datasetId> --app <appId> --title "Review"',
673
929
  ' orizu tasks publish --task <taskId> --assignees <userId1,userId2>',