peaks-cli 1.0.28 → 1.1.1

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 (29) hide show
  1. package/bin/peaks.js +0 -0
  2. package/dist/src/cli/commands/core-artifact-commands.js +4 -4
  3. package/dist/src/cli/commands/project-commands.js +23 -101
  4. package/dist/src/cli/commands/statusline-commands.d.ts +3 -0
  5. package/dist/src/cli/commands/statusline-commands.js +111 -0
  6. package/dist/src/cli/program.js +2 -0
  7. package/dist/src/services/doctor/doctor-service.d.ts +1 -0
  8. package/dist/src/services/doctor/doctor-service.js +40 -0
  9. package/dist/src/services/memory/project-context-service.d.ts +0 -38
  10. package/dist/src/services/memory/project-context-service.js +2 -304
  11. package/dist/src/services/memory/project-memory-service.d.ts +17 -1
  12. package/dist/src/services/memory/project-memory-service.js +72 -4
  13. package/dist/src/services/skills/skill-statusline-renderer.d.ts +6 -0
  14. package/dist/src/services/skills/skill-statusline-renderer.js +55 -0
  15. package/dist/src/services/skills/skill-statusline-service.d.ts +22 -0
  16. package/dist/src/services/skills/skill-statusline-service.js +94 -0
  17. package/dist/src/services/skills/statusline-settings-service.d.ts +32 -0
  18. package/dist/src/services/skills/statusline-settings-service.js +144 -0
  19. package/dist/src/shared/version.d.ts +1 -1
  20. package/dist/src/shared/version.js +1 -1
  21. package/package.json +1 -1
  22. package/schemas/doctor-report.schema.json +2 -2
  23. package/skills/peaks-prd/SKILL.md +10 -3
  24. package/skills/peaks-qa/SKILL.md +10 -3
  25. package/skills/peaks-rd/SKILL.md +10 -3
  26. package/skills/peaks-sc/SKILL.md +11 -4
  27. package/skills/peaks-solo/SKILL.md +16 -9
  28. package/skills/peaks-txt/SKILL.md +12 -5
  29. package/skills/peaks-ui/SKILL.md +10 -3
@@ -0,0 +1,144 @@
1
+ import { closeSync, constants, existsSync, lstatSync, mkdirSync, openSync, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ export const STATUSLINE_COMMAND = 'peaks statusline';
6
+ function isInsidePath(childPath, parentPath) {
7
+ const rel = relative(parentPath, childPath);
8
+ return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
9
+ }
10
+ function resolveSettingsRoot(scope, projectRoot) {
11
+ if (scope === 'global')
12
+ return resolve(homedir());
13
+ if (!projectRoot) {
14
+ throw new Error('Project scope requires a project root');
15
+ }
16
+ return resolve(projectRoot);
17
+ }
18
+ function resolveSettingsPath(scope, projectRoot) {
19
+ const root = resolveSettingsRoot(scope, projectRoot);
20
+ return join(root, '.claude', 'settings.json');
21
+ }
22
+ /** Reject symlinked .claude dir or settings file to prevent escape. */
23
+ function assertSafeSettingsPath(scope, root, settingsPath) {
24
+ const claudeDir = join(root, '.claude');
25
+ if (existsSync(claudeDir) && lstatSync(claudeDir).isSymbolicLink()) {
26
+ throw new Error('.claude directory must not be a symlink');
27
+ }
28
+ if (existsSync(settingsPath)) {
29
+ if (lstatSync(settingsPath).isSymbolicLink()) {
30
+ throw new Error('settings.json must not be a symlink');
31
+ }
32
+ const realRoot = realpathSync(root);
33
+ if (!isInsidePath(realpathSync(settingsPath), realRoot)) {
34
+ throw new Error(`settings.json must stay inside the ${scope} root`);
35
+ }
36
+ }
37
+ }
38
+ function readSettings(settingsPath) {
39
+ if (!existsSync(settingsPath))
40
+ return {};
41
+ const fd = openSync(settingsPath, constants.O_RDONLY | constants.O_NOFOLLOW);
42
+ try {
43
+ const raw = readFileSync(fd, 'utf8').trim();
44
+ if (raw.length === 0)
45
+ return {};
46
+ const parsed = JSON.parse(raw);
47
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
48
+ throw new Error('settings.json must contain a JSON object');
49
+ }
50
+ return parsed;
51
+ }
52
+ finally {
53
+ closeSync(fd);
54
+ }
55
+ }
56
+ function extractExistingCommand(settings) {
57
+ const statusLine = settings.statusLine;
58
+ if (statusLine && typeof statusLine === 'object' && !Array.isArray(statusLine)) {
59
+ const command = statusLine.command;
60
+ if (typeof command === 'string')
61
+ return command;
62
+ }
63
+ return null;
64
+ }
65
+ function buildPlan(scope, settingsPath, settings, exists) {
66
+ const existingCommand = extractExistingCommand(settings);
67
+ const alreadyInstalled = existingCommand !== null && existingCommand.includes(STATUSLINE_COMMAND);
68
+ const conflict = existingCommand !== null && !alreadyInstalled;
69
+ return {
70
+ scope,
71
+ settingsPath,
72
+ exists,
73
+ alreadyInstalled,
74
+ conflict,
75
+ conflictCommand: conflict ? existingCommand : null,
76
+ desiredCommand: STATUSLINE_COMMAND
77
+ };
78
+ }
79
+ export function planStatusLineInstall(scope, projectRoot) {
80
+ const root = resolveSettingsRoot(scope, projectRoot);
81
+ const settingsPath = resolveSettingsPath(scope, projectRoot);
82
+ assertSafeSettingsPath(scope, root, settingsPath);
83
+ const exists = existsSync(settingsPath);
84
+ const settings = readSettings(settingsPath);
85
+ return buildPlan(scope, settingsPath, settings, exists);
86
+ }
87
+ function atomicWriteJson(settingsPath, settings) {
88
+ const dir = dirname(settingsPath);
89
+ mkdirSync(dir, { recursive: true });
90
+ const tempPath = join(dir, `.settings.${randomUUID()}.tmp`);
91
+ const fd = openSync(tempPath, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
92
+ try {
93
+ writeFileSync(fd, `${JSON.stringify(settings, null, 2)}\n`, 'utf8');
94
+ }
95
+ finally {
96
+ closeSync(fd);
97
+ }
98
+ try {
99
+ renameSync(tempPath, settingsPath);
100
+ }
101
+ catch (error) {
102
+ try {
103
+ unlinkSync(tempPath);
104
+ }
105
+ catch {
106
+ // best effort cleanup
107
+ }
108
+ throw error;
109
+ }
110
+ }
111
+ export function applyStatusLineInstall(scope, projectRoot, options = {}) {
112
+ const root = resolveSettingsRoot(scope, projectRoot);
113
+ const settingsPath = resolveSettingsPath(scope, projectRoot);
114
+ assertSafeSettingsPath(scope, root, settingsPath);
115
+ const exists = existsSync(settingsPath);
116
+ const settings = readSettings(settingsPath);
117
+ const plan = buildPlan(scope, settingsPath, settings, exists);
118
+ if (plan.alreadyInstalled) {
119
+ return { ...plan, applied: false };
120
+ }
121
+ if (plan.conflict && !options.force) {
122
+ return { ...plan, applied: false };
123
+ }
124
+ const entry = { type: 'command', command: STATUSLINE_COMMAND, padding: 0 };
125
+ const nextSettings = { ...settings, statusLine: entry };
126
+ atomicWriteJson(settingsPath, nextSettings);
127
+ return { ...plan, applied: true };
128
+ }
129
+ export function removeStatusLineInstall(scope, projectRoot) {
130
+ const root = resolveSettingsRoot(scope, projectRoot);
131
+ const settingsPath = resolveSettingsPath(scope, projectRoot);
132
+ assertSafeSettingsPath(scope, root, settingsPath);
133
+ if (!existsSync(settingsPath)) {
134
+ return { scope, settingsPath, removed: false };
135
+ }
136
+ const settings = readSettings(settingsPath);
137
+ const existingCommand = extractExistingCommand(settings);
138
+ if (existingCommand === null || !existingCommand.includes(STATUSLINE_COMMAND)) {
139
+ return { scope, settingsPath, removed: false };
140
+ }
141
+ const { statusLine: _removed, ...rest } = settings;
142
+ atomicWriteJson(settingsPath, rest);
143
+ return { scope, settingsPath, removed: true };
144
+ }
@@ -1 +1 @@
1
- export declare const CLI_VERSION = "1.0.28";
1
+ export declare const CLI_VERSION = "1.1.1";
@@ -1 +1 @@
1
- export const CLI_VERSION = "1.0.28";
1
+ export const CLI_VERSION = "1.1.1";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peaks-cli",
3
- "version": "1.0.28",
3
+ "version": "1.1.1",
4
4
  "description": "Peaks CLI and short skill family for Claude Code automation.",
5
5
  "author": "SquabbyZ",
6
6
  "license": "MIT",
@@ -13,8 +13,8 @@
13
13
  "properties": {
14
14
  "id": {
15
15
  "type": "string",
16
- "pattern": "^(skill|skill-name|skill-parse|skill-runbook|skill-apply-note|skill-presence|schema|config|doctor-self|capability):[A-Za-z0-9][A-Za-z0-9._-]*$",
17
- "description": "Stable check id. Known prefixes: skill:<name> (required skill present), skill-name:<dir> (directory matches declared name), skill-parse:<dir> (skill metadata parsed), skill-runbook:<name> (Default runbook section exists), skill-apply-note:<name> (destructive --apply lines carry an authorization/--dry-run note), skill-presence:<topic> (status of .peaks/.active-skill.json — current/freshness), schema:<file> (schema file exists and is valid JSON), config:<scope> (optional config locations), doctor-self:<topic> (doctor validates its own output against this schema), capability:<name> (third-party capability is resolvable at the pinned version)."
16
+ "pattern": "^(skill|skill-name|skill-parse|skill-runbook|skill-apply-note|skill-presence|statusline|schema|config|doctor-self|capability):[A-Za-z0-9][A-Za-z0-9._-]*$",
17
+ "description": "Stable check id. Known prefixes: skill:<name> (required skill present), skill-name:<dir> (directory matches declared name), skill-parse:<dir> (skill metadata parsed), skill-runbook:<name> (Default runbook section exists), skill-apply-note:<name> (destructive --apply lines carry an authorization/--dry-run note), skill-presence:<topic> (status of .peaks/.active-skill.json — current/freshness), statusline:<topic> (whether the out-of-band Claude Code statusLine is installed), schema:<file> (schema file exists and is valid JSON), config:<scope> (optional config locations), doctor-self:<topic> (doctor validates its own output against this schema), capability:<name> (third-party capability is resolvable at the pinned version)."
18
18
  },
19
19
  "ok": { "type": "boolean" },
20
20
  "message": { "type": "string", "minLength": 1 }
@@ -14,13 +14,20 @@ Before any analysis or tool call, immediately run:
14
14
  ```bash
15
15
  peaks skill presence:set peaks-prd --project <repo> --mode <mode> --gate startup
16
16
  ```
17
- Read persistent project memory via CLI (structured ontology for LLM):
17
+
18
+ On the first presence:set in a project, ensure the out-of-band status bar is installed so the user can see at a glance that Peaks is orchestrating — it renders the active skill in Claude Code's terminal status line, independent of model output:
19
+
20
+ ```bash
21
+ peaks statusline install --project <repo> # idempotent; skips if already installed
22
+ ```
23
+
24
+ Read persistent project memory via CLI (durable, LLM-authored memories):
18
25
 
19
26
  ```bash
20
- peaks project ontology show --project <repo> --json
27
+ peaks project memories --project <repo> --json
21
28
  ```
22
29
 
23
- This returns `.peaks/ontology.json` — structured modules, decisions, and conventions from past sessions. (`.peaks/PROJECT.md` is a human-readable timeline only.)
30
+ This returns durable memories from `.peaks/memory` — decisions, conventions, modules, and rules captured in past sessions. Filter with `--kind <decision|convention|module|rule|reference|project>`. (`.peaks/PROJECT.md` is a human-readable session timeline only.)
24
31
  Then display: `Peaks-Cli Skill: peaks-prd | Peaks-Cli Gate: startup | Next: <one short action>`. Update with `peaks skill presence:set peaks-prd --project <repo> --mode <mode> --gate <gate>` when gates change. When the role's work ends, run `peaks skill presence:clear --project <repo>`.
25
32
 
26
33
  ## Responsibilities
@@ -14,13 +14,20 @@ Before any analysis or tool call, immediately run:
14
14
  ```bash
15
15
  peaks skill presence:set peaks-qa --project <repo> --mode <mode> --gate startup
16
16
  ```
17
- Read persistent project memory via CLI (structured ontology for LLM):
17
+
18
+ On the first presence:set in a project, ensure the out-of-band status bar is installed so the user can see at a glance that Peaks is orchestrating — it renders the active skill in Claude Code's terminal status line, independent of model output:
19
+
20
+ ```bash
21
+ peaks statusline install --project <repo> # idempotent; skips if already installed
22
+ ```
23
+
24
+ Read persistent project memory via CLI (durable, LLM-authored memories):
18
25
 
19
26
  ```bash
20
- peaks project ontology show --project <repo> --json
27
+ peaks project memories --project <repo> --json
21
28
  ```
22
29
 
23
- This returns `.peaks/ontology.json` — structured modules, decisions, and conventions from past sessions. (`.peaks/PROJECT.md` is a human-readable timeline only.)
30
+ This returns durable memories from `.peaks/memory` — decisions, conventions, modules, and rules captured in past sessions. Filter with `--kind <decision|convention|module|rule|reference|project>`. (`.peaks/PROJECT.md` is a human-readable session timeline only.)
24
31
  Then display: `Peaks-Cli Skill: peaks-qa | Peaks-Cli Gate: startup | Next: <one short action>`. Update with `peaks skill presence:set peaks-qa --project <repo> --mode <mode> --gate <gate>` when gates change. When the role's work ends, run `peaks skill presence:clear --project <repo>`.
25
32
 
26
33
  ## Responsibilities
@@ -14,13 +14,20 @@ Before any analysis or tool call, immediately run:
14
14
  ```bash
15
15
  peaks skill presence:set peaks-rd --project <repo> --mode <mode> --gate startup
16
16
  ```
17
- Read persistent project memory via CLI (structured ontology for LLM):
17
+
18
+ On the first presence:set in a project, ensure the out-of-band status bar is installed so the user can see at a glance that Peaks is orchestrating — it renders the active skill in Claude Code's terminal status line, independent of model output:
19
+
20
+ ```bash
21
+ peaks statusline install --project <repo> # idempotent; skips if already installed
22
+ ```
23
+
24
+ Read persistent project memory via CLI (durable, LLM-authored memories):
18
25
 
19
26
  ```bash
20
- peaks project ontology show --project <repo> --json
27
+ peaks project memories --project <repo> --json
21
28
  ```
22
29
 
23
- This returns `.peaks/ontology.json` — structured modules, decisions, and conventions from past sessions. (`.peaks/PROJECT.md` is a human-readable timeline only.)
30
+ This returns durable memories from `.peaks/memory` — decisions, conventions, modules, and rules captured in past sessions. Filter with `--kind <decision|convention|module|rule|reference|project>`. (`.peaks/PROJECT.md` is a human-readable session timeline only.)
24
31
  Then display: `Peaks-Cli Skill: peaks-rd | Peaks-Cli Gate: startup | Next: <one short action>`. Update with `peaks skill presence:set peaks-rd --project <repo> --mode <mode> --gate <gate>` when gates change. When the role's work ends, run `peaks skill presence:clear --project <repo>`.
25
32
 
26
33
  ## Responsibilities
@@ -14,13 +14,20 @@ Before any analysis or tool call, immediately run:
14
14
  ```bash
15
15
  peaks skill presence:set peaks-sc --project <repo> --mode <mode> --gate startup
16
16
  ```
17
- Read persistent project memory via CLI (structured ontology for LLM):
17
+
18
+ On the first presence:set in a project, ensure the out-of-band status bar is installed so the user can see at a glance that Peaks is orchestrating — it renders the active skill in Claude Code's terminal status line, independent of model output:
19
+
20
+ ```bash
21
+ peaks statusline install --project <repo> # idempotent; skips if already installed
22
+ ```
23
+
24
+ Read persistent project memory via CLI (durable, LLM-authored memories):
18
25
 
19
26
  ```bash
20
- peaks project ontology show --project <repo> --json
27
+ peaks project memories --project <repo> --json
21
28
  ```
22
29
 
23
- This returns `.peaks/ontology.json` — structured modules, decisions, and conventions from past sessions. (`.peaks/PROJECT.md` is a human-readable timeline only.)
30
+ This returns durable memories from `.peaks/memory` — decisions, conventions, modules, and rules captured in past sessions. Filter with `--kind <decision|convention|module|rule|reference|project>`. (`.peaks/PROJECT.md` is a human-readable session timeline only.)
24
31
  Then display: `Peaks-Cli Skill: peaks-sc | Peaks-Cli Gate: startup | Next: <one short action>`. Update with `peaks skill presence:set peaks-sc --project <repo> --mode <mode> --gate <gate>` when gates change. When the role's work ends, run `peaks skill presence:clear --project <repo>`.
25
32
 
26
33
  ## Responsibilities
@@ -56,7 +63,7 @@ Use gstack as a concrete source-control and release workflow reference for the `
56
63
 
57
64
  ## Project memory backup
58
65
 
59
- Project `.claude/memory` is the primary source for durable project memory. At approved checkpoints, use `peaks memory sync --project <path> --workspace <artifact-workspace> --apply` to back up the full project memory directory into the artifact repository workspace; do not treat the artifact backup as a second writable memory source.
66
+ Project `.peaks/memory` is the primary source for durable project memory. At approved checkpoints, use `peaks memory sync --project <path> --workspace <artifact-workspace> --apply` to back up the full project memory directory into the artifact repository workspace; do not treat the artifact backup as a second writable memory source.
60
67
 
61
68
  ## Commit boundary derivation
62
69
 
@@ -74,26 +74,33 @@ Only after the mode is known (user selected or explicitly named), run:
74
74
  peaks skill presence:set peaks-solo --project <repo> --mode <mode-value> --gate startup
75
75
  ```
76
76
 
77
+ On the first presence:set in a project, ensure the out-of-band status bar is installed so the user can see at a glance that Peaks is orchestrating — it renders the active skill in Claude Code's terminal status line, independent of model output:
78
+
79
+ ```bash
80
+ peaks statusline install --project <repo> # idempotent; skips if already installed
81
+ ```
82
+
77
83
  Then display the compact status header: `Peaks-Cli Skill: peaks-solo | Peaks-Cli Gate: startup | Next: <one short action>`. Display this header on EVERY turn while the skill is active.
78
84
 
79
85
  Update with `peaks skill presence:set peaks-solo --project <repo> --mode <mode> --gate <gate>` when gates change. The presence file persists across the full workflow lifecycle — do NOT clear it at workflow end.
80
86
 
81
- ### Peaks-Cli Step 2.3: Load project memory (structured ontology for LLM)
87
+ ### Peaks-Cli Step 2.3: Load project memory (durable, LLM-authored memories)
82
88
 
83
- Before planning any work, read the project's persistent memory — structured data that survives across sessions:
89
+ Before planning any work, read the project's persistent memory — durable memories that survive across sessions:
84
90
 
85
91
  ```bash
86
- peaks project ontology show --project <repo> --json
92
+ peaks project memories --project <repo> --json
87
93
  ```
88
94
 
89
- This returns `.peaks/ontology.json` containing:
90
- - **modules** — code areas touched, with risk levels and which sessions modified them
91
- - **decisions** — architectural choices, why they were made, what modules they affect
92
- - **conventions** — discovered project patterns (code style, naming, tooling)
95
+ This returns durable memories from `.peaks/memory`, grouped by kind:
96
+ - **module** — code areas touched, with risk and rationale captured by past sessions
97
+ - **decision** — architectural choices, why they were made, what they affect
98
+ - **convention** — discovered project patterns (code style, naming, tooling)
99
+ - **rule** / **reference** / **project** — standing constraints, external pointers, and project context
93
100
 
94
- Use this to understand what exists, what was decided, and what to avoid re-litigating. The ontology is auto-updated on `peaks skill presence:clear`.
101
+ Filter with `--kind <decision|convention|module|rule|reference|project>` when you only need one slice. Use this to understand what exists, what was decided, and what to avoid re-litigating. Memories are LLM-authored at approved checkpoints via `peaks memory extract`.
95
102
 
96
- `.peaks/PROJECT.md` is a human-readable timeline only — do NOT use it for LLM context.
103
+ `.peaks/PROJECT.md` is a human-readable session timeline only — do NOT use it for LLM context.
97
104
 
98
105
  ### Peaks-Cli Step 2.5: Set session title
99
106
 
@@ -14,13 +14,20 @@ Before any analysis or tool call, immediately run:
14
14
  ```bash
15
15
  peaks skill presence:set peaks-txt --project <repo> --mode <mode> --gate startup
16
16
  ```
17
- Read persistent project memory via CLI (structured ontology for LLM):
17
+
18
+ On the first presence:set in a project, ensure the out-of-band status bar is installed so the user can see at a glance that Peaks is orchestrating — it renders the active skill in Claude Code's terminal status line, independent of model output:
19
+
20
+ ```bash
21
+ peaks statusline install --project <repo> # idempotent; skips if already installed
22
+ ```
23
+
24
+ Read persistent project memory via CLI (durable, LLM-authored memories):
18
25
 
19
26
  ```bash
20
- peaks project ontology show --project <repo> --json
27
+ peaks project memories --project <repo> --json
21
28
  ```
22
29
 
23
- This returns `.peaks/ontology.json` — structured modules, decisions, and conventions from past sessions. (`.peaks/PROJECT.md` is a human-readable timeline only.)
30
+ This returns durable memories from `.peaks/memory` — decisions, conventions, modules, and rules captured in past sessions. Filter with `--kind <decision|convention|module|rule|reference|project>`. (`.peaks/PROJECT.md` is a human-readable session timeline only.)
24
31
  Then display: `Peaks-Cli Skill: peaks-txt | Peaks-Cli Gate: startup | Next: <one short action>`. Update with `peaks skill presence:set peaks-txt --project <repo> --mode <mode> --gate <gate>` when gates change. When the role's work ends, run `peaks skill presence:clear --project <repo>`.
25
32
 
26
33
  ## Responsibilities
@@ -96,7 +103,7 @@ Each entry should include:
96
103
  - why it exists;
97
104
  - affected skills;
98
105
  - how future PRD/RD/UI/QA/SC/Solo workflows should apply it;
99
- - whether it is stable enough for `.claude/memory` extraction.
106
+ - whether it is stable enough for `.peaks/memory` extraction.
100
107
 
101
108
  ## Project memory guidance
102
109
 
@@ -111,7 +118,7 @@ Stable memory body.
111
118
  <!-- peaks-memory:end -->
112
119
  ```
113
120
 
114
- The primary write target is the target project's `.claude/memory`. Use `peaks memory extract --project <path> --artifact <artifact> --apply` only after the user or active profile allows durable project memory writes.
121
+ The primary write target is the target project's `.peaks/memory`. Use `peaks memory extract --project <path> --artifact <artifact> --apply` only after the user or active profile allows durable project memory writes.
115
122
 
116
123
  ## Matt Pocock skills integration
117
124
 
@@ -14,13 +14,20 @@ Before any analysis or tool call, immediately run:
14
14
  ```bash
15
15
  peaks skill presence:set peaks-ui --project <repo> --mode <mode> --gate startup
16
16
  ```
17
- Read persistent project memory via CLI (structured ontology for LLM):
17
+
18
+ On the first presence:set in a project, ensure the out-of-band status bar is installed so the user can see at a glance that Peaks is orchestrating — it renders the active skill in Claude Code's terminal status line, independent of model output:
19
+
20
+ ```bash
21
+ peaks statusline install --project <repo> # idempotent; skips if already installed
22
+ ```
23
+
24
+ Read persistent project memory via CLI (durable, LLM-authored memories):
18
25
 
19
26
  ```bash
20
- peaks project ontology show --project <repo> --json
27
+ peaks project memories --project <repo> --json
21
28
  ```
22
29
 
23
- This returns `.peaks/ontology.json` — structured modules, decisions, and conventions from past sessions. (`.peaks/PROJECT.md` is a human-readable timeline only.)
30
+ This returns durable memories from `.peaks/memory` — decisions, conventions, modules, and rules captured in past sessions. Filter with `--kind <decision|convention|module|rule|reference|project>`. (`.peaks/PROJECT.md` is a human-readable session timeline only.)
24
31
  Then display: `Peaks-Cli Skill: peaks-ui | Peaks-Cli Gate: startup | Next: <one short action>`. Update with `peaks skill presence:set peaks-ui --project <repo> --mode <mode> --gate <gate>` when gates change. When the role's work ends, run `peaks skill presence:clear --project <repo>`.
25
32
 
26
33
  ## Responsibilities