claudeos-core 2.1.0 → 2.2.0
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/CHANGELOG.md +456 -0
- package/README.de.md +33 -39
- package/README.es.md +33 -39
- package/README.fr.md +33 -39
- package/README.hi.md +33 -39
- package/README.ja.md +33 -39
- package/README.ko.md +37 -43
- package/README.md +37 -43
- package/README.ru.md +35 -39
- package/README.vi.md +33 -39
- package/README.zh-CN.md +33 -39
- package/bin/commands/init.js +81 -45
- package/content-validator/index.js +6 -1
- package/lib/env-parser.js +317 -0
- package/lib/memory-scaffold.js +7 -5
- package/package.json +1 -1
- package/pass-prompts/templates/angular/pass3.md +28 -13
- package/pass-prompts/templates/common/claude-md-scaffold.md +644 -0
- package/pass-prompts/templates/common/pass3-footer.md +185 -0
- package/pass-prompts/templates/common/pass4.md +6 -3
- package/pass-prompts/templates/common/staging-override.md +1 -1
- package/pass-prompts/templates/java-spring/pass3.md +31 -21
- package/pass-prompts/templates/kotlin-spring/pass3.md +34 -22
- package/pass-prompts/templates/node-express/pass3.md +30 -21
- package/pass-prompts/templates/node-fastify/pass3.md +28 -14
- package/pass-prompts/templates/node-nestjs/pass3.md +29 -14
- package/pass-prompts/templates/node-nextjs/pass3.md +34 -21
- package/pass-prompts/templates/node-vite/pass3.md +30 -13
- package/pass-prompts/templates/python-django/pass3.md +32 -21
- package/pass-prompts/templates/python-fastapi/pass3.md +33 -21
- package/pass-prompts/templates/python-flask/pass3.md +31 -13
- package/pass-prompts/templates/vue-nuxt/pass3.md +32 -13
- package/plan-installer/index.js +8 -0
- package/plan-installer/prompt-generator.js +18 -1
- package/plan-installer/stack-detector.js +16 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,461 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.2.0] — 2026-04-21
|
|
4
|
+
|
|
5
|
+
Adds deterministic CLAUDE.md structure. Generated `CLAUDE.md` files now follow
|
|
6
|
+
an 8-section scaffold with fixed titles and order, driven by `pass-prompts/
|
|
7
|
+
templates/common/claude-md-scaffold.md`. Content within each section still
|
|
8
|
+
adapts to the project, but the structural skeleton no longer drifts between
|
|
9
|
+
projects or runs.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **`pass-prompts/templates/common/claude-md-scaffold.md`** (new, ~630 lines).
|
|
14
|
+
Single source of truth for CLAUDE.md structure. Defines the 8 sections
|
|
15
|
+
(Role Definition / Project Overview / Build & Run Commands / Core
|
|
16
|
+
Architecture / Directory Structure / Standard · Rules · Skills
|
|
17
|
+
Reference / DO NOT Read / Common Rules & Memory (L4); titles are
|
|
18
|
+
emitted in the project's output language), per-section generation
|
|
19
|
+
rules, dynamic substitution variables (`{PROJECT_NAME}`,
|
|
20
|
+
`{OUTPUT_LANG}`, `{PROJECT_CONTEXT}`), and a post-generation validation
|
|
21
|
+
checklist. Section 8 has TWO required sub-sections: a Common Rules
|
|
22
|
+
sub-section (meta-summary table of `paths: ["**/*"]` universal rules)
|
|
23
|
+
and an L4 Memory sub-section (memory file table + workflow). All 12 stack-specific Pass 3 prompts
|
|
24
|
+
now delegate CLAUDE.md structure to this scaffold and supply only
|
|
25
|
+
stack-specific hints (2-4 lines each).
|
|
26
|
+
|
|
27
|
+
- **`lib/env-parser.js`** (new). Parses `.env*` files into structured
|
|
28
|
+
`{port, host, apiTarget, vars, source}` used by stack-detector. Search
|
|
29
|
+
order prefers `.env.example` (committed, canonical) over local `.env`
|
|
30
|
+
variants. Port detection recognizes 16+ convention variable names across
|
|
31
|
+
Vite, Next.js, Nuxt, Angular, Node, and Python frameworks. Exposes
|
|
32
|
+
utilities (`parseEnvContent`, `extractPort`, `extractHost`,
|
|
33
|
+
`extractApiTarget`, `readStackEnvInfo`) plus a sensitive-variable
|
|
34
|
+
filter (`isSensitiveVarName`, `redactSensitiveVars`) that redacts
|
|
35
|
+
values of PASSWORD/SECRET/TOKEN/API_KEY/CREDENTIAL/PRIVATE_KEY-style
|
|
36
|
+
variables to a `***REDACTED***` sentinel before the vars map reaches
|
|
37
|
+
any downstream consumer. DATABASE_URL is whitelisted for
|
|
38
|
+
stack-detector back-compat. 39 unit tests in `tests/env-parser.test.js`
|
|
39
|
+
(30 core + 9 redaction).
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
|
|
43
|
+
- **All 12 Pass 3 prompts** (`angular/`, `java-spring/`, `kotlin-spring/`,
|
|
44
|
+
`node-express/`, `node-fastify/`, `node-nestjs/`, `node-nextjs/`,
|
|
45
|
+
`node-vite/`, `python-django/`, `python-fastapi/`, `python-flask/`,
|
|
46
|
+
`vue-nuxt/`). Two separate changes per file:
|
|
47
|
+
1. The previous 5-bullet CLAUDE.md generation block (`- Role definition`,
|
|
48
|
+
`- Build & Run Commands`, `- Core architecture diagram`, `- {stack item}`,
|
|
49
|
+
`- Standard/Skills/Guide reference table`) is replaced by a scaffold
|
|
50
|
+
reference plus stack-specific hints. The `CRITICAL — CLAUDE.md Reference
|
|
51
|
+
Table Completeness` warning above the block is also removed (the
|
|
52
|
+
scaffold's validation checklist supersedes it).
|
|
53
|
+
2. The `40.infra/*` `paths` frontmatter spec is split per-file. Previously
|
|
54
|
+
all three infra rules (environment-config, logging-monitoring, cicd-
|
|
55
|
+
deployment) received the same category-level `paths` value, which caused
|
|
56
|
+
the logging-monitoring rule to never auto-load on source code edits
|
|
57
|
+
(its `paths` only matched `.env`, `*.config.*`, `*.json`, `*.yml`,
|
|
58
|
+
`Dockerfile*` — none of which are source files). Per-file paths now
|
|
59
|
+
match each rule's actual guardrail target: environment-config → env/
|
|
60
|
+
config files, logging-monitoring → source code extensions (`.ts`/`.tsx`/
|
|
61
|
+
`.py`/`.java`/`.kt` per stack), cicd-deployment → CI YAML + source.
|
|
62
|
+
|
|
63
|
+
- **`pass-prompts/templates/common/pass3-footer.md`** — five new `CRITICAL`
|
|
64
|
+
blocks added:
|
|
65
|
+
- **`00.standard-reference.md` Composition**: scopes the mechanical
|
|
66
|
+
standards index strictly. REQUIRES a forward reference to
|
|
67
|
+
`claudeos-core/standard/00.core/04.doc-writing-guide.md` (generated
|
|
68
|
+
by Pass 4 but indexed at Pass 3 time to prevent a gap between passes).
|
|
69
|
+
FORBIDS a redundant "DO NOT Read / context waste" section inside
|
|
70
|
+
`00.standard-reference.md` — that information belongs solely in
|
|
71
|
+
CLAUDE.md Section 7, which is both more complete (includes project-
|
|
72
|
+
specific build-output and external-module paths) and not reloaded
|
|
73
|
+
on every edit. The 6 stacks (java-spring, kotlin-spring, node-express,
|
|
74
|
+
node-nextjs, python-django, python-fastapi) whose Pass 3 prompts
|
|
75
|
+
previously hardcoded a `## DO NOT Read` block in the reference file
|
|
76
|
+
have been cleaned up.
|
|
77
|
+
- **`.env` Is the Source of Truth for Runtime Configuration**: when
|
|
78
|
+
`pass2-merged.json` contains `stack.envInfo`, ports/hosts/API targets
|
|
79
|
+
declared in the project's `.env.example` MUST be used over framework
|
|
80
|
+
defaults. Affects Section 2's table, Section 3's inline run-command
|
|
81
|
+
comments, and any rule referencing port values (e.g., CORS origins
|
|
82
|
+
in auth rules).
|
|
83
|
+
- **Rule `paths` Must Match Rule Content**: enforces that each rule's
|
|
84
|
+
`paths` frontmatter matches the file types its guardrails actually
|
|
85
|
+
target. Explicitly prohibits copying `paths` across sibling rule files
|
|
86
|
+
in the same category, and tells the LLM to re-verify "when should
|
|
87
|
+
Claude Code auto-load this rule?" as the criterion for paths. Added
|
|
88
|
+
because a category-level paths shortcut in earlier Pass 3 prompts
|
|
89
|
+
caused the logging-monitoring rule to never match source code edits.
|
|
90
|
+
- **CLAUDE.md Scaffold Compliance**: enforces the 8-section structure at
|
|
91
|
+
generation time. Explicitly forbids adding sections with titles like
|
|
92
|
+
"Required to Observe While Working", "Rules Summary", "Documentation
|
|
93
|
+
Writing Rules", "AI Common Rules", "L4 Memory Integration Rules",
|
|
94
|
+
"Common Rules", or any title whose category meaning is "rules"
|
|
95
|
+
beyond the 8 fixed section names (the same blocklist is applied in
|
|
96
|
+
every output language, matching on the translated equivalents).
|
|
97
|
+
Adds a mandatory post-generation check (count `^## ` headings; must
|
|
98
|
+
equal 8; merge surplus into the correct section or move to `rules/*`
|
|
99
|
+
/ `standard/*`). The expanded blocklist closes a rename loophole
|
|
100
|
+
discovered during dogfooding on a Vite + React frontend project
|
|
101
|
+
where the LLM appended a §9 whose title combined "Documentation
|
|
102
|
+
Writing + AI Common Rules + Memory Layer (L4)" to collect
|
|
103
|
+
rule-related content.
|
|
104
|
+
- **CLAUDE.md Does Not Duplicate Rules**: clarifies that CLAUDE.md
|
|
105
|
+
describes structure, not enforcement. Lists four categories of content
|
|
106
|
+
that do NOT belong in CLAUDE.md (coding rules, domain-specific rules,
|
|
107
|
+
multi-file sync rules, work procedures) and points each to its proper
|
|
108
|
+
home in rules/standard/skills/guide.
|
|
109
|
+
|
|
110
|
+
- **`pass-prompts/templates/common/claude-md-scaffold.md`** (in addition to
|
|
111
|
+
the new-file Add above) was tightened after initial dogfooding:
|
|
112
|
+
- Hard constraints section now leads with **"EXACTLY 8 SECTIONS. No more,
|
|
113
|
+
no less."** plus a recovery procedure for surplus sections.
|
|
114
|
+
- Section 6 Rules sub-section explicitly notes that the
|
|
115
|
+
`.claude/rules/00.core/*` wildcard row already COVERS
|
|
116
|
+
`51.doc-writing-rules.md` and `52.ai-work-rules.md` — eliminating the
|
|
117
|
+
perceived need to create a separate section enumerating those rules.
|
|
118
|
+
- Validation checks section lists common surplus section patterns with
|
|
119
|
+
target destinations so the LLM can act rather than just detect.
|
|
120
|
+
|
|
121
|
+
- **`plan-installer/prompt-generator.js`** — embeds the scaffold inline
|
|
122
|
+
into `pass3-prompt.md` at generation time. The 12 stack-specific Pass 3
|
|
123
|
+
templates and `pass3-footer.md` both reference
|
|
124
|
+
`pass-prompts/templates/common/claude-md-scaffold.md` by path, but that
|
|
125
|
+
path is relative to the claudeos-core package, not the user project.
|
|
126
|
+
The generator now reads the scaffold and inserts it between the Phase 1
|
|
127
|
+
fact-table block and the stack-specific body, wrapped in explicit
|
|
128
|
+
`# === EMBEDDED: claude-md-scaffold.md ===` markers so the LLM can locate
|
|
129
|
+
it. Without this embed the scaffold references would point to a file
|
|
130
|
+
Claude Code cannot resolve at runtime. Load is optional (`existsSafe`)
|
|
131
|
+
so a missing scaffold does not crash generation — the rest of the
|
|
132
|
+
prompt is still produced, just without the deterministic structure
|
|
133
|
+
enforcement.
|
|
134
|
+
|
|
135
|
+
- **`plan-installer/stack-detector.js`** — now calls `readStackEnvInfo`
|
|
136
|
+
before returning and attaches the result as `stack.envInfo` on
|
|
137
|
+
project-analysis.json. When the project's `.env.example` (or fallback
|
|
138
|
+
`.env`) declares a port AND no earlier detector won (Spring Boot
|
|
139
|
+
application.yml still takes precedence), the parsed port is promoted
|
|
140
|
+
to `stack.port`. This closes a long-standing gap where Vite projects
|
|
141
|
+
that customized their dev port via `.env` (e.g., `VITE_DESKTOP_PORT=3000`)
|
|
142
|
+
received the framework-default 5173 in CLAUDE.md.
|
|
143
|
+
Host and API target values are also captured for downstream use.
|
|
144
|
+
|
|
145
|
+
- **`plan-installer/index.js`** — port resolution precedence documented
|
|
146
|
+
in code comments. The existing `defaultPort` fallback chain (Vite 5173,
|
|
147
|
+
Next.js 3000, Django 8000, etc.) is now explicitly labeled "last resort"
|
|
148
|
+
and runs only when neither stack-detector's direct detection (Spring
|
|
149
|
+
application.yml) nor the env-parser populated `stack.port`.
|
|
150
|
+
|
|
151
|
+
- **`pass-prompts/templates/common/claude-md-scaffold.md`** Section 2
|
|
152
|
+
(Project Overview) and Section 3 (Build & Run Commands) rules now
|
|
153
|
+
reference `stack.envInfo` as authoritative for port/host/API-target
|
|
154
|
+
values. Section 2 requires env-annotated rows in the project overview
|
|
155
|
+
table when the project declares them (e.g., `| Dev Server Port | 3000
|
|
156
|
+
(VITE_DESKTOP_PORT) |`), and Section 3 requires inline port comments
|
|
157
|
+
next to run commands to match the env-declared value. Framework defaults
|
|
158
|
+
are explicitly labeled "last resort" in both rules.
|
|
159
|
+
|
|
160
|
+
### Why this matters
|
|
161
|
+
|
|
162
|
+
When claudeos-core was applied to three sibling projects in the same
|
|
163
|
+
organization (one Spring Boot backend, two Vite + React frontends), the
|
|
164
|
+
generated files were content-correct — standards, rules, and skills
|
|
165
|
+
accurately captured each project's patterns — but the `CLAUDE.md` files
|
|
166
|
+
had different section counts (8, 8, 9), different section names, and
|
|
167
|
+
different section orders. Claude Code reads CLAUDE.md first on every
|
|
168
|
+
session; inconsistent structure across repos made it harder for
|
|
169
|
+
developers (and Claude Code) to know where to look for a given piece of
|
|
170
|
+
information. v2.2.0 fixes the structure while leaving content
|
|
171
|
+
project-specific.
|
|
172
|
+
|
|
173
|
+
The removed "Required to Observe While Working" section was a symptom
|
|
174
|
+
of the same problem: different projects put different rules there, most
|
|
175
|
+
of which duplicated
|
|
176
|
+
content already in `.claude/rules/*` (auto-loaded) or `claudeos-core/
|
|
177
|
+
standard/*` (detailed patterns). Removing it eliminates a redundant
|
|
178
|
+
maintenance surface and reinforces the "one rule, one home" principle.
|
|
179
|
+
|
|
180
|
+
Dogfooding also uncovered a latent paths bug. The `40.infra/*` rules
|
|
181
|
+
shared a single category-level `paths` frontmatter that only matched
|
|
182
|
+
config/infra file extensions (`.env`, `*.config.*`, `*.json`, `*.yml`,
|
|
183
|
+
`Dockerfile*`). This meant the logging-monitoring rule — whose guardrails
|
|
184
|
+
cover `console.log` misuse, PII in logs, and `catch {}` swallowing —
|
|
185
|
+
never auto-loaded when editing `.ts`/`.tsx`/`.py`/`.java` files, i.e.,
|
|
186
|
+
exactly when it was needed. The rule body was correct; its activation
|
|
187
|
+
trigger was mis-scoped. v2.2.0 now specifies per-file `paths` in the Pass
|
|
188
|
+
3 prompts and adds a `Rule paths Must Match Rule Content` CRITICAL block
|
|
189
|
+
to the footer so future rules cannot inherit the wrong scope by default.
|
|
190
|
+
|
|
191
|
+
A third dogfooding finding exposed a different layer of the same
|
|
192
|
+
philosophy violation. The stack detector parsed Spring Boot's
|
|
193
|
+
`application.yml` for `server.port`, but for Node/Vite projects it
|
|
194
|
+
simply used a hardcoded framework default (Vite → 5173) whenever no
|
|
195
|
+
Spring-style config was found — even when the project declared its
|
|
196
|
+
actual port in `.env.example` (e.g., `VITE_DESKTOP_PORT=3000`). This
|
|
197
|
+
meant CLAUDE.md's §2 table and §3 run-command
|
|
198
|
+
comments showed the Vite theoretical default instead of what the project
|
|
199
|
+
actually runs. The root cause was structural: the detector had no
|
|
200
|
+
`.env` parser beyond a DATABASE_URL check for DB identification. v2.2.0
|
|
201
|
+
introduces `lib/env-parser.js` with convention-aware port/host/API-target
|
|
202
|
+
extraction, and the scaffold and footer now treat `.env.example` as the
|
|
203
|
+
canonical source of runtime configuration — framework defaults are
|
|
204
|
+
last-resort only. This also captures host and API-target values that
|
|
205
|
+
previously never appeared in generated CLAUDE.md at all.
|
|
206
|
+
|
|
207
|
+
A fourth dogfooding iteration on a Spring Boot backend project
|
|
208
|
+
(regenerated with the interim v2.2.0 scaffold that only allowed a single
|
|
209
|
+
Section 8 titled "Memory (L4)") found the LLM producing a §9 titled
|
|
210
|
+
"Common Rules & Memory (L4)" — even with the expanded blocklist from
|
|
211
|
+
the earlier frontend-project fix.
|
|
212
|
+
The §9 contained both (a) a meta-summary table of `paths: ["**/*"]`
|
|
213
|
+
rules (51.doc-writing-rules + 52.ai-work-rules) and (b) a restated L4
|
|
214
|
+
memory table labeled "L4 Memory Files (Re-declaration)". Close
|
|
215
|
+
inspection showed (a) was genuinely useful content the scaffold had no
|
|
216
|
+
legitimate home for — a developer-facing summary of which rules
|
|
217
|
+
auto-load on every edit, complementary to Section 6's directory index.
|
|
218
|
+
The LLM kept inventing §9 because the information it wanted to convey
|
|
219
|
+
was real. v2.2.0 resolves this by promoting Section 8 to "Common Rules
|
|
220
|
+
& Memory (L4)" with two required sub-sections: one for common rules
|
|
221
|
+
auto-loaded on every edit (meta-summary only, not rule bodies) and one
|
|
222
|
+
for L4 memory referenced on-demand. This acknowledges that "which rules
|
|
223
|
+
auto-load universally" is a legitimate meta-information category that
|
|
224
|
+
deserves a visible home, while keeping the always-8-sections contract
|
|
225
|
+
intact. The duplicate §9 "re-declaration" anti-pattern is now
|
|
226
|
+
explicitly named and forbidden in both the scaffold
|
|
227
|
+
and the footer.
|
|
228
|
+
|
|
229
|
+
Finally, the same backend-project inspection also surfaced two smaller
|
|
230
|
+
but real bugs in `00.standard-reference.md` generation. First, 6 of the
|
|
231
|
+
12 Pass 3 stack prompts hardcoded a `## DO NOT Read (context waste)`
|
|
232
|
+
section at the bottom of the reference file — a shadow of CLAUDE.md
|
|
233
|
+
Section 7 that was less complete (missed project-specific paths like
|
|
234
|
+
`build/` or external modules) and lived at the wrong layer: `00.standard-
|
|
235
|
+
reference.md` reloads on every edit via `paths: ["**/*"]`, while
|
|
236
|
+
Section 7 loads once per session. Second, `claudeos-core/standard/00.
|
|
237
|
+
core/04.doc-writing-guide.md` is generated by Pass 4 (Required output
|
|
238
|
+
#12) but never appeared in the Pass 3-generated reference index, creating
|
|
239
|
+
a gap the moment Pass 4 ran. v2.2.0 adds a `00.standard-reference.md
|
|
240
|
+
Composition` CRITICAL block to the footer that codifies: (a) always
|
|
241
|
+
include the Pass 4 forward reference, (b) never include a DO NOT Read
|
|
242
|
+
section (Section 7 is the single source of truth), (c) keep the per-
|
|
243
|
+
edit payload minimal (paths only, no descriptions — descriptions live
|
|
244
|
+
in Section 6 which is session-time budget). The 6 inline hardcoded
|
|
245
|
+
DO NOT Read blocks have been removed from the stack prompts and
|
|
246
|
+
replaced with explicit inline notes pointing to the footer rule.
|
|
247
|
+
|
|
248
|
+
Three additional risks surfaced during pre-release cross-checking
|
|
249
|
+
and were addressed in the same release cycle. **First**, the scaffold's
|
|
250
|
+
"Section 6 Rules: Always include 60.memory/*" directive, added during
|
|
251
|
+
Section 8 redesign, was not echoed in the 12 stack Pass 3 prompts'
|
|
252
|
+
rule-category listings — so the LLM received conflicting signals
|
|
253
|
+
(scaffold says include, stack prompt doesn't mention it). Real dogfooding
|
|
254
|
+
on the backend project confirmed the category was being omitted from
|
|
255
|
+
the generated CLAUDE.md §6 Rules table. v2.2.0 fixes both sides: each stack
|
|
256
|
+
Pass 3 prompt now explicitly lists `60.memory/*` as a forward-reference
|
|
257
|
+
rule category (generated by Pass 4, but indexed at Pass 3 time), and the
|
|
258
|
+
scaffold's Sub-section 2 guidance is strengthened with an example row
|
|
259
|
+
and a "mandatory — do NOT omit" note. **Second**, the existing Migration
|
|
260
|
+
guidance mentioned `--force` but did not explain why `npx claudeos-core
|
|
261
|
+
init` (without `--force`) silently fails to adopt v2.2.0 improvements on
|
|
262
|
+
upgrades. Under Rule B idempotency, existing generated files are skipped
|
|
263
|
+
as "already exists", meaning users running plain `init` on a v2.1.x
|
|
264
|
+
project see no visible change. v2.2.0 adds (a) a dedicated "upgrade
|
|
265
|
+
detected" warning in bin/commands/init.js that fires when a pre-v2.2.0
|
|
266
|
+
CLAUDE.md is detected before the resume/fresh prompt, and (b) an expanded
|
|
267
|
+
Migration section in CHANGELOG that makes the `--force` requirement and
|
|
268
|
+
preservation semantics (memory/ content kept, generated files replaced)
|
|
269
|
+
explicit. **Third**, the new `.env.example` → CLAUDE.md pipeline created
|
|
270
|
+
a theoretical pathway for accidentally committed secrets in `.env.example`
|
|
271
|
+
to be amplified into the project's public-facing documentation. Although
|
|
272
|
+
`.env.example` is conventionally a placeholder file, real-world projects
|
|
273
|
+
occasionally check in real values by mistake. v2.2.0 adds a
|
|
274
|
+
sensitive-variable filter (`lib/env-parser.js`: `isSensitiveVarName`,
|
|
275
|
+
`redactSensitiveVars`) that replaces values of variables matching
|
|
276
|
+
PASSWORD/SECRET/TOKEN/API_KEY/CREDENTIAL/PRIVATE_KEY patterns with a
|
|
277
|
+
`***REDACTED***` sentinel before the vars map reaches any downstream
|
|
278
|
+
consumer. Port/host/API-target extraction uses a whitelist of
|
|
279
|
+
config-relevant keys and is unaffected. The scaffold also gains an
|
|
280
|
+
explicit SECURITY directive forbidding reference to sensitive variables
|
|
281
|
+
in CLAUDE.md as defense-in-depth. `DATABASE_URL` remains unredacted
|
|
282
|
+
because stack-detector's DB identification path has depended on it since
|
|
283
|
+
v1.x — changing that would be a breaking change.
|
|
284
|
+
|
|
285
|
+
### Migration
|
|
286
|
+
|
|
287
|
+
Existing projects keep working. The prompt-generator change affects only
|
|
288
|
+
how `pass3-prompt.md` is assembled on the next `init` or `refresh` run —
|
|
289
|
+
installed standards, rules, skills, memory, and CLAUDE.md in existing
|
|
290
|
+
projects are not touched until the user regenerates.
|
|
291
|
+
|
|
292
|
+
**⚠️ Important: `--force` is REQUIRED to adopt v2.2.0 improvements.**
|
|
293
|
+
|
|
294
|
+
claudeos-core's Pass 3 runs under Rule B (idempotency): if a target file
|
|
295
|
+
already exists on disk, it is skipped during regeneration. This is
|
|
296
|
+
designed to protect hand-edited content from being overwritten, but it
|
|
297
|
+
means **a plain `npx claudeos-core init` on an existing v2.1.x project
|
|
298
|
+
will NOT apply v2.2.0 improvements** because the old files (CLAUDE.md,
|
|
299
|
+
`00.standard-reference.md`, `40.infra/*-rules.md`, memory rules, etc.)
|
|
300
|
+
will all be skipped as "already exists".
|
|
301
|
+
|
|
302
|
+
To actually adopt v2.2.0's improvements (8-section CLAUDE.md, per-file
|
|
303
|
+
`40.infra/*` paths, `.env.example`-based port accuracy, Section 8
|
|
304
|
+
redesign, forward-referenced `04.doc-writing-guide.md`, `60.memory/*`
|
|
305
|
+
row), regenerate via:
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
npx claudeos-core init --force
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
`--force` overwrites existing generated files while leaving untouched:
|
|
312
|
+
- Your source code
|
|
313
|
+
- `claudeos-core/memory/` content (decision-log, failure-patterns entries
|
|
314
|
+
you've accumulated) — these are append-only and preserved
|
|
315
|
+
- Any non-generated files under the project root
|
|
316
|
+
|
|
317
|
+
If you want to preview changes first, regenerate into a scratch copy of
|
|
318
|
+
the project, diff the resulting files against your current ones, and
|
|
319
|
+
then decide whether to `--force` on the real project. Key files to
|
|
320
|
+
diff: `CLAUDE.md`, `.claude/rules/00.core/00.standard-reference.md`,
|
|
321
|
+
`.claude/rules/40.infra/02.logging-monitoring-rules.md` (paths change
|
|
322
|
+
is the most visible delta).
|
|
323
|
+
|
|
324
|
+
No manual edits are required after `--force`; the scaffold handles
|
|
325
|
+
everything. Hand-edited content in `claudeos-core/standard/**` that
|
|
326
|
+
you want preserved should be committed to version control before
|
|
327
|
+
running `--force` so you can diff/merge any overwrites.
|
|
328
|
+
|
|
329
|
+
### Notes
|
|
330
|
+
|
|
331
|
+
- 39 new tests added in `tests/env-parser.test.js` (30 core + 9 sensitive-
|
|
332
|
+
variable redaction). All tests continue to pass: **563 pre-existing + 39
|
|
333
|
+
new = 602 total**.
|
|
334
|
+
- No file-format breaking changes. Existing `claudeos-core/standard/`,
|
|
335
|
+
`.claude/rules/`, and `claudeos-core/skills/` content in installed
|
|
336
|
+
projects is unaffected — only the CLAUDE.md generated at the project
|
|
337
|
+
root changes shape on regeneration. The `40.infra/*` rule `paths`
|
|
338
|
+
values will update on next regeneration, which changes when those
|
|
339
|
+
rules auto-load (more accurately scoped); the rule content itself
|
|
340
|
+
does not change. `stack.envInfo` is a new additive field — older
|
|
341
|
+
project-analysis.json files without it still work.
|
|
342
|
+
- Discovered via dogfooding on three real production projects:
|
|
343
|
+
- Structural drift (3 different CLAUDE.md layouts) prompted the scaffold.
|
|
344
|
+
- A Vite + React frontend project produced a §9 surplus section under
|
|
345
|
+
a renamed title that bypassed the initial forbidden-sections blocklist
|
|
346
|
+
— fixed by expanding the blocklist and adding the mandatory
|
|
347
|
+
post-generation §-count check.
|
|
348
|
+
- The `40.infra/*` paths mismatch surfaced when inspecting a generated
|
|
349
|
+
`02.logging-monitoring-rules.md` and confirming via grep that its
|
|
350
|
+
guardrails (source-code-level: PII logging, silent swallow, console
|
|
351
|
+
use) could never auto-load given the file's own paths frontmatter
|
|
352
|
+
(config-only).
|
|
353
|
+
- The Vite port mismatch (5173 in CLAUDE.md when `.env.example`
|
|
354
|
+
declared 3000) exposed the absence of any `.env` parsing in
|
|
355
|
+
stack-detector beyond DATABASE_URL — prompted the new
|
|
356
|
+
`lib/env-parser.js` utility and the `.env Is the Source of Truth`
|
|
357
|
+
CRITICAL footer block.
|
|
358
|
+
- A second Spring Boot backend regeneration against the interim
|
|
359
|
+
scaffold produced §9 "Common Rules & Memory (L4)" despite the
|
|
360
|
+
expanded blocklist, because the LLM's desired content (a
|
|
361
|
+
meta-summary of `paths: ["**/*"]` universal rules, complementary to
|
|
362
|
+
Section 6's directory index) had no legitimate home in the original
|
|
363
|
+
8-section design. Resolved by redesigning Section 8 into two
|
|
364
|
+
sub-sections — a Common Rules sub-section for the universal-rules
|
|
365
|
+
meta-summary and an L4 Memory sub-section for the memory
|
|
366
|
+
table/workflow. The "L4 Memory Files (Re-declaration)" anti-pattern
|
|
367
|
+
(duplicate memory table inside a second section) is now explicitly
|
|
368
|
+
named and forbidden.
|
|
369
|
+
- Inspection of the same backend-project output showed a generated
|
|
370
|
+
`00.standard-reference.md` carrying a hardcoded `## DO NOT Read
|
|
371
|
+
(context waste)` section (a partial duplicate of CLAUDE.md Section 7)
|
|
372
|
+
and missing `00.core/04.doc-writing-guide.md` (created later by
|
|
373
|
+
Pass 4). Fixed in the 6 affected Pass 3 stack prompts and formalized
|
|
374
|
+
as the `00.standard-reference.md Composition` CRITICAL block so
|
|
375
|
+
future stacks cannot reintroduce either defect.
|
|
376
|
+
- Pre-release cross-check found the scaffold's `60.memory/*` "Always
|
|
377
|
+
include" directive was not mirrored in any of the 12 stack Pass 3
|
|
378
|
+
prompts' rule-category listings, causing the backend project's
|
|
379
|
+
CLAUDE.md §6 Rules table to omit `60.memory/*` entirely. Fixed by adding the
|
|
380
|
+
forward-reference row to all 12 stack prompts and strengthening the
|
|
381
|
+
scaffold's Sub-section 2 guidance with an example row and "mandatory"
|
|
382
|
+
wording.
|
|
383
|
+
- Pre-release cross-check flagged that a plain `npx claudeos-core init`
|
|
384
|
+
on an existing v2.1.x project would silently skip v2.2.0 improvements
|
|
385
|
+
under Rule B idempotency. Added a CLAUDE.md marker-based detection
|
|
386
|
+
in `bin/commands/init.js` that warns about the `--force` requirement
|
|
387
|
+
before the resume/fresh prompt, plus an expanded Migration section
|
|
388
|
+
covering preservation semantics and preview workflow.
|
|
389
|
+
- Pre-release cross-check identified that values in `.env.example`
|
|
390
|
+
flow through to CLAUDE.md, creating a leak pathway for accidentally
|
|
391
|
+
committed secrets. Added sensitive-variable redaction in
|
|
392
|
+
`lib/env-parser.js` (PASSWORD/SECRET/TOKEN/API_KEY/CREDENTIAL/
|
|
393
|
+
PRIVATE_KEY patterns replaced with `***REDACTED***` sentinel) plus
|
|
394
|
+
a SECURITY directive in the scaffold as defense-in-depth.
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## [2.1.2] — 2026-04-21
|
|
399
|
+
|
|
400
|
+
Post-release regression fix for v2.1.0 master plan removal cleanup.
|
|
401
|
+
|
|
402
|
+
### Fixed
|
|
403
|
+
|
|
404
|
+
- **`content-validator`: `plan/` directory no longer required.** On fresh
|
|
405
|
+
v2.1.0+ projects `npx claudeos-core health` always failed because
|
|
406
|
+
`content-validator/index.js` pushed a `MISSING: plan directory not found`
|
|
407
|
+
error when `claudeos-core/plan/` was absent. Master plan generation was
|
|
408
|
+
explicitly removed in v2.1.0 — `plan-validator` (v2.1.0 `Fixed`) and
|
|
409
|
+
`manifest-generator` (v2.1.0 `Fixed`) were both updated to tolerate a
|
|
410
|
+
missing `plan/` directory, but `content-validator` was missed during
|
|
411
|
+
that cleanup. It now silently skips the plan/ check when the directory
|
|
412
|
+
is absent (with an informational `plan/ not present (expected post-v2.1.0)`
|
|
413
|
+
log line), matching the contract established by the other validators.
|
|
414
|
+
The directory contents are still validated when present (legacy projects
|
|
415
|
+
or user-authored plan files are unaffected).
|
|
416
|
+
|
|
417
|
+
### Notes
|
|
418
|
+
|
|
419
|
+
- All 563 existing tests continue to pass. No new tests added — the fix
|
|
420
|
+
is a one-line behavior change (`errors.push(...)` → `console.log(...)`)
|
|
421
|
+
with a comment documenting the v2.1.0 context, and regression risk is
|
|
422
|
+
covered by routine `health` runs rather than an integration test.
|
|
423
|
+
- Discovered via dogfooding on a real Vite 6 + React 19 project: 62
|
|
424
|
+
generated files, all Pass 1–4 stages succeeded, but `health` failed
|
|
425
|
+
at content-validator. No other cleanup gaps found.
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## [2.1.1] — 2026-04-20
|
|
430
|
+
|
|
431
|
+
Docs-only maintenance release. No runtime behavior or API changes.
|
|
432
|
+
|
|
433
|
+
### Changed
|
|
434
|
+
|
|
435
|
+
- **README: dropped `What's New in v2.1.0` section** from all 10 language
|
|
436
|
+
READMEs (`README.md`, `README.ko.md`, `README.ja.md`, `README.zh-CN.md`,
|
|
437
|
+
`README.es.md`, `README.vi.md`, `README.hi.md`, `README.ru.md`,
|
|
438
|
+
`README.fr.md`, `README.de.md`). Post-release cleanup — the section's
|
|
439
|
+
job is done once the release ships, and the same content is preserved
|
|
440
|
+
in `CHANGELOG.md` for anyone who wants the historical detail.
|
|
441
|
+
|
|
442
|
+
- **README: dropped the `Real production case: 18-domain admin frontend
|
|
443
|
+
(2026-04-20)` subsection** under _Auto-scaling by Project Size_ across
|
|
444
|
+
all 10 language READMEs. The per-stage breakdown table (9 rows) and its
|
|
445
|
+
surrounding prose are removed. The trailing empirical reference in the
|
|
446
|
+
FAQ "What is Pass 3 split mode" answer (the `Empirically verified up
|
|
447
|
+
to 18 domains × 101 files × 102 minutes …` sentence with its now-dead
|
|
448
|
+
link) is also removed so no orphan reference remains.
|
|
449
|
+
|
|
450
|
+
### Notes
|
|
451
|
+
|
|
452
|
+
- Each README drops ~33 lines; total net change across translations is
|
|
453
|
+
~330 lines removed. No code, tests, prompts, or generated artifacts
|
|
454
|
+
are touched — `npm pack` contents are identical to v2.1.0 apart from
|
|
455
|
+
the README files and `package.json`/`package-lock.json` version bump.
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
3
459
|
## [2.1.0] — 2026-04-20
|
|
4
460
|
|
|
5
461
|
This release addresses the primary cause of `Prompt is too long` failures in
|
package/README.de.md
CHANGED
|
@@ -12,20 +12,6 @@ ClaudeOS-Core liest Ihre Codebasis, extrahiert jedes Muster, das es findet, und
|
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
-
## Neuerungen in v2.1.0
|
|
16
|
-
|
|
17
|
-
v2.1.0 architektiert Pass 3 neu, um `Prompt is too long`-Fehler bei mittleren bis großen Projekten zu eliminieren. Zuvor musste ein einzelner Pass-3-Aufruf den gesamten Dokumentationsbaum in einem Rutsch ausgeben — Dutzende von Dateien über `CLAUDE.md`, Rules, Standards, Skills und Guides hinweg — und der akkumulierte Output überschritt ab ca. 5 Domains zuverlässig das Context-Fenster. Die Lösung ist strukturell, kein Prompt-Tuning:
|
|
18
|
-
|
|
19
|
-
- **Pass 3 Split-Mode** (immer aktiv) — Pass 3 wird in sequenzielle `claude -p`-Aufrufe aufgeteilt (`3a` → `3b-core` → `3b-N` → `3c-core` → `3c-N` → `3d-aux`). Jede Stage startet mit einem **frischen Context-Fenster**, sodass Output-Akkumulations-Overflows unabhängig von der Projektgröße strukturell unmöglich sind.
|
|
20
|
-
- **Fact Sheet zwischen Stages** — Stage `3a` liest die Pass-2-Analyse einmal und destilliert sie in ein 5–10 KB großes `pass3a-facts.md`. Alle späteren Stages referenzieren diese Fact Sheet anstatt die 100–500 KB große `pass2-merged.json` neu zu lesen, wodurch die Konsistenz über Dateien und frische Contexts hinweg erhalten bleibt.
|
|
21
|
-
- **Batch-Unterteilung** (automatisch ab 16 Domains) — Stages 3b/3c werden zusätzlich in Batches von je 15 Domains aufgeteilt, sodass jede Stage unter ~50 Ausgabedateien bleibt. Ein 18-Domain-Admin-Frontend (React 19 + Vite 6) läuft in **102 Minuten mit 101 generierten Dateien über 8 Stages durch, null Overflow-Fehler** (echter Produktionslauf, 2026-04-20).
|
|
22
|
-
- **Master-Plan-Generierung entfernt** — `claudeos-core/plan/*-master.md`-Dateien werden nicht mehr generiert. Master Plans waren ein internes Backup, das Claude Code zur Laufzeit nicht konsumierte, und ihre Aggregation in Pass 3d war ein primärer Overflow-Auslöser. Verwenden Sie stattdessen `git` für Backup/Restore.
|
|
23
|
-
- **Pass 4 Gap-Fill: `skills/00.shared/MANIFEST.md`** — Wenn Pass 3c das Skill-Register auslässt (skill-spärliche Projekte), erstellt Pass 4 jetzt automatisch einen Stub, damit `.claude/rules/50.sync/03.skills-sync.md` niemals auf eine nicht existierende Datei zeigt.
|
|
24
|
-
|
|
25
|
-
Ein paar kleinere Fixes: `memory --help` zeigt nun die Memory-Subcommand-Hilfe an (zuvor wurde die Top-Level-Hilfe gezeigt); `memory score` hinterlässt keine doppelten `importance`-Zeilen mehr; die `memory compact`-Summary-Marker sind jetzt korrekte Markdown-Listenelemente. Volle Details: [CHANGELOG.md](./CHANGELOG.md).
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
15
|
## Warum ClaudeOS-Core?
|
|
30
16
|
|
|
31
17
|
Jedes andere Claude-Code-Tool funktioniert so:
|
|
@@ -99,10 +85,20 @@ Dieser Unterschied summiert sich. 10 Aufgaben/Tag × 20 Minuten gespart = **übe
|
|
|
99
85
|
| **Vite / React SPA** | `package.json`, `vite.config.*` | 9 Kategorien, 55 Unterpunkte |
|
|
100
86
|
| **Angular** | `package.json`, `angular.json` | 12 Kategorien, 78 Unterpunkte |
|
|
101
87
|
|
|
102
|
-
Automatisch erkannt: Sprache und Version, Framework und Version (einschließlich Vite als SPA-Framework), ORM (MyBatis, JPA, Exposed, Prisma, TypeORM, SQLAlchemy usw.), Datenbank (PostgreSQL, MySQL, Oracle, MongoDB, SQLite), Paketmanager (Gradle, Maven, npm, yarn, pnpm, pip, poetry), Architektur (CQRS, BFF — aus Modulnamen), Multi-Modul-Struktur (aus settings.gradle), Monorepo (Turborepo, pnpm-workspace, Lerna, npm/yarn workspaces).
|
|
88
|
+
Automatisch erkannt: Sprache und Version, Framework und Version (einschließlich Vite als SPA-Framework), ORM (MyBatis, JPA, Exposed, Prisma, TypeORM, SQLAlchemy usw.), Datenbank (PostgreSQL, MySQL, Oracle, MongoDB, SQLite), Paketmanager (Gradle, Maven, npm, yarn, pnpm, pip, poetry), Architektur (CQRS, BFF — aus Modulnamen), Multi-Modul-Struktur (aus settings.gradle), Monorepo (Turborepo, pnpm-workspace, Lerna, npm/yarn workspaces), **Laufzeitkonfiguration aus `.env.example`** (v2.2.0 — extrahiert port/host/API-target aus über 16 Konventions-Variablennamen in den Frameworks Vite · Next.js · Nuxt · Angular · Node · Python).
|
|
103
89
|
|
|
104
90
|
**Sie geben nichts an. Alles wird automatisch erkannt.**
|
|
105
91
|
|
|
92
|
+
### `.env`-basierte Laufzeitkonfiguration (v2.2.0)
|
|
93
|
+
|
|
94
|
+
v2.2.0 fügt `lib/env-parser.js` hinzu, damit die generierte `CLAUDE.md` widerspiegelt, was das Projekt tatsächlich deklariert, statt Framework-Defaults.
|
|
95
|
+
|
|
96
|
+
- **Suchreihenfolge**: `.env.example` (kanonisch, committet) → `.env.local.example` → `.env.sample` → `.env.template` → `.env` → `.env.local` → `.env.development`. Die `.example`-Variante gewinnt, weil sie die entwickler-neutrale Shape-of-Truth ist, nicht die lokalen Overrides eines einzelnen Contributors.
|
|
97
|
+
- **Erkannte Port-Variablen-Konventionen**: `VITE_PORT` / `VITE_DEV_PORT` / `VITE_DESKTOP_PORT` / `NEXT_PUBLIC_PORT` / `NUXT_PORT` / `NG_PORT` / `APP_PORT` / `SERVER_PORT` / `HTTP_PORT` / `DEV_PORT` / `FLASK_RUN_PORT` / `UVICORN_PORT` / `DJANGO_PORT` / generisches `PORT`. Framework-spezifische Namen gewinnen gegenüber dem generischen `PORT`, wenn beide vorhanden sind.
|
|
98
|
+
- **Host & API-Target**: `VITE_DEV_HOST` / `VITE_API_TARGET` / `NEXT_PUBLIC_API_URL` / `NUXT_PUBLIC_API_BASE` / `BACKEND_URL` / `PROXY_TARGET` usw.
|
|
99
|
+
- **Priorität**: Spring Boots `application.yml` `server.port` gewinnt weiterhin (framework-native Config), dann der in `.env` deklarierte Port, dann der Framework-Default (Vite 5173, Next.js 3000, Django 8000 usw.) als letzte Rückfall-Option.
|
|
100
|
+
- **Redaction sensibler Variablen**: Werte von Variablen, die den Mustern `PASSWORD` / `SECRET` / `TOKEN` / `API_KEY` / `ACCESS_KEY` / `PRIVATE_KEY` / `CREDENTIAL` / `JWT_SECRET` / `CLIENT_SECRET` / `SESSION_SECRET` / `BEARER` / `SALT` entsprechen, werden durch `***REDACTED***` ersetzt, bevor sie einen nachgelagerten Generator erreichen. Defense-in-Depth gegen versehentlich committed Secrets in `.env.example`. `DATABASE_URL` ist explizit auf der Allowlist für die Stack-Detector-DB-Identifikations-Back-Compat.
|
|
101
|
+
|
|
106
102
|
### Java-Domain-Erkennung (5 Muster mit Fallback)
|
|
107
103
|
|
|
108
104
|
| Priorität | Muster | Struktur | Beispiel |
|
|
@@ -378,7 +374,7 @@ cat claudeos-core/generated/pass4-prompt.md \
|
|
|
378
374
|
|
|
379
375
|
**Verifikation:** `claudeos-core/memory/` sollte 4 Dateien enthalten (`decision-log.md`, `failure-patterns.md`, `compaction.md`, `auto-rule-update.md`), `.claude/rules/60.memory/` sollte 4 Rule-Dateien enthalten, und `CLAUDE.md` sollte einen angehängten Abschnitt `## Memory (L4)` haben. Marker: `claudeos-core/generated/pass4-memory.json`.
|
|
380
376
|
|
|
381
|
-
> **v2.1.0 Gap-Fill:** Pass 4 stellt zudem sicher, dass `claudeos-core/skills/00.shared/MANIFEST.md` existiert. Wenn Pass 3c die Datei ausgelassen hat (möglich bei skill-spärlichen Projekten, weil die Stack-`pass3.md`-Templates `MANIFEST.md` unter den Generierungszielen listen, aber nicht als REQUIRED markieren), erzeugt das Gap-Fill einen minimalen Stub, damit `.claude/rules/50.sync/
|
|
377
|
+
> **v2.1.0 Gap-Fill:** Pass 4 stellt zudem sicher, dass `claudeos-core/skills/00.shared/MANIFEST.md` existiert. Wenn Pass 3c die Datei ausgelassen hat (möglich bei skill-spärlichen Projekten, weil die Stack-`pass3.md`-Templates `MANIFEST.md` unter den Generierungszielen listen, aber nicht als REQUIRED markieren), erzeugt das Gap-Fill einen minimalen Stub, damit `.claude/rules/50.sync/02.skills-sync.md` (v2.2.0-Pfad — die Anzahl der Sync-Regeln wurde von 3 auf 2 reduziert, was `03` war, ist jetzt `02`) stets ein gültiges Referenzziel hat. Idempotent: wird übersprungen, wenn die Datei bereits echten Inhalt hat (>20 Zeichen).
|
|
382
378
|
|
|
383
379
|
> **Hinweis:** Wenn `claude -p` fehlschlägt oder `pass4-prompt.md` fehlt, fällt die automatisierte Pipeline auf ein statisches Scaffold über `lib/memory-scaffold.js` zurück (mit Claude-getriebener Übersetzung, wenn `--lang` nicht-englisch ist). Der statische Fallback läuft nur innerhalb von `npx claudeos-core init` — der manuelle Modus erfordert, dass Pass 4 erfolgreich ist.
|
|
384
380
|
|
|
@@ -488,6 +484,8 @@ Das Pass-3-Prompt-Template enthält zudem einen **Phase-1-Block „Read Once, Ex
|
|
|
488
484
|
- **Rule D** — Output-Knappheit: eine Zeile (`[WRITE]`/`[SKIP]`) zwischen Datei-Schreibvorgängen, keine Wiederholung der Fact-Tabelle, kein Echoing des Datei-Inhalts.
|
|
489
485
|
- **Rule E** — Batch-Idempotenz-Prüfung: ein `Glob` zu PHASE-2-Beginn statt Per-Target-`Read`-Aufrufe.
|
|
490
486
|
|
|
487
|
+
In **v2.2.0** bettet Pass 3 zusätzlich ein deterministisches CLAUDE.md-Scaffold (`pass-prompts/templates/common/claude-md-scaffold.md`) inline in den Prompt ein. Dies fixiert die Titel und die Reihenfolge der 8 obersten Abschnitte, sodass die generierte `CLAUDE.md` nicht mehr zwischen Projekten drifted, während der Inhalt jedes Abschnitts sich weiterhin an jedes Projekt anpasst. Der neue `.env`-Parser des Stack-Detectors (`lib/env-parser.js`) liefert `stack.envInfo` an den Prompt, sodass Port/Host/API-Target-Zeilen mit dem übereinstimmen, was das Projekt tatsächlich deklariert, statt mit Framework-Defaults.
|
|
488
|
+
|
|
491
489
|
**Pass 4** baut die L4-Memory-Schicht auf: persistente Team-Wissensdateien (decision-log, failure-patterns, Compaction-Policy, auto-rule-update) plus die `60.memory/`-Regeln, die zukünftigen Sessions mitteilen, wann und wie diese Dateien gelesen/geschrieben werden sollen. Die Memory-Schicht ist das, was Claude Code erlaubt, Lehren über Sessions hinweg anzusammeln, anstatt sie jedes Mal neu zu entdecken. Wenn `--lang` nicht-englisch ist, wird der statische Fallback-Inhalt über Claude übersetzt, bevor er geschrieben wird. v2.1.0 fügt ein Gap-Fill für `skills/00.shared/MANIFEST.md` hinzu, falls Pass 3c es ausgelassen hat.
|
|
492
490
|
|
|
493
491
|
---
|
|
@@ -497,7 +495,7 @@ Das Pass-3-Prompt-Template enthält zudem einen **Phase-1-Block „Read Once, Ex
|
|
|
497
495
|
```
|
|
498
496
|
your-project/
|
|
499
497
|
│
|
|
500
|
-
├── CLAUDE.md ← Claude-Code-Einstiegspunkt
|
|
498
|
+
├── CLAUDE.md ← Claude-Code-Einstiegspunkt (deterministische 8-Abschnitt-Struktur, v2.2.0)
|
|
501
499
|
│
|
|
502
500
|
├── .claude/
|
|
503
501
|
│ └── rules/ ← Glob-getriggerte Regeln
|
|
@@ -591,24 +589,6 @@ Stage-Anzahl-Formel (bei aktivierter Batch-Teilung): `1 (3a) + 1 (3b-core) + N (
|
|
|
591
589
|
|
|
592
590
|
Pass 4 (Memory-Scaffolding) fügt je nach Ausführungspfad (Claude-getriebene Generierung oder statischer Fallback) ~30 Sekunden bis 5 Minuten hinzu. Für Multi-Stack-Projekte (z. B. Java + React) werden Backend- und Frontend-Domains zusammen gezählt. Ein Projekt mit 6 Backend- + 4 Frontend-Domains = 10 gesamt = Stufe Mittel.
|
|
593
591
|
|
|
594
|
-
### Reale Produktions-Fallstudie: 18-Domain-Admin-Frontend (2026-04-20)
|
|
595
|
-
|
|
596
|
-
Ein React-19- + Vite-6- + TypeScript-Admin-Frontend mit 18 Domains und 6 Domain-Gruppen lief End-to-End in **102 Minuten mit 101 generierten Dateien** durch. Stage-Aufschlüsselung:
|
|
597
|
-
|
|
598
|
-
| Stage | Dateien | Zeit | Dateien/min |
|
|
599
|
-
|---|---|---|---|
|
|
600
|
-
| `3a` (Fakten-Extraktion) | 1 (`pass3a-facts.md`) | 8m 44s | — |
|
|
601
|
-
| `3b-core` (CLAUDE.md + gemeinsam) | 24 | 22m 10s | 1,1 |
|
|
602
|
-
| `3b-1` (15 Domains) | 30 | 10m 6s | **3,0** |
|
|
603
|
-
| `3b-2` (3 Domains) | 6 | 4m 34s | 1,3 |
|
|
604
|
-
| `3c-core` (Guides + geteilt) | 11 | 8m 31s | 1,3 |
|
|
605
|
-
| `3c-1` (15 Domains) | 8 | 5m 11s | **1,5** |
|
|
606
|
-
| `3c-2` (3 Domains) | 3 | 3m 50s | 0,8 |
|
|
607
|
-
| `3d-aux` (database + mcp) | 3 | 2m 52s | 1,0 |
|
|
608
|
-
| Pass 4 | 12 | 5m 36s | 2,1 |
|
|
609
|
-
|
|
610
|
-
Der Durchsatz ist bei den batched Domain-Stages deutlich höher (3b-1: 3,0 Dateien/min vs. 3b-core: 1,1 Dateien/min), weil Stages mit frischem Context von engen, wiederholbaren Per-Domain-Mustern profitieren. Verifikation komplett grün: `plan-validator`, `sync-checker`, `content-validator`, `pass-json-validator` — null Overflow-Fehler, null Abschneidungen.
|
|
611
|
-
|
|
612
592
|
---
|
|
613
593
|
|
|
614
594
|
## Verifikations-Tools
|
|
@@ -811,8 +791,7 @@ Nein. Es erstellt nur `CLAUDE.md`, `.claude/rules/` und `claudeos-core/`. Ihr be
|
|
|
811
791
|
Es ruft `claude -p` mehrfach über die 4 Passes hinweg auf. Im v2.1.0-Split-Mode expandiert allein Pass 3 je nach Projektgröße in 4–14+ Stages (siehe [Auto-Scaling](#auto-scaling-nach-projektgröße)). Ein typisches kleines Projekt (1–15 Domains) verwendet insgesamt 8–9 `claude -p`-Aufrufe; ein 18-Domain-Projekt 11; ein 60-Domain-Projekt 15–17. Jede Stage läuft mit einem frischen Context-Fenster — die Token-Kosten pro Aufruf sind sogar niedriger als beim früheren Single-Call-Pass-3, weil keine Stage den gesamten Datei-Baum in einem Context halten muss. Wenn `--lang` nicht-englisch ist, kann der statische Fallback-Pfad einige zusätzliche `claude -p`-Aufrufe für Übersetzungen auslösen; Ergebnisse werden in `claudeos-core/generated/.i18n-cache-<lang>.json` gecacht, sodass nachfolgende Läufe sie wiederverwenden. Das liegt im Rahmen der normalen Claude-Code-Nutzung.
|
|
812
792
|
|
|
813
793
|
**F: Was ist der Pass-3-Split-Mode und warum wurde er in v2.1.0 eingeführt?**
|
|
814
|
-
Vor v2.1.0 führte Pass 3 einen einzigen `claude -p`-Aufruf aus, der den gesamten generierten Datei-Baum (`CLAUDE.md`, Standards, Rules, Skills, Guides — typischerweise 30–60 Dateien) in einer Antwort ausgeben musste. Das funktionierte bei kleinen Projekten, traf aber bei ca. 5 Domains zuverlässig auf `Prompt is too long`-Output-Akkumulations-Fehler. Der Fehler war nicht aus der Input-Größe vorhersagbar — er hing davon ab, wie ausführlich jede generierte Datei ausfiel, und konnte dasselbe Projekt intermittierend treffen. Der Split-Mode umgeht das Problem strukturell: Pass 3 wird in sequenzielle Stages aufgeteilt (`3a` → `3b-core` → `3b-N` → `3c-core` → `3c-N` → `3d-aux`), jede ein separater `claude -p`-Aufruf mit frischem Context-Fenster. Die Konsistenz über Stages hinweg wird durch `pass3a-facts.md` erhalten, eine 5–10 KB große destillierte Fact Sheet, die jede spätere Stage referenziert, anstatt `pass2-merged.json` erneut zu lesen. Der `pass3-complete.json`-Marker trägt ein `groupsCompleted`-Array, sodass ein Crash während `3c-2` ab `3c-2` fortgesetzt wird (nicht ab `3a`), was doppelte Token-Kosten vermeidet.
|
|
815
|
-
|
|
794
|
+
Vor v2.1.0 führte Pass 3 einen einzigen `claude -p`-Aufruf aus, der den gesamten generierten Datei-Baum (`CLAUDE.md`, Standards, Rules, Skills, Guides — typischerweise 30–60 Dateien) in einer Antwort ausgeben musste. Das funktionierte bei kleinen Projekten, traf aber bei ca. 5 Domains zuverlässig auf `Prompt is too long`-Output-Akkumulations-Fehler. Der Fehler war nicht aus der Input-Größe vorhersagbar — er hing davon ab, wie ausführlich jede generierte Datei ausfiel, und konnte dasselbe Projekt intermittierend treffen. Der Split-Mode umgeht das Problem strukturell: Pass 3 wird in sequenzielle Stages aufgeteilt (`3a` → `3b-core` → `3b-N` → `3c-core` → `3c-N` → `3d-aux`), jede ein separater `claude -p`-Aufruf mit frischem Context-Fenster. Die Konsistenz über Stages hinweg wird durch `pass3a-facts.md` erhalten, eine 5–10 KB große destillierte Fact Sheet, die jede spätere Stage referenziert, anstatt `pass2-merged.json` erneut zu lesen. Der `pass3-complete.json`-Marker trägt ein `groupsCompleted`-Array, sodass ein Crash während `3c-2` ab `3c-2` fortgesetzt wird (nicht ab `3a`), was doppelte Token-Kosten vermeidet.
|
|
816
795
|
**F: Soll ich die generierten Dateien in Git committen?**
|
|
817
796
|
Ja, empfohlen. Ihr Team kann dieselben Claude-Code-Standards teilen. Erwägen Sie, `claudeos-core/generated/` in `.gitignore` aufzunehmen (Analyse-JSON ist regenerierbar).
|
|
818
797
|
|
|
@@ -867,7 +846,14 @@ Nichts erforderlich — v2.1.0-Tools ignorieren `plan/`, wenn es fehlt oder leer
|
|
|
867
846
|
|
|
868
847
|
```
|
|
869
848
|
pass-prompts/templates/
|
|
870
|
-
├── common/ #
|
|
849
|
+
├── common/ # gemeinsame header/footer + pass4 + staging-override + CLAUDE.md scaffold (v2.2.0)
|
|
850
|
+
│ ├── header.md # Rolle + Ausgabeformat-Direktive (alle Passes)
|
|
851
|
+
│ ├── pass3-footer.md # Post-Pass-3 health-check-Anweisung + 5 CRITICAL Guardrail-Blöcke (v2.2.0)
|
|
852
|
+
│ ├── pass3-phase1.md # „Read Once, Extract Facts"-Block mit Rules A-E (v2.1.0)
|
|
853
|
+
│ ├── pass4.md # Memory-Scaffolding-Prompt (v2.0.0)
|
|
854
|
+
│ ├── staging-override.md # Leitet .claude/rules/**-Schreibvorgänge auf .staged-rules/** um (v2.0.0)
|
|
855
|
+
│ ├── claude-md-scaffold.md # Deterministische 8-Abschnitt-CLAUDE.md-Vorlage (v2.2.0)
|
|
856
|
+
│ └── lang-instructions.json # Ausgabedirektiven pro Sprache (10 Sprachen)
|
|
871
857
|
├── java-spring/ # Java / Spring Boot
|
|
872
858
|
├── kotlin-spring/ # Kotlin / Spring Boot (CQRS, BFF, multi-module)
|
|
873
859
|
├── node-express/ # Node.js / Express
|
|
@@ -884,6 +870,8 @@ pass-prompts/templates/
|
|
|
884
870
|
|
|
885
871
|
`plan-installer` erkennt Ihren Stack/Ihre Stacks automatisch und setzt dann typ-spezifische Prompts zusammen. NestJS, Vue/Nuxt, Vite SPA und Flask verwenden jeweils dedizierte Templates mit framework-spezifischen Analyse-Kategorien (z. B. `@Module`/`@Injectable`/Guards für NestJS; `<script setup>`/Pinia/useFetch für Vue; Client-Side-Routing/`VITE_`-Env für Vite; Blueprint/`app.factory`/Flask-SQLAlchemy für Flask). Für Multi-Stack-Projekte werden separate `pass1-backend-prompt.md` und `pass1-frontend-prompt.md` generiert, während `pass3-prompt.md` die Generierungsziele beider Stacks kombiniert. In v2.1.0 wird dem Pass-3-Template `common/pass3-phase1.md` (der „Read Once, Extract Facts"-Block mit Rules A–E) vorangestellt, bevor es pro Split-Mode-Stage zugeschnitten wird. Pass 4 verwendet unabhängig vom Stack das gemeinsame `common/pass4.md`-Template (Memory-Scaffolding).
|
|
886
872
|
|
|
873
|
+
**In v2.2.0** bettet der Pass-3-Prompt zusätzlich `common/claude-md-scaffold.md` (die deterministische 8-Abschnitt-CLAUDE.md-Vorlage) inline zwischen dem phase1-Block und dem stack-spezifischen Körper ein — dies fixiert die Abschnittsstruktur, sodass generierte CLAUDE.md nicht zwischen Projekten abweichen, während der Inhalt weiterhin projektspezifisch angepasst wird. Vorlagen werden **English-first** geschrieben; die Sprachinjektion aus `lang-instructions.json` weist das LLM an, Abschnittstitel und Fließtext zum Emit-Zeitpunkt in die Zielausgabesprache zu übersetzen.
|
|
874
|
+
|
|
887
875
|
---
|
|
888
876
|
|
|
889
877
|
## Monorepo-Unterstützung
|
|
@@ -970,6 +958,12 @@ my-monorepo/ ← Hier ausführen: npx claudeos-core init
|
|
|
970
958
|
|
|
971
959
|
**„CLAUDEOS_SKIP_TRANSLATION=1 is set but --lang='ko' requires translation" InitError (v2.0.0)** — Sie haben die Test-only-Env-Var `CLAUDEOS_SKIP_TRANSLATION=1` in Ihrer Shell gesetzt (wahrscheinlich ein Rest aus CI-/Test-Setup) UND eine nicht-englische `--lang` gewählt. Diese Env-Var short-circuit den Übersetzungs-Pfad, von dem Pass 4's statischer Fallback und Gap-Fill für nicht-englischen Output abhängen. `init` erkennt den Konflikt beim Sprachwahl-Zeitpunkt und bricht sofort ab (anstatt mitten in Pass 4 mit einem verwirrenden verschachtelten Fehler zu crashen). Fix: Entweder `unset CLAUDEOS_SKIP_TRANSLATION` vor dem Ausführen oder `npx claudeos-core init --lang en` verwenden.
|
|
972
960
|
|
|
961
|
+
**Warnung "⚠️ v2.2.0 upgrade detected" (v2.2.0)** — Deine existierende `CLAUDE.md` wurde mit einer Pre-v2.2.0-Version generiert. Die Standard-Resume-Mode-Regeneration wird existierende Dateien unter Rule B idempotency überspringen, daher werden die strukturellen Verbesserungen von v2.2.0 (8-Abschnitt-CLAUDE.md-Scaffold, Per-File-Paths in `40.infra/*`, `.env.example`-basierte Port-Genauigkeit, Section-8-Redesign mit `Common Rules & Memory (L4)` (neu gestaltet mit zwei Unterabschnitten: Common Rules · L4 Memory), `60.memory/*`-Rule-Zeile, forward-referenced `04.doc-writing-guide.md`) NICHT angewendet. Fix: Mit `npx claudeos-core init --force` erneut ausführen. Das überschreibt generierte Dateien (`CLAUDE.md`, `.claude/rules/`, `claudeos-core/standard/`, `claudeos-core/skills/`, `claudeos-core/guide/`) und bewahrt dabei `claudeos-core/memory/` (akkumulierte decision-log-, failure-patterns-Einträge — append-only). Committe das Projekt vorher, wenn du die Überschreibungen vor dem Akzeptieren diff-en möchtest.
|
|
962
|
+
|
|
963
|
+
**Port in CLAUDE.md weicht von `.env.example` ab (v2.2.0)** — Der neue `.env`-Parser des Stack-Detectors (`lib/env-parser.js`) liest zuerst `.env.example` (kanonisch, committed), dann `.env`-Varianten als Fallback. Erkannte Port-Variablen: `PORT`, `VITE_PORT`, `VITE_DESKTOP_PORT`, `NEXT_PUBLIC_PORT`, `NUXT_PORT`, `DJANGO_PORT` usw. Für Spring Boot hat `server.port` aus `application.yml` weiterhin Vorrang vor `.env` (framework-native Config gewinnt). Wenn dein Projekt einen ungewöhnlichen Env-Variablennamen verwendet, benenne ihn auf eine anerkannte Konvention um oder stelle eine Issue-Anfrage zur Erweiterung von `PORT_VAR_KEYS`. Framework-Defaults (Vite 5173, Next.js 3000, Django 8000) werden nur verwendet, wenn sowohl direkte Detection als auch `.env` still bleiben.
|
|
964
|
+
|
|
965
|
+
**Secret-Werte als `***REDACTED***` in generierten Docs (v2.2.0)** — Erwartetes Verhalten. Der `.env`-Parser von v2.2.0 redact-iert automatisch Werte von Variablen, die den Mustern `PASSWORD`/`SECRET`/`TOKEN`/`API_KEY`/`CREDENTIAL`/`PRIVATE_KEY` entsprechen, bevor sie irgendeinen Generator erreichen. Das ist Defense-in-Depth gegen versehentlich in `.env.example` committed Secrets. `DATABASE_URL` bleibt unverändert für Stack-Detector-DB-Identifikations-Back-Compat. Wenn du irgendwo in der generierten `CLAUDE.md` `***REDACTED***` siehst, ist das ein Bug — redact-ierte Werte sollten nicht in der Tabelle landen; bitte erstelle eine Issue. Nicht-sensible Runtime-Config (Port, Host, API Target, NODE_ENV usw.) kommt unverändert durch.
|
|
966
|
+
|
|
973
967
|
---
|
|
974
968
|
|
|
975
969
|
## Mitwirken
|
|
@@ -979,7 +973,7 @@ Beiträge sind willkommen! Bereiche, in denen Hilfe am meisten benötigt wird:
|
|
|
979
973
|
- **Neue Stack-Templates** — Ruby/Rails, Go (Gin/Fiber/Echo), PHP (Laravel/Symfony), Rust (Axum/Actix), Svelte/SvelteKit, Remix
|
|
980
974
|
- **IDE-Integration** — VS-Code-Extension, IntelliJ-Plugin
|
|
981
975
|
- **CI/CD-Templates** — GitLab CI, CircleCI, Jenkins-Beispiele (GitHub Actions bereits ausgeliefert — siehe `.github/workflows/test.yml`)
|
|
982
|
-
- **Testabdeckung** — Erweiterung der Test-Suite (derzeit
|
|
976
|
+
- **Testabdeckung** — Erweiterung der Test-Suite (derzeit 602 Tests über 30 Test-Dateien, die Scanner, Stack-Erkennung, Domain-Grouping, Plan-Parsing, Prompt-Generierung, CLI-Selectors, Monorepo-Erkennung, Vite-SPA-Erkennung, Verifikations-Tools, L4-Memory-Scaffold, Pass-2-Resume-Validierung, Pass-3-Guards 1/2/3 (H1-Sentinel + H2-BOM-aware-Empty-File + strikter Stale-Marker-Unlink), Pass-3-Split-Mode-Batch-Unterteilung, Pass-3-Partial-Marker-Resume (v2.1.0), Pass-4-Marker-Content-Validierung + Stale-Marker-Unlink-Striktheit + scaffoldSkillsManifest-Gap-Fill (v2.1.0), Translation-Env-Skip-Guard + Early-Fail-Fast + CI-Workflow, staged-rules-Move, lang-aware-Translation-Fallback, Master-Plan-Removal-Regressions-Suite (v2.1.0), Memory-Score/Compact-Formatting-Regression (v2.1.0) und AI-Work-Rules-Template-Struktur und `.env`-Parser Port/Host/API-Target-Extraktion + Redaction sensibler Variablen (v2.2.0) abdecken)
|
|
983
977
|
|
|
984
978
|
Siehe [`CONTRIBUTING.md`](./CONTRIBUTING.md) für die vollständige Liste der Bereiche, den Code-Style, die Commit-Konvention und die Schritt-für-Schritt-Anleitung zum Hinzufügen eines neuen Stack-Templates.
|
|
985
979
|
|