Skip to content

Subroutine 0.9.7

Choose a tag to compare

@github-actions github-actions released this 25 Sep 09:04
· 427 commits to main since this release

This release changes the database schema, to 58c81c09d101.

Install it, then run subroutine db upgrade. That reports both versions, takes a
verified backup, migrates and checks the result - in that order. Stop the service
first if you are running one; expect it to be down for the length of the migration.

Added

  • Every workspace is given a milestone type and two new links: includes, for what counts
    toward a milestone, and precedes, for an order that holds nothing up - Precedes at one
    end, Follows at the other. A workspace that already has a type or a link under one of
    those names keeps its own.

  • A milestone is never offered as work, whether or not anything is in it yet: --ready
    and an agent's next work leave it out. The agenda shows one by its date - under Today,
    Overdue or the look-ahead, where a missed one is late - and never under Next, nor as work
    somebody else is holding up, and the terminal's closing tip never suggests ticking one off.
    One with no date is counted on the line that says what the day is not showing.
    undated_milestones_total is new on the agenda response and is optional, so an older client
    is unaffected.

  • A milestone counts what it includes: an includes link from the milestone to its work,
    as in subroutine link 12 includes 43. Its show reads Links (3 of 5 included done) on
    the terminal, in the browser and to an agent, and show --tree walks what it includes and
    what that waits for. Its row on every listing says 3 of 5 included done too, and
    included done once all of it is, so a roadmap reads down a list; completing it stays
    yours. Only a milestone includes, and it includes only tasks - another milestone among
    them, so a phase can sit inside a roadmap. A loop of them is refused, and so is retyping a
    milestone that includes work. included_done, included_count and included_done_count
    are new on a task and are optional, so an older client is unaffected.

  • subroutine explain milestones says how milestones work: features, milestones, and the
    difference between includes, blocks and precedes. The link help's example is
    includes now, where it used to teach a roadmap as things blocking one item. The plugin's
    skill teaches the same, from this plugin update on.

  • subroutine agent create <name> --here gives one project's Claude Code sessions an agent of
    their own, in one command.
    Run in the project's directory, it writes the credential into
    .claude/settings.local.json under the variable for your connection, makes the repository
    ignore that file - adding the line to .gitignore if it needs one - and prints nothing
    secret, so your agent can run it for you without ever seeing the credential. If it could not
    finish, it refuses before a credential is made, leaving at most the line it added to
    .gitignore, and if the settings file cannot be written afterwards it shows you the credential
    rather than lose it. Reload the window straight afterwards: a session
    already open may act as the new agent in its shell before its tools catch up. With
    subroutine-remote it names the shell only
    : that plugin's tools present the one token it
    was given, in every project. agent create and subroutine_whoami both say so, and name the
    two claude plugin ... --scope local commands that switch one project to the subroutine
    plugin, whose tools take the agent too. A different agent in each
    project
    is built around it now.

  • Your agent offers it. An agent that finds itself working as you in a project offers to
    give the project an agent of its own, and subroutine_whoami names the command. The offer is
    in the plugin's skill, so refresh the plugin to get it: claude plugin marketplace update subroutine, then claude plugin update subroutine@subroutine.

  • The subroutine plugin's tools say so when its token field has been emptied, rather than
    going on as somebody else without a word. Claude Code empties that field when you sign out of
    Claude Code, uninstall the plugin or remove its marketplace. The next time the tools start,
    subroutine_whoami and the answer to their first write say who they act as now, and how to
    put the token back. A field that was always empty is never mentioned.

Changed

  • SQLAlchemy stays on 2.0 for now. Version 2.1 came out on 24 September and Subroutine is not
    yet tested against it, so this release asks for a version below 2.1. An installation made since
    then, which will have 2.1, is moved back to 2.0 when you upgrade.

  • agent create says whom the new agent answers to, which is whoever ran it. When that is
    another agent - your own, giving a project its agent - it also prints the one command that
    makes you the parent instead, subroutine user transfer <name> --to <you>, which only a
    person can run. The plugin's skill says the same, and that mentioning the feature to your
    agent is not a yes.

  • agent create without a hand-over names the variable to put its credential under, for a
    project on the machine it ran on, rather than leaving you to work it out. A name that is not
    your connection's is ignored without a word.

  • Every page that takes a token says where it is kept and what removes it. A token typed
    into a Claude Code plugin's field is kept by Claude Code, which deletes it when you sign out of
    Claude Code, uninstall the plugin or remove its marketplace; updating the plugin keeps it.
    Where your token is kept
    compares the seven places a token can live, and the plugins' own fields and
    subroutine explain connecting say the same. subroutine-remote's field no longer tells you
    to ask for a new token when one is refused: enter it again first.

  • Nothing the program prints carries an em dash. Command output, help, refusals, the API's
    route and schema descriptions and the agent tools' descriptions use a spaced hyphen, and an
    empty cell in a compact listing - no due date, no priority, a workspace with no timezone - is
    a hyphen.

  • Subroutine's mark is Lucide's waypoints, in the browser's tab, on a home screen and
    beside the name at the top of every page, where it was kanban: points joined up, rather
    than a board.

  • view run no longer offers --merged and --strict, which did nothing for a view: it runs
    on the one connection it was saved on. Both are still accepted, so a script that passes either
    goes on working.

  • The journal is a tab beside Agenda, List and Board in the browser, on a workspace's pages
    and on the journal itself, which now draws those tabs and the search too, so you can go from
    a workspace's journal straight to its list or board. Choosing another workspace there opens
    that workspace's journal rather than its agenda. An item's button reads Item journal.

Fixed

  • An instance says so when a request carries no token, rather than telling you your token may
    be mistyped, revoked or expired. subroutine-remote sends an empty one once Claude Code has
    emptied its token field - which signing out of Claude Code, uninstalling the plugin and
    removing its marketplace all do - and the refusal now names that field and says to enter the
    token again with /plugin.

  • A refusal says what to do straight after what went wrong. Claude Code shows the first 500
    characters of a refusal from an HTTP plugin, and the hint came last, so it was cut off. It now
    follows the detail.

  • Saving a token or a setting can no longer leave credentials.toml or config.toml empty.
    Both were cut to nothing and then written, so a full disk or a killed process part way
    through lost what they held. Each is now written beside the old file and renamed over it, so
    you find the old file or the new one, whole. One you keep elsewhere and link into place stays
    linked.

  • The subroutine plugin's token field is used whichever instance the plugin names. Pointed
    at a connection other than this machine's default, the plugin's token was skipped, and its
    tools acted as whoever credentials.toml held for that connection - usually you. A token you
    export in a shell still goes only to your default connection. If you pointed the plugin at
    another instance and left a token for your default one in its field
    , that token is now sent
    to the instance the plugin names, which refuses it: put that instance's token in the field, or
    empty it.

  • A date written with its year is read in that year. by 31 March 2028 was due on 31 March
    2027, the next one, with 2028 left in the title, and a start, a span and a date typed at the
    command line did the same. The year is now read with the date it follows - 14 March 2028 or
    March 14, 2028 - and a year written once at the end of a span is both days', so from 2
    October to 12 October 2027
    is in 2027. A written date with no year is still the next one.
    Four digits after a date count as its year from last year to fifty years ahead; anything else,
    such as a time written 0930 or 1500 chairs, stays in the title and is reported.

  • A range with am or pm on its start alone ends when you meant. Meet on friday at 9am-5:30
    was stored as ending at 5:30 the next morning, and Party on friday at 11pm until 12:30 at noon
    the next day. An end written without am or pm is now the first time after the start that a
    clock shows it - half past five in the afternoon, and half past midnight - so 9am-9:00 runs
    from nine to nine, and no range read this way is longer than twelve hours. An end on the 24-hour
    clock, such as 05:30, is read as written.

  • After you add something in the browser, the note saying so links to it. It named the
    new item's number and title in plain text, so going to it meant finding it in the list. The
    number and title now open it.

  • Moving to another page in the browser closes the add form's More. Opened once, its
    extra fields stayed open on every page after, still writing a document if you had chosen one.
    A new page now starts with the box alone. Switching the view or narrowing the list where you
    are keeps it as you left it.

  • Moving to another item in the browser closes an edit form left open. It used to follow
    you to the next item with what you had typed still in it, and Save then wrote that onto
    the item now showing. A new page draws the form closed, and what was typed and not saved is
    dropped, as a reload drops it.

  • Moving to another item in the browser can no longer bring back the one you left. A
    background read of it still under way when you moved could land after the new item had been
    drawn, and put the old one back on screen under the new item's address, where Save and
    every other control acted on it.

  • When a list stops at its limit, the command it suggests keeps everything you narrowed it
    by.
    It repeated only --order, --project and --deferred, so following it after
    --type, --status, --filter or any other narrowing listed open work of every kind, and a
    saved view's suggestion ran list rather than the view. It now repeats the command as you
    typed it, with a larger limit, and last on its line without quotes around it, so it can be
    pasted as it stands.

  • A token set with a space or a line break at either end is read without it, and a token that
    cannot be sent is never quoted back.
    It was sent as it was set, refused, and quoted whole into
    an error that blamed the network - the secret, in the text an agent reads. A connection's own
    token variable holding only spaces is now refused by name, rather than skipped for whatever
    else this machine holds.

  • A hyphen with nothing piped in is refused, rather than read as nothing. --description -
    and --because - read an empty pipe as empty text, so in a shell with no terminal - which is
    where an agent works - a project's or a workspace's description was cleared, a reason was
    dropped, and skip let the occurrence go before refusing. Each is refused now, before
    anything is written.