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.
- package/bin/peaks.js +0 -0
- package/dist/src/cli/commands/core-artifact-commands.js +4 -4
- package/dist/src/cli/commands/project-commands.js +23 -101
- package/dist/src/cli/commands/statusline-commands.d.ts +3 -0
- package/dist/src/cli/commands/statusline-commands.js +111 -0
- package/dist/src/cli/program.js +2 -0
- package/dist/src/services/doctor/doctor-service.d.ts +1 -0
- package/dist/src/services/doctor/doctor-service.js +40 -0
- package/dist/src/services/memory/project-context-service.d.ts +0 -38
- package/dist/src/services/memory/project-context-service.js +2 -304
- package/dist/src/services/memory/project-memory-service.d.ts +17 -1
- package/dist/src/services/memory/project-memory-service.js +72 -4
- package/dist/src/services/skills/skill-statusline-renderer.d.ts +6 -0
- package/dist/src/services/skills/skill-statusline-renderer.js +55 -0
- package/dist/src/services/skills/skill-statusline-service.d.ts +22 -0
- package/dist/src/services/skills/skill-statusline-service.js +94 -0
- package/dist/src/services/skills/statusline-settings-service.d.ts +32 -0
- package/dist/src/services/skills/statusline-settings-service.js +144 -0
- package/dist/src/shared/version.d.ts +1 -1
- package/dist/src/shared/version.js +1 -1
- package/package.json +1 -1
- package/schemas/doctor-report.schema.json +2 -2
- package/skills/peaks-prd/SKILL.md +10 -3
- package/skills/peaks-qa/SKILL.md +10 -3
- package/skills/peaks-rd/SKILL.md +10 -3
- package/skills/peaks-sc/SKILL.md +11 -4
- package/skills/peaks-solo/SKILL.md +16 -9
- package/skills/peaks-txt/SKILL.md +12 -5
- 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.
|
|
1
|
+
export declare const CLI_VERSION = "1.1.1";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const CLI_VERSION = "1.
|
|
1
|
+
export const CLI_VERSION = "1.1.1";
|
package/package.json
CHANGED
|
@@ -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
|
-
|
|
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
|
|
27
|
+
peaks project memories --project <repo> --json
|
|
21
28
|
```
|
|
22
29
|
|
|
23
|
-
This returns `.peaks/
|
|
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
|
package/skills/peaks-qa/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
27
|
+
peaks project memories --project <repo> --json
|
|
21
28
|
```
|
|
22
29
|
|
|
23
|
-
This returns `.peaks/
|
|
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
|
package/skills/peaks-rd/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
27
|
+
peaks project memories --project <repo> --json
|
|
21
28
|
```
|
|
22
29
|
|
|
23
|
-
This returns `.peaks/
|
|
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
|
package/skills/peaks-sc/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
27
|
+
peaks project memories --project <repo> --json
|
|
21
28
|
```
|
|
22
29
|
|
|
23
|
-
This returns `.peaks/
|
|
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 `.
|
|
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 (
|
|
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 —
|
|
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
|
|
92
|
+
peaks project memories --project <repo> --json
|
|
87
93
|
```
|
|
88
94
|
|
|
89
|
-
This returns `.peaks/
|
|
90
|
-
- **
|
|
91
|
-
- **
|
|
92
|
-
- **
|
|
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.
|
|
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
|
-
|
|
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
|
|
27
|
+
peaks project memories --project <repo> --json
|
|
21
28
|
```
|
|
22
29
|
|
|
23
|
-
This returns `.peaks/
|
|
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 `.
|
|
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 `.
|
|
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
|
|
package/skills/peaks-ui/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
27
|
+
peaks project memories --project <repo> --json
|
|
21
28
|
```
|
|
22
29
|
|
|
23
|
-
This returns `.peaks/
|
|
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
|