Repository navigation
Subroutine 0.9.7
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, andprecedes, 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_totalis new on the agenda response and is optional, so an older client
is unaffected. -
A milestone counts what it includes: an
includeslink from the milestone to its work,
as insubroutine link 12 includes 43. Itsshowreads Links (3 of 5 included done) on
the terminal, in the browser and to an agent, andshow --treewalks 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_countandincluded_done_count
are new on a task and are optional, so an older client is unaffected. -
subroutine explain milestonessays how milestones work: features, milestones, and the
difference betweenincludes,blocksandprecedes. Thelinkhelp's example is
includesnow, 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> --heregives 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.jsonunder the variable for your connection, makes the repository
ignore that file - adding the line to.gitignoreif 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-remoteit names the shell only: that plugin's tools present the one token it
was given, in every project.agent createandsubroutine_whoamiboth say so, and name the
twoclaude plugin ... --scope localcommands that switch one project to thesubroutine
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, andsubroutine_whoaminames the command. The offer is
in the plugin's skill, so refresh the plugin to get it:claude plugin marketplace update subroutine, thenclaude plugin update subroutine@subroutine. -
The
subroutineplugin'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_whoamiand 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 createsays 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 createwithout 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 connectingsay 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 runno longer offers--mergedand--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-remotesends 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.tomlorconfig.tomlempty.
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
subroutineplugin'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 whoevercredentials.tomlheld 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, with2028left 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 2028or
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 written0930or 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 as05: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,--projectand--deferred, so following it after
--type,--status,--filteror any other narrowing listed open work of every kind, and a
saved view's suggestion ranlistrather 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, andskiplet the occurrence go before refusing. Each is refused now, before
anything is written.