tooeasy-crew/junis
Operate the Junis multi-agent platform by conversation: connect, build and tune agent squads, run them, read results and improve them.
Changelog
All notable changes to the Junis kit. The format follows
Keep a Changelog; versions are the
release tags users pin with JUNIS_KIT_REF.
[Unreleased]
Added
- Wiki:
junis_wikiandwikigainverify(a person confirms a page is correct today — text and version stay, its review timer restarts; hostedPOST /api/external/management/wiki/verify) andlint(read-only check of the whole wiki — pages past their review date, broken[[links]], orphans, empty pages, missing annotations, oversized pages — with afindingscount; hostedGET /api/external/management/wiki/lint).linttakes nofile_key.references/memory-and-identity.mddescribes soul version history and restore (get_soul_history,restore_soul_version), memory kept per (user, organization), and the wiki review period. - Knowledge:
references/knowledge.mdgains "Live dashboards and custom front-ends" — building a team's own screen on an organization's Knowledge with the hosted server's newknowledge_changes(what changed since a cursor; SSE formGET /api/external/brain/changes/stream),knowledge_entities_update_attrs(state updates by type + external_id with no re-import and no credits),knowledge_map_limits/knowledge_map_set_limits(the map caps, withconfirm_cost),knowledge_graph_snapshot(as_of=…), and the External-only OpenAPI document atGET /api/external/openapi.json. Browser tokens (POST /api/external/brain/browser-token, read-only, ≤15 min, bound to the page origin) let the page call the read endpoints directly.knowledge_geo_near/knowledge_geo_within(entities near a point or in a box, from ageo_pointattribute) and the AG-UI form of the run events (GET /api/external/sessions/<id>/events?format=agui) for screens.knowledge_changes_webhook/_set/_delete: a signed webhook that pushes the change feed every minute (Standard Webhooks headers, secret named by an Org Key). examples/live-dashboard/: a single-file reference front-end (browser token, paged first draw, SSE follow, map dots from ageo_pointlocation) and the platform's newopsknowledge-map preset it is written against.wiki get|put|append: safe wiki page writes from the command line — empty bodies are refused, the current page is backed up under the kit home (one file per write), the write carries the version that was read (a 409 comes back asconflictwith the backup path), and the page is read back and compared before success is reported. The Claude Code hook asks beforewiki putlike it does beforeapi PUT.- Actions: the skill's new reference
references/actions.mdcovers the platform's typed, approvable operations on an organization's own systems (connections, drafts, OpenAPI import, dry runs, assignment to agents, runs and the run log) through the hosted server'sactions_*tools, including thesimulateconnection for trying the flow with nothing connected. The kit drafts and runs; approving a draft, disabling an action and approving a waiting run stay with a person in the web app. - Five behaviour eval cases for Actions (not yet run).
- Knowledge:
references/knowledge.mdcovers set questions over the graph (knowledge_graph_around) and verified graph questions (knowledge_graph_templates,knowledge_graph_template_create,knowledge_graph_template_test; approval stays with a person in the web app),qualifierson neighbor edges, what a kind's property definitions check, and the web-only settings for restricted kinds and member browsing.
Security
-
Confirmation now also covers Actions:
actions_run(it acts in a system outside Junis;dry_run=trueis not asked),actions_agent_set,actions_connection_update,actions_connection_delete,actions_draft_delete,actions_draft_update(it replaces the whole draft in place, as the ExternalPUTalready was asked),actions_import_openapiandactions_import(only when it really writes: the tool previews by default and is asked withdry_run=false; the route imports by default and is asked unlessdry_run=true), and throughjunis_apiPOST /actions/run,POST /actions/import/openapiandPOST /actions/import. -
junis_wiki(actions get, put, append) gives agents the same safe wiki operations through the MCP bridge; put on an existing page needsconfirmed=true.
Changed
- A write whose body sets
instructionorcontentto an empty string is refused before it leaves the kit, on every path:api,tools calland the MCP bridge (junis_api,junis_call_tool). Typical cause:instruction=@filewith a file that was never written. api --filewith a missing or empty payload file is now a clearfile_not_found/empty_payloaderror (before: a raw ENOENT or a genericbad_json).actions_runis given 420 seconds before the kit reports a timeout, because the platform holds the call open while the action executes.- Browser login asks for 29 permissions: the 26 as before plus
actions:read,actions:runandactions:manage. A platform that does not know one of them yet refuses the list (400invalid_scopes); the kit then asks once more for the permissions that platform offers, so the key is the same as before this change instead of the platform's narrower default set. Permissions named with--scopesare still never replaced. - The hint for a missing permission says that browser login requests the permissions the platform offers, rather than every permission.
Fixed
-
restore_soul_versionnow asks before it runs, likeupdate_soul_contentandrollback_agent: it replaces the soul or identity text for every agent of the organization. -
wiki verifyon a platform that does not have the route yet answersunsupportedinstead ofnot_found(which read as "the page is missing"). -
The catalogue fixture carries the hosted server's 214 tools, including
update_soul_content'sexpected_versionandsummary. -
tools describe <wrong name>suggests tools by name words (make_agent→create_agent,clone_agent, …) instead of by description search, which stopped namingcreate_agentonce the catalogue grew. -
The catalogue fixture the tests check documentation against now carries all 202 platform tools (actions_* and knowledge_* were never checked before).
doctordecodes the bridge's output as one UTF-8 stream. -
doctorreported the local bridge as broken on macOS once its tool list grew past 8 KiB: it parsed the second answer before the pipe had delivered all of it. It now waits for whole lines.
[0.1.0] - 2026-11-05
First tagged release.
Security
- URL overrides (
JUNIS_API_BASE,JUNIS_MCP_URL,JUNIS_WEB_URL) and saved addresses are accepted only forjunis.ai, its subdomains and this machine. Any other host needsJUNIS_ALLOW_CUSTOM_HOST=1, and is then named bystatus,doctorand the bridge's start-up log (host_not_allowedotherwise). - The Claude Code Bash hook also reads the kit's shape under another script
name (
node <script> api …,node <script> tools call …), so a copy or link ofjunis.mjsis asked about. A hook event that cannot be parsed but names the kit is asked about instead of passing. - On the command line, a destructive
apiortools callrun without a terminal stops with exit code 2 until it is repeated with--yes. install.shrefuses aJUNIS_KIT_REForJUNIS_KIT_REPOthat is an option or several words, passes both to git after--, and switches an existing clone to a changedJUNIS_KIT_REPOinstead of ignoring it.
Added
login --browser --scopes read-only|operator|all|<list>asks for a narrower key. A list the platform refuses is an error, never widened.- CI on GitHub Actions (Node 18 and 20), code owners, a bug report template,
this changelog and a "Supported versions" section in
SECURITY.md.
Changed
- Documentation: the hook's limits (name and shape, wrapper scripts not
caught, 10-second fail-open), that
loginunder an override saves the address, the masked key returned bystatus, Windows file permissions, and wording about the platform's ownjunis-magic-autokey.
Initial (2026-09-30)
The kit as first published: the junis skill, the stdio MCP bridge (mcp, mcp --lazy),
the command line (status, login, tools, api, run, session, lint,
snapshot, doctor) and the installer for Claude Code, Codex, Cursor, Gemini
CLI, OpenCode and Copilot.