recallium 1.2.6 → 2.0.8

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.
Files changed (100) hide show
  1. package/.claude-plugin/plugin.json +20 -0
  2. package/LICENSE +56 -0
  3. package/README.md +36 -52
  4. package/bin/manifest.json +8 -0
  5. package/bin/opencode-plugin-manifest.json +8 -0
  6. package/bin/recallium-hooks.cjs +111 -0
  7. package/bin/recallium-opencode-plugin.cjs +1 -0
  8. package/bin/skills/antigravity/capture/SKILL.md +61 -0
  9. package/bin/skills/antigravity/curate/SKILL.md +64 -0
  10. package/bin/skills/antigravity/decide/SKILL.md +62 -0
  11. package/bin/skills/antigravity/design/SKILL.md +61 -0
  12. package/bin/skills/antigravity/finish/SKILL.md +82 -0
  13. package/bin/skills/antigravity/handoff/SKILL.md +63 -0
  14. package/bin/skills/antigravity/investigate/SKILL.md +84 -0
  15. package/bin/skills/antigravity/project/SKILL.md +60 -0
  16. package/bin/skills/antigravity/recall/SKILL.md +107 -0
  17. package/bin/skills/antigravity/recallium-guidance/SKILL.md +141 -0
  18. package/bin/skills/antigravity/recallium-guidance/reference.md +117 -0
  19. package/bin/skills/antigravity/recallium-tools/SKILL.md +64 -0
  20. package/bin/skills/antigravity/resume/SKILL.md +64 -0
  21. package/bin/skills/antigravity/rule/SKILL.md +64 -0
  22. package/bin/skills/antigravity/start-work/SKILL.md +78 -0
  23. package/bin/skills/antigravity/team/SKILL.md +57 -0
  24. package/bin/skills/antigravity/verdict/SKILL.md +63 -0
  25. package/bin/skills/claude-code/capture/SKILL.md +61 -0
  26. package/bin/skills/claude-code/curate/SKILL.md +64 -0
  27. package/bin/skills/claude-code/decide/SKILL.md +62 -0
  28. package/bin/skills/claude-code/design/SKILL.md +61 -0
  29. package/bin/skills/claude-code/finish/SKILL.md +82 -0
  30. package/bin/skills/claude-code/handoff/SKILL.md +63 -0
  31. package/bin/skills/claude-code/investigate/SKILL.md +84 -0
  32. package/bin/skills/claude-code/project/SKILL.md +60 -0
  33. package/bin/skills/claude-code/recall/SKILL.md +107 -0
  34. package/bin/skills/claude-code/recallium-guidance/SKILL.md +141 -0
  35. package/bin/skills/claude-code/recallium-guidance/reference.md +117 -0
  36. package/bin/skills/claude-code/recallium-tools/SKILL.md +64 -0
  37. package/bin/skills/claude-code/resume/SKILL.md +64 -0
  38. package/bin/skills/claude-code/rule/SKILL.md +64 -0
  39. package/bin/skills/claude-code/start-work/SKILL.md +78 -0
  40. package/bin/skills/claude-code/team/SKILL.md +57 -0
  41. package/bin/skills/claude-code/verdict/SKILL.md +63 -0
  42. package/bin/skills/codex/capture/SKILL.md +61 -0
  43. package/bin/skills/codex/curate/SKILL.md +64 -0
  44. package/bin/skills/codex/decide/SKILL.md +62 -0
  45. package/bin/skills/codex/design/SKILL.md +61 -0
  46. package/bin/skills/codex/finish/SKILL.md +82 -0
  47. package/bin/skills/codex/handoff/SKILL.md +63 -0
  48. package/bin/skills/codex/investigate/SKILL.md +84 -0
  49. package/bin/skills/codex/project/SKILL.md +60 -0
  50. package/bin/skills/codex/recall/SKILL.md +107 -0
  51. package/bin/skills/codex/recallium-guidance/SKILL.md +141 -0
  52. package/bin/skills/codex/recallium-guidance/reference.md +117 -0
  53. package/bin/skills/codex/recallium-tools/SKILL.md +64 -0
  54. package/bin/skills/codex/resume/SKILL.md +64 -0
  55. package/bin/skills/codex/rule/SKILL.md +64 -0
  56. package/bin/skills/codex/start-work/SKILL.md +78 -0
  57. package/bin/skills/codex/team/SKILL.md +57 -0
  58. package/bin/skills/codex/verdict/SKILL.md +63 -0
  59. package/bin/skills/cursor/capture/SKILL.md +61 -0
  60. package/bin/skills/cursor/curate/SKILL.md +64 -0
  61. package/bin/skills/cursor/decide/SKILL.md +62 -0
  62. package/bin/skills/cursor/design/SKILL.md +61 -0
  63. package/bin/skills/cursor/finish/SKILL.md +82 -0
  64. package/bin/skills/cursor/handoff/SKILL.md +63 -0
  65. package/bin/skills/cursor/investigate/SKILL.md +84 -0
  66. package/bin/skills/cursor/project/SKILL.md +60 -0
  67. package/bin/skills/cursor/recall/SKILL.md +107 -0
  68. package/bin/skills/cursor/recallium-guidance/SKILL.md +141 -0
  69. package/bin/skills/cursor/recallium-guidance/reference.md +117 -0
  70. package/bin/skills/cursor/recallium-tools/SKILL.md +64 -0
  71. package/bin/skills/cursor/resume/SKILL.md +64 -0
  72. package/bin/skills/cursor/rule/SKILL.md +64 -0
  73. package/bin/skills/cursor/start-work/SKILL.md +78 -0
  74. package/bin/skills/cursor/team/SKILL.md +57 -0
  75. package/bin/skills/cursor/verdict/SKILL.md +63 -0
  76. package/commands/doctor.md +15 -0
  77. package/commands/login.md +17 -0
  78. package/commands/status.md +11 -0
  79. package/hooks/hooks.json +88 -0
  80. package/package.json +26 -29
  81. package/plugin-manifest.json +128 -0
  82. package/skills/capture/SKILL.md +61 -0
  83. package/skills/curate/SKILL.md +64 -0
  84. package/skills/decide/SKILL.md +62 -0
  85. package/skills/design/SKILL.md +61 -0
  86. package/skills/finish/SKILL.md +82 -0
  87. package/skills/handoff/SKILL.md +63 -0
  88. package/skills/investigate/SKILL.md +84 -0
  89. package/skills/project/SKILL.md +60 -0
  90. package/skills/recall/SKILL.md +107 -0
  91. package/skills/recallium-guidance/SKILL.md +141 -0
  92. package/skills/recallium-guidance/reference.md +117 -0
  93. package/skills/recallium-tools/SKILL.md +64 -0
  94. package/skills/resume/SKILL.md +64 -0
  95. package/skills/rule/SKILL.md +64 -0
  96. package/skills/start-work/SKILL.md +78 -0
  97. package/skills/team/SKILL.md +57 -0
  98. package/skills/verdict/SKILL.md +63 -0
  99. package/bin/recallium +0 -2
  100. package/src/index.js +0 -179
@@ -0,0 +1,117 @@
1
+ # Recallium reference
2
+
3
+ Shapes, not rules. `SKILL.md` beside this file is the rulebook and carries the call shape needed to obey each rule it states; this file carries the worked `store_memory` examples, the footguns a tool schema does not tell you, and a six-row index. Parameter names themselves come from the tools' own input schemas — they are not repeated here.
4
+
5
+ ## Worked shapes
6
+
7
+ ### A bugfix
8
+
9
+ ```python
10
+ store_memory(
11
+ content="""
12
+ ## Fixed: <short title>
13
+ **Problem:** <what was broken / why>
14
+ **Solution:** <what changed and why this approach>
15
+ **Files:** <key files + what changed in each>
16
+ **Testing:** <how verified>
17
+ """,
18
+ project_name="my-api",
19
+ workstream_slug="auth-hardening",
20
+ memory_type="bugfix",
21
+ related_files=["src/auth/token-manager.ts", "src/api/client.ts"],
22
+ tags=["authentication", "race-condition"],
23
+ relationships=[{"target": "<design-uuid the defect lived under>", "type": "related"}],
24
+ importance_score=0.8,
25
+ )
26
+ ```
27
+
28
+ ### A decision
29
+
30
+ ```python
31
+ store_memory(
32
+ content="""
33
+ ## Decided: recognition stays server-name-prefixed
34
+ **Context:** hook matcher must decide whether a tool call is recallium's store_memory.
35
+ **Options:** (a) match any mcp__*__store_memory; (b) keep mcp__recallium(-edition)?__ prefix; (c) thread a --server-name flag.
36
+ **Chosen:** (b). Installer owns the name; a generic match would capture other memory MCPs' stores.
37
+ **Consequences:** hand-renamed servers unsupported; (c) parked if custom names are ever needed.
38
+ """,
39
+ project_name="recallium-client",
40
+ workstream_slug="restructure-community",
41
+ memory_type="decision",
42
+ related_files=["src/cli/installer.ts", "src/adapter/canonical-events.ts"],
43
+ tags=["hooks", "server-naming"],
44
+ relationships=[
45
+ {"target": "<design uuid for the hook capture pipeline>", "type": "constrains"},
46
+ {"target": "<bugfix uuid for the 'nothing captured' defect>", "type": "related"},
47
+ ],
48
+ importance_score=0.8,
49
+ )
50
+ ```
51
+
52
+ ### A commit checkpoint
53
+
54
+ ```python
55
+ store_memory(
56
+ content="""
57
+ ## Landed: fix(hooks) match edition-suffixed server names
58
+ **SHA:** e436e0a4c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6
59
+ **Branch:** feature/restructure-community
60
+ **What it achieved:** settings.json matcher now fires for recallium-<edition> names; plain recallium still matches.
61
+ **Verified by:** vitest 1607/1607; regenerated matcher checked against recallium-saas-local; live capture in a fresh session.
62
+ **Next:** nothing on this branch; bin/ still parked.
63
+ """,
64
+ project_name="recallium-client",
65
+ workstream_slug="restructure-community",
66
+ memory_type="progress",
67
+ related_files=["src/cli/installer.ts", "src/adapter/canonical-events.ts", "test/installer.test.ts"],
68
+ tags=["hooks", "installer", "commit:e436e0a4"],
69
+ relationships=[
70
+ {"target": "01a06f00-4bdc-7158-b4ff-b43268b74e56", "type": "related"},
71
+ {"target": "01a06ee2-8c1d-7a90-b2e4-1f3a9c7d5e21", "type": "related"},
72
+ ],
73
+ importance_score=0.6,
74
+ )
75
+ ```
76
+
77
+ Net effect: `git log` → trailer → why. `search_memories(query="commit:e436e0a4", project_name="x")` → the checkpoint → what, how, files, and the why-edges. `get_workstream` → the whole journey.
78
+
79
+ ## Footguns
80
+
81
+ Things the input schema will not warn you about:
82
+
83
+ - `update_task(task_id=…, status="completed")` closes a task; `task_id` takes one UUID or a list, so several close in one call. Closing goes through the status field, never a separate tool.
84
+ - `list_tasks` returns open tasks only; pass `include_completed=True` for history.
85
+ - `update_task(status="inactive", reason=…)` and `modify_memory(action="inactivate")` are soft deletes. Nothing in Recallium is ever deleted.
86
+ - `expand_memories` takes at most 10 memory ids per call.
87
+ - `relationships` supersedes the deprecated `related_memory_ids`; keep using `relationships`.
88
+ - `get_workstream` with an unknown slug returns fuzzy-matched candidates, not an empty result — read them before creating a second workstream.
89
+ - `search_memories`: `recent_only=True` is a fixed last-30-days window while `days_back=N` is the last N days, and `file_path` takes ILIKE wildcards (`"%installer.ts%"`, `"src/auth/%"`).
90
+ - `create_project` is idempotent and metadata-only; there is no delete, so `update_project(status="inactive")` retires a project and `status="active"` restores it.
91
+ - `list_team_members` takes NO `project_name`; `team_recap` takes an optional one.
92
+ - `get_insights(analysis_type=…)` accepts `comprehensive`, `patterns`, `quality`, `technical_debt`, `learning`, `productivity`, `progress`.
93
+
94
+ ### Rules
95
+
96
+ The one signature worth writing out, because `scope` and `priority` are not reconstructable:
97
+
98
+ ```python
99
+ store_rule(
100
+ body="Always use uv instead of pip", # the rule text is `body`, not `content`
101
+ scope="project", # project | user | team (SaaS); project | install (community); global -> install
102
+ project_name="my-project", # REQUIRED when scope="project"
103
+ priority="important", # critical | important | normal (a 0.0-1.0 float also works)
104
+ )
105
+ store_rule(rule_id="<id>", action="deactivate") # remove; get the id from get_rules
106
+ ```
107
+
108
+ ## Index
109
+
110
+ | Goal | Sequence |
111
+ |------|----------|
112
+ | Start a session | `recallium(project_name)` → `get_working_state` → `get_workstream` for the roster → `get_workstream(slug=…)` on the one you are resuming |
113
+ | Record a checkpoint | a `progress` memory; tag it `commit:<short-sha>` if a commit landed; `update_task(task_id=…, memory_ids=[…])` if it sits inside a task |
114
+ | Link a commit to its why | the `Recallium-Memory:` trailer on the commit, carrying the why-memory UUIDs |
115
+ | Link a why back to its commit | the progress memory: `commit:<short-sha>` tag, the commit's files, and `related` edges to the same UUIDs |
116
+ | Connect new work to old | search the workstream first, then `relationships=[{"target": "<uuid>", "type": "related" \| "constrains" \| "contradicts"}]` |
117
+ | Replace something now wrong | `relationships=[{"target": "<uuid>", "type": "supersedes"}]` on the memory that replaces it |
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: recallium-tools
3
+ description: Maps the Recallium MCP tool surface — every tool name, the handler that owns it, whether it reads or writes, and which ones are enterprise-only. Use when you need an exact tool name or its arguments, when a call fails as an unknown tool, when deciding whether a capability exists in this edition, or before reaching for a Recallium tool you have not used in this project.
4
+ user-invocable: false
5
+ ---
6
+
7
+ <!-- GENERATED by scripts/gen-tool-skill.mjs from packages/core/src/recallium_core/mcp/registry.py
8
+ and its handlers/ package. Do not edit by hand — run `npm run gen:tools`
9
+ (`npm run check:tools` fails CI on drift). -->
10
+
11
+ # Recallium MCP tools
12
+
13
+ ## Quick start
14
+
15
+ 28 tools across 12 handlers. `R` reads · `W` writes · `E` enterprise-only.
16
+ Argument schemas come from the live tool descriptions, not from here.
17
+
18
+ - **Insights** — `get_insights` RE
19
+ - **Memory** — `store_memory` W · `create_workstream` W · `get_workstream` R · `search_memories` R · `expand_memories` R · `modify_memory` W
20
+ - **Project** — `create_project` W · `list_projects` R · `get_project` R · `update_project` W · `link_projects` W · `unlink_projects` W
21
+ - **Rules** — `get_rules` R · `store_rule` W
22
+ - **Session recap** — `session_recap` R
23
+ - **Task** — `create_task` W · `list_tasks` R · `get_task` R · `update_task` W
24
+ - **Team recap** — `team_recap` RE
25
+ - **Teams** — `list_team_members` RE
26
+ - **Thinking** — `start_thinking` W · `add_thought` W
27
+ - **Validation** — `recallium` R
28
+ - **Verdict** — `store_verdict` W
29
+ - **Working state** — `set_working_state` W · `get_working_state` R
30
+
31
+ ## Why
32
+
33
+ The surface is discovered, not declared: `HandlerRegistry.discover_handlers()`
34
+ imports every `BaseHandler` subclass under `handlers/` and registers its
35
+ `@mcp_tool` methods, skipping any handler whose `EDITION_REQUIRED` does not
36
+ match the running edition. The list moves with the server, so it is generated
37
+ from it rather than hand-maintained.
38
+
39
+ ## Workflow
40
+
41
+ 1. Find the tool by group above, then call it — its live description carries the
42
+ argument schema, always newer than any copy.
43
+ 2. **Gate:** `project_name` is required on nearly every tool.
44
+ 3. An `E` tool on a community server is not missing, it is gated; do not retry.
45
+ 4. **Gate:** `task`, `rule`, and `verdict` are not `store_memory` types —
46
+ they have their own tools above and soft-land as a `note` if you try.
47
+
48
+ ## Anti-patterns
49
+
50
+ WRONG: guessing a tool name from a memory of the API.
51
+ RIGHT: read it off this list; the generator keeps it true to the server.
52
+
53
+ WRONG: editing this file when a tool is added.
54
+ RIGHT: `npm run gen:tools` — hand edits are reverted by the next drift check.
55
+
56
+ ## Checklist
57
+
58
+ - [ ] Tool name taken from this list, not recalled
59
+ - [ ] `project_name` supplied
60
+ - [ ] Edition gate considered before treating a tool as broken
61
+
62
+ ## See also
63
+
64
+ `recallium-guidance` (the rules), `recall`, `capture`, `start-work`.
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: resume
3
+ description: Rebuilds where the work stands from Recallium rather than from scrollback - working state, the workstream journey, open tasks, this session's recap, a timeline of recent sessions, or patterns across them. Use when the user asks "where did we leave off", "what did we do", "what's still open", "what have we been doing this week", "what keeps going wrong", when switching to another project, after days away, and after a compaction or /clear.
4
+ ---
5
+
6
+ # Resume
7
+
8
+ ## Quick start
9
+
10
+ ```
11
+ get_working_state(project_name="my-api") # the raw note from last time
12
+ get_workstream(project_name="my-api") # roster; "__all__" across projects
13
+ get_workstream(slug="auth-hardening", project_name="my-api")
14
+ list_tasks(project_name="my-api") # open only by default
15
+ session_recap(project_name="my-api") # this session, or days_back=N
16
+ search_memories(query=None, project_name="my-api", memory_type="progress", days_back=7)
17
+ ```
18
+
19
+ ## Why
20
+
21
+ Scrollback vanishes at compaction. What Recallium holds is what was actually
22
+ stored, so resuming from it is also a check: a recap thinner than the work means
23
+ memories were never written. Progress memories are a timeline, so reading them
24
+ in date order reconstructs how the work moved.
25
+
26
+ ## Workflow
27
+
28
+ 1. **Gate:** the `recallium` summon has returned this conversation; rules,
29
+ working state and open tasks arrive only with it. Switching project? Call it
30
+ again with the new `project_name`. No workspace and no project named?
31
+ Ask, else `"default"`.
32
+ If the resume buffer is a preview, tell the user what it holds, as a part of the note and not the whole state. End by saying, without character counts, that more context is available that gives the full picture, and offer to load it; when the user says "resume", call get_working_state first.
33
+ 2. Read `get_working_state`: branch, slug, in flight, parked, next action.
34
+ 3. Roster, then the slug you are continuing; constraints and decisions come
35
+ first and bound what you may do. `expand_memories` the ones that bound
36
+ this work and read them; a one-line title is not the decision.
37
+ **Gate:** slug loaded, and those read, before code.
38
+ 4. Triage `list_tasks`; `get_task` shows one task's linked memories. Pick up,
39
+ or hand stale ones to `curate`.
40
+ 5. Pick the window the question asks for: "this session" -> `session_recap`;
41
+ "this week" -> browse `progress` with `days_back` or `date_from`/`date_to`,
42
+ oldest first, `commit:<sha>` tags as the landed commits; "what keeps
43
+ recurring / what tech debt" -> `get_insights` (enterprise; an absent tool
44
+ is gated, not broken). Team-wide questions belong to `team`.
45
+ 6. **Gate:** report; store nothing. Reconstructing history is not new.
46
+
47
+ ## Anti-patterns
48
+
49
+ WRONG: summarising from the conversation.
50
+ RIGHT: `session_recap` first, then narrate what it returned.
51
+
52
+ WRONG: `git log` as the history.
53
+ RIGHT: the progress timeline has the why and the evidence; git confirms SHAs.
54
+
55
+ ## Checklist
56
+
57
+ - [ ] Summon returned for the right project; working state read
58
+ - [ ] Slug loaded before code; open tasks triaged
59
+ - [ ] Right window and tool for the question
60
+ - [ ] Any `<fun-lines>...</fun-lines>` in a result opened the reply verbatim
61
+
62
+ ## See also
63
+
64
+ `start-work`, `recall`, `team`, `curate`, `handoff` (the other end), `recallium-guidance`.
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: rule
3
+ description: Stores or retires a standing behavioural rule in Recallium's tiered rule store - never as a memory - and only when the user asks for one. Use when the user says "always do X from now on", "remember this rule", "add a rule that", "stop doing Y", or corrects you in a way they want kept across sessions; check get_rules first so an existing rule is never stored twice, and never author a rule on your own initiative.
4
+ ---
5
+
6
+ # Rule
7
+
8
+ ## Quick start
9
+
10
+ ```
11
+ get_rules(project_name="my-api") # above-project tiers + this project's
12
+ store_rule(body="Always use uv instead of pip", scope="project",
13
+ project_name="my-api", priority="important")
14
+ store_rule(rule_id="<id>", action="deactivate")
15
+ ```
16
+
17
+ ## Why
18
+
19
+ Rules load with every `recallium` summon and are enforced as rules, not
20
+ suggestions. A rule the agent invented is the agent legislating for the user.
21
+ A duplicate is two guardrails that drift apart. And `store_memory(memory_type=
22
+ "rule")` does not create a rule; it silently lands a `note`, so you will think
23
+ a rule exists and it will not.
24
+
25
+ ## Workflow
26
+
27
+ 1. **Gate:** the user asked, in words: "always", "never", "from now on",
28
+ "remember this rule". A one-off instruction for this task is not a rule.
29
+ 2. `get_rules(project_name=...)`. The tiers above the project are always
30
+ returned unfiltered. If the rule is already there, say so; do not re-store.
31
+ Never re-store a rule the summon returned.
32
+ 3. Scope: `project` when a project is named (requires `project_name`);
33
+ `user`/`team` on SaaS; `install` on community. Omit and it defaults to the
34
+ narrowest safe tier.
35
+ 4. Priority: `critical` | `important` | `normal` (a 0.0-1.0 float also works).
36
+ The rule text is `body`.
37
+ 5. Removing one: `store_rule(rule_id=..., action="deactivate")`. There is no
38
+ delete.
39
+ 6. A correction the user wants kept but that is project-specific behaviour
40
+ rather than a guardrail is often a `learning` (see `capture`) plus a rule,
41
+ not a rule alone.
42
+
43
+ ## Anti-patterns
44
+
45
+ WRONG: turning "use the other endpoint this time" into a rule.
46
+ RIGHT: follow it; rules are for "from now on".
47
+
48
+ WRONG: `store_memory(memory_type="rule", ...)`.
49
+ RIGHT: `store_rule(body=...)`.
50
+
51
+ WRONG: storing the fun-line rule again because it appeared in a result.
52
+ RIGHT: the summon says which rules already exist; those are never re-stored.
53
+
54
+ ## Checklist
55
+
56
+ - [ ] User asked explicitly
57
+ - [ ] `get_rules` checked; nothing duplicated
58
+ - [ ] Scope and priority chosen; `body` is the text
59
+ - [ ] Nothing the summon returned was re-stored
60
+
61
+ ## See also
62
+
63
+ `capture` (a learning, not a rule), `resume` (rules arrive with the summon),
64
+ `recallium-guidance`.
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: start-work
3
+ description: "Set up a new named feature or effort before implementation: retrieve settled context, establish its workstream and continuation plan, offer tasks when the work has two or more units, and write working state. Use for an explicit kickoff or when a body of work needs that setup. A bounded mechanical edit alone does not start a new effort. Create persistent tasks only when the user asks or says yes to the offer."
4
+ ---
5
+
6
+ # Start work
7
+
8
+ ## Quick start
9
+
10
+ ```
11
+ search_memories(query="<what this work is about>", project_name="my-api",
12
+ file_path="src/auth/%")
13
+ get_workstream(project_name="my-api") # roster
14
+ create_workstream(project_name="my-api", title="Auth hardening",
15
+ status="active", attach=["<orphan-memory-uuid>"])
16
+ # two or more units? ask once: "This is 3 units — rotate tokens, revoke on logout,
17
+ # audit log. Track them as tasks?" → on yes, one task per unit:
18
+ create_task(project_name="my-api", task_description="Rotate refresh tokens",
19
+ workstream_slug="auth-hardening", memory_ids=["<design-uuid>"])
20
+ set_working_state(project_name="my-api", content="branch / slug / in flight / next")
21
+ ```
22
+
23
+ ## Why
24
+
25
+ Three traps live at the start of work. Re-deriving something a past session
26
+ settled produces a second, conflicting answer. A store with no workstream does
27
+ not fail; it lands where no `get_workstream` will replay it, so the next session
28
+ re-derives what you just settled. A Recallium task persists, links to the
29
+ memories that explain it, and resurfaces at the next summon - which is exactly
30
+ why tasks are created only when the user chose to track the work; unchosen
31
+ agent plans go in working state, where they expire harmlessly. But a task is
32
+ also the best checkpoint for multi-part work: closing it on the commit that
33
+ finishes it IS the checkpoint (see `finish`), so when the effort has several
34
+ units the user must at least be offered them — one question, their answer.
35
+
36
+ ## Workflow
37
+
38
+ 1. Confirm a new effort needs setup. A self-contained edit with a specified result can be completed directly; its required memory lookup does not by itself require this workflow or a new workstream.
39
+ For an effort, search by intent and file. A prior decision or constraint may settle part of it. `expand_memories` the hits and read them before opening the files they name: a summary line is not the memory. Keep the UUIDs for edges.
40
+ 2. `get_workstream(project_name=...)` for the roster. Continuing something?
41
+ Open its slug. Nothing fits? `create_workstream(..., status="active")`.
42
+ **Gate:** the workstream exists before the first store, never after.
43
+ `attach` takes MEMORY UUIDs (never task ids) to adopt earlier orphans.
44
+ 3. Tasks. Did the user ask to create or track tasks? Then `create_task` per
45
+ requested piece, within the request's scope, slug at creation time
46
+ (`update_task` ignores `workstream_slug`). No request, but the effort
47
+ resolves into TWO OR MORE units (PRs, phases, deliverables)? **Gate:** offer
48
+ them once, naming the units — "This is N units: A, B, C. Track them as
49
+ tasks?" — and create one task per unit only on a yes, linked to the design
50
+ memory when one exists. A single unit, a no, or silence: the plan stays in
51
+ `set_working_state`. Never create tasks the user did not ask for or agree to.
52
+ 4. Work spans two repos? Link them once via `project`; a link is full
53
+ one-hop search visibility both ways.
54
+ 5. If a plan or design formed, store it now: see `design`. If not, store
55
+ nothing; setup is not a finding.
56
+ 6. `set_working_state`: branch, slug, in flight, parked, next action.
57
+
58
+ ## Anti-patterns
59
+
60
+ WRONG: storing three memories, then creating the workstream.
61
+ RIGHT: `create_workstream` first; every store carries the slug.
62
+
63
+ WRONG: silently creating tasks from an ordinary implementation request.
64
+ RIGHT: tasks only for what the user asked to track or said yes to; findings as
65
+ memories; the rest in working state.
66
+
67
+ WRONG: a three-PR plan kept only in working state because nobody said "track".
68
+ RIGHT: "This is 3 units: … Track them as tasks?" — asked once, then their call.
69
+
70
+ ## Checklist
71
+
72
+ - [ ] Topic and file-scoped search run; hits read in full before the code; UUIDs kept
73
+ - [ ] Slug loaded or workstream created before any store
74
+ - [ ] Two or more units → tasks offered once by name; created only on a yes, with the slug, linked to the design if one exists
75
+
76
+ ## See also
77
+
78
+ `resume`, `recall`, `project`, `design`, `investigate`, `capture`, `finish`, `recallium-tools`.
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: team
3
+ description: Answers questions about the people and the shared work on an enterprise Recallium deployment - who is on which team, what the team has been doing across the projects it owns, what is pending there, and which teammate wrote what. Use when the user asks "who's on my team", "what has the team been working on", "what's pending across our projects", "what did a teammate do last week", or before filtering a search by author; on a community deployment these tools are absent by design, not broken.
4
+ ---
5
+
6
+ # Team
7
+
8
+ ## Quick start
9
+
10
+ ```
11
+ list_team_members() # every team you belong to; team_name="core" narrows
12
+ team_recap(days_back=7) # all projects your team owns; project_name="my-api" narrows
13
+ team_recap(project_name="my-api", include_tasks=True)
14
+ search_memories(query="...", project_name="__all__", author_email="<exact email from list_team_members>")
15
+ ```
16
+
17
+ ## Why
18
+
19
+ Team tools are the only view that crosses projects and people. `team_recap`
20
+ aggregates recent memories and pending tasks over the projects the team OWNS
21
+ and carries no per-user working state; `session_recap` is the personal view.
22
+ The author filter on `search_memories` is an exact match, so the email must
23
+ come from `list_team_members`, never from recollection.
24
+
25
+ ## Workflow
26
+
27
+ 1. **Gate:** enterprise. If the tool is not in the tool list, say so and fall
28
+ back to `session_recap` / `search_memories`; do not report it as broken.
29
+ 2. "Who is on the team" -> `list_team_members`. Takes no `project_name`;
30
+ `team_name` is a case-insensitive substring filter.
31
+ 3. "What has the team done" -> `team_recap`, 1-30 days back; narrow with
32
+ `project_name` when one project is meant.
33
+ 4. "What did X do" -> `list_team_members` for the exact email, then
34
+ `search_memories(author_email=..., project_name="__all__")`, because a
35
+ teammate's memories span projects.
36
+ 5. Patterns rather than activity ("what keeps going wrong across the team")
37
+ -> `get_insights` (see `resume`).
38
+ 6. **Gate:** report; store nothing. Someone's activity is not a new finding.
39
+
40
+ ## Anti-patterns
41
+
42
+ WRONG: guessing a teammate's email for `author_email`.
43
+ RIGHT: `list_team_members` first; the filter is exact.
44
+
45
+ WRONG: `team_recap` for "where did I leave off".
46
+ RIGHT: `resume`; the team view has no working state.
47
+
48
+ ## Checklist
49
+
50
+ - [ ] Enterprise confirmed, or the fallback used
51
+ - [ ] Right scope: every team project, or one
52
+ - [ ] Author email taken from the tool, not recalled
53
+
54
+ ## See also
55
+
56
+ `resume` (the personal view), `recall` (search by author), `project` (links
57
+ between projects), `recallium-tools` (edition gates).
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: verdict
3
+ description: Records one agent's judgment of another agent's output - a design, decision, answer, or memory - as a Recallium verdict on that target, so a parent agent can trust it without re-verifying. Use when you are acting as reviewer, critic, or judge of a specific memory and have reached a position on it; a verdict always names its target and is never stored as progress or a note.
4
+ user-invocable: false
5
+ ---
6
+
7
+ # Verdict
8
+
9
+ ## Quick start
10
+
11
+ ```
12
+ expand_memories(memory_ids=["<target-uuid>"])
13
+ store_verdict(target_memory_id="<target-uuid>",
14
+ decision="accept", # accept | refute | revise
15
+ confidence=0.8, # your certainty IN THIS JUDGMENT
16
+ reasoning="<self-contained evidence>",
17
+ project_name="my-api", workstream_slug="auth-hardening")
18
+ ```
19
+
20
+ ## Why
21
+
22
+ A verdict is the convergence primitive: it is how a subtree of agents collapses
23
+ to one trusted result. A false `accept` propagates unverified up the tree and
24
+ poisons every ancestor that trusts it; a false `refute` costs one more round.
25
+ So when in doubt, prefer a low-confidence `refute`. `confidence` is your
26
+ certainty in the judgment, not the quality of the target: a confident refute is
27
+ confidence 0.9 with decision `refute`.
28
+
29
+ ## Workflow
30
+
31
+ 1. **Gate:** `target_memory_id` is required and must be a real memory you can
32
+ see. Expand it first; judge what it says, not what you remember of it.
33
+ 2. Reach a position: `accept` (stands, build on it), `refute` (wrong or
34
+ unsound, do not build on it), `revise` (close; the changes are named in
35
+ your reasoning).
36
+ 3. Put the full evidence in `reasoning`. A parent may act on it without
37
+ re-checking, so it must be self-contained and must not present unverified
38
+ claims as established.
39
+ 4. One verdict per (you, target). A changed position is a new verdict that
40
+ supersedes your earlier reasoning; never edit the old one.
41
+ 5. Anchor it to the same `workstream_slug` as the target.
42
+
43
+ ## Anti-patterns
44
+
45
+ WRONG: a review stored as `progress` or `note`.
46
+ RIGHT: `store_verdict`; progress is a state timeline, not a judgment.
47
+
48
+ WRONG: a verdict with no target, "the approach is fine".
49
+ RIGHT: a verdict OF a specific memory UUID.
50
+
51
+ WRONG: `accept` at confidence 0.5 because nothing looked wrong.
52
+ RIGHT: if you are not sure, a low-confidence `refute` and the reason.
53
+
54
+ ## Checklist
55
+
56
+ - [ ] Target UUID real and expanded
57
+ - [ ] Decision and confidence set independently
58
+ - [ ] Reasoning self-contained; no unverified claims as fact
59
+ - [ ] Anchored to the target's workstream
60
+
61
+ ## See also
62
+
63
+ `design` (what usually gets judged), `decide`, `capture`.
package/bin/recallium DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import '../src/index.js';