runpane 2.4.199 → 2.4.201
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/README.md +2 -2
- package/dist/agentTasks.js +1 -0
- package/dist/agentTasks.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +4 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +13 -1
- package/dist/commands.js.map +1 -1
- package/dist/docs-index.json +1 -1
- package/dist/generated/contract.d.ts +570 -11
- package/dist/generated/contract.d.ts.map +1 -1
- package/dist/generated/contract.js +1166 -30
- package/dist/generated/contract.js.map +1 -1
- package/dist/localControl.d.ts +5 -0
- package/dist/localControl.d.ts.map +1 -1
- package/dist/localControl.js +286 -0
- package/dist/localControl.js.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +2 -3
- package/dist/update.js.map +1 -1
- package/dist/updateOperation.d.ts +3 -0
- package/dist/updateOperation.d.ts.map +1 -1
- package/dist/updateOperation.js +8 -2
- package/dist/updateOperation.js.map +1 -1
- package/package.json +1 -1
|
@@ -1509,6 +1509,120 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1509
1509
|
"prWatchResult"
|
|
1510
1510
|
],
|
|
1511
1511
|
"localControl": true
|
|
1512
|
+
},
|
|
1513
|
+
{
|
|
1514
|
+
"name": "loops list",
|
|
1515
|
+
"summary": "List loops (scheduled tasks) with their schedule, next run, and recent runs.",
|
|
1516
|
+
"usage": [
|
|
1517
|
+
"runpane loops list [--json] [--pane-dir <path>]"
|
|
1518
|
+
],
|
|
1519
|
+
"toolsets": [
|
|
1520
|
+
"loops"
|
|
1521
|
+
],
|
|
1522
|
+
"jsonSchemas": [
|
|
1523
|
+
"loopListResult"
|
|
1524
|
+
],
|
|
1525
|
+
"localControl": true
|
|
1526
|
+
},
|
|
1527
|
+
{
|
|
1528
|
+
"name": "loops create",
|
|
1529
|
+
"summary": "Create a loop: a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.",
|
|
1530
|
+
"usage": [
|
|
1531
|
+
"runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]"
|
|
1532
|
+
],
|
|
1533
|
+
"mutates": true,
|
|
1534
|
+
"additive": true,
|
|
1535
|
+
"toolsets": [
|
|
1536
|
+
"loops"
|
|
1537
|
+
],
|
|
1538
|
+
"jsonSchemas": [
|
|
1539
|
+
"loopInput",
|
|
1540
|
+
"loopResult",
|
|
1541
|
+
"loopDryRunResult"
|
|
1542
|
+
],
|
|
1543
|
+
"localControl": true
|
|
1544
|
+
},
|
|
1545
|
+
{
|
|
1546
|
+
"name": "loops update",
|
|
1547
|
+
"summary": "Change a loop's repo or Session, name, schedule, agent or command, prompt, or worktree template. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.",
|
|
1548
|
+
"usage": [
|
|
1549
|
+
"runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]"
|
|
1550
|
+
],
|
|
1551
|
+
"mutates": true,
|
|
1552
|
+
"idempotent": true,
|
|
1553
|
+
"toolsets": [
|
|
1554
|
+
"loops"
|
|
1555
|
+
],
|
|
1556
|
+
"jsonSchemas": [
|
|
1557
|
+
"loopInput",
|
|
1558
|
+
"loopResult",
|
|
1559
|
+
"loopDryRunResult"
|
|
1560
|
+
],
|
|
1561
|
+
"localControl": true
|
|
1562
|
+
},
|
|
1563
|
+
{
|
|
1564
|
+
"name": "loops run",
|
|
1565
|
+
"summary": "Start a run of a loop now. The schedule stays the same.",
|
|
1566
|
+
"usage": [
|
|
1567
|
+
"runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]"
|
|
1568
|
+
],
|
|
1569
|
+
"mutates": true,
|
|
1570
|
+
"additive": true,
|
|
1571
|
+
"toolsets": [
|
|
1572
|
+
"loops"
|
|
1573
|
+
],
|
|
1574
|
+
"jsonSchemas": [
|
|
1575
|
+
"loopResult"
|
|
1576
|
+
],
|
|
1577
|
+
"localControl": true
|
|
1578
|
+
},
|
|
1579
|
+
{
|
|
1580
|
+
"name": "loops pause",
|
|
1581
|
+
"summary": "Pause a loop: it starts no scheduled runs until resumed.",
|
|
1582
|
+
"usage": [
|
|
1583
|
+
"runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]"
|
|
1584
|
+
],
|
|
1585
|
+
"mutates": true,
|
|
1586
|
+
"idempotent": true,
|
|
1587
|
+
"toolsets": [
|
|
1588
|
+
"loops"
|
|
1589
|
+
],
|
|
1590
|
+
"jsonSchemas": [
|
|
1591
|
+
"loopResult"
|
|
1592
|
+
],
|
|
1593
|
+
"localControl": true
|
|
1594
|
+
},
|
|
1595
|
+
{
|
|
1596
|
+
"name": "loops resume",
|
|
1597
|
+
"summary": "Resume a paused loop from its next scheduled time.",
|
|
1598
|
+
"usage": [
|
|
1599
|
+
"runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]"
|
|
1600
|
+
],
|
|
1601
|
+
"mutates": true,
|
|
1602
|
+
"idempotent": true,
|
|
1603
|
+
"toolsets": [
|
|
1604
|
+
"loops"
|
|
1605
|
+
],
|
|
1606
|
+
"jsonSchemas": [
|
|
1607
|
+
"loopResult"
|
|
1608
|
+
],
|
|
1609
|
+
"localControl": true
|
|
1610
|
+
},
|
|
1611
|
+
{
|
|
1612
|
+
"name": "loops delete",
|
|
1613
|
+
"summary": "Delete a loop. It starts no more runs.",
|
|
1614
|
+
"usage": [
|
|
1615
|
+
"runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]"
|
|
1616
|
+
],
|
|
1617
|
+
"mutates": true,
|
|
1618
|
+
"idempotent": true,
|
|
1619
|
+
"toolsets": [
|
|
1620
|
+
"loops"
|
|
1621
|
+
],
|
|
1622
|
+
"jsonSchemas": [
|
|
1623
|
+
"loopDeleteResult"
|
|
1624
|
+
],
|
|
1625
|
+
"localControl": true
|
|
1512
1626
|
}
|
|
1513
1627
|
],
|
|
1514
1628
|
"flags": {
|
|
@@ -1629,12 +1743,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1629
1743
|
{
|
|
1630
1744
|
"name": "--name",
|
|
1631
1745
|
"value": "<name>",
|
|
1632
|
-
"description": "Name for the registered repository, created/renamed pane session,
|
|
1746
|
+
"description": "Name for the registered repository, created/renamed pane session, named lock, or loop."
|
|
1633
1747
|
},
|
|
1634
1748
|
{
|
|
1635
1749
|
"name": "--worktree-name",
|
|
1636
1750
|
"value": "<name>",
|
|
1637
|
-
"description": "Worktree name to request. Defaults to --name."
|
|
1751
|
+
"description": "Worktree name to request. Defaults to --name. For a loop, the worktree and branch name template; defaults to loop-<name>."
|
|
1638
1752
|
},
|
|
1639
1753
|
{
|
|
1640
1754
|
"name": "--branch",
|
|
@@ -1855,6 +1969,16 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1855
1969
|
"value": "<text>",
|
|
1856
1970
|
"description": "What a named lock is for. Outside a Pane terminal it also names the owner, so pass the same note to release it."
|
|
1857
1971
|
},
|
|
1972
|
+
{
|
|
1973
|
+
"name": "--loop",
|
|
1974
|
+
"value": "<id>",
|
|
1975
|
+
"description": "Loop id, from `runpane loops list`."
|
|
1976
|
+
},
|
|
1977
|
+
{
|
|
1978
|
+
"name": "--cron",
|
|
1979
|
+
"value": "<expr>",
|
|
1980
|
+
"description": "Five-field cron schedule in this machine's local time zone, such as \"0 3 * * *\". Runs must be at least 60 minutes apart."
|
|
1981
|
+
},
|
|
1858
1982
|
{
|
|
1859
1983
|
"name": "--message",
|
|
1860
1984
|
"value": "<message>",
|
|
@@ -2065,6 +2189,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2065
2189
|
{
|
|
2066
2190
|
"name": "--all",
|
|
2067
2191
|
"description": "inbox ack only: clear every item of the --session."
|
|
2192
|
+
},
|
|
2193
|
+
{
|
|
2194
|
+
"name": "--paused",
|
|
2195
|
+
"description": "loops create only: create the loop paused."
|
|
2068
2196
|
}
|
|
2069
2197
|
]
|
|
2070
2198
|
},
|
|
@@ -2098,6 +2226,9 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2098
2226
|
" runpane lock acquire --name <name> --ttl <duration> [--wait <milliseconds>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]",
|
|
2099
2227
|
" runpane lock release --name <name> [--force] [--session <id|name>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]",
|
|
2100
2228
|
" runpane lock list [--session <id|name>] [--json] [--pane-dir <path>]",
|
|
2229
|
+
" runpane loops list [--json]",
|
|
2230
|
+
" runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>] --yes",
|
|
2231
|
+
" runpane loops update|run|pause|resume|delete --loop <id> --yes",
|
|
2101
2232
|
" runpane panes list [--repo <selector>] [--json]",
|
|
2102
2233
|
" runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]",
|
|
2103
2234
|
" runpane workspace state [--repo <selector>] [--json]",
|
|
@@ -3282,6 +3413,147 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3282
3413
|
" --session <id|name> Named Session whose locks to list or release.",
|
|
3283
3414
|
" --json Print JSON output."
|
|
3284
3415
|
],
|
|
3416
|
+
"loops": [
|
|
3417
|
+
"Usage:",
|
|
3418
|
+
" runpane loops <list|create|update|run|pause|resume|delete> [options]",
|
|
3419
|
+
"",
|
|
3420
|
+
"Loops (scheduled tasks) start a new Pane in a fresh worktree on a cron schedule.",
|
|
3421
|
+
"A Session loop instead sends its prompt to a Session's agent each run.",
|
|
3422
|
+
"Loops are for large recurring jobs and run at most once an hour.",
|
|
3423
|
+
"For short waits, use your agent harness's own sleep and wake.",
|
|
3424
|
+
"Runs start only while Pane is running, in this machine's local time zone.",
|
|
3425
|
+
"",
|
|
3426
|
+
"Commands:",
|
|
3427
|
+
" runpane loops list [--json] [--pane-dir <path>]",
|
|
3428
|
+
" runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]",
|
|
3429
|
+
" runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]",
|
|
3430
|
+
" runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
3431
|
+
" runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
3432
|
+
" runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
3433
|
+
" runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]"
|
|
3434
|
+
],
|
|
3435
|
+
"loops list": [
|
|
3436
|
+
"Usage:",
|
|
3437
|
+
"runpane loops list [--json] [--pane-dir <path>]",
|
|
3438
|
+
"",
|
|
3439
|
+
"List loops (scheduled tasks) with their schedule, next run, and recent runs.",
|
|
3440
|
+
"",
|
|
3441
|
+
"Options:",
|
|
3442
|
+
" --json Print JSON output.",
|
|
3443
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
3444
|
+
],
|
|
3445
|
+
"loops create": [
|
|
3446
|
+
"Usage:",
|
|
3447
|
+
"runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]",
|
|
3448
|
+
"",
|
|
3449
|
+
"Create a loop: a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.",
|
|
3450
|
+
"With --repo, each run is a new Pane in a fresh worktree from the repo's default base branch.",
|
|
3451
|
+
"A Session loop sends its prompt to that Session's agent each run instead of creating a new Pane.",
|
|
3452
|
+
"",
|
|
3453
|
+
"Options:",
|
|
3454
|
+
" --repo <selector> Repository: active, id, exact path, or saved name.",
|
|
3455
|
+
" --session <id|name|new> Session whose agent gets the prompt each run, instead of",
|
|
3456
|
+
" a new Pane; `new` creates a Session named after the loop.",
|
|
3457
|
+
" That agent then skips permission prompts for every message",
|
|
3458
|
+
" it gets, not only loop runs.",
|
|
3459
|
+
" --name <name> Loop name.",
|
|
3460
|
+
" --cron <expr> Five-field cron in local time, such as \"0 3 * * *\"; at least 1 hour apart.",
|
|
3461
|
+
" --agent <claude|codex|cursor> Agent each run starts; for a Session loop, the Session's agent.",
|
|
3462
|
+
" Runs skip permission prompts.",
|
|
3463
|
+
" --tool-command <command> Command each run starts instead of an agent, such as",
|
|
3464
|
+
" ./scripts/nightly-report.sh. Project loops only. On Windows it runs",
|
|
3465
|
+
" in Pane's terminal shell, Git Bash by default, so write bash or",
|
|
3466
|
+
" `cmd //c`: \"cmd //c echo hi > loop.txt\" works, \"cmd /c ...\" hangs.",
|
|
3467
|
+
" --prompt <text> Text typed into the agent or command after it starts; for a",
|
|
3468
|
+
" Session loop, the message sent to the Session's agent each run.",
|
|
3469
|
+
" --prompt-file <path|-> Read the prompt from a file or stdin.",
|
|
3470
|
+
" --worktree-name <template> Worktree and branch name; defaults to loop-<name>. Project loops only.",
|
|
3471
|
+
" --paused Create the loop paused.",
|
|
3472
|
+
" --dry-run Check the schedule and print what would be saved.",
|
|
3473
|
+
" --yes Confirm the change.",
|
|
3474
|
+
" --json Print JSON output.",
|
|
3475
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
3476
|
+
],
|
|
3477
|
+
"loops update": [
|
|
3478
|
+
"Usage:",
|
|
3479
|
+
"runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]",
|
|
3480
|
+
"",
|
|
3481
|
+
"Change a loop's repo or Session, name, schedule, agent or command, prompt, or worktree template. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.",
|
|
3482
|
+
"With --repo, each run is a new Pane in a fresh worktree from the repo's default base branch.",
|
|
3483
|
+
"A Session loop sends its prompt to that Session's agent each run instead of creating a new Pane.",
|
|
3484
|
+
"",
|
|
3485
|
+
"Options:",
|
|
3486
|
+
" --loop <id> Loop to change; other flags replace its values.",
|
|
3487
|
+
" --repo <selector> Repository: active, id, exact path, or saved name.",
|
|
3488
|
+
" --session <id|name|new> Session whose agent gets the prompt each run, instead of",
|
|
3489
|
+
" a new Pane; `new` creates a Session named after the loop.",
|
|
3490
|
+
" That agent then skips permission prompts for every message",
|
|
3491
|
+
" it gets, not only loop runs.",
|
|
3492
|
+
" --name <name> Loop name.",
|
|
3493
|
+
" --cron <expr> Five-field cron in local time, such as \"0 3 * * *\"; at least 1 hour apart.",
|
|
3494
|
+
" --agent <claude|codex|cursor> Agent each run starts; for a Session loop, the Session's agent.",
|
|
3495
|
+
" Runs skip permission prompts.",
|
|
3496
|
+
" --tool-command <command> Command each run starts instead of an agent, such as",
|
|
3497
|
+
" ./scripts/nightly-report.sh. Project loops only. On Windows it runs",
|
|
3498
|
+
" in Pane's terminal shell, Git Bash by default, so write bash or",
|
|
3499
|
+
" `cmd //c`: \"cmd //c echo hi > loop.txt\" works, \"cmd /c ...\" hangs.",
|
|
3500
|
+
" --prompt <text> Text typed into the agent or command after it starts; for a",
|
|
3501
|
+
" Session loop, the message sent to the Session's agent each run.",
|
|
3502
|
+
" --prompt-file <path|-> Read the prompt from a file or stdin.",
|
|
3503
|
+
" --worktree-name <template> Worktree and branch name; defaults to loop-<name>. Project loops only.",
|
|
3504
|
+
" --dry-run Check the schedule and print what would be saved.",
|
|
3505
|
+
" --yes Confirm the change.",
|
|
3506
|
+
" --json Print JSON output.",
|
|
3507
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
3508
|
+
],
|
|
3509
|
+
"loops run": [
|
|
3510
|
+
"Usage:",
|
|
3511
|
+
"runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
3512
|
+
"",
|
|
3513
|
+
"Start a run of a loop now. The schedule stays the same.",
|
|
3514
|
+
"",
|
|
3515
|
+
"Options:",
|
|
3516
|
+
" --loop <id> Loop id, from runpane loops list.",
|
|
3517
|
+
" --yes Confirm the change.",
|
|
3518
|
+
" --json Print JSON output.",
|
|
3519
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
3520
|
+
],
|
|
3521
|
+
"loops pause": [
|
|
3522
|
+
"Usage:",
|
|
3523
|
+
"runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
3524
|
+
"",
|
|
3525
|
+
"Pause a loop: it starts no scheduled runs until resumed.",
|
|
3526
|
+
"",
|
|
3527
|
+
"Options:",
|
|
3528
|
+
" --loop <id> Loop id, from runpane loops list.",
|
|
3529
|
+
" --yes Confirm the change.",
|
|
3530
|
+
" --json Print JSON output.",
|
|
3531
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
3532
|
+
],
|
|
3533
|
+
"loops resume": [
|
|
3534
|
+
"Usage:",
|
|
3535
|
+
"runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
3536
|
+
"",
|
|
3537
|
+
"Resume a paused loop from its next scheduled time.",
|
|
3538
|
+
"",
|
|
3539
|
+
"Options:",
|
|
3540
|
+
" --loop <id> Loop id, from runpane loops list.",
|
|
3541
|
+
" --yes Confirm the change.",
|
|
3542
|
+
" --json Print JSON output.",
|
|
3543
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
3544
|
+
],
|
|
3545
|
+
"loops delete": [
|
|
3546
|
+
"Usage:",
|
|
3547
|
+
"runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
3548
|
+
"",
|
|
3549
|
+
"Delete a loop. It starts no more runs.",
|
|
3550
|
+
"",
|
|
3551
|
+
"Options:",
|
|
3552
|
+
" --loop <id> Loop id, from runpane loops list.",
|
|
3553
|
+
" --yes Confirm the change.",
|
|
3554
|
+
" --json Print JSON output.",
|
|
3555
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
3556
|
+
],
|
|
3285
3557
|
"workspace list": [
|
|
3286
3558
|
"Usage:",
|
|
3287
3559
|
" runpane workspace list [--json] [--pane-dir <path>]",
|
|
@@ -3497,6 +3769,9 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3497
3769
|
" runpane lock acquire --name <name> --ttl <duration> [--wait <milliseconds>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]",
|
|
3498
3770
|
" runpane lock release --name <name> [--force] [--session <id|name>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]",
|
|
3499
3771
|
" runpane lock list [--session <id|name>] [--json] [--pane-dir <path>]",
|
|
3772
|
+
" python -m runpane loops list [--json]",
|
|
3773
|
+
" python -m runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>] --yes",
|
|
3774
|
+
" python -m runpane loops update|run|pause|resume|delete --loop <id> --yes",
|
|
3500
3775
|
" runpane help [command]",
|
|
3501
3776
|
"",
|
|
3502
3777
|
"Quick start:",
|
|
@@ -4588,6 +4863,147 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4588
4863
|
" --session <id|name> Named Session whose locks to list or release.",
|
|
4589
4864
|
" --json Print JSON output."
|
|
4590
4865
|
],
|
|
4866
|
+
"loops": [
|
|
4867
|
+
"Usage:",
|
|
4868
|
+
" python -m runpane loops <list|create|update|run|pause|resume|delete> [options]",
|
|
4869
|
+
"",
|
|
4870
|
+
"Loops (scheduled tasks) start a new Pane in a fresh worktree on a cron schedule.",
|
|
4871
|
+
"A Session loop instead sends its prompt to a Session's agent each run.",
|
|
4872
|
+
"Loops are for large recurring jobs and run at most once an hour.",
|
|
4873
|
+
"For short waits, use your agent harness's own sleep and wake.",
|
|
4874
|
+
"Runs start only while Pane is running, in this machine's local time zone.",
|
|
4875
|
+
"",
|
|
4876
|
+
"Commands:",
|
|
4877
|
+
" python -m runpane loops list [--json] [--pane-dir <path>]",
|
|
4878
|
+
" python -m runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]",
|
|
4879
|
+
" python -m runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]",
|
|
4880
|
+
" python -m runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
4881
|
+
" python -m runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
4882
|
+
" python -m runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
4883
|
+
" python -m runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]"
|
|
4884
|
+
],
|
|
4885
|
+
"loops list": [
|
|
4886
|
+
"Usage:",
|
|
4887
|
+
"python -m runpane loops list [--json] [--pane-dir <path>]",
|
|
4888
|
+
"",
|
|
4889
|
+
"List loops (scheduled tasks) with their schedule, next run, and recent runs.",
|
|
4890
|
+
"",
|
|
4891
|
+
"Options:",
|
|
4892
|
+
" --json Print JSON output.",
|
|
4893
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
4894
|
+
],
|
|
4895
|
+
"loops create": [
|
|
4896
|
+
"Usage:",
|
|
4897
|
+
"python -m runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]",
|
|
4898
|
+
"",
|
|
4899
|
+
"Create a loop: a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.",
|
|
4900
|
+
"With --repo, each run is a new Pane in a fresh worktree from the repo's default base branch.",
|
|
4901
|
+
"A Session loop sends its prompt to that Session's agent each run instead of creating a new Pane.",
|
|
4902
|
+
"",
|
|
4903
|
+
"Options:",
|
|
4904
|
+
" --repo <selector> Repository: active, id, exact path, or saved name.",
|
|
4905
|
+
" --session <id|name|new> Session whose agent gets the prompt each run, instead of",
|
|
4906
|
+
" a new Pane; `new` creates a Session named after the loop.",
|
|
4907
|
+
" That agent then skips permission prompts for every message",
|
|
4908
|
+
" it gets, not only loop runs.",
|
|
4909
|
+
" --name <name> Loop name.",
|
|
4910
|
+
" --cron <expr> Five-field cron in local time, such as \"0 3 * * *\"; at least 1 hour apart.",
|
|
4911
|
+
" --agent <claude|codex|cursor> Agent each run starts; for a Session loop, the Session's agent.",
|
|
4912
|
+
" Runs skip permission prompts.",
|
|
4913
|
+
" --tool-command <command> Command each run starts instead of an agent, such as",
|
|
4914
|
+
" ./scripts/nightly-report.sh. Project loops only. On Windows it runs",
|
|
4915
|
+
" in Pane's terminal shell, Git Bash by default, so write bash or",
|
|
4916
|
+
" `cmd //c`: \"cmd //c echo hi > loop.txt\" works, \"cmd /c ...\" hangs.",
|
|
4917
|
+
" --prompt <text> Text typed into the agent or command after it starts; for a",
|
|
4918
|
+
" Session loop, the message sent to the Session's agent each run.",
|
|
4919
|
+
" --prompt-file <path|-> Read the prompt from a file or stdin.",
|
|
4920
|
+
" --worktree-name <template> Worktree and branch name; defaults to loop-<name>. Project loops only.",
|
|
4921
|
+
" --paused Create the loop paused.",
|
|
4922
|
+
" --dry-run Check the schedule and print what would be saved.",
|
|
4923
|
+
" --yes Confirm the change.",
|
|
4924
|
+
" --json Print JSON output.",
|
|
4925
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
4926
|
+
],
|
|
4927
|
+
"loops update": [
|
|
4928
|
+
"Usage:",
|
|
4929
|
+
"python -m runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]",
|
|
4930
|
+
"",
|
|
4931
|
+
"Change a loop's repo or Session, name, schedule, agent or command, prompt, or worktree template. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.",
|
|
4932
|
+
"With --repo, each run is a new Pane in a fresh worktree from the repo's default base branch.",
|
|
4933
|
+
"A Session loop sends its prompt to that Session's agent each run instead of creating a new Pane.",
|
|
4934
|
+
"",
|
|
4935
|
+
"Options:",
|
|
4936
|
+
" --loop <id> Loop to change; other flags replace its values.",
|
|
4937
|
+
" --repo <selector> Repository: active, id, exact path, or saved name.",
|
|
4938
|
+
" --session <id|name|new> Session whose agent gets the prompt each run, instead of",
|
|
4939
|
+
" a new Pane; `new` creates a Session named after the loop.",
|
|
4940
|
+
" That agent then skips permission prompts for every message",
|
|
4941
|
+
" it gets, not only loop runs.",
|
|
4942
|
+
" --name <name> Loop name.",
|
|
4943
|
+
" --cron <expr> Five-field cron in local time, such as \"0 3 * * *\"; at least 1 hour apart.",
|
|
4944
|
+
" --agent <claude|codex|cursor> Agent each run starts; for a Session loop, the Session's agent.",
|
|
4945
|
+
" Runs skip permission prompts.",
|
|
4946
|
+
" --tool-command <command> Command each run starts instead of an agent, such as",
|
|
4947
|
+
" ./scripts/nightly-report.sh. Project loops only. On Windows it runs",
|
|
4948
|
+
" in Pane's terminal shell, Git Bash by default, so write bash or",
|
|
4949
|
+
" `cmd //c`: \"cmd //c echo hi > loop.txt\" works, \"cmd /c ...\" hangs.",
|
|
4950
|
+
" --prompt <text> Text typed into the agent or command after it starts; for a",
|
|
4951
|
+
" Session loop, the message sent to the Session's agent each run.",
|
|
4952
|
+
" --prompt-file <path|-> Read the prompt from a file or stdin.",
|
|
4953
|
+
" --worktree-name <template> Worktree and branch name; defaults to loop-<name>. Project loops only.",
|
|
4954
|
+
" --dry-run Check the schedule and print what would be saved.",
|
|
4955
|
+
" --yes Confirm the change.",
|
|
4956
|
+
" --json Print JSON output.",
|
|
4957
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
4958
|
+
],
|
|
4959
|
+
"loops run": [
|
|
4960
|
+
"Usage:",
|
|
4961
|
+
"python -m runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
4962
|
+
"",
|
|
4963
|
+
"Start a run of a loop now. The schedule stays the same.",
|
|
4964
|
+
"",
|
|
4965
|
+
"Options:",
|
|
4966
|
+
" --loop <id> Loop id, from runpane loops list.",
|
|
4967
|
+
" --yes Confirm the change.",
|
|
4968
|
+
" --json Print JSON output.",
|
|
4969
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
4970
|
+
],
|
|
4971
|
+
"loops pause": [
|
|
4972
|
+
"Usage:",
|
|
4973
|
+
"python -m runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
4974
|
+
"",
|
|
4975
|
+
"Pause a loop: it starts no scheduled runs until resumed.",
|
|
4976
|
+
"",
|
|
4977
|
+
"Options:",
|
|
4978
|
+
" --loop <id> Loop id, from runpane loops list.",
|
|
4979
|
+
" --yes Confirm the change.",
|
|
4980
|
+
" --json Print JSON output.",
|
|
4981
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
4982
|
+
],
|
|
4983
|
+
"loops resume": [
|
|
4984
|
+
"Usage:",
|
|
4985
|
+
"python -m runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
4986
|
+
"",
|
|
4987
|
+
"Resume a paused loop from its next scheduled time.",
|
|
4988
|
+
"",
|
|
4989
|
+
"Options:",
|
|
4990
|
+
" --loop <id> Loop id, from runpane loops list.",
|
|
4991
|
+
" --yes Confirm the change.",
|
|
4992
|
+
" --json Print JSON output.",
|
|
4993
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
4994
|
+
],
|
|
4995
|
+
"loops delete": [
|
|
4996
|
+
"Usage:",
|
|
4997
|
+
"python -m runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]",
|
|
4998
|
+
"",
|
|
4999
|
+
"Delete a loop. It starts no more runs.",
|
|
5000
|
+
"",
|
|
5001
|
+
"Options:",
|
|
5002
|
+
" --loop <id> Loop id, from runpane loops list.",
|
|
5003
|
+
" --yes Confirm the change.",
|
|
5004
|
+
" --json Print JSON output.",
|
|
5005
|
+
" --pane-dir <path> Connect to a specific Pane data directory."
|
|
5006
|
+
],
|
|
4591
5007
|
"workspace list": [
|
|
4592
5008
|
"Usage:",
|
|
4593
5009
|
" runpane workspace list [--json] [--pane-dir <path>]",
|
|
@@ -4787,6 +5203,9 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4787
5203
|
"runpane lock acquire --name testing-account --ttl 30m --wait 1800000 --note \"call QA\" --json",
|
|
4788
5204
|
"runpane lock release --name testing-account --json",
|
|
4789
5205
|
"runpane lock list --json",
|
|
5206
|
+
"runpane loops create --repo active --name nightly-bug-sweep --cron \"0 3 * * *\" --agent claude --prompt \"Fix one bug from yesterday's issues\" --yes --json",
|
|
5207
|
+
"runpane loops list --json",
|
|
5208
|
+
"runpane loops run --loop <loop-id> --yes --json",
|
|
4790
5209
|
"runpane agents start --repo active --name fix-login --agent claude --prompt \"Fix the login redirect\" --yes --json",
|
|
4791
5210
|
"runpane agents start --pane <pane-id> --agent codex --prompt \"Review the PR from this branch and report findings\" --yes --json",
|
|
4792
5211
|
"runpane agents status --pane <pane-id> --json",
|
|
@@ -4852,6 +5271,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4852
5271
|
"`sessions detach` detach a Pane from a named Session.",
|
|
4853
5272
|
"`sessions overview` read a live status, activity, git, and pull request overview for a named Session. Each panel in `panes[].panels[]` carries its own latest `runpane report` as `report`, so one call shows what every worker last reported and when (`reportedAt`, next to the panel's `state` and `lastActivityAt`). When a report's summary is a complete JSON object, such as a status file sent with `--summary-file`, `report.data` holds it exactly as the worker gave it; Pane never reads, renames or validates its fields. A summary that is not a JSON object (plain text, an array, a scalar or invalid JSON), is nested more than 64 levels deep, or was truncated (`summaryTruncated`), has no `data`. A panel that never reported has no `report`. `panes[].report` is still the newest report among the Pane's panels.",
|
|
4854
5273
|
"`runpane lock acquire|release|list` coordinate a resource shared between agents, such as one test account. The caller's Pane and panel own the lock; it is scoped to the owner's Session (or global outside one), renews for the same owner, and is released on TTL expiry, owner panel exit, or owner Pane archive. `--wait` blocks in the daemon until the lock comes free.",
|
|
5274
|
+
"`runpane loops list|create|update|run|pause|resume|delete` manage loops (scheduled tasks): a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, agents use their harness's own sleep and wake. See [LOOPS.md](LOOPS.md).",
|
|
4855
5275
|
"`runpane agents start|status|send` finish the three common agent jobs in one call each: start an agent on a task (a new tab in the work's Pane with `--pane <id>`, or a new Pane for new work), check on it, and send it a follow-up.",
|
|
4856
5276
|
"`runpane report --state ready|blocked|failed|done` is how a worker hands back its result. It stores the latest report on the worker's panel (state, `--pr`, `--head`, up to 16,000 characters of `--summary` or `--summary-file`, and the `--question` a blocked worker needs answered), journals an opt-in `agent.report` watch event (`REPORT <pane-name> pane <pane-id> panel <panel-id> ready pr#747 fc5dce9`; it skips the `--min-interval` batch), records it as Session activity, and shows it in `agents status`, `panels list`, and `sessions overview` (each panel's own report as `panes[].panels[].report`, with a JSON object summary as `data`, and the Pane's newest as `panes[].report`). Inside a Pane terminal the panel comes from `PANE_SESSION_ID` and `PANE_PANEL_ID`; elsewhere pass `--pane` and `--panel`. It prints how many watches were waiting for the report and received it (`Delivered to 1 waiting watcher.`, `liveWatchers` in JSON). Zero means nobody was waiting right now, not that the report is lost: it stays on the panel, and a named-cursor watch receives it when it next waits.",
|
|
4857
5277
|
"Work sent to an agent through `runpane panels create`, `panes create` (with a prompt), or `panels submit` records that the sender waits for a `runpane report`, unless the request says `--source user` (Pane's own UI does) or `--no-expect-report`; `--expect-report` asks for one anyway. Typing into a tab never does. If the agent then goes ready or its panel exits without a report, Pane journals one opt-in `agent.report.missing` entry (`MISSING REPORT <pane-name> pane <pane-id> panel <panel-id> ready|exited`) whose `lastOutput` is the agent's last transcript reply or last screen lines; it skips the `--min-interval` batch and reaches only watchers that list it in `--kinds`. While the agent's screen shows background work (Claude's `· 1 shell` footer or a running background subagent row, Codex's `background terminal running` line), Pane waits and looks again every 10 seconds instead. `agent.blocked` entries carry `screenLines`, the prompt the agent waits on, and are journalled once a panel has stayed blocked for 2 seconds.",
|
|
@@ -5937,6 +6357,94 @@ exports.RUNPANE_CONTRACT = {
|
|
|
5937
6357
|
"deploy",
|
|
5938
6358
|
"--wait",
|
|
5939
6359
|
"5000"
|
|
6360
|
+
],
|
|
6361
|
+
[
|
|
6362
|
+
"loops",
|
|
6363
|
+
"create",
|
|
6364
|
+
"--repo",
|
|
6365
|
+
"active",
|
|
6366
|
+
"--name",
|
|
6367
|
+
"nightly",
|
|
6368
|
+
"--cron",
|
|
6369
|
+
"0 3 * * *",
|
|
6370
|
+
"--agent",
|
|
6371
|
+
"claude",
|
|
6372
|
+
"--prompt",
|
|
6373
|
+
"Sweep bugs",
|
|
6374
|
+
"--worktree-name",
|
|
6375
|
+
"nightly-sweep",
|
|
6376
|
+
"--paused",
|
|
6377
|
+
"--dry-run",
|
|
6378
|
+
"--yes",
|
|
6379
|
+
"--json"
|
|
6380
|
+
],
|
|
6381
|
+
[
|
|
6382
|
+
"loops",
|
|
6383
|
+
"create",
|
|
6384
|
+
"--repo=2",
|
|
6385
|
+
"--name=deps",
|
|
6386
|
+
"--cron=0 9 * * 1",
|
|
6387
|
+
"--tool-command",
|
|
6388
|
+
"./scripts/nightly-report.sh",
|
|
6389
|
+
"--prompt-file",
|
|
6390
|
+
"-"
|
|
6391
|
+
],
|
|
6392
|
+
[
|
|
6393
|
+
"loops",
|
|
6394
|
+
"create",
|
|
6395
|
+
"--session",
|
|
6396
|
+
"new",
|
|
6397
|
+
"--name",
|
|
6398
|
+
"triage",
|
|
6399
|
+
"--cron",
|
|
6400
|
+
"0 9 * * 1-5",
|
|
6401
|
+
"--agent",
|
|
6402
|
+
"claude",
|
|
6403
|
+
"--prompt",
|
|
6404
|
+
"Triage",
|
|
6405
|
+
"--yes"
|
|
6406
|
+
],
|
|
6407
|
+
[
|
|
6408
|
+
"loops",
|
|
6409
|
+
"update",
|
|
6410
|
+
"--loop",
|
|
6411
|
+
"loop-1",
|
|
6412
|
+
"--cron",
|
|
6413
|
+
"0 4 * * *",
|
|
6414
|
+
"--yes"
|
|
6415
|
+
],
|
|
6416
|
+
[
|
|
6417
|
+
"loops",
|
|
6418
|
+
"update",
|
|
6419
|
+
"--loop",
|
|
6420
|
+
"loop-1",
|
|
6421
|
+
"--session",
|
|
6422
|
+
"Nightly",
|
|
6423
|
+
"--yes"
|
|
6424
|
+
],
|
|
6425
|
+
[
|
|
6426
|
+
"loops",
|
|
6427
|
+
"run",
|
|
6428
|
+
"--loop=loop-1",
|
|
6429
|
+
"--yes",
|
|
6430
|
+
"--json"
|
|
6431
|
+
],
|
|
6432
|
+
[
|
|
6433
|
+
"loops",
|
|
6434
|
+
"pause",
|
|
6435
|
+
"--loop",
|
|
6436
|
+
"loop-1",
|
|
6437
|
+
"--pane-dir",
|
|
6438
|
+
"/tmp/pane"
|
|
6439
|
+
],
|
|
6440
|
+
[
|
|
6441
|
+
"loops",
|
|
6442
|
+
"list",
|
|
6443
|
+
"--json"
|
|
6444
|
+
],
|
|
6445
|
+
[
|
|
6446
|
+
"loops",
|
|
6447
|
+
"--help"
|
|
5940
6448
|
]
|
|
5941
6449
|
],
|
|
5942
6450
|
"topLevelHelpIncludes": [
|
|
@@ -5967,11 +6475,13 @@ exports.RUNPANE_CONTRACT = {
|
|
|
5967
6475
|
],
|
|
5968
6476
|
"npmHelpIncludes": [
|
|
5969
6477
|
"pnpm dlx runpane@latest",
|
|
5970
|
-
"npx --yes runpane@latest"
|
|
6478
|
+
"npx --yes runpane@latest",
|
|
6479
|
+
"runpane loops list"
|
|
5971
6480
|
],
|
|
5972
6481
|
"pipHelpIncludes": [
|
|
5973
6482
|
"pipx run runpane",
|
|
5974
|
-
"python -m pip install runpane && python -m runpane setup"
|
|
6483
|
+
"python -m pip install runpane && python -m runpane setup",
|
|
6484
|
+
"python -m runpane loops list"
|
|
5975
6485
|
],
|
|
5976
6486
|
"installHelpIncludes": [
|
|
5977
6487
|
"--version <latest|vX.Y.Z>",
|
|
@@ -11648,34 +12158,275 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11648
12158
|
}
|
|
11649
12159
|
},
|
|
11650
12160
|
"additionalProperties": false
|
|
11651
|
-
}
|
|
11652
|
-
|
|
11653
|
-
|
|
11654
|
-
|
|
11655
|
-
|
|
11656
|
-
|
|
11657
|
-
|
|
11658
|
-
|
|
11659
|
-
|
|
11660
|
-
"
|
|
11661
|
-
|
|
11662
|
-
|
|
11663
|
-
"
|
|
11664
|
-
|
|
11665
|
-
|
|
11666
|
-
|
|
11667
|
-
"
|
|
11668
|
-
|
|
11669
|
-
|
|
11670
|
-
"
|
|
11671
|
-
|
|
11672
|
-
|
|
11673
|
-
"
|
|
11674
|
-
|
|
12161
|
+
},
|
|
12162
|
+
"loopInput": {
|
|
12163
|
+
"type": "object",
|
|
12164
|
+
"required": [
|
|
12165
|
+
"name",
|
|
12166
|
+
"cron",
|
|
12167
|
+
"enabled"
|
|
12168
|
+
],
|
|
12169
|
+
"properties": {
|
|
12170
|
+
"id": {
|
|
12171
|
+
"type": "string"
|
|
12172
|
+
},
|
|
12173
|
+
"name": {
|
|
12174
|
+
"type": "string",
|
|
12175
|
+
"minLength": 1
|
|
12176
|
+
},
|
|
12177
|
+
"projectId": {
|
|
12178
|
+
"type": "number"
|
|
12179
|
+
},
|
|
12180
|
+
"orchestrationSessionId": {
|
|
12181
|
+
"type": "string"
|
|
12182
|
+
},
|
|
12183
|
+
"cron": {
|
|
12184
|
+
"type": "string"
|
|
12185
|
+
},
|
|
12186
|
+
"agent": {
|
|
12187
|
+
"enum": [
|
|
12188
|
+
"claude",
|
|
12189
|
+
"codex",
|
|
12190
|
+
"cursor"
|
|
12191
|
+
]
|
|
12192
|
+
},
|
|
12193
|
+
"toolCommand": {
|
|
12194
|
+
"type": "string"
|
|
12195
|
+
},
|
|
12196
|
+
"initialInput": {
|
|
12197
|
+
"type": "string"
|
|
12198
|
+
},
|
|
12199
|
+
"worktreeTemplate": {
|
|
12200
|
+
"type": "string"
|
|
12201
|
+
},
|
|
12202
|
+
"enabled": {
|
|
12203
|
+
"type": "boolean"
|
|
12204
|
+
}
|
|
12205
|
+
},
|
|
12206
|
+
"additionalProperties": false
|
|
12207
|
+
},
|
|
12208
|
+
"loop": {
|
|
12209
|
+
"type": "object",
|
|
12210
|
+
"required": [
|
|
12211
|
+
"id",
|
|
12212
|
+
"name",
|
|
12213
|
+
"cron",
|
|
12214
|
+
"enabled",
|
|
12215
|
+
"createdAtMs",
|
|
12216
|
+
"nextRunAtMs",
|
|
12217
|
+
"scheduleText",
|
|
12218
|
+
"runs"
|
|
12219
|
+
],
|
|
12220
|
+
"properties": {
|
|
12221
|
+
"id": {
|
|
12222
|
+
"type": "string"
|
|
12223
|
+
},
|
|
12224
|
+
"name": {
|
|
12225
|
+
"type": "string",
|
|
12226
|
+
"minLength": 1
|
|
12227
|
+
},
|
|
12228
|
+
"projectId": {
|
|
12229
|
+
"type": "number"
|
|
12230
|
+
},
|
|
12231
|
+
"orchestrationSessionId": {
|
|
12232
|
+
"type": "string"
|
|
12233
|
+
},
|
|
12234
|
+
"cron": {
|
|
12235
|
+
"type": "string"
|
|
12236
|
+
},
|
|
12237
|
+
"agent": {
|
|
12238
|
+
"enum": [
|
|
12239
|
+
"claude",
|
|
12240
|
+
"codex",
|
|
12241
|
+
"cursor"
|
|
12242
|
+
]
|
|
12243
|
+
},
|
|
12244
|
+
"toolCommand": {
|
|
12245
|
+
"type": "string"
|
|
12246
|
+
},
|
|
12247
|
+
"initialInput": {
|
|
12248
|
+
"type": "string"
|
|
12249
|
+
},
|
|
12250
|
+
"worktreeTemplate": {
|
|
12251
|
+
"type": "string"
|
|
12252
|
+
},
|
|
12253
|
+
"enabled": {
|
|
12254
|
+
"type": "boolean"
|
|
12255
|
+
},
|
|
12256
|
+
"createdAtMs": {
|
|
12257
|
+
"type": "number"
|
|
12258
|
+
},
|
|
12259
|
+
"nextRunAtMs": {
|
|
12260
|
+
"type": [
|
|
12261
|
+
"number",
|
|
12262
|
+
"null"
|
|
12263
|
+
]
|
|
12264
|
+
},
|
|
12265
|
+
"scheduleText": {
|
|
12266
|
+
"type": "string"
|
|
12267
|
+
},
|
|
12268
|
+
"runs": {
|
|
12269
|
+
"type": "array",
|
|
12270
|
+
"items": {
|
|
12271
|
+
"type": "object",
|
|
12272
|
+
"required": [
|
|
12273
|
+
"id",
|
|
12274
|
+
"loopId",
|
|
12275
|
+
"slotAtMs",
|
|
12276
|
+
"trigger",
|
|
12277
|
+
"status",
|
|
12278
|
+
"error",
|
|
12279
|
+
"sessionId"
|
|
12280
|
+
],
|
|
12281
|
+
"properties": {
|
|
12282
|
+
"id": {
|
|
12283
|
+
"type": "string"
|
|
12284
|
+
},
|
|
12285
|
+
"loopId": {
|
|
12286
|
+
"type": "string"
|
|
12287
|
+
},
|
|
12288
|
+
"slotAtMs": {
|
|
12289
|
+
"type": "number"
|
|
12290
|
+
},
|
|
12291
|
+
"trigger": {
|
|
12292
|
+
"enum": [
|
|
12293
|
+
"schedule",
|
|
12294
|
+
"manual"
|
|
12295
|
+
]
|
|
12296
|
+
},
|
|
12297
|
+
"status": {
|
|
12298
|
+
"enum": [
|
|
12299
|
+
"started",
|
|
12300
|
+
"failed",
|
|
12301
|
+
"skipped"
|
|
12302
|
+
]
|
|
12303
|
+
},
|
|
12304
|
+
"error": {
|
|
12305
|
+
"type": [
|
|
12306
|
+
"string",
|
|
12307
|
+
"null"
|
|
12308
|
+
]
|
|
12309
|
+
},
|
|
12310
|
+
"sessionId": {
|
|
12311
|
+
"type": [
|
|
12312
|
+
"string",
|
|
12313
|
+
"null"
|
|
12314
|
+
]
|
|
12315
|
+
}
|
|
12316
|
+
},
|
|
12317
|
+
"additionalProperties": false
|
|
12318
|
+
}
|
|
12319
|
+
}
|
|
12320
|
+
},
|
|
12321
|
+
"additionalProperties": false
|
|
12322
|
+
},
|
|
12323
|
+
"loopListResult": {
|
|
12324
|
+
"type": "object",
|
|
12325
|
+
"required": [
|
|
12326
|
+
"ok",
|
|
12327
|
+
"loops"
|
|
12328
|
+
],
|
|
12329
|
+
"properties": {
|
|
12330
|
+
"ok": {
|
|
12331
|
+
"const": true
|
|
12332
|
+
},
|
|
12333
|
+
"loops": {
|
|
12334
|
+
"type": "array",
|
|
12335
|
+
"items": {
|
|
12336
|
+
"$ref": "#/jsonSchemas/loop"
|
|
12337
|
+
}
|
|
12338
|
+
}
|
|
12339
|
+
},
|
|
12340
|
+
"additionalProperties": false
|
|
12341
|
+
},
|
|
12342
|
+
"loopResult": {
|
|
12343
|
+
"type": "object",
|
|
12344
|
+
"required": [
|
|
12345
|
+
"ok",
|
|
12346
|
+
"loop"
|
|
12347
|
+
],
|
|
12348
|
+
"properties": {
|
|
12349
|
+
"ok": {
|
|
12350
|
+
"const": true
|
|
12351
|
+
},
|
|
12352
|
+
"loop": {
|
|
12353
|
+
"$ref": "#/jsonSchemas/loop"
|
|
12354
|
+
}
|
|
12355
|
+
},
|
|
12356
|
+
"additionalProperties": false
|
|
12357
|
+
},
|
|
12358
|
+
"loopDryRunResult": {
|
|
12359
|
+
"type": "object",
|
|
12360
|
+
"required": [
|
|
12361
|
+
"ok",
|
|
12362
|
+
"dryRun",
|
|
12363
|
+
"input",
|
|
12364
|
+
"scheduleText",
|
|
12365
|
+
"nextRunAtMs"
|
|
12366
|
+
],
|
|
12367
|
+
"properties": {
|
|
12368
|
+
"ok": {
|
|
12369
|
+
"const": true
|
|
12370
|
+
},
|
|
12371
|
+
"dryRun": {
|
|
12372
|
+
"const": true
|
|
12373
|
+
},
|
|
12374
|
+
"input": {
|
|
12375
|
+
"$ref": "#/jsonSchemas/loopInput"
|
|
12376
|
+
},
|
|
12377
|
+
"scheduleText": {
|
|
12378
|
+
"type": "string"
|
|
12379
|
+
},
|
|
12380
|
+
"nextRunAtMs": {
|
|
12381
|
+
"type": "number"
|
|
12382
|
+
}
|
|
12383
|
+
},
|
|
12384
|
+
"additionalProperties": false
|
|
12385
|
+
},
|
|
12386
|
+
"loopDeleteResult": {
|
|
12387
|
+
"type": "object",
|
|
12388
|
+
"required": [
|
|
12389
|
+
"ok",
|
|
12390
|
+
"deleted"
|
|
12391
|
+
],
|
|
12392
|
+
"properties": {
|
|
12393
|
+
"ok": {
|
|
12394
|
+
"const": true
|
|
12395
|
+
},
|
|
12396
|
+
"deleted": {
|
|
12397
|
+
"type": "string"
|
|
12398
|
+
}
|
|
12399
|
+
},
|
|
12400
|
+
"additionalProperties": false
|
|
12401
|
+
}
|
|
12402
|
+
},
|
|
12403
|
+
"agentContext": {
|
|
12404
|
+
"brief": {
|
|
12405
|
+
"title": "Pane agent context",
|
|
12406
|
+
"summary": "Pane lets a developer manage saved base repositories, user-visible Panes (Pane sessions) for feature/PR work, and terminal-backed panel tabs. A Pane is a visible workspace that normally maps to one Pane-managed git worktree and branch; a panel is a terminal tab inside one Pane and shares that Pane's worktree; an agent is a CLI process running inside a panel.",
|
|
12407
|
+
"rules": [
|
|
12408
|
+
"Start with `runpane doctor --json` to understand wrapper, platform, daemon reachability, and the next safe commands before mutating Pane state.",
|
|
12409
|
+
"In a Pane repository checkout, if `runpane` is not on PATH, build the local wrapper with `pnpm --filter runpane build` and run it with patched Node 22.23.4+ (22.x), 24.22.1+ (24.x), or 26.12.1+ (26.x), for example `node packages/runpane/dist/cli.js doctor --json`.",
|
|
12410
|
+
"Happy path for any user request to use Pane/RunPane: run `runpane doctor --json`, read `runpane agent-context --json`, resolve or add the saved base repo, then route by the rule 1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane: if the work's branch already has a Pane (find it with `runpane panes list --repo <repo> --json` by matching the PR's head branch against `git -C <worktreePath> branch --show-current`), open a new agent tab in it with `runpane panels create --pane <id> --agent <agent> --initial-input \"<task>\" --source agent --no-focus --wait-ready --yes --json`; only when the branch has no Pane yet, create one with a complete command such as `runpane panes create --repo <repo> --name <name> --agent <agent> --prompt \"<task>\" --source agent --no-focus --wait-ready --yes --json` (the new Pane is pinned by default; add `--no-pinned` for a throwaway Pane, add `--base-branch <ref>` to branch from something other than the repository default, or use `--tool-command <command>` instead of `--agent <agent>`), then validate with `panels wait` or `panels screen`. For long-lived supervision, use `runpane watch --follow` instead of polling wait or screen.",
|
|
12411
|
+
"Treat Pane as the user's visible cockpit for watching/co-driving work. Do not create Panes or panels for private delegation unless the user asked for visible Pane orchestration or the result should appear in the Pane app.",
|
|
12412
|
+
"Register the saved base repository once with `repos add`; do not register a pre-created worktree as a separate repo unless the user explicitly asks.",
|
|
12413
|
+
"1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Use `panes create` only when the work's branch has no Pane yet (new work, or an existing PR with no Pane), since each new Pane creates a worktree. Every later agent for that branch opens as a new tab in its Pane with `panels create --pane <id>`, never a new Pane. Tabs share one checkout: only the implementer changes the branch or HEAD, one writer at a time; review, audit and QA tabs never run `git checkout`, `reset` or `stash`.",
|
|
12414
|
+
"For private background decomposition, use your normal subagent/worktree mechanism instead of Pane.",
|
|
12415
|
+
"Skill routing: Pane's skills live in `<PANE_DIR>/skills/pane-chat/skills/`, and the Pane Chat entry point is `<PANE_DIR>/skills/pane-chat/pane-orchestrator/SKILL.md`; read the skill that matches the request, such as `discussion`, `create-ticket`, `tdd`, `prepare-pr`, or `review`.",
|
|
12416
|
+
"When an agent creates Panes or panels, pass `--source agent --no-focus --wait-ready --yes --json` unless the user explicitly wants focus moved; `panes create` pins the new Pane into the UI's favorite/pin set by default, so no follow-up `panes pin` call is needed and `--no-pinned` is the opt-out for throwaway Panes.",
|
|
12417
|
+
"Use `runpane agent-context --json` for the full agent-facing CLI context, or `runpane agent-context --command <command> --json` for one detailed command definition.",
|
|
12418
|
+
"For `agent-context --command`, use canonical spaced names like `panes create`; copied forms like `panes.create` or `runpane panes create` are accepted too.",
|
|
12419
|
+
"Use `runpane repos list --json` to find the saved repository when unsure after doctor shows the daemon is reachable.",
|
|
12420
|
+
"If WSL cannot reach Pane or `runpane` resolves to a broken Windows shim, the user may be running Windows Pane; try `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane doctor --json'`.",
|
|
12421
|
+
"If the repository exists on disk but is not saved in Pane, use `runpane repos add --path <repo> --yes --json` before creating panes.",
|
|
12422
|
+
"Use `runpane agents doctor --agent <codex|claude|cursor> --repo <selector> --json` when agent availability differs across host, Windows, WSL, or repo environments.",
|
|
12423
|
+
"Use `runpane panes create --wait-ready` to create Panes, wait for each agent's input box, and verify its starting message in one call.",
|
|
12424
|
+
"Use `runpane panels screen` for compact current state, including Claude and Codex composer state. Use `panels wait` for create-time readiness or text checks. Use `runpane watch --follow` to block on workspace transitions (READY, BLOCKED, IDLE, STUCK, EXIT) without polling, or `runpane watch --until-event` to exit on the first one. Use `panels submit` to send and submit a new turn. Use `panels submit-composer --strategy auto` only for a composer that was filled separately.",
|
|
11675
12425
|
"Use `runpane panels input` only when exact bytes are required, such as Ctrl-C or handcrafted terminal input.",
|
|
11676
12426
|
"Pane terminals draw inline images: sixel, iTerm2 inline images, and the kitty graphics protocol. Tools that need kitty graphics, such as terminal-browser and terminal-doom, run inside a Pane panel; `runpane doctor --json` reports the exact list under `terminal.graphicsProtocols`.",
|
|
11677
12427
|
"After creating Panes or sending terminal input, validate with `panels wait` or bounded `panels screen`. For a harness that consumes streaming output, use `runpane watch --follow` (with `--session <id>` for a Session); its named consumer applies settling and batching. Adding numeric --since leaves it unnamed and bypasses cadence; --as cannot be combined with --since. A harness that wakes only when a process exits uses `runpane watch --as <name> --until-event --json` and runs it again after each event. Single-event waits deliver immediately without follow cadence. Never pipe `--follow` into `grep -m1` or `head`.",
|
|
11678
|
-
"When several agents share one resource, such as a test account, name a lock in their prompts: each worker runs `runpane lock acquire --name <name> --ttl 30m --wait 1800000 --json` before using it and `runpane lock release --name <name>` after."
|
|
12428
|
+
"When several agents share one resource, such as a test account, name a lock in their prompts: each worker runs `runpane lock acquire --name <name> --ttl 30m --wait 1800000 --json` before using it and `runpane lock release --name <name>` after.",
|
|
12429
|
+
"Loops (`runpane loops create`) run a task on a cron schedule, each run in a new Pane or, with `--session`, as a message to a Session's agent. They are for large recurring jobs, such as a nightly bug sweep, and run at most once an hour. For a short wait, use your agent harness's own sleep and wake instead."
|
|
11679
12430
|
],
|
|
11680
12431
|
"detailCommand": "runpane agent-context --command <command> [--json]",
|
|
11681
12432
|
"tools": [
|
|
@@ -12271,7 +13022,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12271
13022
|
"name": "--toolsets",
|
|
12272
13023
|
"value": "<name,...>",
|
|
12273
13024
|
"required": false,
|
|
12274
|
-
"description": "Comma-separated toolsets to serve: core (default), all, read, repos, panes, panels, agents, sessions, git, docs, links, admin."
|
|
13025
|
+
"description": "Comma-separated toolsets to serve: core (default), all, read, repos, panes, panels, agents, sessions, loops, git, docs, links, admin."
|
|
12275
13026
|
},
|
|
12276
13027
|
{
|
|
12277
13028
|
"name": "--read-only",
|
|
@@ -16100,6 +16851,391 @@ exports.RUNPANE_CONTRACT = {
|
|
|
16100
16851
|
"notes": [
|
|
16101
16852
|
"Unknown ids are reported under `unknown`; acknowledging twice is harmless."
|
|
16102
16853
|
]
|
|
16854
|
+
},
|
|
16855
|
+
"loops list": {
|
|
16856
|
+
"name": "loops list",
|
|
16857
|
+
"summary": "List loops (scheduled tasks) with their schedule, next run, and recent runs.",
|
|
16858
|
+
"details": "Lists every loop: its id, target (projectId for a repo, or orchestrationSessionId for a Session), cron and scheduleText, enabled, nextRunAtMs (null while paused), and its newest runs. A run's sessionId is its Pane (null for a Session loop's runs); read its progress with `runpane agents status --pane <id>`.",
|
|
16859
|
+
"requiresPaneDaemon": true,
|
|
16860
|
+
"mutates": false,
|
|
16861
|
+
"arguments": [
|
|
16862
|
+
{
|
|
16863
|
+
"name": "--json",
|
|
16864
|
+
"required": false,
|
|
16865
|
+
"description": "Print machine-readable output."
|
|
16866
|
+
},
|
|
16867
|
+
{
|
|
16868
|
+
"name": "--pane-dir",
|
|
16869
|
+
"value": "<path>",
|
|
16870
|
+
"required": false,
|
|
16871
|
+
"description": "Connect to a specific Pane data directory."
|
|
16872
|
+
}
|
|
16873
|
+
],
|
|
16874
|
+
"examples": [
|
|
16875
|
+
"runpane loops list --json"
|
|
16876
|
+
],
|
|
16877
|
+
"jsonSchemas": [
|
|
16878
|
+
"loopListResult"
|
|
16879
|
+
],
|
|
16880
|
+
"notes": [
|
|
16881
|
+
"Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake."
|
|
16882
|
+
]
|
|
16883
|
+
},
|
|
16884
|
+
"loops create": {
|
|
16885
|
+
"name": "loops create",
|
|
16886
|
+
"summary": "Create a loop: a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.",
|
|
16887
|
+
"details": "With --repo, each run is a new Pane in a fresh worktree branched from the repo's default base branch, started like `runpane panes create` with the agent or command and prompt given here. With --session, each run sends the prompt to that Session's agent instead of creating a Pane; a Session loop needs --agent and --prompt and takes no --tool-command. `new` creates a Session named after the loop. The Session's agent then skips permission prompts for every message it gets, not only loop runs. Runs start only while Pane is running, in the host's local time zone. A run up to 15 minutes late still starts; a later one is recorded as skipped and never caught up. Runs may overlap. Unattended agent runs skip permission prompts. Pane keeps each loop's last 10 run Panes and archives older ones.",
|
|
16888
|
+
"requiresPaneDaemon": true,
|
|
16889
|
+
"mutates": true,
|
|
16890
|
+
"arguments": [
|
|
16891
|
+
{
|
|
16892
|
+
"name": "--repo",
|
|
16893
|
+
"value": "<selector>",
|
|
16894
|
+
"required": false,
|
|
16895
|
+
"description": "Repository: active, id, exact path, or saved repository name. Each run is a new Pane in it. Pass this or --session."
|
|
16896
|
+
},
|
|
16897
|
+
{
|
|
16898
|
+
"name": "--session",
|
|
16899
|
+
"value": "<id|name|new>",
|
|
16900
|
+
"required": false,
|
|
16901
|
+
"description": "Session whose agent gets the prompt each run, by id or name, instead of a new Pane. `new` creates a Session named after the loop. The Session's agent then skips permission prompts for every message it gets, not only loop runs. Pass this or --repo."
|
|
16902
|
+
},
|
|
16903
|
+
{
|
|
16904
|
+
"name": "--name",
|
|
16905
|
+
"value": "<name>",
|
|
16906
|
+
"required": true,
|
|
16907
|
+
"description": "Loop name."
|
|
16908
|
+
},
|
|
16909
|
+
{
|
|
16910
|
+
"name": "--cron",
|
|
16911
|
+
"value": "<expr>",
|
|
16912
|
+
"required": true,
|
|
16913
|
+
"description": "Five-field cron in the host's local time zone, such as \"0 3 * * *\" (every day at 03:00). Runs must be at least 60 minutes apart."
|
|
16914
|
+
},
|
|
16915
|
+
{
|
|
16916
|
+
"name": "--agent",
|
|
16917
|
+
"value": "<claude|codex|cursor>",
|
|
16918
|
+
"required": false,
|
|
16919
|
+
"description": "Agent each run starts; for a Session loop, the Session's agent. Pass this or --tool-command."
|
|
16920
|
+
},
|
|
16921
|
+
{
|
|
16922
|
+
"name": "--tool-command",
|
|
16923
|
+
"value": "<command>",
|
|
16924
|
+
"required": false,
|
|
16925
|
+
"description": "Command each run starts instead of a built-in agent, such as `./scripts/nightly-report.sh` or `pnpm test`. Project loops only. On Windows it runs in Pane's terminal shell, Git Bash by default: write bash, or `cmd //c echo hi > loop.txt` rather than `cmd /c`."
|
|
16926
|
+
},
|
|
16927
|
+
{
|
|
16928
|
+
"name": "--prompt",
|
|
16929
|
+
"value": "<text>",
|
|
16930
|
+
"required": false,
|
|
16931
|
+
"description": "Text typed into the agent or command after it starts; for a Session loop, the message sent to the Session's agent each run."
|
|
16932
|
+
},
|
|
16933
|
+
{
|
|
16934
|
+
"name": "--prompt-file",
|
|
16935
|
+
"value": "<path|->",
|
|
16936
|
+
"required": false,
|
|
16937
|
+
"description": "Read the prompt from a file or stdin."
|
|
16938
|
+
},
|
|
16939
|
+
{
|
|
16940
|
+
"name": "--worktree-name",
|
|
16941
|
+
"value": "<template>",
|
|
16942
|
+
"required": false,
|
|
16943
|
+
"description": "Worktree and branch name template; defaults to loop-<name>. Project loops only."
|
|
16944
|
+
},
|
|
16945
|
+
{
|
|
16946
|
+
"name": "--paused",
|
|
16947
|
+
"required": false,
|
|
16948
|
+
"description": "Create the loop paused."
|
|
16949
|
+
},
|
|
16950
|
+
{
|
|
16951
|
+
"name": "--dry-run",
|
|
16952
|
+
"required": false,
|
|
16953
|
+
"description": "Check the cron and print the loop that would be saved, with its schedule and next run, without saving."
|
|
16954
|
+
},
|
|
16955
|
+
{
|
|
16956
|
+
"name": "--yes",
|
|
16957
|
+
"required": true,
|
|
16958
|
+
"description": "Confirm the change."
|
|
16959
|
+
},
|
|
16960
|
+
{
|
|
16961
|
+
"name": "--json",
|
|
16962
|
+
"required": false,
|
|
16963
|
+
"description": "Print machine-readable output."
|
|
16964
|
+
},
|
|
16965
|
+
{
|
|
16966
|
+
"name": "--pane-dir",
|
|
16967
|
+
"value": "<path>",
|
|
16968
|
+
"required": false,
|
|
16969
|
+
"description": "Connect to a specific Pane data directory."
|
|
16970
|
+
}
|
|
16971
|
+
],
|
|
16972
|
+
"examples": [
|
|
16973
|
+
"runpane loops create --repo active --name nightly-bug-sweep --cron \"0 3 * * *\" --agent claude --prompt \"Fix one bug from yesterday's issues\" --yes --json",
|
|
16974
|
+
"runpane loops create --repo <repo> --name dependency-check --cron \"0 9 * * 1\" --tool-command \"pnpm test\" --yes --json",
|
|
16975
|
+
"runpane loops create --session new --name morning-triage --cron \"0 9 * * 1-5\" --agent claude --prompt \"Triage the new issues\" --yes --json"
|
|
16976
|
+
],
|
|
16977
|
+
"jsonSchemas": [
|
|
16978
|
+
"loopInput",
|
|
16979
|
+
"loopResult",
|
|
16980
|
+
"loopDryRunResult"
|
|
16981
|
+
],
|
|
16982
|
+
"notes": [
|
|
16983
|
+
"Saving rejects a cron whose runs fall less than 60 minutes apart. Check one first with --dry-run."
|
|
16984
|
+
]
|
|
16985
|
+
},
|
|
16986
|
+
"loops update": {
|
|
16987
|
+
"name": "loops update",
|
|
16988
|
+
"summary": "Change a loop's repo or Session, name, schedule, agent or command, prompt, or worktree template. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.",
|
|
16989
|
+
"details": "Reads the loop, replaces the values you pass, and saves it. Passing --agent clears --tool-command and the other way round; --repo and --session replace each other the same way. Pause and resume with `loops pause` and `loops resume`. Runs start only while Pane is running, in the host's local time zone. A run up to 15 minutes late still starts; a later one is recorded as skipped and never caught up. Runs may overlap. Unattended agent runs skip permission prompts. Pane keeps each loop's last 10 run Panes and archives older ones.",
|
|
16990
|
+
"requiresPaneDaemon": true,
|
|
16991
|
+
"mutates": true,
|
|
16992
|
+
"arguments": [
|
|
16993
|
+
{
|
|
16994
|
+
"name": "--loop",
|
|
16995
|
+
"value": "<id>",
|
|
16996
|
+
"required": true,
|
|
16997
|
+
"description": "Loop id, from `runpane loops list`."
|
|
16998
|
+
},
|
|
16999
|
+
{
|
|
17000
|
+
"name": "--repo",
|
|
17001
|
+
"value": "<selector>",
|
|
17002
|
+
"required": false,
|
|
17003
|
+
"description": "Repository: active, id, exact path, or saved repository name. Each run is a new Pane in it. Pass this or --session."
|
|
17004
|
+
},
|
|
17005
|
+
{
|
|
17006
|
+
"name": "--session",
|
|
17007
|
+
"value": "<id|name|new>",
|
|
17008
|
+
"required": false,
|
|
17009
|
+
"description": "Session whose agent gets the prompt each run, by id or name, instead of a new Pane. `new` creates a Session named after the loop. The Session's agent then skips permission prompts for every message it gets, not only loop runs. Pass this or --repo."
|
|
17010
|
+
},
|
|
17011
|
+
{
|
|
17012
|
+
"name": "--name",
|
|
17013
|
+
"value": "<name>",
|
|
17014
|
+
"required": false,
|
|
17015
|
+
"description": "Loop name."
|
|
17016
|
+
},
|
|
17017
|
+
{
|
|
17018
|
+
"name": "--cron",
|
|
17019
|
+
"value": "<expr>",
|
|
17020
|
+
"required": false,
|
|
17021
|
+
"description": "Five-field cron in the host's local time zone, such as \"0 3 * * *\" (every day at 03:00). Runs must be at least 60 minutes apart."
|
|
17022
|
+
},
|
|
17023
|
+
{
|
|
17024
|
+
"name": "--agent",
|
|
17025
|
+
"value": "<claude|codex|cursor>",
|
|
17026
|
+
"required": false,
|
|
17027
|
+
"description": "Agent each run starts; for a Session loop, the Session's agent. Pass this or --tool-command."
|
|
17028
|
+
},
|
|
17029
|
+
{
|
|
17030
|
+
"name": "--tool-command",
|
|
17031
|
+
"value": "<command>",
|
|
17032
|
+
"required": false,
|
|
17033
|
+
"description": "Command each run starts instead of a built-in agent, such as `./scripts/nightly-report.sh` or `pnpm test`. Project loops only. On Windows it runs in Pane's terminal shell, Git Bash by default: write bash, or `cmd //c echo hi > loop.txt` rather than `cmd /c`."
|
|
17034
|
+
},
|
|
17035
|
+
{
|
|
17036
|
+
"name": "--prompt",
|
|
17037
|
+
"value": "<text>",
|
|
17038
|
+
"required": false,
|
|
17039
|
+
"description": "Text typed into the agent or command after it starts; for a Session loop, the message sent to the Session's agent each run."
|
|
17040
|
+
},
|
|
17041
|
+
{
|
|
17042
|
+
"name": "--prompt-file",
|
|
17043
|
+
"value": "<path|->",
|
|
17044
|
+
"required": false,
|
|
17045
|
+
"description": "Read the prompt from a file or stdin."
|
|
17046
|
+
},
|
|
17047
|
+
{
|
|
17048
|
+
"name": "--worktree-name",
|
|
17049
|
+
"value": "<template>",
|
|
17050
|
+
"required": false,
|
|
17051
|
+
"description": "Worktree and branch name template; defaults to loop-<name>. Project loops only."
|
|
17052
|
+
},
|
|
17053
|
+
{
|
|
17054
|
+
"name": "--dry-run",
|
|
17055
|
+
"required": false,
|
|
17056
|
+
"description": "Check the cron and print the loop that would be saved, with its schedule and next run, without saving."
|
|
17057
|
+
},
|
|
17058
|
+
{
|
|
17059
|
+
"name": "--yes",
|
|
17060
|
+
"required": true,
|
|
17061
|
+
"description": "Confirm the change."
|
|
17062
|
+
},
|
|
17063
|
+
{
|
|
17064
|
+
"name": "--json",
|
|
17065
|
+
"required": false,
|
|
17066
|
+
"description": "Print machine-readable output."
|
|
17067
|
+
},
|
|
17068
|
+
{
|
|
17069
|
+
"name": "--pane-dir",
|
|
17070
|
+
"value": "<path>",
|
|
17071
|
+
"required": false,
|
|
17072
|
+
"description": "Connect to a specific Pane data directory."
|
|
17073
|
+
}
|
|
17074
|
+
],
|
|
17075
|
+
"examples": [
|
|
17076
|
+
"runpane loops update --loop <loop-id> --cron \"0 4 * * *\" --yes --json"
|
|
17077
|
+
],
|
|
17078
|
+
"jsonSchemas": [
|
|
17079
|
+
"loopInput",
|
|
17080
|
+
"loopResult",
|
|
17081
|
+
"loopDryRunResult"
|
|
17082
|
+
],
|
|
17083
|
+
"notes": []
|
|
17084
|
+
},
|
|
17085
|
+
"loops run": {
|
|
17086
|
+
"name": "loops run",
|
|
17087
|
+
"summary": "Start a run of a loop now. The schedule stays the same.",
|
|
17088
|
+
"details": "Starts a run now, as a new Pane or a message to the loop's Session, even while the loop is paused or another run is still going. The schedule stays the same, and the run counts toward the 10 kept runs.",
|
|
17089
|
+
"requiresPaneDaemon": true,
|
|
17090
|
+
"mutates": true,
|
|
17091
|
+
"arguments": [
|
|
17092
|
+
{
|
|
17093
|
+
"name": "--loop",
|
|
17094
|
+
"value": "<id>",
|
|
17095
|
+
"required": true,
|
|
17096
|
+
"description": "Loop id, from `runpane loops list`."
|
|
17097
|
+
},
|
|
17098
|
+
{
|
|
17099
|
+
"name": "--yes",
|
|
17100
|
+
"required": true,
|
|
17101
|
+
"description": "Confirm the change."
|
|
17102
|
+
},
|
|
17103
|
+
{
|
|
17104
|
+
"name": "--json",
|
|
17105
|
+
"required": false,
|
|
17106
|
+
"description": "Print machine-readable output."
|
|
17107
|
+
},
|
|
17108
|
+
{
|
|
17109
|
+
"name": "--pane-dir",
|
|
17110
|
+
"value": "<path>",
|
|
17111
|
+
"required": false,
|
|
17112
|
+
"description": "Connect to a specific Pane data directory."
|
|
17113
|
+
}
|
|
17114
|
+
],
|
|
17115
|
+
"examples": [
|
|
17116
|
+
"runpane loops run --loop <loop-id> --yes --json"
|
|
17117
|
+
],
|
|
17118
|
+
"jsonSchemas": [
|
|
17119
|
+
"loopResult"
|
|
17120
|
+
],
|
|
17121
|
+
"notes": [
|
|
17122
|
+
"The result is the loop; `runs[0]` is the new run, with `status` started or failed and `sessionId` its Pane (null for a Session loop).",
|
|
17123
|
+
"Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake."
|
|
17124
|
+
]
|
|
17125
|
+
},
|
|
17126
|
+
"loops pause": {
|
|
17127
|
+
"name": "loops pause",
|
|
17128
|
+
"summary": "Pause a loop: it starts no scheduled runs until resumed.",
|
|
17129
|
+
"details": "A paused loop starts no scheduled runs. `loops run` still starts one by hand.",
|
|
17130
|
+
"requiresPaneDaemon": true,
|
|
17131
|
+
"mutates": true,
|
|
17132
|
+
"arguments": [
|
|
17133
|
+
{
|
|
17134
|
+
"name": "--loop",
|
|
17135
|
+
"value": "<id>",
|
|
17136
|
+
"required": true,
|
|
17137
|
+
"description": "Loop id, from `runpane loops list`."
|
|
17138
|
+
},
|
|
17139
|
+
{
|
|
17140
|
+
"name": "--yes",
|
|
17141
|
+
"required": true,
|
|
17142
|
+
"description": "Confirm the change."
|
|
17143
|
+
},
|
|
17144
|
+
{
|
|
17145
|
+
"name": "--json",
|
|
17146
|
+
"required": false,
|
|
17147
|
+
"description": "Print machine-readable output."
|
|
17148
|
+
},
|
|
17149
|
+
{
|
|
17150
|
+
"name": "--pane-dir",
|
|
17151
|
+
"value": "<path>",
|
|
17152
|
+
"required": false,
|
|
17153
|
+
"description": "Connect to a specific Pane data directory."
|
|
17154
|
+
}
|
|
17155
|
+
],
|
|
17156
|
+
"examples": [
|
|
17157
|
+
"runpane loops pause --loop <loop-id> --yes --json"
|
|
17158
|
+
],
|
|
17159
|
+
"jsonSchemas": [
|
|
17160
|
+
"loopResult"
|
|
17161
|
+
],
|
|
17162
|
+
"notes": []
|
|
17163
|
+
},
|
|
17164
|
+
"loops resume": {
|
|
17165
|
+
"name": "loops resume",
|
|
17166
|
+
"summary": "Resume a paused loop from its next scheduled time.",
|
|
17167
|
+
"details": "Runs resume at the next scheduled time. Runs missed while paused are not caught up.",
|
|
17168
|
+
"requiresPaneDaemon": true,
|
|
17169
|
+
"mutates": true,
|
|
17170
|
+
"arguments": [
|
|
17171
|
+
{
|
|
17172
|
+
"name": "--loop",
|
|
17173
|
+
"value": "<id>",
|
|
17174
|
+
"required": true,
|
|
17175
|
+
"description": "Loop id, from `runpane loops list`."
|
|
17176
|
+
},
|
|
17177
|
+
{
|
|
17178
|
+
"name": "--yes",
|
|
17179
|
+
"required": true,
|
|
17180
|
+
"description": "Confirm the change."
|
|
17181
|
+
},
|
|
17182
|
+
{
|
|
17183
|
+
"name": "--json",
|
|
17184
|
+
"required": false,
|
|
17185
|
+
"description": "Print machine-readable output."
|
|
17186
|
+
},
|
|
17187
|
+
{
|
|
17188
|
+
"name": "--pane-dir",
|
|
17189
|
+
"value": "<path>",
|
|
17190
|
+
"required": false,
|
|
17191
|
+
"description": "Connect to a specific Pane data directory."
|
|
17192
|
+
}
|
|
17193
|
+
],
|
|
17194
|
+
"examples": [
|
|
17195
|
+
"runpane loops resume --loop <loop-id> --yes --json"
|
|
17196
|
+
],
|
|
17197
|
+
"jsonSchemas": [
|
|
17198
|
+
"loopResult"
|
|
17199
|
+
],
|
|
17200
|
+
"notes": []
|
|
17201
|
+
},
|
|
17202
|
+
"loops delete": {
|
|
17203
|
+
"name": "loops delete",
|
|
17204
|
+
"summary": "Delete a loop. It starts no more runs.",
|
|
17205
|
+
"details": "Deletes the loop and its schedule.",
|
|
17206
|
+
"requiresPaneDaemon": true,
|
|
17207
|
+
"mutates": true,
|
|
17208
|
+
"arguments": [
|
|
17209
|
+
{
|
|
17210
|
+
"name": "--loop",
|
|
17211
|
+
"value": "<id>",
|
|
17212
|
+
"required": true,
|
|
17213
|
+
"description": "Loop id, from `runpane loops list`."
|
|
17214
|
+
},
|
|
17215
|
+
{
|
|
17216
|
+
"name": "--yes",
|
|
17217
|
+
"required": true,
|
|
17218
|
+
"description": "Confirm the change."
|
|
17219
|
+
},
|
|
17220
|
+
{
|
|
17221
|
+
"name": "--json",
|
|
17222
|
+
"required": false,
|
|
17223
|
+
"description": "Print machine-readable output."
|
|
17224
|
+
},
|
|
17225
|
+
{
|
|
17226
|
+
"name": "--pane-dir",
|
|
17227
|
+
"value": "<path>",
|
|
17228
|
+
"required": false,
|
|
17229
|
+
"description": "Connect to a specific Pane data directory."
|
|
17230
|
+
}
|
|
17231
|
+
],
|
|
17232
|
+
"examples": [
|
|
17233
|
+
"runpane loops delete --loop <loop-id> --yes --json"
|
|
17234
|
+
],
|
|
17235
|
+
"jsonSchemas": [
|
|
17236
|
+
"loopDeleteResult"
|
|
17237
|
+
],
|
|
17238
|
+
"notes": []
|
|
16103
17239
|
}
|
|
16104
17240
|
},
|
|
16105
17241
|
"managedBlock": [
|