@jentrix/cli 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jentrix
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # @jentrix/cli
2
+
3
+ `jentrix` is a command-line client for the [Jentrix](https://tm.jentrix.ai) MCP
4
+ surface. It turns every MCP tool into a shell command —
5
+ `jentrix task list --board <id> --json | jq …` — so agents and humans can drive
6
+ boards from bash with no bespoke API.
7
+
8
+ It is a **thin client over the same MCP endpoint** the agent platform uses, so
9
+ it inherits scopes, workspace pinning, rate limits, idempotency,
10
+ `expectedUpdatedAt` freshness, and agent attribution by construction.
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm install -g @jentrix/cli
16
+ # or: brew install jentrix-au/tap/jentrix
17
+ jentrix --version
18
+ ```
19
+
20
+ Requires Node ≥ 20. You can also run it without installing:
21
+ `npx @jentrix/cli --help` (`pnpm dlx @jentrix/cli --help`).
22
+
23
+ Install the bundled connected-session plugin with `jentrix plugin install`
24
+ (Claude Code default) or `jentrix plugin install codex`; both require the
25
+ matching `@jentrix/runner`, which the installer adds when missing.
26
+
27
+ For a local self-hosted workflow runner, install the matching
28
+ `@jentrix/runner` version, sign in to Claude Code and/or Codex yourself,
29
+ then run `jentrix runner doctor`,
30
+ `jentrix runner setup --runtime claude|codex|all`, and `jentrix runner up`.
31
+ Setup is preview-first; pass `--yes` only after reviewing the plan. Full details
32
+ and blocker recovery are in the [runner guide](https://tm.jentrix.ai/docs/cli#local-workflow-runner).
33
+
34
+ ## Quickstart
35
+
36
+ ```bash
37
+ export STACKS_TOKEN=tm_your_token # mint at /account/tokens
38
+ export STACKS_MCP_URL=https://tm.jentrix.ai/api/mcp # default; override for dev
39
+ jentrix whoami
40
+ jentrix task list --board <id> --json | jq .
41
+ ```
42
+
43
+ `STACKS_TOKEN` / `STACKS_MCP_URL` are the same env vars the reference agents
44
+ use, so one `.env` serves both. Humans can also `jentrix login` (OAuth in the
45
+ browser); agents should prefer a scoped `STACKS_TOKEN`.
46
+
47
+ ## Documentation
48
+
49
+ Full command reference, auth precedence, exit codes, and idempotency/conflict
50
+ recipes: **https://tm.jentrix.ai/docs/cli**
51
+
52
+ ## License
53
+
54
+ MIT © Jentrix
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "jentrix",
3
+ "description": "Jentrix connected-session plugin for Claude Code.",
4
+ "owner": {
5
+ "name": "Jentrix"
6
+ },
7
+ "plugins": [
8
+ {
9
+ "name": "jentrix",
10
+ "source": "./",
11
+ "description": "Bind a Claude Code session to a Jentrix project: /jentrix-connect, /jentrix-align, /jentrix-status, /jentrix-end over the Jentrix CLI, with trusted lifecycle hooks supplying the session id.",
12
+ "category": "productivity",
13
+ "keywords": ["jentrix", "sessions", "mcp", "agents", "jentrix"]
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "jentrix",
3
+ "description": "Connect this Claude Code session to a Jentrix project: /jentrix-connect binds the current session (trusted lifecycle hooks supply the session id), /jentrix-align runs the MVP alignment wizard, /jentrix-status and /jentrix-end wrap the same session operations. Business logic lives in the Jentrix CLI — removing this plugin leaves `jentrix session attach` as the universal fallback.",
4
+ "version": "0.4.0"
5
+ }
@@ -0,0 +1,113 @@
1
+ ---
2
+ description: Align this session to a Jentrix work layer (workspace → project → task → owner) with a server-confirmed alignment snapshot
3
+ allowed-tools: Bash(jentrix align:*), Bash(jentrix session:*)
4
+ ---
5
+
6
+ Run the Jentrix MVP alignment wizard for THIS session. The question set is
7
+ fixed — workspace, project, project name, work item, task title, owner,
8
+ confirmation — and every answer is a choice selection except `project_name`
9
+ and `task_title`, which are `kind: "freetext"`: the operator types them. You
10
+ present the questions; the operator decides. Do NOT invent extra questions,
11
+ and do NOT answer any question yourself.
12
+
13
+ 1. Run `jentrix align --questions --json` with the Bash tool. It prints the
14
+ detection summary (repo, branch, provider), `currentAlignment` (when the
15
+ session is already aligned), `preconditions` (the doctor's checks, run up
16
+ front), and the fixed `questions` array.
17
+ 2. If any precondition has status `"fail"` or `"warn"`, relay its `detail`
18
+ (and `fix`) to the operator BEFORE asking questions — a failure caught
19
+ here saves answering everything and then failing at submit.
20
+ 3. If `currentAlignment` is non-null: show it to the operator and ask —
21
+ using the native choice UI (AskUserQuestion) — whether to keep it or
22
+ re-align. Keep → relay the current snapshot and stop.
23
+ 4. For each question whose `status` is `"ask"`, present its `choices`
24
+ verbatim through the native choice UI (AskUserQuestion), preserving the
25
+ labels. If the question carries a `notice`, relay it to the operator
26
+ verbatim BEFORE the choices — it discloses a degraded list (e.g. repo
27
+ discovery unavailable, so the list is the whole workspace). The "Other…"
28
+ choice is the explicit free-text escape: when picked, let the operator
29
+ type the id/slug. A question whose `status` is `"skipped"` was resolved
30
+ by detection — tell the operator what was resolved (e.g. the workspace),
31
+ don't re-ask it.
32
+ 5. After the project answer, re-run
33
+ `jentrix align --questions --json --project <chosen>` to load the
34
+ work-item and owner choices, then continue asking. If the operator picked
35
+ "Create a new project from this repo", the NEXT question is
36
+ `project_name` (already in the payload, `kind: "freetext"`): relay its
37
+ `prompt` verbatim and collect the name as free text FROM THE OPERATOR —
38
+ never propose name options, never fill it in yourself. Then re-run
39
+ `jentrix align --questions --json --new-project "<name>"` — the work-item
40
+ and owner questions do not depend on an existing project.
41
+ 6. If the operator picked "New task", the NEXT question is `task_title`
42
+ (already in the payload, `kind: "freetext"`). Relay its `prompt` verbatim
43
+ and collect the title as free text FROM THE OPERATOR — never propose
44
+ title options, never fill it in yourself: it becomes the board-permanent
45
+ task title. Pass it as `--new-task "<title>"` on the next `--questions`
46
+ run and the final submit.
47
+ 7. The confirmation question's `prompt` embeds `disclosures` — every side
48
+ effect submitting will perform (project/board/task creation, repo link,
49
+ session host, capture mode) plus any notices. Present that prompt
50
+ VERBATIM and IN FULL through the choice UI; never summarize, trim, or
51
+ reorder the disclosure lines. Confirm means the operator approved
52
+ exactly that list.
53
+ 8. On Confirm, submit exactly once:
54
+ `jentrix align --json --yes (--project <id> | --new-project "<name>") (--task <taskId> | --new-task "<title>" | --session-level) [--owner <userId>]`
55
+ 9. Echo the returned `alignment` snapshot VERBATIM to the operator — it is
56
+ the server-confirmed "we agree" record. Then continue the session's work.
57
+ 10. Move the aligned task to the board's working column when you start work
58
+ on it. Read the real columns with `jentrix column list --board <boardId>`
59
+ and move with
60
+ `jentrix task move --task <taskId> --to-column-id <columnId>`. Use only
61
+ the columns the board actually has — never invent a status. `/jentrix-end`
62
+ moves it to a terminal column when the work is genuinely finished. A
63
+ board that never moves is a board that lies about what is in flight.
64
+ 11. If align wrote `./.mcp.json`, relay that line too: MCP servers load at
65
+ session start, so the tools in THIS session still point wherever they
66
+ pointed before. Tell the operator to reconnect the MCP server (or start a
67
+ new session) before relying on `list_workspaces` / `create_task` / any
68
+ other Jentrix MCP tool — otherwise those calls land in a different
69
+ deployment, silently.
70
+
71
+ The written server carries **no credential and no `Authorization`
72
+ header**: it authenticates with the deployment over OAuth. So the next
73
+ session needs the operator to approve the consent screen once — in Claude
74
+ Code, `/mcp` → `jentrix` → Authenticate — and nothing needs exporting. Say
75
+ that plainly; a session that has not authorized simply has no
76
+ `mcp__jentrix__*` tools, which looks identical to the endpoint being
77
+ wrong. If align reports removing an existing `Authorization` header, relay
78
+ that too: it is the repair (a header switches OAuth discovery off), and
79
+ `jentrix align --pat` puts it back for a headless checkout.
80
+
81
+ Notes for you (the assistant):
82
+
83
+ - Do NOT invent a `--provider-session` value. The CLI reads the current
84
+ session id from the TRUSTED lifecycle-hook context this plugin records, and
85
+ a model-authored id is never acceptable.
86
+ There is now ONE defined repair path, and only one. The `--questions`
87
+ payload carries a `session` precondition and the confirmation card names
88
+ the provider session id and the transcript the host will watch. When that
89
+ precondition is `warn` — typically "a NEWER live Claude session <id> was
90
+ recorded in <dir>" — **surface it to the operator before asking anything
91
+ else**, together with the `fix` string the precondition carries. If the
92
+ operator confirms the named session is the one you are running in, re-run
93
+ with the id **exactly as the precondition printed it** (it came from the
94
+ trusted hook file, not from you) plus `--transcript-path` if the payload
95
+ names one. Never proceed silently past that warning: on 2026-08-11 an
96
+ alignment bound a 35-hour-dead session this way and lost the entire run's
97
+ token telemetry at exit 0.
98
+ - The confirmation card now names the binding (`bind provider session …`,
99
+ `the session host will watch …`) and any `./.mcp.json` write. Those are
100
+ side effects like any other — present them verbatim with the rest.
101
+ - TRACE capture stays OFF for aligned sessions by default (typed artifacts
102
+ only). Only pass `--capture` when the operator explicitly asks for full
103
+ transcript capture — and the confirmation disclosures will then say
104
+ capture is ON; make sure the operator saw that before confirming.
105
+ - When talking to the operator, use the choice LABELS, never internal ids
106
+ like `__create__` or `__new__` — those are flag values, not words a human
107
+ should be asked to type.
108
+ - Re-aligning to the SAME project converges on the existing session (safe to
109
+ repeat). Aligning this provider session to a DIFFERENT project requires
110
+ ending the current session first (`jentrix session end`) — a `preconditions`
111
+ entry warns about this up front, and the refusal names the same fix.
112
+ - If a command fails, show its error verbatim — it names the blocker and the
113
+ fallback. Do not improvise a workaround.
@@ -0,0 +1,56 @@
1
+ ---
2
+ description: Write a distilled state-of-play for this session and push it as a typed Jentrix artifact
3
+ allowed-tools: Bash(jentrix push:*), Bash(jentrix session:*), Bash(jentrix task:*)
4
+ ---
5
+
6
+ Write down what this session currently knows, and push it.
7
+
8
+ This is the half a hook provably cannot do. A hook is a shell command with a
9
+ small JSON payload on stdin and no model turn: it can move bytes and nothing
10
+ else. Distilling 400k tokens into the six facts that mattered requires a model
11
+ turn. That is this command.
12
+
13
+ It matters most on a **capture-off** session, which is the MVP default. There
14
+ the `PreCompact` hook records only that a compaction happened — it does not
15
+ preserve the transcript, because `capture: "off"` means the operator asked for
16
+ typed artifacts and no transcript. The bytes stay on the local machine and
17
+ nothing carries their meaning into Jentrix unless you write it. So on a
18
+ capture-off session this command is not a nicety; it is the only thing that
19
+ survives the compaction.
20
+
21
+ Run it at real boundaries: before a `/compact`, after a decision that changes
22
+ the plan, when a long investigation resolves, or before handing the work over.
23
+
24
+ ## Steps
25
+
26
+ 1. Write the checkpoint. Cover only what a fresh session would need and could
27
+ not re-derive cheaply:
28
+ - **Decisions taken** — and, for each, the reason, because the reason is
29
+ what gets lost first.
30
+ - **What actually changed** — files, records, ids. Concrete, not "made
31
+ progress".
32
+ - **Open questions and dead ends** — including what was tried and did not
33
+ work, which is the most expensive thing to rediscover.
34
+ - **Next step** — the single thing to do next.
35
+ 2. Do not summarize the transcript. Do not restate the prompt. Do not include
36
+ anything you have not verified this session — a checkpoint that carries a
37
+ guess as a fact poisons every session that reads it.
38
+ 3. Push it:
39
+ - `jentrix push learning --title "Checkpoint — <topic>"` when it is durable
40
+ knowledge worth carrying past this project;
41
+ - `jentrix push report --title "Checkpoint — <topic>"` when it is the
42
+ state of THIS work.
43
+ Content goes on stdin.
44
+ 4. Relay the returned `artifactId` to the operator, and say which kind you
45
+ chose and why.
46
+ 5. If the session's task status no longer matches reality, fix it now:
47
+ `jentrix column list --board <boardId>` then
48
+ `jentrix task move --task <id> --to-column-id <id>`. Only the columns the
49
+ board actually has.
50
+
51
+ Note for the operator: this records the distillation. On a session aligned
52
+ with `--capture`, the raw pre-compaction range is preserved separately and
53
+ automatically by the `PreCompact` hook, so the bytes survive even when this
54
+ command is never run — but only the bytes. On a capture-off session (the MVP
55
+ default) the hook records the boundary and nothing else, so this command is
56
+ the only thing that carries the work forward.
@@ -0,0 +1,21 @@
1
+ ---
2
+ description: Connect this Claude Code session to a Jentrix project (session anchor + capture)
3
+ allowed-tools: Bash(jentrix session:*)
4
+ ---
5
+
6
+ Run this exact command with the Bash tool and relay its output to the user:
7
+
8
+ ```
9
+ jentrix session attach --provider claude --watch
10
+ ```
11
+
12
+ Notes for you (the assistant):
13
+
14
+ - Do NOT pass `--provider-session` yourself — the CLI reads the current
15
+ session id and transcript path from the TRUSTED lifecycle-hook context this
16
+ plugin's hooks recorded; model-authored session ids are never accepted.
17
+ - If the user named a project (e.g. `/jentrix-connect atlas`), append
18
+ `--project <that value>`.
19
+ - If the command fails, show its error verbatim — it names the fallback
20
+ (`jentrix session attach ...`) and the blocker code. Do not improvise a
21
+ workaround.
@@ -0,0 +1,62 @@
1
+ ---
2
+ description: End the connected Jentrix session (pushes the final artifacts, verifies capture, stores the RUN_SUMMARY)
3
+ allowed-tools: Bash(jentrix session:*), Bash(jentrix push:*)
4
+ ---
5
+
6
+ End the connected Jentrix session honestly. For an ALIGNED session (the MVP
7
+ pipeline), the typed artifacts ARE the record — push them before closing:
8
+
9
+ 1. If this session is aligned (`jentrix session status` shows the alignment,
10
+ or `jentrix align --questions --json` reports `currentAlignment`):
11
+ - Push the final report: write a concise session report (what was done,
12
+ what changed, what's next) and run
13
+ `jentrix push report --title "<short title>"` with the content on stdin.
14
+ - Push any decisions made this session that were not already pushed:
15
+ `jentrix push decision …` (one per decision).
16
+ - Push any durable lessons: `jentrix push learning …`.
17
+ - If the session produced a diff/patch worth recording, push it:
18
+ `git diff | jentrix push diff --title "<what it changes>"`.
19
+ Ask the operator (native choice UI) before pushing anything they might
20
+ not want recorded; never invent content — summarize what actually
21
+ happened.
22
+ 2. Move the aligned task to the board's **"In review"** column when the work
23
+ is finished — not to a terminal one. Acceptance is a human's to record
24
+ (Accept / Return on the task panel writes who decided, when, and on which
25
+ artifacts), and an agent grading its own work as Done is the cheapest habit
26
+ to break now and the most expensive later. Read the board's real columns
27
+ first — `jentrix column list --board <boardId>` — and move with
28
+ `jentrix task move --task <taskId> --to-column-id <columnId>`. Use the
29
+ column names the board has; never invent a status it does not carry, and
30
+ never move a card whose work is unfinished. If the board has no in-review
31
+ column, say so and leave the card where it is rather than moving it to a
32
+ terminal column the operator never got to judge. If it is unclear whether
33
+ the task is done, ask the operator through the native choice UI. Pushing a
34
+ `findings` or `report` artifact is not by itself proof the task is done.
35
+ 3. **Offer a one-line project outcome.** A project that never changes state
36
+ cannot answer the only question a goal exists to answer — are we closer.
37
+ Ask the operator, through the native choice UI, for one sentence on what
38
+ this session moved, and record it on the project's goal statement: read the
39
+ project first — `jentrix tool get_project --args '{"projectId":"<id>"}'` —
40
+ then append a dated line to its `goalStatement` (never overwrite what is
41
+ there):
42
+ `jentrix tool update_project --args '{"projectId":"<id>","goalStatement":"<existing text>\n<YYYY-MM-DD>: <the operator's sentence>","expectedUpdatedAt":"<updatedAt from the read>"}'`.
43
+ Offer it; never write a sentence they did not say, and never block the
44
+ close on it — a declined nudge is a normal outcome.
45
+ 4. Run `jentrix session end <session-id>` with the Bash tool (ask the user or
46
+ run `jentrix session status` first when the id is unknown) and relay the
47
+ output. Telemetry is recorded by the session host's attested path — never
48
+ report token numbers yourself.
49
+ 5. **Relay the closing telemetry line verbatim.** `session end` prints a
50
+ `Telemetry:` line, and on stderr it may print `NO TOKEN TELEMETRY: …`.
51
+ Exit 0 does NOT mean telemetry was recorded — on 2026-08-11 a real session
52
+ closed at exit 0 having recorded none, and nothing said so. If the warning
53
+ appears, show it in full: it names the cause (usually the host was watching
54
+ another session's transcript) and the repair for the next session
55
+ (`jentrix align --provider-session <id> --transcript-path <file>`). Do not
56
+ restate the numbers as your own claim — quote the line.
57
+ 6. The session is SEALED once ended: `jentrix push` refuses it
58
+ (`SESSION_NOT_ACTIVE`), by design. Anything learned at the close —
59
+ including the telemetry line above — belongs in the report you pushed in
60
+ step 1, or in the next session. Do not try to reopen it.
61
+ 7. Ending the Jentrix session does NOT terminate this Claude Code session —
62
+ say so if the user seems to expect it.
@@ -0,0 +1,66 @@
1
+ ---
2
+ description: Turn the opening prompt into a goal and a small set of Jentrix tasks, confirmed by the operator before anything is created
3
+ allowed-tools: Bash(jentrix task:*), Bash(jentrix column:*), Bash(jentrix board:*), Bash(jentrix session:*), Bash(jentrix push:*)
4
+ ---
5
+
6
+ Decompose the work the operator just asked for into a goal and a short task
7
+ list, **confirm both before creating anything**, then create them.
8
+
9
+ `/jentrix-align` binds at most ONE task and is scrupulous that its title is the
10
+ operator's own words. Every task after that used to be agent-invented with no
11
+ confirmation step at all — the principle was right and its coverage was one
12
+ task deep. This command extends the same rule to the rest.
13
+
14
+ ## Rules that are not negotiable
15
+
16
+ - **You never create a board-permanent title the operator has not approved.**
17
+ Propose; do not decide. The operator edits or replaces any title before it
18
+ is created.
19
+ - **Propose few tasks.** A task is a commitment, not a restatement of the
20
+ prompt. Two or three real units of work beat six that mirror your plan's
21
+ headings. If the prompt is one unit of work, say so and create nothing.
22
+ - **The prompt is provenance, the tasks are commitments.** Save the prompt
23
+ once, verbatim, as a `prompt` artifact; do not transcribe it into task
24
+ titles. The approved goal is its own `goal` artifact — the inputs are typed
25
+ records the RUN_SUMMARY's Intent cites, not prose folded into a plan.
26
+ - Read the board's real columns before placing anything. Never invent a
27
+ column or a status.
28
+
29
+ ## Steps
30
+
31
+ 1. Confirm the session is aligned: `jentrix session status`. If it is not, stop
32
+ and point the operator at `/jentrix-align` — there is no project or board to
33
+ plan into, and creating tasks somewhere else is worse than creating none.
34
+ 2. Read the board's columns:
35
+ `jentrix column list --board <boardId> --json`. The first column is the
36
+ normal home for new work unless the operator says otherwise.
37
+ 3. Draft, in your own analysis and NOT yet on the board:
38
+ - **one goal sentence** — what "done" means for this work, and how it will
39
+ be judged;
40
+ - **1–4 task titles**, each a unit of work someone could pick up alone.
41
+ 4. Present them for confirmation through the native choice UI
42
+ (AskUserQuestion), one decision at a time, showing your proposed wording
43
+ verbatim. Note that the choice UI has no free-text-only mode — it requires
44
+ preset options — so "Other…" is the intended escape for the operator to
45
+ type their own wording, and you must say so. Their words win; when they
46
+ type a replacement, use it exactly, do not "clean it up".
47
+ 5. Create only what was approved:
48
+ - `jentrix task create --column-id <columnId> --title "<approved title>" --description "<one-line scope>" --idempotency-key "<stable-key>" --json`
49
+ - record the goal on the aligned task (the card keeps its at-a-glance
50
+ line; the artifact below is the record):
51
+ `jentrix task update --task <alignedTaskId> --description "GOAL: <approved goal> …"`
52
+ - push the opening prompt as provenance, VERBATIM:
53
+ `jentrix push prompt --title "Opening prompt"` with the operator's prompt
54
+ on stdin — never a paraphrase;
55
+ - push the approved goal:
56
+ `jentrix push goal --title "Goal"` with the approved goal sentence on
57
+ stdin;
58
+ - when a PRD exists for this work, push it too:
59
+ `jentrix push prd --title "<PRD title>"` with the PRD body on stdin.
60
+ 6. Report the created ids and keys back to the operator, and say which task
61
+ you are starting on. Move that one into the working column
62
+ (`jentrix task move --task <id> --to-column-id <id>`).
63
+
64
+ If the operator declines the plan, create nothing and say so plainly. An
65
+ un-decomposed prompt is a normal outcome; a board full of speculative tasks is
66
+ not.
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: Show the connected Jentrix session for this work (capture health included)
3
+ allowed-tools: Bash(jentrix session:*)
4
+ ---
5
+
6
+ Run `jentrix session status` with the Bash tool (append the session id if the
7
+ user gave one) and relay the output verbatim, including any capture-pending
8
+ warning.
@@ -0,0 +1,57 @@
1
+ {
2
+ "description": "M20.1 \u00a715.1 \u2014 lifecycle bridge: hooks append their structured stdin payload (session_id, transcript_path, cwd) to the local session context file via `stacks-runner session-hook`. argv carries only the directory and event name \u2014 never credentials or transcript content. PreCompact/PostCompact additionally run `jentrix session snapshot`, which FOLLOWS THE CAPTURE CONSENT: capture ON preserves the transcript range about to leave the model's context; capture OFF (the MVP default) records the compaction boundary and NO content, because `capture: \"off\"` was disclosed as typed artifacts only, no transcript. Preservation is never distillation \u2014 a hook has no model turn; /jentrix-checkpoint does that. Compaction-path hooks carry an explicit 10s timeout (STA-51): they run inside the operator's /compact, and a slow artifact push must delay it by seconds, not the 60s default.",
3
+ "hooks": {
4
+ "SessionStart": [
5
+ {
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/claude-sessions\" --event SessionStart"
10
+ }
11
+ ]
12
+ }
13
+ ],
14
+ "SessionEnd": [
15
+ {
16
+ "hooks": [
17
+ {
18
+ "type": "command",
19
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/claude-sessions\" --event SessionEnd"
20
+ }
21
+ ]
22
+ }
23
+ ],
24
+ "PreCompact": [
25
+ {
26
+ "hooks": [
27
+ {
28
+ "type": "command",
29
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/claude-sessions\" --event PreCompact",
30
+ "timeout": 10
31
+ },
32
+ {
33
+ "type": "command",
34
+ "command": "jentrix session snapshot --event PreCompact",
35
+ "timeout": 10
36
+ }
37
+ ]
38
+ }
39
+ ],
40
+ "PostCompact": [
41
+ {
42
+ "hooks": [
43
+ {
44
+ "type": "command",
45
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/claude-sessions\" --event PostCompact",
46
+ "timeout": 10
47
+ },
48
+ {
49
+ "type": "command",
50
+ "command": "jentrix session snapshot --event PostCompact",
51
+ "timeout": 10
52
+ }
53
+ ]
54
+ }
55
+ ]
56
+ }
57
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "jentrix",
3
+ "interface": {
4
+ "displayName": "Jentrix"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "jentrix",
9
+ "source": {
10
+ "source": "local",
11
+ "path": "./plugins/jentrix"
12
+ },
13
+ "policy": {
14
+ "installation": "AVAILABLE",
15
+ "authentication": "ON_INSTALL"
16
+ },
17
+ "category": "Productivity"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "jentrix",
3
+ "version": "0.1.0",
4
+ "description": "Connect Codex tasks to Jentrix projects with trusted lifecycle hooks, alignment, checkpoints, and honest session capture.",
5
+ "author": {
6
+ "name": "Jentrix",
7
+ "url": "https://github.com/jentrix-au"
8
+ },
9
+ "homepage": "https://stacks-mvp.vercel.app/docs",
10
+ "repository": "https://github.com/jentrix-au/task-manager",
11
+ "license": "MIT",
12
+ "keywords": ["jentrix", "sessions", "task-management", "agents"],
13
+ "skills": "./skills/",
14
+ "interface": {
15
+ "displayName": "Jentrix",
16
+ "shortDescription": "Connect this Codex task to Jentrix.",
17
+ "longDescription": "Align a Codex task to a Jentrix project and task, preserve typed checkpoints, and capture supported lifecycle evidence through trusted hooks.",
18
+ "developerName": "Jentrix",
19
+ "category": "Productivity",
20
+ "capabilities": ["Interactive", "Write"],
21
+ "defaultPrompt": [
22
+ "Connect this Codex task to my Jentrix project.",
23
+ "Align this work and create a confirmed task plan."
24
+ ]
25
+ }
26
+ }
@@ -0,0 +1,87 @@
1
+ {
2
+ "description": "Trusted Codex lifecycle bridge. Hook payloads are appended locally; compact hooks also ask the Jentrix CLI to preserve the approved capture boundary.",
3
+ "hooks": {
4
+ "SessionStart": [
5
+ {
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/codex-sessions\" --event SessionStart"
10
+ }
11
+ ]
12
+ }
13
+ ],
14
+ "UserPromptSubmit": [
15
+ {
16
+ "hooks": [
17
+ {
18
+ "type": "command",
19
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/codex-sessions\" --event UserPromptSubmit"
20
+ }
21
+ ]
22
+ }
23
+ ],
24
+ "PostToolUse": [
25
+ {
26
+ "hooks": [
27
+ {
28
+ "type": "command",
29
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/codex-sessions\" --event PostToolUse"
30
+ }
31
+ ]
32
+ }
33
+ ],
34
+ "Stop": [
35
+ {
36
+ "hooks": [
37
+ {
38
+ "type": "command",
39
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/codex-sessions\" --event Stop"
40
+ }
41
+ ]
42
+ }
43
+ ],
44
+ "PreCompact": [
45
+ {
46
+ "hooks": [
47
+ {
48
+ "type": "command",
49
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/codex-sessions\" --event PreCompact",
50
+ "timeout": 10
51
+ },
52
+ {
53
+ "type": "command",
54
+ "command": "jentrix session snapshot --event PreCompact",
55
+ "timeout": 10
56
+ }
57
+ ]
58
+ }
59
+ ],
60
+ "PostCompact": [
61
+ {
62
+ "hooks": [
63
+ {
64
+ "type": "command",
65
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/codex-sessions\" --event PostCompact",
66
+ "timeout": 10
67
+ },
68
+ {
69
+ "type": "command",
70
+ "command": "jentrix session snapshot --event PostCompact",
71
+ "timeout": 10
72
+ }
73
+ ]
74
+ }
75
+ ],
76
+ "SessionEnd": [
77
+ {
78
+ "hooks": [
79
+ {
80
+ "type": "command",
81
+ "command": "stacks-runner session-hook --dir \"$HOME/.config/stacks/codex-sessions\" --event SessionEnd"
82
+ }
83
+ ]
84
+ }
85
+ ]
86
+ }
87
+ }
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: stacks-align
3
+ description: Align the current Codex task to a Jentrix workspace, project, work item, and owner with an operator-confirmed server snapshot.
4
+ ---
5
+
6
+ # Align this Codex task
7
+
8
+ 1. Run `jentrix align --provider codex --questions --json`.
9
+ 2. Relay every failed or warning precondition before asking anything.
10
+ 3. If `currentAlignment` exists, ask whether to keep it or re-align. Keep means
11
+ show the current snapshot and stop.
12
+ 4. Present each `status:"ask"` question and its choices verbatim using Codex's
13
+ structured input UI when available, otherwise ask in chat. Never answer for the
14
+ operator. Preserve notices and the `Other…` free-text escape.
15
+ 5. Re-run `--questions --json` after project selection. Collect `project_name` and
16
+ `task_title` as free text from the operator; never propose permanent names.
17
+ 6. Present the confirmation prompt and every disclosure verbatim.
18
+ 7. On confirmation, submit exactly once with `jentrix align --provider codex --json
19
+ --yes` plus the confirmed project, task/session-level, owner, agent label, and
20
+ capture flags.
21
+ 8. Echo the returned server alignment snapshot verbatim. If `.mcp.json` changed,
22
+ explain that the current task must reconnect MCP or restart before using it.
23
+
24
+ TRACE capture is off by default. Pass `--capture` only when the operator explicitly
25
+ approved full hook-derived trace capture. Same-project re-alignment converges;
26
+ different-project re-alignment must be refused until `jentrix session end`.