+
    jHàj'o  ã                   ó¸  € R t ^ RIHt ^ RIt^ RIHt ^ RIHt ^ RIH	t
 R R ltER¢RR/R	 R
 llltR R ltR tR R ltR R ltR R ltR R ltR R lt]! R4      t]! RRR7      t]! R4      t]! RRR7      t]! R ]^ R!R"7      t]! R#4      t]! R$R%R&7      ]! R'R%R&7      ]! R(4      3t]! R)R*R7      ]! R+R,R7      3t]! R-]! 4       ]! R.R/R0R17      .R2.R3R47      ]! R5]! RR6R7      ]! R7R8R7      ]! R9R:R7      ]! R;R<R7      ]! R=R>R7      ]! R?R/R@R17      ]! RARBR7      .RC.RDR47      ]! RE]]! RFR/RGR17      .RHRI.RJR47      ]! RK].RL.RMR47      ]! RNRO.RPR47      ]! RQ]]! RRRSR7      .RTR7      ]! RU]]! RVRWRXRY7      .RZR7      ]! R[]! RRWR\RY7      ]! R]R^R_R7      ]! R`R/RaR17      ]! RbR/RcR17      ]! 4       .RdReRf7      ]! Rg]! RhRiR7      ]! RjRkRlRm7      ]! R?R/RnR17      ]! 4       .RoRpRf7      .	t. ]! RqRrR7      N]! RsRt]3RuRvRw7      N]! R5]! RxRyR7      ]! RzR{R7      ]! R|R}R~R7      ]! R€R�R7      ]! R‚Rƒ. R„R…7      ]! R†R‡R7      ]! RˆR‰R7      ]! RŠR‹R7      ]]]! RŒR/R�R17      ]! RŽR�R7      ]! R�R‘R7      ]! R’R“R”R•7      ]! R–Rƒ. R—R˜R™7      ]! Rš]R›Rœ]P<                   R�2Rž7      ]! RŸR R¡Rm7      ]! R¢R£R¤Rm7      ]! R¥R¦R§R7      ]! R¨R/R©RªR«7      ]! R¬]R›R­R®R¯7      ]! R°]! ]P@                  4      R±R²R³7      ]! R´R7      .RµR7      N]! R¶]! R·R¸R7      ]! R¹Rƒ. RºR»R¼7      ]! R½R%R¾R¿7      ]! RÀR%RÁR¿7      ]]]! R’RÂR7      ]! RŽRÃR7      ]! R´R7      .	RÄR7      N]! R-]! RÅR/RÆR17      ]! R€4      ]! RÇ]! ]PB                  4      RÈ7      ]! R4      ]! RÉRÊR7      ]! RËR/RÌR17      ]! 4       ]! RÍ]! ]PD                  PG                  4       4      RÎRÏ7      ]! RÐRÑRÒR7      ]! RÓRÔRÕRÖR×7      .
R2.RØR47      N]! RN]]! 4       .]! RÙ4      ORÚR7      N]! RÛ]]! RÜRÝR7      .RÞR7      N]! Rß]]! RàRWRáRY7      ]! R¢RâR7      .RãR7      N]! Rä]].RåR7      N]! Ræ]]! RÜRçR7      ]! RèR/RéR17      ].RêR7      N]! Rë]! Rì. ER£ORíRÏ7      ]! RîRïR7      ]! RðR7      .Rñ.RòR47      N]! Ró]! Rô4      ]! Rõ4      .RöR7      N]! R÷]! Rô4      ]! Rõ4      .RøR7      N]! Rù]]! Rú]]PH                  RûR"7      .RüR7      N]! Rý]]! RþRRÿRY7      ]! ER ERR7      ]! ER]ERER7      .ERR7      N]! ER]]! RVERR7      ]! ERER	R7      ]! R7ER
R7      ]! ER ERR7      .ERR7      N]! ER]]! 4       .ERR7      N]! ER]! ER]ER7      .ERR7      N]! ER]! RRERRY7      ]! ERERR7      ]! R)ERR7      ]! R+ERR7      ]! ERR/ERR17      .ERR7      N]! ER]]! ERERR7      ]! RzERR7      ]! R ]ER ER7      ]! ERER!R7      .]OER"R7      N]! ER#]]! ER$ER%ER&RY7      ]! ER#4      ]! ER']! ]PJ                  4      ER(RÏ7      .ER)R7      N]! ER*]]! ER$ER%ER+RY7      ]! ER*4      .ER,R7      N]! ER-]! ER.4      ].ER/R7      N]! ER0]]! R)ER1R7      ]! ER2ER3R7      ]! R+ER4R7      ]! ERR/ER5R17      .ER6R7      N]! ER7]]! ER$RER8RY7      .ER9R7      N]! ER:]]! ER;4      .ER<R7      N]! ER=]]! ER$ER%ER>RY7      ]! ER=4      ]! ER?R/ER@R17      ]! ERAERBR/ERCERD7      .ERER7      N]! Rh]! RER%ERFRY7      ]! ERGERHRERIERJ7      .ERKR7      N]! ERL]]! ERM]&ERNERO7      .ERPR7      N]! ERQ]! ER?R/ERRR17      ]! ERS]ERTER7      ]! ERU]]P<                  ERV]P<                   ERW2R"7      ]! 4       .ERXR7      N]! ERY]! ERM]&ERZER[R"7      ]! ERS]ER\ER7      ]! ERU]]P<                  ERO7      ]! ER]ER^R7      ]! ER_ER`R/ERaR17      ]! ERR/]PN                  R17      .ERbR7      N]! ERc]! R€ERdR7      ]! REReR7      ]! ERfERgR7      ]! ERM]&ERhERiR"7      .ERjR7      N]! ERk]! 4       .ERlR7      N]! ERm].]O]! ERn4      N]! ERo4      N]! ERpER¤ERqRÏ7      N]! ERrERsR7      N]! ERtERuR7      N]! ERvERwR7      N]! ERx]
PP                  ERyRÏ7      NERzR7      N]! ER{]! RRWR7      ]! 4       .ER|R7      N]! ER}].]OER~R7      N]! ER]]! ER€]ER�ER7      .ER‚R7      N]! ERƒ]]! 4       .]! ER„4      OER…R7      N]! ER†]]! ER‡ERˆR7      .ER‰R7      N]! ERŠ]! 4       .ER‹R7      N]! ERŒ].ER�R7      N]! ERŽ]! ERŽER�ER�4      ER‘R7      N]! ER’]! ER’ER“ER”4      ER•R7      N]! ER–]! ER—]^ER˜R"7      ]! ER™]^ERšR"7      .ER›R7      N]! ERœ]! ER�R7      .ERžERŸRf7      Nt)ER  ER¡ lt*R# (¥  uY  Argparse tree for ``hermes kanban â€¦`` (``build_parser``).

The subcommand tree is declared as data â€” one ``_cmd(...)`` record per
subcommand holding its ``add_parser`` kwargs and an ordered tuple of
``add_argument`` specs â€” and materialised by ``_add_commands``. Order of
records and arguments is the order argparse renders in ``--help``.
)ÚannotationsN)Ú	kanban_db)Úkanban_db_dispatch)Úkanban_db_notifyc               ó   € V ^8„  d   QhRR/# )é   ÚflagsÚstr© )Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/hermes_cli/kanban_parser.pyÚ__annotate__r      s   € ÷ ñ �ñ ó    c                 ó   € W3# )Nr
   )r   Úkws   *,r   Ú_argr      s
   € Øˆ;Ðr   Úchildrenc               ó   € V ^8„  d   QhRR/# )r   Únamer	   r
   )r   s   "r   r   r      s   € ÷ 4ñ 4ˆsñ 4r   c               ó   € W\        V4      V3# )z@``children`` = ``(dest, [specs])`` for a nested subparser group.)Útuple)r   Úargsr   Ú	parser_kws   &&$,r   Ú_cmdr      s   € àœU 4›[¨(Ð3Ð3r   c               ó    € V ^8„  d   QhRRRR/# )r   Úsubúargparse._SubParsersActionÚreturnÚNoner
   )r   s   "r   r   r      s   € ÷ Dñ DÐ1ð D¸Tñ Dr   c                óÒ   € V F`  w  r#rEV P                   ! V3/ VB pV F  w  rxVP                  ! V/ VB  K  	  V'       g   K@  Vw  rš\        VP                  V	R 7      V
4       Kb  	  R# )©ÚdestN)Ú
add_parserÚadd_argumentÚ_add_commandsÚadd_subparsers)r   Úspecsr   r   r   r   Úpr   r   r!   Úchild_specss   &&         r   r$   r$      sf   € Û+0Ñ'ˆ˜Ø�NŠN˜4Ñ- 9Ñ-ˆÛ‰IˆEØ�NŠN˜EÐ( RÔ(ñ ç‰8Ø (ÑˆDÜ˜!×*Ñ*°Ð*Ó5°{ÖCó ,1r   c                 ó   € \        RRR/V B # )ú--jsonÚactionÚ
store_true)r*   ©r   )r   s   ,r   Ú
_json_flagr.   %   s   € ÜÑ4 Ð4°Ñ4Ð4r   c               ó   € V ^8„  d   QhRR/# )r   Úhelpr	   r
   )r   s   "r   r   r   )   s   € ÷ 'ñ '�#ñ 'r   c                ó   € \        R V R7      # )z--reason©r0   r-   r2   s   &r   Ú_reasonr3   )   s   € Ü�
 Ô&Ð&r   c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer	   r   Úintr
   )r   s   "r   r   r   -   s   € ÷ 	ñ 	˜Cð 	 Cñ 	r   c                ó¬   €  \        V 4      pT^ 8  d   \        P                  ! R4      hT#   \         d   p\        P                  ! R4      ThRp?ii ; i)z•argparse type for retention days: a negative window builds a future cutoff
that matches every row, so reject it at the CLI boundary before any sweep.zmust be an integerNz3retention days must be >= 0 (0 disables that sweep))r6   Ú
ValueErrorÚargparseÚArgumentTypeError)r5   ÚparsedÚexcs   &  r   Ú_nonnegative_intr=   -   sY   € ðHÜ�U“ˆð �„zÜ×(Ò(Ð)^Ó_Ð_Ø€Møô	 ô HÜ×(Ò(Ð)=Ó>ÀCÐGûðHús   ‚, ¬A·AÁAc               ó   € V ^8„  d   QhRR/# )r   Ú	type_helpr	   r
   )r   s   "r   r   r   9   s   € ÷ ñ ˜sñ r   c                ó@   € \        R RRV  2R7      \        RRRR7      3# )z--state-typezWith --state-name: ©Úchoicesr0   z--state-nameÚVALUEz;With --state-type: keep runs whose column equals this value©Úmetavarr0   )ÚstatusÚoutcomer-   )r?   s   &r   Ú_run_state_argsrH   9   s3   € äˆ^Ð%:ÐCVÐW`ÐVaÐAbÔcÜˆ^ WØOô	Qðð r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úverbr	   ÚVerbÚnounr
   )r   s   "r   r   r   A   s!   € ÷ 	ñ 	˜Sð 	¨ð 	°3ñ 	r   c           	     ó˜   € \        RRRV  R2R7      \        RRRV R	2R
7      \        RRR7      \        RRV R2R7      \        RR7      3# )z-Shared ``specify`` / ``decompose`` arguments.Útask_idÚ?zTask id to z! (required unless --all is given)©Únargsr0   ú--allÚ
all_triager,   z* every task currently in the triage column©r!   r+   r0   ú--tenantz7When used with --all, restrict the sweep to this tenantr2   ú--authorzHAuthor name recorded on the audit comment (default: $HERMES_PROFILE or 'z')z'Emit one JSON object per task on stdout)r   r.   )rJ   rK   rL   s   &&&r   Ú_triage_sweep_argsrW   A   sh   € ô 	ˆY˜c¨+°d°VÐ;\Ð(]Ô^ÜˆW˜<°ÀdÀVÐKuÐCvÔwÜˆZÐWÔXÜˆZØ\Ð]aÐ\bÐbdÐeô	gäÐAÔBðð r   c               ó   € V ^8„  d   QhRR/# )r   rJ   r	   r
   )r   s   "r   r   r   M   s   € ÷ lñ l�Cñ lr   c                ó&   € \        R RRV  R2R7      # )z--idsÚ+zAdditional task ids to z! with the same reason (bulk mode)rP   r-   )rJ   s   &r   Ú	_bulk_idsr[   M   s   € Ü�˜sÐ+BÀ4À&ÐHiÐ)jÔkÐkr   rN   Útask_idsrZ   )rQ   ÚslugrU   zTenant namespacer2   z
--priorityzPriority tiebreaker)ÚtypeÚdefaultr0   z7Human-readable reason (recorded on the reclaimed event)z
--platformT)Úrequiredz	--chat-idz--thread-idz	--summaryz>Structured handoff summary. Falls back to --result if omitted.z
--metadatazCJSON dict of structured facts to store on the latest completed run.ÚlistrR   r,   zInclude archived boards too)r+   r0   Úlsz List all boards with task counts)Úaliasesr0   Úcreatez*Board slug (kebab-case, e.g. atm10-server)z--namez<Human-readable display name (defaults to Title Case of slug)z--descriptionzOptional descriptionz--iconz9Optional emoji or single-character icon for the dashboardz--colorz5Optional hex color (e.g. '#8b5cf6') for the dashboardz--switchz)Switch to the new board after creating itz--default-workdirz6Default workspace path for tasks created on this boardÚnewzCreate a new boardÚrmz--deletezxHard-delete the board directory instead of archiving it. Default is to move it to boards/_archived/ so it's recoverable.ÚremoveÚdeletez#Archive (default) or delete a boardÚswitchÚusez-Set the active board for subsequent CLI callsÚshowÚcurrentz%Print the currently-active board slugÚrenamer   zNew display namez@Change a board's human-readable display name (slug is immutable)zset-default-workdirÚpathrO   z7Absolute path to use as default workdir. Omit to clear.rP   z3Set the default workspace path for tasks on a boardÚexportz,Board to export (default: the current board)z-oz--outputz'Archive path (default: ./<slug>.tar.gz)z--no-attachmentsz0Skip attachment files, keeping the archive smallz--include-logszInclude per-task worker logsz,Export a board to a portable .tar.gz archiveu  Package a board's tasks, comments, links, history, and file attachments into one archive that can be imported on another machine. Claims, worker PIDs, chat subscriptions, and paths belonging to this machine are stripped. Workspaces are never included â€” they are rebuilt on demand.©r0   ÚdescriptionÚimportÚarchivezPath to the .tar.gz archivez--asÚas_slugz7Slug for the imported board (default: from the archive))r!   r0   z'Switch to the imported board afterwardsz%Import a board archive as a new boardué   Import a .tar.gz produced by `hermes kanban boards export`. The board always lands as a NEW board â€” the slug gains a numeric suffix if it is already taken â€” so an import can never overwrite or merge into a board you already have.Úinitz(Create kanban.db if missing (idempotent)ÚboardsÚboards_actionz9Manage kanban boards (one board per project / workstream)u  Boards let you separate unrelated streams of work (projects, repos, domains) into isolated queues. Each board has its own DB, workspaces directory, and dispatcher loop â€” tasks on one board cannot collide with tasks on another. The first board is 'default' and always exists.)r   r0   rq   Útitlez
Task titlez--bodyzOptional opening postz--body-fileÚPATHz›Read the opening post from a file ('-' = stdin), so bodies with embedded newlines or flag-like lines survive shell quoting. Mutually exclusive with --body.rD   z
--assigneezProfile name to assignz--parentÚappendzParent task id (repeatable))r+   r_   r0   z--workspacez�scratch | worktree | worktree:<path> | dir:<path> (default: scratch; an explicit 'scratch' also opts out of a project-scoped board's project)z--branchz/Branch name for worktree tasks, e.g. wt/t6-wirez	--projectz”Link to a project (id or slug). Anchors the task's worktree under the project's primary repo with a deterministic branch. See `hermes project list`.z--triageuJ   Park in triage â€” a specifier will flesh out the spec and promote to todoz--idempotency-keyzkDedup key. If a non-archived task with this key exists, its id is returned instead of creating a duplicate.z--max-runtimez¦Per-task runtime cap. Accepts seconds (300) or durations (90s, 30m, 2h, 1d). When exceeded, the dispatcher SIGTERMs (then SIGKILLs) the worker and re-queues the task.z--created-byÚuserz0Author name recorded on the task (default: user))r_   r0   z--skillÚskillsz¡Skill to force-load into the worker (repeatable). The kanban lifecycle is already injected automatically. Example: --skill translation --skill github-code-review)r+   r_   r!   r0   z--max-retriesÚNu   Per-task override for the consecutive-failure circuit breaker. Trip on the Nth failure â€” e.g. --max-retries 1 blocks on the first failure (no retries), --max-retries 3 allows two retries. Omit to use the dispatcher's kanban.failure_limit config (default z).)r^   rE   r0   z--modelÚmodel_overridezÆPin the worker to this model (passed as -m <model>) without changing the profile's configured model. Combine with --provider when the model belongs to a different backend than the profile's default.z
--providerÚprovider_overridez^Provider the --model belongs to (passed as --provider <name> to the worker). Requires --model.z--completion-contractÚCONTRACTzalocal-only (default), OWNER/REPO for publication, or exact GitHub PR URL; required CI gates done.z--goalÚ	goal_modea=  Run the worker in a goal loop: after each turn a judge checks the response against the card title/body and, if not done, the worker keeps going in the same session until the judge agrees it's complete (or the turn budget runs out, which blocks the card for review). Best for open-ended cards one shot rarely finishes.)r+   r!   r0   z--goal-max-turnsÚgoal_max_turnszDTurn budget for --goal workers (default 20). Ignored without --goal.)r^   rE   r!   r0   z--initial-statusÚrunningzˆInitial card status. Use 'blocked' for cards that require immediate human ops (R3 gate) to skip the brief running-to-blocked transition.)rB   r_   r0   zEmit JSON outputzCreate a new taskÚswarmÚgoalzSwarm goal / final outcomez--workerzPROFILE:TITLE[:SKILL,SKILL]z!Parallel worker card (repeatable))r+   r_   rE   r0   z
--verifierzVerifier profile)r`   r0   z--synthesizerzSynthesizer/writer profilezCreator/anchor profilezDedup key for the root carduN   Create a Kanban Swarm v1 graph (parallel workers â†’ verifier â†’ synthesizer)z--minez%Filter by $HERMES_PROFILE as assigneez--status)rB   z	--sessionzZFilter by originating chat/agent session id (set on tasks created from inside an ACP loop)z
--archivedzInclude archived tasksz--sortz/Sort order for listed tasks (default: priority)rA   z--workflow-template-idÚIDz0Restrict to tasks with this workflow_template_idz
--step-keyÚcurrent_step_keyÚKEYz,Restrict to tasks with this current_step_key)r!   rE   r0   z
List tasksz&filter listed runs by task_runs columnz"Show a task with comments + eventsÚassignÚprofilez$Profile name (or 'none' to unassign)zAssign or reassign a taskz	set-modelÚmodelz<Model to pin the worker to (or 'none' to clear the override)zjProvider the model belongs to (worker is spawned with --provider <name>). Cleared together with the model.zQSet or clear a task's model/provider override (takes effect on the next dispatch)Úreclaimz0Release an active worker claim on a running taskÚreassignz(New profile name (or 'none' to unassign)z	--reclaimzIRelease any active claim before reassigning (required if task is running)zCReassign a task to a different profile, optionally reclaiming firstÚdiagnosticsz
--severityz/Only show diagnostics at or above this severityz--taskz%Only show diagnostics for one task idz9Emit JSON (structured) instead of the default human tableÚdiagz,List active diagnostics on the current boardÚlinkÚ	parent_idÚchild_idzAdd a parent->child dependencyÚunlinkz!Remove a parent->child dependencyÚclaimz--ttlz#Claim TTL in seconds (default: 900)z>Atomically claim a ready task (prints resolved workspace path)ÚcommentÚtextzComment bodyrV   z0Author name (default: $HERMES_PROFILE or 'user')z	--max-lenz4Trim the stored comment body to this many characters)r^   r0   zAppend a commentÚattachz Path to the local file to attachz--content-typez4MIME type (default: guessed from the file extension)z5Stored filename (default: the source file's basename)z6uploaded_by label (default: $HERMES_PROFILE or 'user')zAttach a local file to a taskÚattachmentszList a task's attachmentsz	attach-rmÚattachment_id)r^   zDelete an attachment by idÚcompletez;One or more task ids (only --result applies to all of them)z--resultzResult summaryzSStructured handoff summary for downstream tasks. Falls back to --result if omitted.zlJSON dict of structured facts (e.g. '{"changed_files": [...], "tests_run": 12}'). Stored on the closing run.z--forcezvOverride the live-claim guard: complete a running, claimed task even without owning its run (closes the worker's run).zMark one or more tasks doneÚeditz--titlezReplace the task titlezReplace the task bodyzReplace the task priorityz+Backfilled task result text for a done taskz@Edit task fields or recovery fields on an already-completed taskÚblockÚreasonÚ*z#Reason (also appended as a comment)z--kinda2  Typed block reason. 'dependency' waits in todo (auto-promoted when parents finish, no human); 'needs_input'/'capability' go to blocked for a human; 'transient' marks a maybe-flaky failure. Repeated same-kind re-blocks after unblock route the task to triage to break unblock loops. Omit for a generic block.zMark one or more tasks blockedÚschedulez/Reason/timing note (also appended as a comment)zFPark one or more tasks in Scheduled (waiting on time, not human input)Úunblocku[   Optional reason/note â€” recorded as a comment before unblocking. Quote multi-word reasons.zJReturn blocked/scheduled tasks to ready, or todo while parents remain openzrequest-reviewuG   What was implemented and how it was verified â€” shown to the reviewer.z
--reviewerzEOptional reviewer profile; reassigns the task before review dispatch.z3JSON object with structured reviewer handoff facts.z~Override the live-claim guard: move a running, claimed task to review even without owning its run (clears the worker's claim).uN   Move a task to 'review' (implementation done, awaiting review) â€” NOT a blockzrequest-changesz*Concrete changes required before re-reviewzAReviewer verdict: return the active review run to its implementerzreopen-reviewuZ   Optional reason/note â€” recorded as a comment before reopening. Quote multi-word reasons.zESend one or more review tasks back for changes (review -> ready/todo)Úpromotez4Audit-trail reason (recorded on the task_events row)z	--dry-runz-Validate the promotion without mutating stater*   Újsonz!Emit machine-readable JSON resultrT   zEManually move one or more todo/blocked tasks to ready (recovery path)z"Task ids to archive (default mode)z--rmÚ	purge_idsz;Permanently delete already-archived task ids from the board)r!   rQ   r0   zArchive one or more tasksÚtailz
--intervalg      ð?)r^   r_   zFollow a task's event streamÚdispatchz<Don't actually spawn processes; just print what would happenz--maxzCap number of spawns this passz--failure-limitzrAuto-block a task after this many consecutive non-success attempts (spawn_failed, timed_out, or crashed; default: Ú)z@One dispatcher pass: reclaim stale, promote ready, spawn workersÚdaemong      N@z,Seconds between dispatch ticks (default: 60)zCap number of spawns per tickz	--pidfilez,Write the daemon's PID to this file on startz	--verbosez-vz!Log each tick's outcome to stdoutuN   DEPRECATED â€” dispatcher now runs in the gateway. Use `hermes gateway start`.Úwatchz3Only show events for tasks assigned to this profilez*Only show events from tasks in this tenantz--kindsz[Comma-separated event kinds to include (e.g. 'completed,blocked,gave_up,crashed,timed_out')g      à?z'Poll interval in seconds (default: 0.5)z8Live-stream task_events to the terminal (Ctrl+C to exit)Ústatsz3Per-status + per-assignee counts + oldest-ready ageznotify-subscribez	--user-idz--user-id-altz--chat-typez±Originating source chat_type, recorded so the active-wake delivery modes resolve the operator's real session. Omit to leave an existing sub unchanged (new subs default to 'dm').z--parent-chat-idzQParent channel ID for a thread or forum post, used for multiplex profile routing.z
--guild-idz5Discord guild ID, used for multiplex profile routing.z--notifier-profilezNProfile gateway that owns/delivers this subscription (default: active profile)z--delivery-modea  How the kanban-notifier reacts to terminal events for this subscription: 'notify' (passive message only; default), 'notify+wake' (message AND wake the destination gateway agent so it reads the full board context and replies in its own voice), or 'wake' (wake the agent only, no passive message). Omit to leave an existing subscription's mode unchanged (new subs default to 'notify').ziSubscribe a gateway source to a task's terminal events (used by /kanban subscribe in the gateway adapter)znotify-listz>List notification subscriptions (optionally for a single task)znotify-unsubscribez)Remove a gateway subscription from a taskÚlogz--tailzOnly print the last N byteszAPrint the worker log for a task (from <kanban-root>/kanban/logs/)Úrunszfilter runs by task_runs columnzUShow attempt history for a task (one row per run: profile, outcome, elapsed, summary)Ú	heartbeatz--notez3Optional short note attached to the heartbeat eventzBEmit a heartbeat event for a running task (worker liveness signal)Ú	assigneeszoList known profiles + per-profile task counts (union of ~/.hermes/profiles/ and current assignees on the board)Úcontextz[Print the full context a worker sees for a task (title + body + parent results + comments).ÚspecifyÚSpecifyÚ	specifierzžFlesh out a triage-column task into a concrete spec (title + body) and promote it to todo. Uses the auxiliary LLM configured under auxiliary.triage_specifier.Ú	decomposeÚ	DecomposeÚ
decomposerzèDecompose a triage-column task into a graph of child tasks routed to specialist profiles by description. Falls back to specify-style single-task promotion when the task doesn't benefit from fan-out. Uses auxiliary.kanban_decomposer.Úgcz--event-retention-dayszQDelete task_events older than N days for terminal tasks (default: 30; 0 disables)z--log-retention-dayszCDelete worker log files older than N days (default: 30; 0 disables)zBGarbage-collect archived-task workspaces, old events, and old logsÚrepairzEmit the repair report as JSONz?Check kanban.db integrity and auto-repair index-only corruptionu  Runs PRAGMA integrity_check on the board's DB and reports the result. When the failure consists only of index-scoped errors ('wrong # of entries in index <name>' / 'row N missing from index <name>'), the corrupt file is quarantined to a .corrupt.<hash>.bak sibling first and the damaged indexes are rebuilt with REINDEX â€” the same narrow auto-repair the connect-time guard applies. Any other corruption class is reported and left untouched (fail-closed). Exits 0 when the DB is healthy or was repaired, non-zero when it is still corrupt.c               ó    € V ^8„  d   QhRRRR/# )r   Úparent_subparsersr   r   zargparse.ArgumentParserr
   )r   s   "r   r   r   É  s   € ÷ ñ Ð$>ð ÐCZñ r   c                ó¼   € V P                  RRRR7      pVP                  RRRRR	7       \        VP                  R
R7      \        4       VP                  VR7       V# )zEAttach the ``kanban`` subcommand tree; returns the ``kanban`` parser.Úkanbanz:Multi-profile collaboration board (tasks, links, comments)a  Durable SQLite-backed task board shared across Hermes profiles. Tasks are claimed atomically, can depend on other tasks, and are executed by a named profile in an isolated workspace. See https://hermes-agent.nousresearch.com/docs/user-guide/features/kanban.rp   z--boardNz<slug>z½Board slug to operate on. Defaults to the current board (set via `hermes kanban boards switch <slug>` or the HERMES_KANBAN_BOARD env var). Use `hermes kanban boards list` to see all boards.)r_   rE   r0   Úkanban_actionr    )Ú_kanban_parser)r"   r#   r$   r%   Ú_SPECSÚset_defaults)r¸   Úkanban_parsers   & r   Úbuild_parserrÀ   É  su   € à%×0Ñ0ØØIðað 1ó €Mð ×Ñ˜y°$Àð%?ð ô @ô
 �-×.Ñ.°OÐ.ÓDÄfÔMØ×Ñ¨mÐÔ<ØÐr   )r
   )ÚwarningÚerrorÚcritical)ÚdmÚgroupÚchannelÚthread)+Ú__doc__Ú
__future__r   r9   Ú
hermes_clir   Úkbr   Úkbdr   Úkbnr   r   r$   r.   r3   r=   rH   rW   r[   Ú_TASK_IDÚ	_TASK_IDSÚ_SLUGÚ_TENANTr6   Ú	_PRIORITYÚ_RECLAIM_REASONÚ_NOTIFY_TARGETÚ_STEP_HANDOFFÚ_BOARD_SPECSÚDEFAULT_FAILURE_LIMITÚsortedÚVALID_INITIAL_STATUSESÚVALID_STATUSESÚVALID_SORT_ORDERSÚkeysÚDEFAULT_CLAIM_TTL_SECONDSÚVALID_BLOCK_KINDSÚfloatÚSUPPRESSÚ_NOTIFY_DELIVERY_MODESr½   rÀ   r
   r   r   Ú<module>râ      s>  ðñõ #ã å &Ý 0Ý .õò4¨÷ 4ð 4õ
Dò5õ'õ	õõ	õlñ �	‹?€Ù� 3Ô'€	ÙˆV‹€Ù
ˆzÐ 2Ô
3€Ù� C°Ð9NÔO€	ÙÐSÓT€áˆ Ô%Ùˆ˜tÔ$ÙˆÓð€ñ 	ˆÐ[Ô\ÙˆÐaÔbð€ñ 	ˆÙ‹ÙˆW˜\Ð0MÔNðð ˆvÐ>ô@ñ 	ˆÙˆVÐFÔGÙˆXÐZÔ[Ùˆ_Ð#9Ô:ÙˆXÐWÔXÙˆYÐTÔUÙˆZ Ð3^Ô_ÙÐ Ð'_Ô`ðð ˆwÐ1ô3ñ 	ˆØÙˆZ ðTô	Uðð
 ˜(Ð#Ð*OôQñ 	ˆ�E�7 U GÐ2aÔbÙˆ˜)˜Ð+RÔSÙˆ�E™4 Ð-?Ô@ÐAØPôRáÐ	ØÙˆV˜3Ð%^Ô_ð!ð BôCñ 	ˆÙˆV˜3Ð%SÔTÙˆT�:Ð$MÔNÙÐ¨Ð;mÔnÙÐ lÐ9WÔXÙ‹ðð ;ð	ôñ 	ˆÙˆYÐ:Ô;ÙˆV˜)Ð*cÔdÙˆZ Ð3\Ô]Ù‹ð	ð
 4ð	Bô	ðQ2€ðjp
ÙˆÐ@ÔAðp
áˆ˜_¨lÐ;ØIð,ôðp
ñ 	ˆÙˆW˜<Ô(ÙˆXÐ3Ô4Ùˆ] Fð4ô	5ñ 	ˆ\Ð 8Ô9ÙˆZ °"Ð;XÔYÙˆ]ð]ô	^ñ 	ˆZÐOÔPÙˆ[ðEô	Fð 	ØÙˆZ Ø^ô	`áÐ ðHô	Iñ 	ˆ_ðAô	Bñ 	ˆ^ VÐ2dÔeÙˆY˜x°¸(ð;ô	<ñ 	ˆ_ 3°ðKð ×-Ñ-Ð.¨bð	2ô	3ñ 	ˆYÐ-ð^ô	_ñ 	ˆ\Ð 3ð3ô	4ñ 	Ð$¨jØuô	wáˆX˜l°ðQô	Rñ 	Ð c°3Ð=MØXô	ZáÐ©°×0IÑ0IÓ)JÐT]ðEô	Fñ 	Ð*Ô+ðy=ðz  ô{=!ðp
ñP 	ˆÙˆVÐ6Ô7ÙˆZ °"Ð>[Ø5ô	7áˆ\ DÐ/AÔBÙˆ_ tÐ2NÔOØØÙˆ^Ð":Ô;ÙÐ Ð'DÔEÙÐ*Ô+ðð ]ô^ðQp
ñh 	ˆÙˆX˜lÐ1XÔYÙˆ\ÓÙˆZ¡¨×(9Ñ(9Ó!:Ô;ÙˆZÓÙˆ[Ønô	páˆ\ ,Ð5MÔNÙ‹ÙˆX™v b×&:Ñ&:×&?Ñ&?Ó&AÓBØCô	EáÐ%¨tÐ:lÔmÙˆ\Ð 2¸EØ@ô	Bðð ˆv˜Lô*ðip
ñF 	ˆ�(™J›LÐe©?Ð;cÓ+dÐeØ2ô4ðGp
ñJ 	ˆ�H™d 9Ð3YÔZÐ[Ø)ô+ðKp
ñN 	ˆØÙˆW˜CÐ&dÔeÙˆ\ðIô	Jðð `ôaðOp
ñ\ 	ˆ�X˜Ð/Ð6hÔið]p
ñ^ 	ˆØÙˆYÐGÔHÙˆ[ Ø]ô	_àðð RôSð_p
ñl 	ˆÙˆ\Ó#CØCô	EáˆXÐCÔDÙÐSÔTð	ð
 ˆxÐLôNðmp
ñx 	ˆ‘$�{Ó#¡T¨*Ó%5Ð6Ð=]Ô^ðyp
ñz 	ˆ‘D˜Ó%¡t¨JÓ'7Ð8Ð?bÔcð{p
ñ| 	ˆØÙˆW˜3¨×(DÑ(DÐKpÔqðð MôNð}p
ñD 	ˆØÙˆV˜3 ^Ô4Ù‰ZÑPÔQÙ‰[˜sÑ)_Õ`ð	ñ
 ô ðEp
ñP 	‰ØÙˆVÑ<Ô=ÙÑÑ$ZÔ[ÙˆXÑSÔTÙ‰ZÑVÔWðñ ,ô-ðQp
ñ^ 	‰˜¡:£<Ð0Ñ7RÔSð_p
ñ` 	‰‘t™O°#Õ6Ð7Ñ>ZÔ[ðap
ñb 	‰ÙˆZ˜sÑ)fÔgÙ‰ZÑ.Ô/Ùˆ[Ùgô	iáˆ\ñDô	Eñ 	‰Y˜|ñKô	Lðñ *ô+ðcp
ñz 	‰ØÙ‰YÑ5Ô6ÙˆXÑ3Ô4Ùˆ\ Ñ*EÕFÙ‰ZÑKÔLðð 
ðñ OôPð{p
ñJ 	‰ØÙ‰X™SÑ'LÔMÙ‘'ÓÙ‰X™v b×&:Ñ&:Ó;ñMô	Nð	
ñ -ô
.ðKp
ñ` 	‰ØÙ‰X™SÑ'XÔYÙ‘*Óðñ Uô	Vðap
ñj 	‰ÙÑmÓnØðñ YôZðkp
ñr 	Ñ	ØÙˆ[ÑhÔiÙ‰\Ñ gÔhÙˆ\Ñ UÔVÙ‰Y˜|ñ\ô	]ðñ ]ô^ðsp
ñD 	Ñ	˜X¡t©H¸CÑFrÔ'sÐtÙQôSðEp
ñH 	‰ØÙÑlÓmðñ TôUðIp
ñP 	‰ØÙ‰X™SÑ']Ô^Ù‘)ÓÙ‰[ Ñ4cÔdÙ‰X™F¨<Ñ>aÕbðñ TôUðQp
ñ^ 	ˆÙˆZ™sÑ)MÔNÙ‰V™+¨SÙOõ	Qðñ (ô	)ð_p
ñh 	‰�(™D¡°EÁ3ÕGÐHÑOmÔnðip
ñj 	‰Ù‰[ Ñ4rÔsÙ‰W˜3Ñ%EÕFÙÑ S°#×2KÑ2KñDØDG×D]ÑD]ÐC^Ñ^_ðaô	bñ 	‹ðñ OôPðkp
ñz 	‰Ù‰\ ©tÑ:hÔiÙ‰W˜3Ñ%DÕEÙÑ S°#×2KÑ2KÕLÙ‰[ÑMÔNÙ‰[™$ |Ñ:]Ô^ñ 	‰Y˜|°(×2CÑ2CÔDð	ñ ]ô	^ð{p
ñN 	‰Ùˆ\Ñ UÔVÙˆZÑJÔKÙ‰YÙoô	qá‰\ ©sÑ9bÔcðñ GôHðOp
ñ\ 	‰‘:“<�.Ñ'\Ô]ð]p
ñ^ 	Ñ	Øðà	ðñ 	‰[Óðñ 	‰_Óð	ñ
 	‰]Ñ$HñGô	Hðñ 	ÑÙeô	gðñ 	‰\ÙIô	Kðñ 	Ñ!Ùbô	dðñ  	Ñ¨×(BÑ(Bñ[ô	\ð!ñ. xô/yð_p
ñN 	‰™˜i¨sÔ3±Z³\ÐBÙNôPðOp
ñR 	Ñ	 Ð:¨>Ð:ÑAlÔmðSp
ñT 	‰�™4¡¨sÑ9VÕWÐXÙQôSðUp
ñX 	‰�(™J›LÐ^©?Ñ;\Ó+]Ð^ÙeôgðYp
ñ\ 	‰ØÙ‰XÑQÔRðñ QôRð]p
ñd 	‰‘z“|�nÙôAðep
ñh 	‰�X�JÙkômðip
ñl 	‰Ñ&¡y±)¹[ÓIñ=ô>ðmp
ñt 	‰Ñ(©±kÁ<ÓPñPôQðup
ñ~ 	‰ÙÑ%Ð,<ÀbÙeô	gáÑ#Ð*:ÀBÙWô	Yðñ
 QôRðp
ñJ	 	‰‘JÑ$DÔEÐFÙOñCô
ðK	p
€÷f	ñ r   