projectstore-claude 0.29.2 → 0.29.4
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/README.md +1 -1
- package/bin/projectstore-claude.mjs +1 -1
- package/node_modules/projectstore/.claude-plugin/marketplace.json +1 -1
- package/node_modules/projectstore/.claude-plugin/plugin.json +2 -1
- package/node_modules/projectstore/README.md +44 -7
- package/node_modules/projectstore/commands/bar.md +30 -0
- package/node_modules/projectstore/commands/bind.md +16 -20
- package/node_modules/projectstore/commands/doctor.md +12 -7
- package/node_modules/projectstore/commands/scaffold.md +24 -16
- package/node_modules/projectstore/commands/status.md +1 -1
- package/node_modules/projectstore/commands/statusline.md +2 -2
- package/node_modules/projectstore/commands/story.md +15 -2
- package/node_modules/projectstore/docs/alongside.md +167 -0
- package/node_modules/projectstore/docs/extending.md +17 -3
- package/node_modules/projectstore/docs/getting-started.md +18 -9
- package/node_modules/projectstore/docs/harnesses.md +1 -1
- package/node_modules/projectstore/docs/how-it-works.md +12 -3
- package/node_modules/projectstore/harnesses/claude-code.json +23 -8
- package/node_modules/projectstore/harnesses/codex.json +16 -6
- package/node_modules/projectstore/hooks/band-state.d.ts +44 -0
- package/node_modules/projectstore/hooks/band.tsx +622 -0
- package/node_modules/projectstore/hooks/hooks.json +1 -0
- package/node_modules/projectstore/hooks/pre-compact.mjs +7 -10
- package/node_modules/projectstore/hooks/session-rules.mjs +14 -8
- package/node_modules/projectstore/hooks/session-start.mjs +56 -20
- package/node_modules/projectstore/hooks/session-stop.mjs +8 -6
- package/node_modules/projectstore/package.json +12 -2
- package/node_modules/projectstore/scaffold/headings.json +8 -0
- package/node_modules/projectstore/scripts/band-shared.mjs +446 -0
- package/node_modules/projectstore/scripts/band.mjs +207 -0
- package/node_modules/projectstore/scripts/binding.mjs +733 -62
- package/node_modules/projectstore/scripts/build-adapters.mjs +98 -35
- package/node_modules/projectstore/scripts/cli.mjs +1463 -267
- package/node_modules/projectstore/scripts/codemap.mjs +22 -7
- package/node_modules/projectstore/scripts/convergence.mjs +638 -0
- package/node_modules/projectstore/scripts/diff-refs.mjs +14 -8
- package/node_modules/projectstore/scripts/doctor-report.mjs +253 -0
- package/node_modules/projectstore/scripts/doctor.mjs +1384 -420
- package/node_modules/projectstore/scripts/draft.mjs +5 -2
- package/node_modules/projectstore/scripts/fetch-shell.mjs +369 -0
- package/node_modules/projectstore/scripts/graph.mjs +19 -13
- package/node_modules/projectstore/scripts/harness.mjs +283 -37
- package/node_modules/projectstore/scripts/install-harness.mjs +4701 -575
- package/node_modules/projectstore/scripts/kanban.mjs +6 -21
- package/node_modules/projectstore/scripts/lib.mjs +933 -199
- package/node_modules/projectstore/scripts/mcp.mjs +386 -105
- package/node_modules/projectstore/scripts/portable-registration.mjs +276 -56
- package/node_modules/projectstore/scripts/provenance.mjs +26 -10
- package/node_modules/projectstore/scripts/query.mjs +441 -72
- package/node_modules/projectstore/scripts/reconcile.mjs +55 -18
- package/node_modules/projectstore/scripts/run-host.mjs +139 -0
- package/node_modules/projectstore/scripts/scaffold.mjs +244 -0
- package/node_modules/projectstore/scripts/setup.mjs +987 -0
- package/node_modules/projectstore/scripts/stages.mjs +84 -0
- package/node_modules/projectstore/scripts/statusline-launcher.mjs +36 -11
- package/node_modules/projectstore/scripts/statusline.mjs +55 -14
- package/node_modules/projectstore/scripts/story-section.mjs +39 -17
- package/node_modules/projectstore/scripts/surfaces.mjs +485 -99
- package/node_modules/projectstore/scripts/term.mjs +1027 -52
- package/node_modules/projectstore/scripts/tokens.mjs +106 -28
- package/node_modules/projectstore/scripts/touch-session.mjs +109 -70
- package/node_modules/projectstore/scripts/version-guard.mjs +79 -27
- package/node_modules/projectstore/scripts/worktree.mjs +16 -5
- package/node_modules/projectstore/templates/de/strings.json +63 -1
- package/node_modules/projectstore/templates/de/vault-readme.md.tmpl +13 -0
- package/node_modules/projectstore/templates/en/strings.json +63 -1
- package/node_modules/projectstore/templates/en/vault-readme.md.tmpl +13 -0
- package/node_modules/projectstore/templates/es/strings.json +63 -1
- package/node_modules/projectstore/templates/es/vault-readme.md.tmpl +13 -0
- package/node_modules/projectstore/templates/fr/strings.json +63 -1
- package/node_modules/projectstore/templates/fr/vault-readme.md.tmpl +13 -0
- package/node_modules/projectstore/templates/ru/strings.json +63 -1
- package/node_modules/projectstore/templates/ru/vault-readme.md.tmpl +13 -0
- package/node_modules/projectstore/templates/zh/strings.json +63 -1
- package/node_modules/projectstore/templates/zh/vault-readme.md.tmpl +13 -0
- package/package.json +2 -2
|
@@ -40,11 +40,12 @@ const VERSION_SITES = [
|
|
|
40
40
|
// Found by name, not by position: `plugins[0]` reads a sibling plugin's
|
|
41
41
|
// version the moment the marketplace lists more than one, and reports the
|
|
42
42
|
// disagreement against the wrong file.
|
|
43
|
-
[
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
],
|
|
43
|
+
[".claude-plugin/marketplace.json", (j) => j.plugins?.find((p) => p.name === "projectstore")?.version, true],
|
|
44
|
+
// The lockfile, committed since the lint ADR, records the root package's
|
|
45
|
+
// version twice. `npm version` rewrites both; a hand edit of package.json
|
|
46
|
+
// leaves both behind, and this is where that shows.
|
|
47
|
+
["package-lock.json", (j) => j.version, true],
|
|
48
|
+
["package-lock.json", (j) => j.packages?.[""]?.version, true],
|
|
48
49
|
];
|
|
49
50
|
|
|
50
51
|
// The distribution shells (the shells ADR; layout spec contract 11): one
|
|
@@ -58,34 +59,51 @@ export function collectShells(root = ROOT) {
|
|
|
58
59
|
if (!existsSync(dir)) return { shells: [] };
|
|
59
60
|
const shells = [];
|
|
60
61
|
// Directories only: a .DS_Store Finder drops on a browse is not a shell.
|
|
61
|
-
for (const name of readdirSync(dir, { withFileTypes: true })
|
|
62
|
+
for (const name of readdirSync(dir, { withFileTypes: true })
|
|
63
|
+
.filter((e) => e.isDirectory())
|
|
64
|
+
.map((e) => e.name)
|
|
65
|
+
.sort()) {
|
|
62
66
|
const rel = `${SHELLS_DIR}/${name}/package.json`;
|
|
63
67
|
const abs = resolve(root, rel);
|
|
64
68
|
if (!existsSync(abs)) return { error: `${rel}: missing — every directory under ${SHELLS_DIR}/ is a shell` };
|
|
65
69
|
let json;
|
|
66
|
-
try {
|
|
70
|
+
try {
|
|
71
|
+
json = JSON.parse(readFileSync(abs, "utf8"));
|
|
72
|
+
} catch (e) {
|
|
73
|
+
return { error: `${rel}: ${e.message}` };
|
|
74
|
+
}
|
|
67
75
|
if (json.name !== name) return { error: `${rel}: name "${json.name}" is not its directory's` };
|
|
68
|
-
if (typeof json.version !== "string" || !json.version)
|
|
76
|
+
if (typeof json.version !== "string" || !json.version)
|
|
77
|
+
return { error: `${rel}: no version found where one is required` };
|
|
69
78
|
const pluginVersions = [];
|
|
70
79
|
if (name === "projectstore-codex") {
|
|
71
80
|
// A root plugin.json is an Agent Plugins manifest Codex picks first, and
|
|
72
81
|
// Codex loads no hooks from that format (openai/codex#37027, merged
|
|
73
82
|
// 2026-08-05): every hook goes missing.
|
|
74
83
|
if (existsSync(resolve(root, SHELLS_DIR, name, "plugin.json"))) {
|
|
75
|
-
return {
|
|
84
|
+
return {
|
|
85
|
+
error: `${SHELLS_DIR}/${name}/plugin.json: refused — Codex picks a root Agent Plugins manifest first and loads no hooks from it (openai/codex#37027; codex-rs/core-plugins/src/loader.rs); the shell's manifest is .codex-plugin/plugin.json alone`,
|
|
86
|
+
};
|
|
76
87
|
}
|
|
77
88
|
for (const manifest of [".codex-plugin/plugin.json"]) {
|
|
78
89
|
const manifestRel = `${SHELLS_DIR}/${name}/${manifest}`;
|
|
79
90
|
const manifestAbs = resolve(root, manifestRel);
|
|
80
91
|
if (!existsSync(manifestAbs)) return { error: `${manifestRel}: missing — the Codex shell's one manifest` };
|
|
81
92
|
let parsed;
|
|
82
|
-
try {
|
|
83
|
-
|
|
93
|
+
try {
|
|
94
|
+
parsed = JSON.parse(readFileSync(manifestAbs, "utf8"));
|
|
95
|
+
} catch (e) {
|
|
96
|
+
return { error: `${manifestRel}: ${e.message}` };
|
|
97
|
+
}
|
|
98
|
+
if (typeof parsed.version !== "string" || !parsed.version)
|
|
99
|
+
return { error: `${manifestRel}: no version found where one is required` };
|
|
84
100
|
pluginVersions.push({ file: manifestRel, version: parsed.version });
|
|
85
101
|
}
|
|
86
102
|
}
|
|
87
103
|
shells.push({
|
|
88
|
-
name,
|
|
104
|
+
name,
|
|
105
|
+
file: rel,
|
|
106
|
+
version: json.version,
|
|
89
107
|
pin: json.dependencies?.projectstore ?? null,
|
|
90
108
|
private: json.private === true,
|
|
91
109
|
bin: json.bin?.[name] ?? null,
|
|
@@ -104,7 +122,9 @@ function die(msg) {
|
|
|
104
122
|
|
|
105
123
|
export function collectVersions(root = ROOT) {
|
|
106
124
|
if (existsSync(resolve(root, ".codex-plugin", "plugin.json"))) {
|
|
107
|
-
return {
|
|
125
|
+
return {
|
|
126
|
+
error: ".codex-plugin/plugin.json must live in the projectstore-codex shell, not at the core package root",
|
|
127
|
+
};
|
|
108
128
|
}
|
|
109
129
|
const found = [];
|
|
110
130
|
for (const [rel, pick, required] of VERSION_SITES) {
|
|
@@ -138,7 +158,10 @@ export function checkVersions({ root = ROOT, tag = null } = {}) {
|
|
|
138
158
|
if (sh.error) return { ok: false, error: sh.error };
|
|
139
159
|
|
|
140
160
|
// A shell's version is one more site under the same rule.
|
|
141
|
-
const sites = [
|
|
161
|
+
const sites = [
|
|
162
|
+
...found,
|
|
163
|
+
...sh.shells.flatMap((s) => [{ file: s.file, version: s.version }, ...(s.pluginVersions || [])]),
|
|
164
|
+
];
|
|
142
165
|
if (tag) sites.push({ file: "<tag>", version: stripV(tag) });
|
|
143
166
|
const distinct = [...new Set(sites.map((s) => s.version))];
|
|
144
167
|
if (distinct.length !== 1) return { ok: false, error: "version mismatch", versions: distinct, checked: sites };
|
|
@@ -147,11 +170,32 @@ export function checkVersions({ root = ROOT, tag = null } = {}) {
|
|
|
147
170
|
// is the one file it ships. A range here is the unverified pairing the
|
|
148
171
|
// shells ADR rejects; a missing bundle ships an installer with no core.
|
|
149
172
|
for (const s of sh.shells) {
|
|
150
|
-
if (s.pin !== `=${s.version}`)
|
|
173
|
+
if (s.pin !== `=${s.version}`)
|
|
174
|
+
return {
|
|
175
|
+
ok: false,
|
|
176
|
+
error: "shell pin mismatch",
|
|
177
|
+
shell: s.name,
|
|
178
|
+
pin: s.pin,
|
|
179
|
+
expected: `=${s.version}`,
|
|
180
|
+
checked: sites,
|
|
181
|
+
};
|
|
151
182
|
if (!s.bundled) return { ok: false, error: "shell does not bundle the core", shell: s.name, checked: sites };
|
|
152
|
-
if (s.bin !== `bin/${s.name}.mjs` || !s.binExists)
|
|
183
|
+
if (s.bin !== `bin/${s.name}.mjs` || !s.binExists)
|
|
184
|
+
return {
|
|
185
|
+
ok: false,
|
|
186
|
+
error: "shell bin missing or misnamed",
|
|
187
|
+
shell: s.name,
|
|
188
|
+
bin: s.bin,
|
|
189
|
+
expected: `bin/${s.name}.mjs`,
|
|
190
|
+
checked: sites,
|
|
191
|
+
};
|
|
153
192
|
}
|
|
154
|
-
return {
|
|
193
|
+
return {
|
|
194
|
+
ok: true,
|
|
195
|
+
version: distinct[0],
|
|
196
|
+
checked: sites,
|
|
197
|
+
shells: sh.shells.map((s) => ({ name: s.name, private: s.private })),
|
|
198
|
+
};
|
|
155
199
|
}
|
|
156
200
|
|
|
157
201
|
// Everything at the repository root that is deliberately NOT in the tarball.
|
|
@@ -180,19 +224,25 @@ export const NOT_SHIPPED = new Set([
|
|
|
180
224
|
"tests", // 240 kB of fixtures nobody installing the plugin needs
|
|
181
225
|
"packaging", // reserved-name stubs; see packaging/README.md
|
|
182
226
|
"adapters", // generated harness inputs copied into their distribution shells at build time
|
|
227
|
+
"site", // the public site: Pages serves it, npm never does
|
|
183
228
|
"package-lock.json",
|
|
229
|
+
// The lint and format tooling (the lint ADR): dev-only, never in the package.
|
|
230
|
+
"eslint.config.mjs",
|
|
231
|
+
".prettierrc.json",
|
|
232
|
+
".prettierignore",
|
|
233
|
+
".git-blame-ignore-revs",
|
|
234
|
+
// Claude Code lays this beside a plugin folder it loads with --plugin-dir
|
|
235
|
+
// (extending .claude-plugin/types/, which is gitignored and kept out of the
|
|
236
|
+
// package too): the band module's type-check reads it, nobody installs it.
|
|
237
|
+
"tsconfig.json",
|
|
184
238
|
]);
|
|
185
239
|
|
|
186
240
|
// Top-level entries that are neither shipped nor deliberately excluded. Kept
|
|
187
241
|
// pure — it takes the tree listing rather than reading it — so a test can hand
|
|
188
242
|
// it a directory that does not exist and watch it fail.
|
|
189
243
|
export function unshippedTopLevel(entries, packlist) {
|
|
190
|
-
const shipped = new Set(
|
|
191
|
-
|
|
192
|
-
);
|
|
193
|
-
return entries
|
|
194
|
-
.filter((e) => e !== "." && e !== ".." && !shipped.has(e) && !NOT_SHIPPED.has(e))
|
|
195
|
-
.sort();
|
|
244
|
+
const shipped = new Set(packlist.map((p) => (p.includes("/") ? p.slice(0, p.indexOf("/")) : p)));
|
|
245
|
+
return entries.filter((e) => e !== "." && e !== ".." && !shipped.has(e) && !NOT_SHIPPED.has(e)).sort();
|
|
196
246
|
}
|
|
197
247
|
|
|
198
248
|
// The packlist is the second release-time invariant: what npm would actually
|
|
@@ -241,13 +291,15 @@ async function main(argv) {
|
|
|
241
291
|
for (const b of built.shells) {
|
|
242
292
|
if (b.error) die(b.error);
|
|
243
293
|
const rel = m.shellPacklistPath(b.name);
|
|
244
|
-
try {
|
|
294
|
+
try {
|
|
295
|
+
writeFileAtomic(resolve(ROOT, rel), JSON.stringify(b.files, null, 2) + "\n");
|
|
296
|
+
} catch (e) {
|
|
297
|
+
die(`${rel}: ${e.message}`);
|
|
298
|
+
}
|
|
245
299
|
shells.push({ wrote: rel, count: b.files.length });
|
|
246
300
|
}
|
|
247
301
|
}
|
|
248
|
-
process.stdout.write(
|
|
249
|
-
JSON.stringify({ ok: true, wrote: PACKLIST, count: files.length, shells }) + "\n",
|
|
250
|
-
);
|
|
302
|
+
process.stdout.write(JSON.stringify({ ok: true, wrote: PACKLIST, count: files.length, shells }) + "\n");
|
|
251
303
|
return;
|
|
252
304
|
}
|
|
253
305
|
|
|
@@ -31,7 +31,14 @@ const trim = (s) => (typeof s === "string" ? s.trim() : null);
|
|
|
31
31
|
// `layout` and `language` are the parent's: what a bind without an inherit
|
|
32
32
|
// path must name to write the parent's binding rather than bind's defaults.
|
|
33
33
|
function record(state, worktree, mainCheckout, vaultPath, parent = null) {
|
|
34
|
-
return {
|
|
34
|
+
return {
|
|
35
|
+
state,
|
|
36
|
+
worktree,
|
|
37
|
+
mainCheckout,
|
|
38
|
+
vaultPath,
|
|
39
|
+
layout: parent?.layout || null,
|
|
40
|
+
language: parent?.language || null,
|
|
41
|
+
};
|
|
35
42
|
}
|
|
36
43
|
|
|
37
44
|
// The main checkout behind a linked worktree.
|
|
@@ -96,10 +103,14 @@ export function bindingOfferText(b) {
|
|
|
96
103
|
`- its vault: \`${truncFront(String(b.vaultPath), PATH_CELL)}\``,
|
|
97
104
|
"",
|
|
98
105
|
...(bindInherits()
|
|
99
|
-
? [
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
106
|
+
? [
|
|
107
|
+
`Run \`${inheritForm(b.vaultPath, { layout: b.layout, language: b.language })}\` to adopt that binding. It copies the binding`,
|
|
108
|
+
"only — the vault is shared and unchanged, and no session state travels with it.",
|
|
109
|
+
]
|
|
110
|
+
: [
|
|
111
|
+
`Run \`${inheritForm(b.vaultPath, { layout: b.layout, language: b.language })}\` to bind this checkout to the same vault,`,
|
|
112
|
+
"layout and language — the vault is shared and unchanged, and no session state travels with it.",
|
|
113
|
+
]),
|
|
103
114
|
"",
|
|
104
115
|
"",
|
|
105
116
|
].join("\n");
|
|
@@ -2,5 +2,67 @@
|
|
|
2
2
|
"statusline_no_work": "Noch kein Epic und keine Story in dieser Sitzung",
|
|
3
3
|
"statusline_state_error": "⚠ Sitzungsstatus nicht lesbar",
|
|
4
4
|
"statusline_example_epic": "Super-Feature in einem Super-Produkt",
|
|
5
|
-
"statusline_example_story": "Griff für Toilettenpapier"
|
|
5
|
+
"statusline_example_story": "Griff für Toilettenpapier",
|
|
6
|
+
"band_this_session": "diese Sitzung",
|
|
7
|
+
"band_pinned": "angeheftet",
|
|
8
|
+
"band_goal": "Ziel",
|
|
9
|
+
"band_story": "Story",
|
|
10
|
+
"band_agent": "Agent",
|
|
11
|
+
"band_done": "fertig",
|
|
12
|
+
"band_in_work": "in Arbeit",
|
|
13
|
+
"band_backlog": "Backlog",
|
|
14
|
+
"band_stories": "Storys",
|
|
15
|
+
"band_no_stories": "noch keine Storys",
|
|
16
|
+
"band_more": "weitere",
|
|
17
|
+
"band_hint": "ausblenden:",
|
|
18
|
+
"band_ended_done": "fertig",
|
|
19
|
+
"band_ended_stopped": "gestoppt",
|
|
20
|
+
"band_verb_critic": "prüft",
|
|
21
|
+
"band_verb_reviewer": "gleicht den Diff ab mit",
|
|
22
|
+
"band_verb_planner": "plant",
|
|
23
|
+
"band_verb_clerk": "schreibt",
|
|
24
|
+
"band_verb_librarian": "pflegt",
|
|
25
|
+
"band_verb_archaeologist": "sucht Entscheidungen in",
|
|
26
|
+
"band_verb_other": "arbeitet an",
|
|
27
|
+
"band_step_reads": "liest",
|
|
28
|
+
"band_step_writes": "schreibt",
|
|
29
|
+
"band_step_edits": "bearbeitet",
|
|
30
|
+
"band_step_searches": "sucht",
|
|
31
|
+
"band_step_runs": "führt aus",
|
|
32
|
+
"band_step_web": "sucht im Web",
|
|
33
|
+
"band_step_vault": "fragt den Vault:",
|
|
34
|
+
"folders": {
|
|
35
|
+
"adr": {
|
|
36
|
+
"name": "ADRs",
|
|
37
|
+
"description": "Architecture Decision Records — wichtige technische Entscheidungen mit Kontext, geprüften Optionen und Konsequenzen."
|
|
38
|
+
},
|
|
39
|
+
"spec": {
|
|
40
|
+
"name": "Specs",
|
|
41
|
+
"description": "Normatives „Wie“ je Subsystem — ADR-Verweise, nummerierte Verhaltensverträge, Abnahme zusätzlich zu den abgedeckten Stories."
|
|
42
|
+
},
|
|
43
|
+
"epic": {
|
|
44
|
+
"name": "Epics",
|
|
45
|
+
"description": "Große Arbeitspakete, in Stories zerlegt. Jedes Epic hat einen eigenen Unterordner mit einem Verzeichnis `stories/`."
|
|
46
|
+
},
|
|
47
|
+
"research": {
|
|
48
|
+
"name": "Recherche",
|
|
49
|
+
"description": "Recherchenotizen — Untersuchungen, Spikes, Vergleiche und Erkenntnisse."
|
|
50
|
+
},
|
|
51
|
+
"concept": {
|
|
52
|
+
"name": "Konzepte",
|
|
53
|
+
"description": "Konzeptnotizen — Definitionen, mentale Modelle und Glossareinträge."
|
|
54
|
+
},
|
|
55
|
+
"meeting": {
|
|
56
|
+
"name": "Meetings",
|
|
57
|
+
"description": "Meeting-Notizen — mit dem Datum beginnende Protokolle von Diskussionen, Entscheidungen und Aufgaben."
|
|
58
|
+
},
|
|
59
|
+
"runbook": {
|
|
60
|
+
"name": "Betrieb",
|
|
61
|
+
"description": "Betriebs-Runbooks — Schritt-für-Schritt-Anleitungen mit Überprüfung und Rollback."
|
|
62
|
+
},
|
|
63
|
+
"diagram": {
|
|
64
|
+
"name": "Diagramme",
|
|
65
|
+
"description": "Architektur- und Ablaufdiagramme — Systemkontext, Sequenzen und Datenflüsse."
|
|
66
|
+
}
|
|
67
|
+
}
|
|
6
68
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# {{vault_name}}
|
|
2
|
+
|
|
3
|
+
Das Gedächtnis des Projekts: Entscheidungen, Specs, Epics und Stories als einfaches Markdown, gepflegt von projectstore.
|
|
4
|
+
|
|
5
|
+
## Ordner
|
|
6
|
+
|
|
7
|
+
| Ordner | Zweck |
|
|
8
|
+
|--------|-------|
|
|
9
|
+
{{folder_rows}}
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
*`kanban.md`, `graph.md` und `code-map.md` sind abgeleitete Ansichten: `reconcile` erzeugt sie aus den Dateien in diesen Ordnern neu.*
|
|
@@ -2,5 +2,67 @@
|
|
|
2
2
|
"statusline_no_work": "No epic or story in this session yet",
|
|
3
3
|
"statusline_state_error": "⚠ session state unreadable",
|
|
4
4
|
"statusline_example_epic": "Super Feature in a Super Product",
|
|
5
|
-
"statusline_example_story": "Toilet-Paper Handle"
|
|
5
|
+
"statusline_example_story": "Toilet-Paper Handle",
|
|
6
|
+
"band_this_session": "this session",
|
|
7
|
+
"band_pinned": "pinned",
|
|
8
|
+
"band_goal": "goal",
|
|
9
|
+
"band_story": "story",
|
|
10
|
+
"band_agent": "agent",
|
|
11
|
+
"band_done": "done",
|
|
12
|
+
"band_in_work": "in work",
|
|
13
|
+
"band_backlog": "backlog",
|
|
14
|
+
"band_stories": "stories",
|
|
15
|
+
"band_no_stories": "no stories yet",
|
|
16
|
+
"band_more": "more",
|
|
17
|
+
"band_hint": "hide:",
|
|
18
|
+
"band_ended_done": "done",
|
|
19
|
+
"band_ended_stopped": "stopped",
|
|
20
|
+
"band_verb_critic": "reviews",
|
|
21
|
+
"band_verb_reviewer": "checks the diff against",
|
|
22
|
+
"band_verb_planner": "plans",
|
|
23
|
+
"band_verb_clerk": "writes",
|
|
24
|
+
"band_verb_librarian": "curates",
|
|
25
|
+
"band_verb_archaeologist": "digs for decisions in",
|
|
26
|
+
"band_verb_other": "works on",
|
|
27
|
+
"band_step_reads": "reads",
|
|
28
|
+
"band_step_writes": "writes",
|
|
29
|
+
"band_step_edits": "edits",
|
|
30
|
+
"band_step_searches": "searches",
|
|
31
|
+
"band_step_runs": "runs",
|
|
32
|
+
"band_step_web": "searches the web",
|
|
33
|
+
"band_step_vault": "asks the vault:",
|
|
34
|
+
"folders": {
|
|
35
|
+
"adr": {
|
|
36
|
+
"name": "ADRs",
|
|
37
|
+
"description": "Architecture Decision Records — significant technical decisions with context, considered options, and consequences."
|
|
38
|
+
},
|
|
39
|
+
"spec": {
|
|
40
|
+
"name": "Specs",
|
|
41
|
+
"description": "Normative \"how\" per subsystem — ADR references, numbered behavioral contracts, acceptance additive to the covered stories."
|
|
42
|
+
},
|
|
43
|
+
"epic": {
|
|
44
|
+
"name": "Epics",
|
|
45
|
+
"description": "Large bodies of work broken into stories. Each epic gets its own subfolder with a `stories/` directory."
|
|
46
|
+
},
|
|
47
|
+
"research": {
|
|
48
|
+
"name": "Research",
|
|
49
|
+
"description": "Research notes — investigations, spikes, comparisons, and findings."
|
|
50
|
+
},
|
|
51
|
+
"concept": {
|
|
52
|
+
"name": "Concepts",
|
|
53
|
+
"description": "Concept notes — definitions, mental models, and glossary entries."
|
|
54
|
+
},
|
|
55
|
+
"meeting": {
|
|
56
|
+
"name": "Meetings",
|
|
57
|
+
"description": "Meeting notes — date-prefixed records of discussions, decisions, and action items."
|
|
58
|
+
},
|
|
59
|
+
"runbook": {
|
|
60
|
+
"name": "Ops",
|
|
61
|
+
"description": "Operational runbooks — step-by-step how-tos with verification and rollback."
|
|
62
|
+
},
|
|
63
|
+
"diagram": {
|
|
64
|
+
"name": "Diagrams",
|
|
65
|
+
"description": "Architecture and flow diagrams — system context, sequence, and data-flow visuals."
|
|
66
|
+
}
|
|
67
|
+
}
|
|
6
68
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# {{vault_name}}
|
|
2
|
+
|
|
3
|
+
The project's memory: decisions, specs, epics and stories as plain markdown, kept by projectstore.
|
|
4
|
+
|
|
5
|
+
## Folders
|
|
6
|
+
|
|
7
|
+
| Folder | Purpose |
|
|
8
|
+
|--------|---------|
|
|
9
|
+
{{folder_rows}}
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
*`kanban.md`, `graph.md` and `code-map.md` are derived views: `reconcile` regenerates them from the files in these folders.*
|
|
@@ -2,5 +2,67 @@
|
|
|
2
2
|
"statusline_no_work": "Aún no hay épica ni historia en esta sesión",
|
|
3
3
|
"statusline_state_error": "⚠ estado de sesión ilegible",
|
|
4
4
|
"statusline_example_epic": "Súper función en un súper producto",
|
|
5
|
-
"statusline_example_story": "Asa para el papel higiénico"
|
|
5
|
+
"statusline_example_story": "Asa para el papel higiénico",
|
|
6
|
+
"band_this_session": "esta sesión",
|
|
7
|
+
"band_pinned": "fijado",
|
|
8
|
+
"band_goal": "objetivo",
|
|
9
|
+
"band_story": "historia",
|
|
10
|
+
"band_agent": "agente",
|
|
11
|
+
"band_done": "hechas",
|
|
12
|
+
"band_in_work": "en curso",
|
|
13
|
+
"band_backlog": "pendientes",
|
|
14
|
+
"band_stories": "historias",
|
|
15
|
+
"band_no_stories": "aún no hay historias",
|
|
16
|
+
"band_more": "más",
|
|
17
|
+
"band_hint": "ocultar:",
|
|
18
|
+
"band_ended_done": "hecho",
|
|
19
|
+
"band_ended_stopped": "detenido",
|
|
20
|
+
"band_verb_critic": "revisa",
|
|
21
|
+
"band_verb_reviewer": "contrasta el diff con",
|
|
22
|
+
"band_verb_planner": "planifica",
|
|
23
|
+
"band_verb_clerk": "escribe",
|
|
24
|
+
"band_verb_librarian": "ordena",
|
|
25
|
+
"band_verb_archaeologist": "busca decisiones en",
|
|
26
|
+
"band_verb_other": "trabaja en",
|
|
27
|
+
"band_step_reads": "lee",
|
|
28
|
+
"band_step_writes": "escribe",
|
|
29
|
+
"band_step_edits": "edita",
|
|
30
|
+
"band_step_searches": "busca",
|
|
31
|
+
"band_step_runs": "ejecuta",
|
|
32
|
+
"band_step_web": "busca en la web",
|
|
33
|
+
"band_step_vault": "consulta el vault:",
|
|
34
|
+
"folders": {
|
|
35
|
+
"adr": {
|
|
36
|
+
"name": "ADR",
|
|
37
|
+
"description": "Registros de decisiones de arquitectura — decisiones técnicas relevantes con su contexto, las opciones consideradas y sus consecuencias."
|
|
38
|
+
},
|
|
39
|
+
"spec": {
|
|
40
|
+
"name": "Especificaciones",
|
|
41
|
+
"description": "El «cómo» normativo de cada subsistema — referencias a ADR, contratos de comportamiento numerados, aceptación adicional a la de las historias cubiertas."
|
|
42
|
+
},
|
|
43
|
+
"epic": {
|
|
44
|
+
"name": "Épicas",
|
|
45
|
+
"description": "Grandes bloques de trabajo divididos en historias. Cada épica tiene su propia subcarpeta con un directorio `stories/`."
|
|
46
|
+
},
|
|
47
|
+
"research": {
|
|
48
|
+
"name": "Investigación",
|
|
49
|
+
"description": "Notas de investigación — indagaciones, spikes, comparativas y conclusiones."
|
|
50
|
+
},
|
|
51
|
+
"concept": {
|
|
52
|
+
"name": "Conceptos",
|
|
53
|
+
"description": "Notas de conceptos — definiciones, modelos mentales y entradas de glosario."
|
|
54
|
+
},
|
|
55
|
+
"meeting": {
|
|
56
|
+
"name": "Reuniones",
|
|
57
|
+
"description": "Notas de reuniones — registros de debates, decisiones y tareas pendientes, con la fecha como prefijo."
|
|
58
|
+
},
|
|
59
|
+
"runbook": {
|
|
60
|
+
"name": "Operaciones",
|
|
61
|
+
"description": "Runbooks operativos — guías paso a paso con verificación y reversión."
|
|
62
|
+
},
|
|
63
|
+
"diagram": {
|
|
64
|
+
"name": "Diagramas",
|
|
65
|
+
"description": "Diagramas de arquitectura y de flujo — contexto del sistema, secuencias y flujos de datos."
|
|
66
|
+
}
|
|
67
|
+
}
|
|
6
68
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# {{vault_name}}
|
|
2
|
+
|
|
3
|
+
La memoria del proyecto: decisiones, especificaciones, épicas e historias en markdown plano, mantenida por projectstore.
|
|
4
|
+
|
|
5
|
+
## Carpetas
|
|
6
|
+
|
|
7
|
+
| Carpeta | Propósito |
|
|
8
|
+
|---------|-----------|
|
|
9
|
+
{{folder_rows}}
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
*`kanban.md`, `graph.md` y `code-map.md` son vistas derivadas: `reconcile` las regenera a partir de los archivos de estas carpetas.*
|
|
@@ -2,5 +2,67 @@
|
|
|
2
2
|
"statusline_no_work": "Ni epic ni story dans cette session pour l'instant",
|
|
3
3
|
"statusline_state_error": "⚠ état de session illisible",
|
|
4
4
|
"statusline_example_epic": "Super fonctionnalité dans un super produit",
|
|
5
|
-
"statusline_example_story": "Poignée pour papier toilette"
|
|
5
|
+
"statusline_example_story": "Poignée pour papier toilette",
|
|
6
|
+
"band_this_session": "cette session",
|
|
7
|
+
"band_pinned": "épinglé",
|
|
8
|
+
"band_goal": "objectif",
|
|
9
|
+
"band_story": "story",
|
|
10
|
+
"band_agent": "agent",
|
|
11
|
+
"band_done": "terminées",
|
|
12
|
+
"band_in_work": "en cours",
|
|
13
|
+
"band_backlog": "backlog",
|
|
14
|
+
"band_stories": "stories",
|
|
15
|
+
"band_no_stories": "pas encore de stories",
|
|
16
|
+
"band_more": "de plus",
|
|
17
|
+
"band_hint": "masquer :",
|
|
18
|
+
"band_ended_done": "terminé",
|
|
19
|
+
"band_ended_stopped": "arrêté",
|
|
20
|
+
"band_verb_critic": "relit",
|
|
21
|
+
"band_verb_reviewer": "confronte le diff à",
|
|
22
|
+
"band_verb_planner": "planifie",
|
|
23
|
+
"band_verb_clerk": "écrit",
|
|
24
|
+
"band_verb_librarian": "range",
|
|
25
|
+
"band_verb_archaeologist": "cherche des décisions dans",
|
|
26
|
+
"band_verb_other": "travaille sur",
|
|
27
|
+
"band_step_reads": "lit",
|
|
28
|
+
"band_step_writes": "écrit",
|
|
29
|
+
"band_step_edits": "modifie",
|
|
30
|
+
"band_step_searches": "cherche",
|
|
31
|
+
"band_step_runs": "exécute",
|
|
32
|
+
"band_step_web": "cherche sur le web",
|
|
33
|
+
"band_step_vault": "interroge le vault :",
|
|
34
|
+
"folders": {
|
|
35
|
+
"adr": {
|
|
36
|
+
"name": "ADR",
|
|
37
|
+
"description": "Architecture Decision Records — décisions techniques importantes, avec leur contexte, les options envisagées et leurs conséquences."
|
|
38
|
+
},
|
|
39
|
+
"spec": {
|
|
40
|
+
"name": "Spécifications",
|
|
41
|
+
"description": "Le « comment » normatif de chaque sous-système — références aux ADR, contrats de comportement numérotés, acceptation en plus de celle des stories couvertes."
|
|
42
|
+
},
|
|
43
|
+
"epic": {
|
|
44
|
+
"name": "Epics",
|
|
45
|
+
"description": "Grands ensembles de travail découpés en stories. Chaque epic a son propre sous-dossier avec un répertoire `stories/`."
|
|
46
|
+
},
|
|
47
|
+
"research": {
|
|
48
|
+
"name": "Recherche",
|
|
49
|
+
"description": "Notes de recherche — investigations, spikes, comparaisons et conclusions."
|
|
50
|
+
},
|
|
51
|
+
"concept": {
|
|
52
|
+
"name": "Concepts",
|
|
53
|
+
"description": "Notes de concepts — définitions, modèles mentaux et entrées de glossaire."
|
|
54
|
+
},
|
|
55
|
+
"meeting": {
|
|
56
|
+
"name": "Réunions",
|
|
57
|
+
"description": "Comptes rendus de réunion — notes préfixées par la date : discussions, décisions et actions à mener."
|
|
58
|
+
},
|
|
59
|
+
"runbook": {
|
|
60
|
+
"name": "Exploitation",
|
|
61
|
+
"description": "Runbooks d'exploitation — procédures pas à pas avec vérification et retour arrière."
|
|
62
|
+
},
|
|
63
|
+
"diagram": {
|
|
64
|
+
"name": "Diagrammes",
|
|
65
|
+
"description": "Diagrammes d'architecture et de flux — contexte du système, séquences et flux de données."
|
|
66
|
+
}
|
|
67
|
+
}
|
|
6
68
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# {{vault_name}}
|
|
2
|
+
|
|
3
|
+
La mémoire du projet : décisions, spécifications, epics et stories en markdown brut, tenue par projectstore.
|
|
4
|
+
|
|
5
|
+
## Dossiers
|
|
6
|
+
|
|
7
|
+
| Dossier | Rôle |
|
|
8
|
+
|---------|------|
|
|
9
|
+
{{folder_rows}}
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
*`kanban.md`, `graph.md` et `code-map.md` sont des vues dérivées : `reconcile` les régénère à partir des fichiers de ces dossiers.*
|
|
@@ -2,5 +2,67 @@
|
|
|
2
2
|
"statusline_no_work": "Эпик и стори ещё не в работе в этой сессии",
|
|
3
3
|
"statusline_state_error": "⚠ состояние сессии не читается",
|
|
4
4
|
"statusline_example_epic": "Супер-фича в супер-продукте",
|
|
5
|
-
"statusline_example_story": "Ручка для туалетной бумаги"
|
|
5
|
+
"statusline_example_story": "Ручка для туалетной бумаги",
|
|
6
|
+
"band_this_session": "эта сессия",
|
|
7
|
+
"band_pinned": "закреплён",
|
|
8
|
+
"band_goal": "цель",
|
|
9
|
+
"band_story": "стори",
|
|
10
|
+
"band_agent": "агент",
|
|
11
|
+
"band_done": "готово",
|
|
12
|
+
"band_in_work": "в работе",
|
|
13
|
+
"band_backlog": "бэклог",
|
|
14
|
+
"band_stories": "стори",
|
|
15
|
+
"band_no_stories": "стори пока нет",
|
|
16
|
+
"band_more": "ещё",
|
|
17
|
+
"band_hint": "скрыть:",
|
|
18
|
+
"band_ended_done": "готово",
|
|
19
|
+
"band_ended_stopped": "остановлен",
|
|
20
|
+
"band_verb_critic": "проверяет",
|
|
21
|
+
"band_verb_reviewer": "сверяет дифф с",
|
|
22
|
+
"band_verb_planner": "планирует",
|
|
23
|
+
"band_verb_clerk": "пишет",
|
|
24
|
+
"band_verb_librarian": "курирует",
|
|
25
|
+
"band_verb_archaeologist": "ищет решения в",
|
|
26
|
+
"band_verb_other": "работает над",
|
|
27
|
+
"band_step_reads": "читает",
|
|
28
|
+
"band_step_writes": "пишет",
|
|
29
|
+
"band_step_edits": "правит",
|
|
30
|
+
"band_step_searches": "ищет",
|
|
31
|
+
"band_step_runs": "запускает",
|
|
32
|
+
"band_step_web": "ищет в сети",
|
|
33
|
+
"band_step_vault": "спрашивает хранилище:",
|
|
34
|
+
"folders": {
|
|
35
|
+
"adr": {
|
|
36
|
+
"name": "ADR",
|
|
37
|
+
"description": "Записи архитектурных решений — значимые технические решения с контекстом, рассмотренными вариантами и последствиями."
|
|
38
|
+
},
|
|
39
|
+
"spec": {
|
|
40
|
+
"name": "Спецификации",
|
|
41
|
+
"description": "Нормативное «как» для каждой подсистемы — ссылки на ADR, пронумерованные контракты поведения, приёмка в дополнение к покрываемым стори."
|
|
42
|
+
},
|
|
43
|
+
"epic": {
|
|
44
|
+
"name": "Эпики",
|
|
45
|
+
"description": "Крупные блоки работы, разбитые на стори. У каждого эпика своя подпапка с каталогом `stories/`."
|
|
46
|
+
},
|
|
47
|
+
"research": {
|
|
48
|
+
"name": "Исследования",
|
|
49
|
+
"description": "Исследовательские заметки — изыскания, спайки, сравнения и выводы."
|
|
50
|
+
},
|
|
51
|
+
"concept": {
|
|
52
|
+
"name": "Концепции",
|
|
53
|
+
"description": "Заметки о концепциях — определения, ментальные модели и статьи глоссария."
|
|
54
|
+
},
|
|
55
|
+
"meeting": {
|
|
56
|
+
"name": "Встречи",
|
|
57
|
+
"description": "Заметки о встречах — записи обсуждений, решений и задач, с датой в начале имени файла."
|
|
58
|
+
},
|
|
59
|
+
"runbook": {
|
|
60
|
+
"name": "Эксплуатация",
|
|
61
|
+
"description": "Эксплуатационные ранбуки — пошаговые инструкции с проверкой и откатом."
|
|
62
|
+
},
|
|
63
|
+
"diagram": {
|
|
64
|
+
"name": "Диаграммы",
|
|
65
|
+
"description": "Диаграммы архитектуры и потоков — системный контекст, последовательности и потоки данных."
|
|
66
|
+
}
|
|
67
|
+
}
|
|
6
68
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# {{vault_name}}
|
|
2
|
+
|
|
3
|
+
Память проекта: решения, спецификации, эпики и стори в виде обычного markdown под управлением projectstore.
|
|
4
|
+
|
|
5
|
+
## Папки
|
|
6
|
+
|
|
7
|
+
| Папка | Назначение |
|
|
8
|
+
|-------|------------|
|
|
9
|
+
{{folder_rows}}
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
*`kanban.md`, `graph.md` и `code-map.md` — производные представления: `reconcile` пересобирает их из файлов в этих папках.*
|