Choose which skills the model is offered, with /skills A skill costs context whether or not it is used: its description sits in the `skill` tool for the whole session, and six of them is most of what that tool says. A reader who knows a skill is irrelevant to today's work had no way to take it out. `/skills` is a screen over the chat rather than a turn in it, for the reason `/system` is a notice: switching a skill off changes what the next turn carries, so it is not something to say to the model. Arrow keys move, space switches, and escape returns. The screen holds the keyboard while it is up, so a stray letter cannot land in a composer the reader cannot see. A switched-off skill is left out of the tool entirely -- out of the catalog in its description and out of the enum of names it accepts -- so the model is not told the skill exists and cannot ask for it. The tools are re-declared at the keystroke rather than on the next turn, so `/system` agrees with the screen the moment it is left. The choice is recorded per workspace, keyed by path, because the reason to switch a skill off is usually the repository rather than the machine. It is written under the config directory and not in the repository, so switching one off is not a change someone else has to review. Off is what is recorded, not on: a skill added later is offered until someone rules on it, which is how a session that has never been touched behaves. A preference file that cannot be read is a preference nobody set, and a preference that cannot be written still holds for the session -- neither is a reason to refuse to start. The plain lane has no screen, so `/skills` reports the same facts without the switch. Sending it to the model as a question would be worse than either. 307 tests pass. Six drive the screen through real keystrokes: that it lists each skill with its state, that arrows move, that space switches and re-declares, that nothing reaches the model on the way in or out, that typing does not fall through to the composer, and that an empty workspace says so. Seven more cover the choice itself, including that it stays in the workspace it was made in and that a skill added afterwards is still offered.
Choose which skills the model is offered, with /skills
Deploy story
What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.
Not deployed through the forge lane
No push, promotion, build, or deploy receipt references this commit (receipts are scanned over a bounded recent window). Changes shipped by full node replacement carry their proof in the release gate receipt instead.
Changed files
-
modified
packages/openagents-cli/src/cli.ts -
modified
packages/openagents-cli/src/coder-plain.ts -
modified
packages/openagents-cli/src/coder-skills.ts -
modified
packages/openagents-cli/src/coder-ui.ts -
modified
packages/openagents-cli/test/coder-skills.test.ts -
modified
packages/openagents-cli/test/coder-ui.test.ts
Diff
6 files changed, +521 -13
packages/openagents-cli/src/cli.ts modified +20 -9
@@ -31,7 +31,7 @@ import { backendIds } from "./coder-backends.js";
| 31 | 31 |
|
| 32 | 32 |
|
| 33 | 33 |
|
| 34 |
|
|
| 34 |
|
|
| 35 | 35 |
|
| 36 | 36 |
|
| 37 | 37 |
|
@@ -1744,14 +1744,19 @@ const coderCommand = Command.make(
| 1744 | 1744 |
|
| 1745 | 1745 |
|
| 1746 | 1746 |
|
| 1747 |
|
|
| 1748 |
|
|
| 1749 |
|
|
| 1750 |
|
|
| 1751 |
|
|
| 1752 |
|
|
| 1747 |
|
|
| 1748 |
|
|
| 1749 |
|
|
| 1750 |
|
|
| 1751 |
|
|
| 1752 |
|
|
| 1753 |
|
|
| 1754 |
|
|
| 1755 |
|
|
| 1756 |
|
|
| 1753 | 1757 |
|
| 1754 |
|
|
| 1758 |
|
|
| 1759 |
|
|
| 1755 | 1760 |
|
| 1756 | 1761 |
|
| 1757 | 1762 |
|
@@ -1790,11 +1795,17 @@ const coderCommand = Command.make(
| 1790 | 1795 |
|
| 1791 | 1796 |
|
| 1792 | 1797 |
|
| 1793 |
|
|
| 1798 |
|
|
| 1799 |
|
|
| 1800 |
|
|
| 1801 |
|
|
| 1802 |
|
|
| 1803 |
|
|
| 1794 | 1804 |
|
| 1795 | 1805 |
|
| 1796 | 1806 |
|
| 1797 | 1807 |
|
| 1808 |
|
|
| 1798 | 1809 |
|
| 1799 | 1810 |
|
| 1800 | 1811 |
|
packages/openagents-cli/src/coder-plain.ts modified +21
@@ -19,12 +19,15 @@
| 19 | 19 |
|
| 20 | 20 |
|
| 21 | 21 |
|
| 22 |
|
|
| 22 | 23 |
|
| 23 | 24 |
|
| 24 | 25 |
|
| 25 | 26 |
|
| 26 | 27 |
|
| 27 | 28 |
|
| 29 |
|
|
| 30 |
|
|
| 28 | 31 |
|
| 29 | 32 |
|
| 30 | 33 |
|
@@ -69,6 +72,24 @@ export async function runCoderPlain(
| 69 | 72 |
|
| 70 | 73 |
|
| 71 | 74 |
|
| 75 |
|
|
| 76 |
|
|
| 77 |
|
|
| 78 |
|
|
| 79 |
|
|
| 80 |
|
|
| 81 |
|
|
| 82 |
|
|
| 83 |
|
|
| 84 |
|
|
| 85 |
|
|
| 86 |
|
|
| 87 |
|
|
| 88 |
|
|
| 89 |
|
|
| 90 |
|
|
| 91 |
|
|
| 92 |
|
|
| 72 | 93 |
|
| 73 | 94 |
|
| 74 | 95 |
|
packages/openagents-cli/src/coder-skills.ts modified +93 -2
@@ -18,9 +18,9 @@
| 18 | 18 |
|
| 19 | 19 |
|
| 20 | 20 |
|
| 21 |
|
|
| 21 |
|
|
| 22 | 22 |
|
| 23 |
|
|
| 23 |
|
|
| 24 | 24 |
|
| 25 | 25 |
|
| 26 | 26 |
|
@@ -153,3 +153,94 @@ export const renderSkill = (skill: CoderSkill): string => {
| 153 | 153 |
|
| 154 | 154 |
|
| 155 | 155 |
|
| 156 |
|
|
| 157 |
|
|
| 158 |
|
|
| 159 |
|
|
| 160 |
|
|
| 161 |
|
|
| 162 |
|
|
| 163 |
|
|
| 164 |
|
|
| 165 |
|
|
| 166 |
|
|
| 167 |
|
|
| 168 |
|
|
| 169 |
|
|
| 170 |
|
|
| 171 |
|
|
| 172 |
|
|
| 173 |
|
|
| 174 |
|
|
| 175 |
|
|
| 176 |
|
|
| 177 |
|
|
| 178 |
|
|
| 179 |
|
|
| 180 |
|
|
| 181 |
|
|
| 182 |
|
|
| 183 |
|
|
| 184 |
|
|
| 185 |
|
|
| 186 |
|
|
| 187 |
|
|
| 188 |
|
|
| 189 |
|
|
| 190 |
|
|
| 191 |
|
|
| 192 |
|
|
| 193 |
|
|
| 194 |
|
|
| 195 |
|
|
| 196 |
|
|
| 197 |
|
|
| 198 |
|
|
| 199 |
|
|
| 200 |
|
|
| 201 |
|
|
| 202 |
|
|
| 203 |
|
|
| 204 |
|
|
| 205 |
|
|
| 206 |
|
|
| 207 |
|
|
| 208 |
|
|
| 209 |
|
|
| 210 |
|
|
| 211 |
|
|
| 212 |
|
|
| 213 |
|
|
| 214 |
|
|
| 215 |
|
|
| 216 |
|
|
| 217 |
|
|
| 218 |
|
|
| 219 |
|
|
| 220 |
|
|
| 221 |
|
|
| 222 |
|
|
| 223 |
|
|
| 224 |
|
|
| 225 |
|
|
| 226 |
|
|
| 227 |
|
|
| 228 |
|
|
| 229 |
|
|
| 230 |
|
|
| 231 |
|
|
| 232 |
|
|
| 233 |
|
|
| 234 |
|
|
| 235 |
|
|
| 236 |
|
|
| 237 |
|
|
| 238 |
|
|
| 239 |
|
|
| 240 |
|
|
| 241 |
|
|
| 242 |
|
|
| 243 |
|
|
| 244 |
|
|
| 245 |
|
|
| 246 |
|
packages/openagents-cli/src/coder-ui.ts modified +151 -1
@@ -32,6 +32,7 @@
| 32 | 32 |
|
| 33 | 33 |
|
| 34 | 34 |
|
| 35 |
|
|
| 35 | 36 |
|
| 36 | 37 |
|
| 37 | 38 |
|
@@ -81,6 +82,15 @@ const GUTTER = 9;
| 81 | 82 |
|
| 82 | 83 |
|
| 83 | 84 |
|
| 85 |
|
|
| 86 |
|
|
| 87 |
|
|
| 88 |
|
|
| 89 |
|
|
| 90 |
|
|
| 91 |
|
|
| 92 |
|
|
| 93 |
|
|
| 84 | 94 |
|
| 85 | 95 |
|
| 86 | 96 |
|
@@ -216,6 +226,14 @@ export function runCoderUi(session: CoderSession, options: CoderUiOptions): Prom
| 216 | 226 |
|
| 217 | 227 |
|
| 218 | 228 |
|
| 229 |
|
|
| 230 |
|
|
| 231 |
|
|
| 232 |
|
|
| 233 |
|
|
| 234 |
|
|
| 235 |
|
|
| 236 |
|
|
| 219 | 237 |
|
| 220 | 238 |
|
| 221 | 239 |
|
@@ -402,11 +420,87 @@ export function runCoderUi(session: CoderSession, options: CoderUiOptions): Prom
| 402 | 420 |
|
| 403 | 421 |
|
| 404 | 422 |
|
| 423 |
|
|
| 424 |
|
|
| 425 |
|
|
| 426 |
|
|
| 427 |
|
|
| 428 |
|
|
| 429 |
|
|
| 430 |
|
|
| 431 |
|
|
| 432 |
|
|
| 433 |
|
|
| 434 |
|
|
| 435 |
|
|
| 436 |
|
|
| 437 |
|
|
| 438 |
|
|
| 439 |
|
|
| 440 |
|
|
| 441 |
|
|
| 442 |
|
|
| 443 |
|
|
| 444 |
|
|
| 445 |
|
|
| 446 |
|
|
| 447 |
|
|
| 448 |
|
|
| 449 |
|
|
| 450 |
|
|
| 451 |
|
|
| 452 |
|
|
| 453 |
|
|
| 454 |
|
|
| 455 |
|
|
| 456 |
|
|
| 457 |
|
|
| 458 |
|
|
| 459 |
|
|
| 460 |
|
|
| 461 |
|
|
| 462 |
|
|
| 463 |
|
|
| 464 |
|
|
| 465 |
|
|
| 466 |
|
|
| 467 |
|
|
| 468 |
|
|
| 469 |
|
|
| 470 |
|
|
| 471 |
|
|
| 472 |
|
|
| 473 |
|
|
| 474 |
|
|
| 475 |
|
|
| 476 |
|
|
| 477 |
|
|
| 405 | 478 |
|
| 406 | 479 |
|
| 407 | 480 |
|
| 408 | 481 |
|
| 409 | 482 |
|
| 483 |
|
|
| 484 |
|
|
| 485 |
|
|
| 486 |
|
|
| 487 |
|
|
| 488 |
|
|
| 489 |
|
|
| 490 |
|
|
| 491 |
|
|
| 492 |
|
|
| 493 |
|
|
| 494 |
|
|
| 495 |
|
|
| 496 |
|
|
| 497 |
|
|
| 498 |
|
|
| 499 |
|
|
| 500 |
|
|
| 501 |
|
|
| 502 |
|
|
| 503 |
|
|
| 410 | 504 |
|
| 411 | 505 |
|
| 412 | 506 |
|
@@ -564,6 +658,16 @@ export function runCoderUi(session: CoderSession, options: CoderUiOptions): Prom
| 564 | 658 |
|
| 565 | 659 |
|
| 566 | 660 |
|
| 661 |
|
|
| 662 |
|
|
| 663 |
|
|
| 664 |
|
|
| 665 |
|
|
| 666 |
|
|
| 667 |
|
|
| 668 |
|
|
| 669 |
|
|
| 670 |
|
|
| 567 | 671 |
|
| 568 | 672 |
|
| 569 | 673 |
|
@@ -614,6 +718,51 @@ export function runCoderUi(session: CoderSession, options: CoderUiOptions): Prom
| 614 | 718 |
|
| 615 | 719 |
|
| 616 | 720 |
|
| 721 |
|
|
| 722 |
|
|
| 723 |
|
|
| 724 |
|
|
| 725 |
|
|
| 726 |
|
|
| 727 |
|
|
| 728 |
|
|
| 729 |
|
|
| 730 |
|
|
| 731 |
|
|
| 732 |
|
|
| 733 |
|
|
| 734 |
|
|
| 735 |
|
|
| 736 |
|
|
| 737 |
|
|
| 738 |
|
|
| 739 |
|
|
| 740 |
|
|
| 741 |
|
|
| 742 |
|
|
| 743 |
|
|
| 744 |
|
|
| 745 |
|
|
| 746 |
|
|
| 747 |
|
|
| 748 |
|
|
| 749 |
|
|
| 750 |
|
|
| 751 |
|
|
| 752 |
|
|
| 753 |
|
|
| 754 |
|
|
| 755 |
|
|
| 756 |
|
|
| 757 |
|
|
| 758 |
|
|
| 759 |
|
|
| 760 |
|
|
| 761 |
|
|
| 762 |
|
|
| 763 |
|
|
| 764 |
|
|
| 765 |
|
|
| 617 | 766 |
|
| 618 | 767 |
|
| 619 | 768 |
|
@@ -757,7 +906,8 @@ export function runCoderUi(session: CoderSession, options: CoderUiOptions): Prom
| 757 | 906 |
|
| 758 | 907 |
|
| 759 | 908 |
|
| 760 |
|
|
| 909 |
|
|
| 910 |
|
|
| 761 | 911 |
|
| 762 | 912 |
|
| 763 | 913 |
|
packages/openagents-cli/test/coder-skills.test.ts modified +83 -1
@@ -3,7 +3,7 @@ import { tmpdir } from "node:os";
| 3 | 3 |
|
| 4 | 4 |
|
| 5 | 5 |
|
| 6 |
|
|
| 6 |
|
|
| 7 | 7 |
|
| 8 | 8 |
|
| 9 | 9 |
|
@@ -145,3 +145,85 @@ describe("the skill tool", () => {
| 145 | 145 |
|
| 146 | 146 |
|
| 147 | 147 |
|
| 148 |
|
|
| 149 |
|
|
| 150 |
|
|
| 151 |
|
|
| 152 |
|
|
| 153 |
|
|
| 154 |
|
|
| 155 |
|
|
| 156 |
|
|
| 157 |
|
|
| 158 |
|
|
| 159 |
|
|
| 160 |
|
|
| 161 |
|
|
| 162 |
|
|
| 163 |
|
|
| 164 |
|
|
| 165 |
|
|
| 166 |
|
|
| 167 |
|
|
| 168 |
|
|
| 169 |
|
|
| 170 |
|
|
| 171 |
|
|
| 172 |
|
|
| 173 |
|
|
| 174 |
|
|
| 175 |
|
|
| 176 |
|
|
| 177 |
|
|
| 178 |
|
|
| 179 |
|
|
| 180 |
|
|
| 181 |
|
|
| 182 |
|
|
| 183 |
|
|
| 184 |
|
|
| 185 |
|
|
| 186 |
|
|
| 187 |
|
|
| 188 |
|
|
| 189 |
|
|
| 190 |
|
|
| 191 |
|
|
| 192 |
|
|
| 193 |
|
|
| 194 |
|
|
| 195 |
|
|
| 196 |
|
|
| 197 |
|
|
| 198 |
|
|
| 199 |
|
|
| 200 |
|
|
| 201 |
|
|
| 202 |
|
|
| 203 |
|
|
| 204 |
|
|
| 205 |
|
|
| 206 |
|
|
| 207 |
|
|
| 208 |
|
|
| 209 |
|
|
| 210 |
|
|
| 211 |
|
|
| 212 |
|
|
| 213 |
|
|
| 214 |
|
|
| 215 |
|
|
| 216 |
|
|
| 217 |
|
|
| 218 |
|
|
| 219 |
|
|
| 220 |
|
|
| 221 |
|
|
| 222 |
|
|
| 223 |
|
|
| 224 |
|
|
| 225 |
|
|
| 226 |
|
|
| 227 |
|
|
| 228 |
|
|
| 229 |
|
packages/openagents-cli/test/coder-ui.test.ts modified +153
@@ -389,3 +389,156 @@ describe("runCoderUi", () => {
| 389 | 389 |
|
| 390 | 390 |
|
| 391 | 391 |
|
| 392 |
|
|
| 393 |
|
|
| 394 |
|
|
| 395 |
|
|
| 396 |
|
|
| 397 |
|
|
| 398 |
|
|
| 399 |
|
|
| 400 |
|
|
| 401 |
|
|
| 402 |
|
|
| 403 |
|
|
| 404 |
|
|
| 405 |
|
|
| 406 |
|
|
| 407 |
|
|
| 408 |
|
|
| 409 |
|
|
| 410 |
|
|
| 411 |
|
|
| 412 |
|
|
| 413 |
|
|
| 414 |
|
|
| 415 |
|
|
| 416 |
|
|
| 417 |
|
|
| 418 |
|
|
| 419 |
|
|
| 420 |
|
|
| 421 |
|
|
| 422 |
|
|
| 423 |
|
|
| 424 |
|
|
| 425 |
|
|
| 426 |
|
|
| 427 |
|
|
| 428 |
|
|
| 429 |
|
|
| 430 |
|
|
| 431 |
|
|
| 432 |
|
|
| 433 |
|
|
| 434 |
|
|
| 435 |
|
|
| 436 |
|
|
| 437 |
|
|
| 438 |
|
|
| 439 |
|
|
| 440 |
|
|
| 441 |
|
|
| 442 |
|
|
| 443 |
|
|
| 444 |
|
|
| 445 |
|
|
| 446 |
|
|
| 447 |
|
|
| 448 |
|
|
| 449 |
|
|
| 450 |
|
|
| 451 |
|
|
| 452 |
|
|
| 453 |
|
|
| 454 |
|
|
| 455 |
|
|
| 456 |
|
|
| 457 |
|
|
| 458 |
|
|
| 459 |
|
|
| 460 |
|
|
| 461 |
|
|
| 462 |
|
|
| 463 |
|
|
| 464 |
|
|
| 465 |
|
|
| 466 |
|
|
| 467 |
|
|
| 468 |
|
|
| 469 |
|
|
| 470 |
|
|
| 471 |
|
|
| 472 |
|
|
| 473 |
|
|
| 474 |
|
|
| 475 |
|
|
| 476 |
|
|
| 477 |
|
|
| 478 |
|
|
| 479 |
|
|
| 480 |
|
|
| 481 |
|
|
| 482 |
|
|
| 483 |
|
|
| 484 |
|
|
| 485 |
|
|
| 486 |
|
|
| 487 |
|
|
| 488 |
|
|
| 489 |
|
|
| 490 |
|
|
| 491 |
|
|
| 492 |
|
|
| 493 |
|
|
| 494 |
|
|
| 495 |
|
|
| 496 |
|
|
| 497 |
|
|
| 498 |
|
|
| 499 |
|
|
| 500 |
|
|
| 501 |
|
|
| 502 |
|
|
| 503 |
|
|
| 504 |
|
|
| 505 |
|
|
| 506 |
|
|
| 507 |
|
|
| 508 |
|
|
| 509 |
|
|
| 510 |
|
|
| 511 |
|
|
| 512 |
|
|
| 513 |
|
|
| 514 |
|
|
| 515 |
|
|
| 516 |
|
|
| 517 |
|
|
| 518 |
|
|
| 519 |
|
|
| 520 |
|
|
| 521 |
|
|
| 522 |
|
|
| 523 |
|
|
| 524 |
|
|
| 525 |
|
|
| 526 |
|
|
| 527 |
|
|
| 528 |
|
|
| 529 |
|
|
| 530 |
|
|
| 531 |
|
|
| 532 |
|
|
| 533 |
|
|
| 534 |
|
|
| 535 |
|
|
| 536 |
|
|
| 537 |
|
|
| 538 |
|
|
| 539 |
|
|
| 540 |
|
|
| 541 |
|
|
| 542 |
|
|
| 543 |
|
|
| 544 |
|