codexspec 0.7.15__tar.gz → 0.7.16__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {codexspec-0.7.15 → codexspec-0.7.16}/PKG-INFO +1 -1
  2. {codexspec-0.7.15 → codexspec-0.7.16}/pyproject.toml +1 -1
  3. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/__init__.py +1 -1
  4. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/distill.md +7 -7
  5. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/onboard.md +1 -1
  6. {codexspec-0.7.15 → codexspec-0.7.16}/.gitignore +0 -0
  7. {codexspec-0.7.15 → codexspec-0.7.16}/LICENSE +0 -0
  8. {codexspec-0.7.15 → codexspec-0.7.16}/README.md +0 -0
  9. {codexspec-0.7.15 → codexspec-0.7.16}/codexspec-icon.svg +0 -0
  10. {codexspec-0.7.15 → codexspec-0.7.16}/codexspec-logo-dark.svg +0 -0
  11. {codexspec-0.7.15 → codexspec-0.7.16}/codexspec-logo-light.svg +0 -0
  12. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/bash/check-i18n-completeness.sh +0 -0
  13. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/bash/check-i18n-structure.sh +0 -0
  14. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/bash/check-prerequisites.sh +0 -0
  15. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/bash/common.sh +0 -0
  16. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/bash/create-new-feature.sh +0 -0
  17. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/bash/review-context.sh +0 -0
  18. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/powershell/check-prerequisites.ps1 +0 -0
  19. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/powershell/common.ps1 +0 -0
  20. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/powershell/create-new-feature.ps1 +0 -0
  21. {codexspec-0.7.15 → codexspec-0.7.16}/scripts/powershell/review-context.ps1 +0 -0
  22. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/automation.py +0 -0
  23. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/blueprint.py +0 -0
  24. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/commands/__init__.py +0 -0
  25. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/commands/installer.py +0 -0
  26. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/i18n.py +0 -0
  27. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/idea.md +0 -0
  28. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/integrations/__init__.py +0 -0
  29. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/integrations/base.py +0 -0
  30. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/integrations/claude.py +0 -0
  31. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/integrations/codex.py +0 -0
  32. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/profile.py +0 -0
  33. {codexspec-0.7.15 → codexspec-0.7.16}/src/codexspec/translator.py +0 -0
  34. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/analyze.md +0 -0
  35. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/auto-dev.md +0 -0
  36. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/blueprint.md +0 -0
  37. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/checklist.md +0 -0
  38. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/clarify.md +0 -0
  39. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/commit-staged.md +0 -0
  40. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/config.md +0 -0
  41. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/constitution.md +0 -0
  42. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/debug.md +0 -0
  43. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/evolve.md +0 -0
  44. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/generate-spec.md +0 -0
  45. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/implement-tasks.md +0 -0
  46. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/plan-to-tasks.md +0 -0
  47. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/pr.md +0 -0
  48. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/quick.md +0 -0
  49. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/release-notes.md +0 -0
  50. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/reverse-spec.md +0 -0
  51. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/review-code.md +0 -0
  52. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/review-design.md +0 -0
  53. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/review-plan.md +0 -0
  54. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/review-spec.md +0 -0
  55. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/review-tasks.md +0 -0
  56. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/spec-to-design.md +0 -0
  57. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/spec-to-plan.md +0 -0
  58. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/specify.md +0 -0
  59. {codexspec-0.7.15 → codexspec-0.7.16}/templates/commands/tasks-to-issues.md +0 -0
  60. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/checklist-template.md +0 -0
  61. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/constitution-template.md +0 -0
  62. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/design-template.md +0 -0
  63. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/plan-template-detailed.md +0 -0
  64. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/plan-template-simple.md +0 -0
  65. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/requirements-template.md +0 -0
  66. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/spec-template-detailed.md +0 -0
  67. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/spec-template-simple.md +0 -0
  68. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/tasks-template-detailed.md +0 -0
  69. {codexspec-0.7.15 → codexspec-0.7.16}/templates/docs/tasks-template-simple.md +0 -0
  70. {codexspec-0.7.15 → codexspec-0.7.16}/templates/translations/de.json +0 -0
  71. {codexspec-0.7.15 → codexspec-0.7.16}/templates/translations/en.json +0 -0
  72. {codexspec-0.7.15 → codexspec-0.7.16}/templates/translations/es.json +0 -0
  73. {codexspec-0.7.15 → codexspec-0.7.16}/templates/translations/fr.json +0 -0
  74. {codexspec-0.7.15 → codexspec-0.7.16}/templates/translations/ja.json +0 -0
  75. {codexspec-0.7.15 → codexspec-0.7.16}/templates/translations/ko.json +0 -0
  76. {codexspec-0.7.15 → codexspec-0.7.16}/templates/translations/pt-BR.json +0 -0
  77. {codexspec-0.7.15 → codexspec-0.7.16}/templates/translations/zh-CN.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codexspec
3
- Version: 0.7.15
3
+ Version: 0.7.16
4
4
  Summary: CodexSpec - A Requirements-First SDD toolkit for Claude Code
5
5
  Project-URL: Homepage, https://github.com/Zts0hg/codexspec
6
6
  Project-URL: Repository, https://github.com/Zts0hg/codexspec
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "codexspec"
3
- version = "0.7.15"
3
+ version = "0.7.16"
4
4
  description = "CodexSpec - A Requirements-First SDD toolkit for Claude Code"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -58,7 +58,7 @@ from .profile import ensure_profile_scaffold, inject_profile_block
58
58
  from .translator import SUPPORTED_LANGUAGES, translate
59
59
 
60
60
  # Version info
61
- __version__ = "0.7.15"
61
+ __version__ = "0.7.16"
62
62
  __author__ = "CodexSpec Team"
63
63
 
64
64
  # Constitution file path constants
@@ -55,7 +55,7 @@ Apply this boundary test to every candidate: **"Would a single feature's `requir
55
55
 
56
56
  ## The profile store: `.codexspec/profile/`
57
57
 
58
- Six **category directories**, each holding **one record per file** (`<id>.md`) with **only current-effective** knowledge — dense, with no "retired" section (git history is the ledger). One-file-per-record is deliberate: parallel feature branches each add differently-named files, so distilled knowledge merges without conflict. Create the directory and record file on first write.
58
+ Six **category directories**, each holding **one record per file** (`<id>.md`, or `<id>-<slug>.md` — see the `id` rule below) with **only current-effective** knowledge — dense, with no "retired" section (git history is the ledger). One-file-per-record is deliberate: parallel feature branches each add differently-named files, so distilled knowledge merges without conflict. Create the directory and record file on first write.
59
59
 
60
60
  - `constraints/` — negative constraints (`严禁 / 仅允许`). These carry the **highest** weight and MUST be honored first.
61
61
  - `conventions/` — positive cross-feature conventions / steering.
@@ -70,7 +70,7 @@ There is **no** `facts/` category — a bare fact with no "therefore do X" is ei
70
70
 
71
71
  Every record MUST separate the distilled claim from the evidence it rests on:
72
72
 
73
- - `id` — **type letter + full source-feature id + local sequence**, e.g. `P-2026-0812-14054p-1` or `Con-2026-0812-14054p-1`. It is **both** the record's `### <id>: <title>` heading **and its filename** (`pitfalls/P-2026-0812-14054p-1.md`). The **source-feature id** is the distilling feature's full spec-dir id `{YYYY-MMDD-HHMM}{rr}` (e.g. `2026-0812-14054p`); it is globally unique by the timestamp+random scheme spec directories use, so records distilled on parallel feature branches never collide on id **or filename** (they merge with no conflict). Keep the **full** id (not a short tail) so the record is self-describing: the date supports recency/staleness reading, and the feature id ties the record to its originating change for decision context and scope. When distilling with no feature context, generate a fresh `{YYYY-MMDD-HHMM}{rr}` id now (same convention as create-new-feature). **Never** use a bare sequential id such as `P-001` — those collide across parallel branches.
73
+ - `id` — **type letter + full source-feature id + local sequence**, e.g. `P-2026-0812-14054p-1` or `Con-2026-0812-14054p-1`. The `### <id>: <title>` heading keeps the bare id; the **filename** is `<id>-<slug>.md`, where the **slug** is a semantic suffix derived from the record title: lowercase ASCII letters and digits with hyphens as separators (`^[a-z0-9]+(-[a-z0-9]+)*$`, no leading/trailing hyphen), at most 50 characters, rendered in English when the title is not ASCII. When no meaningful slug can be derived, write the legacy bare form `<id>.md` — both forms are valid store members. The slug never enters the id, the heading, or `[[id]]` links, and never participates in uniqueness. Locating a record from its id stays mechanical: the record's file is exactly the one named `<id>.md` or the one named `<id>-<slug>.md`; because the slug admits only `[a-z0-9-]`, no other filename can begin with `<id>` followed by `-` or `.`, so a lookup by id is unambiguous even when one sequence number is a digit-prefix of another. The **source-feature id** is the distilling feature's full spec-dir id `{YYYY-MMDD-HHMM}{rr}` (e.g. `2026-0812-14054p`); it is globally unique by the timestamp+random scheme spec directories use, so records distilled on parallel feature branches never collide on id **or filename** (they merge with no conflict) — uniqueness is carried entirely by the id. Keep the **full** id (not a short tail) so the record is self-describing: the date supports recency/staleness reading, and the feature id ties the record to its originating change for decision context and scope. When distilling with no feature context, generate a fresh `{YYYY-MMDD-HHMM}{rr}` id now (same convention as create-new-feature). **Never** use a bare sequential id such as `P-001` — those collide across parallel branches.
74
74
  - `claim` — one-sentence reusable **summary** (a title line, not the actionable body — for a `pitfall` the usable content lives in the three body parts below, not in this sentence).
75
75
  - `type` — `convention` | `constraint` | `pitfall` | `decision` | `strategy` | `runbook` (`constraint` = highest priority).
76
76
  - `scope/when` — natural-language applicability condition (e.g. "when editing Python code"); omit for global. **No formal syntax.**
@@ -105,7 +105,7 @@ If you cannot state these parts, the strategy or runbook is not yet worth record
105
105
 
106
106
  This separation is what makes a later error locatable as **misread** (facts wrong) vs **overreach** (claim over-generalized) vs **stale** (state no longer holds).
107
107
 
108
- Example — a `convention` (claim + evidence is enough), file `conventions/Con-2026-0809-2219gg-1.md`:
108
+ Example — a `convention` (claim + evidence is enough), file `conventions/Con-2026-0809-2219gg-1-prefer-absolute-imports.md`:
109
109
 
110
110
  ```markdown
111
111
  ### Con-2026-0809-2219gg-1: Prefer absolute imports
@@ -118,7 +118,7 @@ Example — a `convention` (claim + evidence is enough), file `conventions/Con-2
118
118
  - status: vetted
119
119
  ```
120
120
 
121
- Example — a `pitfall` (note the required `root-cause` / `workaround` / `lesson` body), file `pitfalls/P-2026-0810-1330ab-1.md`:
121
+ Example — a `pitfall` (note the required `root-cause` / `workaround` / `lesson` body), file `pitfalls/P-2026-0810-1330ab-1-re-sub-string-replacement-corruption.md`:
122
122
 
123
123
  ```markdown
124
124
  ### P-2026-0810-1330ab-1: `re.sub` with a string replacement corrupts blocks containing backslashes
@@ -134,7 +134,7 @@ Example — a `pitfall` (note the required `root-cause` / `workaround` / `lesson
134
134
  - status: candidate
135
135
  ```
136
136
 
137
- Example — a `strategy` (note the `trigger` / `action` body), file `strategies/S-2026-0813-1606fz-1.md`:
137
+ Example — a `strategy` (note the `trigger` / `action` body), file `strategies/S-2026-0813-1606fz-1-suspect-markdown-emphasis-first.md`:
138
138
 
139
139
  ```markdown
140
140
  ### S-2026-0813-1606fz-1: When a substring contract test fails, suspect markdown emphasis first
@@ -149,7 +149,7 @@ Example — a `strategy` (note the `trigger` / `action` body), file `strategies/
149
149
  - status: candidate
150
150
  ```
151
151
 
152
- Example — a `runbook` (note the ordered `steps` + `failure-recovery` body), file `runbooks/R-2026-0813-1143el-1.md`:
152
+ Example — a `runbook` (note the ordered `steps` + `failure-recovery` body), file `runbooks/R-2026-0813-1143el-1-release-a-new-codexspec-version.md`:
153
153
 
154
154
  ```markdown
155
155
  ### R-2026-0813-1143el-1: Release a new CodexSpec version
@@ -191,7 +191,7 @@ When a new item conflicts with an existing rule, resolve in this order:
191
191
 
192
192
  Change the profile **only** through three conceptual operations (you edit the files directly — these are a discipline, **not** a tool API or matching algorithm):
193
193
 
194
- - `add` — create a new record file `<category>/<id>.md` for a verified item.
194
+ - `add` — create a new record file `<category>/<id>-<slug>.md` (bare `<category>/<id>.md` when no meaningful slug applies) for a verified item.
195
195
  - `replace` — supersede an outdated/wrong item **in its own file** (keeps records dense).
196
196
  - `remove` — delete the record's file when a changed environment invalidates it.
197
197
 
@@ -65,7 +65,7 @@ onboard **never** extracts `decisions`, `pitfalls`, `strategies`, or `runbooks`.
65
65
 
66
66
  ## Record Format
67
67
 
68
- onboard **reuses `distill`'s profile store and record format verbatim** — one record per file under a category directory (`conventions/<id>.md`, `constraints/<id>.md`), ids namespaced by the source-feature id, and `claim` physically separated from `evidence`. See `distill.md` for the canonical format. onboard writes with these **deltas**:
68
+ onboard **reuses `distill`'s profile store and record format verbatim** — one record per file under a category directory (`conventions/<id>-<slug>.md`, `constraints/<id>-<slug>.md`; bare `<id>.md` when no meaningful slug applies), ids namespaced by the source-feature id, and `claim` physically separated from `evidence`. See `distill.md` for the canonical format. onboard writes with these **deltas**:
69
69
 
70
70
  - `provenance` marks the **onboard scan** as the source (distinct from `distill`), with `derivation: inferred` — always, because the knowledge is inferred from code, never quoted from the user.
71
71
  - An onboard record's `status` is always **`candidate`** at write time — onboard **never** writes `vetted` itself. Its `inferred` origin is **not** a permanent barrier: such a record can later be promoted to `vetted` via `/distill review` once it is outcome-verified and the user approves it (the `evolve` gate remains `vetted`). See the `status` rule in `distill.md`.
File without changes
File without changes
File without changes