enola-guides 0.8.0 → 0.9.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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  3. data/README.md +138 -100
  4. data/bundle/bundle.json +135 -75
  5. data/examples/knowledge-base/README.md +6 -2
  6. data/examples/knowledge-base/enola-cluster.yaml +6 -6
  7. data/examples/knowledge-base/wiki/_state/enola/findings.json +2 -2
  8. data/examples/knowledge-base/wiki/_state/enola/receipts.json +11 -8
  9. data/examples/knowledge-base/wiki/shop/permanent/architecture.md +1 -1
  10. data/examples/knowledge-base/wiki/shop/permanent/public-surface.md +3 -3
  11. data/examples/laws/clean-rings/README.md +3 -1
  12. data/examples/laws/cluster-laws/README.md +3 -1
  13. data/examples/laws/cqrs-queries-never-write/README.md +3 -1
  14. data/examples/laws/foreign-keys/README.md +3 -1
  15. data/examples/laws/governed-code/README.md +3 -1
  16. data/examples/laws/instantiation/README.md +3 -1
  17. data/examples/laws/maintenance-tasks/README.md +3 -1
  18. data/examples/laws/mixins-stay-independent/README.md +3 -1
  19. data/examples/laws/naming-conventions/README.md +3 -1
  20. data/examples/laws/one-door/README.md +3 -1
  21. data/examples/laws/one-owner-per-table/README.md +3 -1
  22. data/examples/laws/paired-names/README.md +3 -1
  23. data/examples/laws/parts-never-cycle/README.md +3 -1
  24. data/examples/laws/protocol-any-of/README.md +3 -1
  25. data/examples/laws/public-surface/README.md +3 -1
  26. data/examples/laws/public-tool-prefix/README.md +3 -1
  27. data/examples/laws/rails-forbidden-names/README.md +3 -1
  28. data/examples/laws/rails-mutations-are-authorized/README.md +3 -1
  29. data/examples/laws/rails-request-boundaries/README.md +3 -1
  30. data/examples/laws/rails-strict-arrangement/README.md +3 -1
  31. data/examples/laws/readers-read-the-store-only/README.md +3 -1
  32. data/examples/laws/receiverless-request-api/README.md +3 -1
  33. data/examples/laws/resolved-ancestry/README.md +3 -1
  34. data/examples/laws/routes-have-consumers/README.md +3 -1
  35. data/examples/laws/storage-stays-home/README.md +3 -1
  36. data/examples/laws/vanilla-rails-stays-empty/README.md +3 -1
  37. data/examples/rust-service/EXPECTED +1 -1
  38. data/examples/rust-service/README.md +1 -1
  39. data/guides/00-concepts.md +97 -0
  40. data/guides/01-start-here.md +241 -83
  41. data/guides/02-rails.md +28 -8
  42. data/guides/03-ember.md +15 -4
  43. data/guides/04-writing-laws.md +163 -17
  44. data/guides/05-constraints-in-ci.md +125 -52
  45. data/guides/06-hooks-and-agents.md +159 -58
  46. data/guides/07-providers.md +21 -10
  47. data/guides/08-beyond-one-repo.md +26 -5
  48. data/guides/09-a-knowledge-base-with-enola.md +21 -13
  49. data/guides/10-hooks.md +50 -28
  50. data/guides/11-the-skills-as-they-run.md +16 -9
  51. data/guides/12-the-wrapper.md +37 -7
  52. data/guides/13-tabula.md +22 -12
  53. data/guides/14-taha.md +10 -0
  54. data/guides/15-python.md +22 -7
  55. data/guides/16-typescript.md +19 -5
  56. data/guides/17-go.md +13 -1
  57. data/guides/18-rust.md +17 -5
  58. data/guides/19-rolling-out.md +131 -0
  59. data/guides/20-reading-a-verdict.md +183 -0
  60. data/lib/enola-guides.rb +1 -1
  61. data/recipes/README.md +10 -10
  62. data/templates/constraints-starter/background-jobs-never-invoke-controller-code.rb +6 -0
  63. data/templates/constraints-starter/models-do-not-reach-controllers.rb +6 -0
  64. data/templates/constraints-starter/policies-only-answer.rb +6 -0
  65. data/templates/constraints-starter/the-request-api-stays-in-controllers.rb +6 -0
  66. data/templates/enola-check.sh +84 -20
  67. data/templates/enola-findings.rb +30 -10
  68. data/templates/hooks/intent-first-gate.sh +13 -2
  69. data/templates/hooks/record.sh +15 -4
  70. data/templates/hooks/stop-debt.sh +4 -2
  71. data/templates/kb/kb +367 -0
  72. data/templates/skills/enola/SKILL.md +15 -3
  73. data/templates/skills/enola-citation-hygiene/SKILL.md +7 -1
  74. data/templates/skills/enola-deepdive/SKILL.md +7 -1
  75. data/templates/skills/enola-drift/SKILL.md +7 -1
  76. data/templates/skills/enola-grade-before-push/SKILL.md +16 -7
  77. data/templates/skills/enola-ingest-check/SKILL.md +7 -1
  78. data/templates/skills/enola-laws/SKILL.md +19 -4
  79. data/templates/skills/enola-zoom-out/SKILL.md +7 -1
  80. metadata +5 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3784520433166796cdd4b84e8991d25877fc6c1c97dcd5af9e04b5d8dcf12985
4
- data.tar.gz: a6e317df671ddcbc2cc90f3077eff8db4ec03e6762cd5c5e3ea8e439d27d3555
3
+ metadata.gz: 8d1b81f179855dbd64a4feb84618651f3b3805d7410dd82f09238fb9a3896f00
4
+ data.tar.gz: 46ec48df52057f409f66e0a60ee1c32224cdfc84f06da9474c85561923a677b5
5
5
  SHA512:
6
- metadata.gz: 7b7987e38206a19d0bddbfa955b77158df65da89b794398ad510c1b63b482f4d28466cba970f1ccf58cf42592e533a2fffa072bd9a89533b60f83852c10b3188
7
- data.tar.gz: 3a488496fb470ab2eb67183cc0e38bfa6f177892a74437cc808e345b85421ef0683bc6061231a9c6bfe38e3b362c9f597672cc274bbe415140767da699c1bccd
6
+ metadata.gz: d6c33d263d7d51ad7b16dc436ddf1412f441309dbbb05f8534fd4efda42c97b8ba2489d02ef9fc04f887ab226261db0f0edab3168dad1c4bf5b2426e899415b8
7
+ data.tar.gz: 99318280749a1987d2a1197f29ca3fe8850a78df1a5fdd13cc3d743d2e24ce14918b79b8b6ccabd1cb492174db69cec19f5f456a2e57283a31d1f13b8ea43c01
data/CHANGELOG.md CHANGED
@@ -1,5 +1,63 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.0 (2026-10-26)
4
+
5
+ Checked against enola v0.4.35, and read again as someone who has never
6
+ heard of enola: a developer landing on the README, one following guide 01
7
+ literally on a Python service, and a tech lead deciding whether to adopt
8
+ it. What they tripped on is fixed, and every command it changed was run
9
+ against v0.4.35.
10
+
11
+ - The README says what enola is and how to install it before anything
12
+ else, and groups the guides into tracks: new to enola, your stack, laws
13
+ and CI, agents, deeper, and an optional knowledge-base track.
14
+ - Three new guides. [00, what enola is](guides/00-concepts.md): the
15
+ pieces, a glossary, who makes what, and enola beside linters and
16
+ dependency-rule tools. [19, rolling out](guides/19-rolling-out.md):
17
+ measured costs (Mastodon and a 20,000-file Rails monolith), one recipe
18
+ instead of five, report then enforce, owners, what to commit, turning
19
+ it off. [20, reading a verdict](guides/20-reading-a-verdict.md): every
20
+ section and exit code, partial and declined, the surprises.
21
+ - Guide 01: install pinned through `pipx`, the npm `enola` warning, the
22
+ MCP server registered with `alwaysLoad`, `doctor` before a restart, a
23
+ first law in YAML that fires on any layout with the output it gives,
24
+ and why a first `.rb` law in a repository with no Ruby makes the verdict
25
+ partial and grades an old breach as new.
26
+ - Guide 04: modes as a table with the confidence each reports at; fix,
27
+ exempt, suppress or leave in the baseline, with the syntax in Ruby and
28
+ YAML; a recipes section; `check` needs a pinned baseline.
29
+ - Guide 05: the action pinned with `version:`, Rubydex installed pinned;
30
+ the template's variables, requirements, exit codes and comment.
31
+ - Guide 06: registering the MCP server per agent, what the agent does
32
+ differently, v0.4.35's narrower search refusal and folder-of-repositories
33
+ install, what to commit (the hooks carry an absolute path) and how to
34
+ turn each piece off.
35
+ - `templates/enola-check.sh`: a regression under enforcement is a verdict
36
+ with a comment, not "did not run"; the confidence floor stays at 1.00 so
37
+ advisory laws never fail; a shallow clone fails on CI instead of passing
38
+ quietly; the comment is edited by its numeric id; without Ruby the
39
+ comment is enola's own summary; `.enola-version` pins the release.
40
+ `script/test-check-template` covers each.
41
+ - The knowledge-base hooks leave a repository with no decision records
42
+ alone (`ENOLA_DECISION_DIRS`) and are wired from `.claude/hooks/`, where
43
+ `enola-guides copy` writes them. The five knowledge-base skills call a
44
+ wrapper that now ships, `templates/kb/kb`, tested by `script/test-kb`.
45
+ `examples/knowledge-base`'s cluster config parses on v0.4.35.
46
+ - Fixed: the `enola --generate . && enola check .` line in guide 02, the
47
+ skills and the twenty-six law READMEs fails with no pinned baseline;
48
+ `constraints init` binds a recipe only when every role has a directory;
49
+ a Ruby `via:` keyword on a sentence is dropped (write `via :imports` in
50
+ the law); `enola gc` trims the local history; the Ember recipe is copied
51
+ with `enola-guides copy`, not `gem contents`; undefined names (munola,
52
+ the brain) are gone; `list recipes` no longer lists the recipes README.
53
+ - What v0.4.35 still reads less than the code, each re-checked: an
54
+ Express `router.post("/")` under a mount, an inline Axum `.nest`, a
55
+ bare Cargo version read as pinned, an inline TypeScript handler,
56
+ `layered`'s `depends_on` rules on Python, TypeScript, Go and Rust, and a
57
+ Ruby `where:` value that is not a string.
58
+ - tabula and taha are marked as a preview: neither is public yet.
59
+ - `script/check-links` checks `#anchors` too.
60
+
3
61
  ## 0.8.0 (2026-10-25)
4
62
 
5
63
  One command, `enola-guides`, in every ecosystem: RubyGems, npm, PyPI,
data/README.md CHANGED
@@ -1,19 +1,137 @@
1
1
  # enola-guides
2
2
 
3
- How to use [enola](https://github.com/enola-labs/enola), the tool that
4
- grades what a change did to a codebase's architecture, checked against
5
- v0.4.34: laws written as sentences in Ruby or YAML, recipes a team
6
- reviews, providers that run beside enola's own extractors, the check in
7
- CI, the hooks and MCP tools an agent uses during a session, and the
8
- knowledge base built on top of it with [tabula](guides/13-tabula.md) and
9
- [taha](guides/14-taha.md). Guides for Rails, Ember, Python, TypeScript,
10
- Go and Rust, worked examples that CI snapshots and grades on every change,
11
- skills and templates, packaged so a team can pin the guidance it adopted.
3
+ [enola](https://github.com/enola-labs/enola) snapshots a codebase's
4
+ architecture (modules, calls, routes, tables, dependencies) and grades
5
+ each change against a pinned baseline. It catches what file-by-file
6
+ linters cannot: a new cycle across four files, a job that starts calling
7
+ a controller, a second part writing a table that was one part's own. And
8
+ it reports only what the change added, not the hundreds of findings the
9
+ repository already had.
12
10
 
13
- ## Install
11
+ These are guides to using it: a first graded change in ten minutes, laws
12
+ your team states as sentences, the check on every pull request, and the
13
+ hooks and tools a coding agent uses during a session, for Rails, Ember,
14
+ Python, TypeScript, Go and Rust. Every command, flag and output in them
15
+ was run against **enola v0.4.35**, and CI snapshots and grades the worked
16
+ examples on every change. The guides are by Muhamed Isabegovic and are
17
+ not part of enola-labs.
14
18
 
15
- One command, `enola-guides`, with the same items and the same output from
16
- every package. Take it from the ecosystem you already use:
19
+ ## Install enola
20
+
21
+ ```bash
22
+ curl -fsSL https://raw.githubusercontent.com/enola-labs/enola/main/install.sh | sh
23
+ enola --version
24
+ ```
25
+
26
+ or `pipx install enola-cli` (the PyPI name; the command is `enola`).
27
+ [Start here](guides/01-start-here.md) has the rest, including how to pin
28
+ a version. enola is not on npm: the npm package `enola` is something
29
+ else.
30
+
31
+ ## Read in this order
32
+
33
+ **New to enola**
34
+
35
+ - [What enola is, and the words these guides use](guides/00-concepts.md):
36
+ the pieces, a glossary, and how it sits beside the tools you already
37
+ run. Five minutes.
38
+ - [Start here](guides/01-start-here.md): install, snapshot, baseline, a
39
+ graded change, the agent hooks, a first law. Ten minutes.
40
+
41
+ **Your stack**: what enola measures in each, the recipe that names its
42
+ parts, and where it reads less than the code says.
43
+
44
+ - [Rails](guides/02-rails.md) · [Ember](guides/03-ember.md) ·
45
+ [Python](guides/15-python.md) · [TypeScript and JavaScript](guides/16-typescript.md) ·
46
+ [Go](guides/17-go.md) · [Rust](guides/18-rust.md)
47
+
48
+ **Laws and CI**
49
+
50
+ - [Writing laws](guides/04-writing-laws.md): parts, the sentences, modes,
51
+ dates, exemptions and suppressions, what a refusal means.
52
+ - [Constraints in CI](guides/05-constraints-in-ci.md): the check on every
53
+ pull request, on GitHub or any other CI.
54
+ - [Rolling out](guides/19-rolling-out.md): adopting it on a repository
55
+ with years of history, what to commit, what it costs, how to turn each
56
+ piece off.
57
+ - [Reading a verdict](guides/20-reading-a-verdict.md): every section of
58
+ `enola check`'s output, every exit code, and the surprises.
59
+
60
+ **Agents**
61
+
62
+ - [Hooks and agents](guides/06-hooks-and-agents.md): registering the MCP
63
+ server, the session hooks, what the agent does differently, the tools
64
+ it reaches for.
65
+
66
+ **Deeper**
67
+
68
+ - [Providers](guides/07-providers.md): the Ruby pair, the census, the
69
+ runtime capture, writing one.
70
+ - [Beyond one repository](guides/08-beyond-one-repo.md): the cluster, the
71
+ seams between repositories, the laws across them, the history.
72
+
73
+ **Optional: a knowledge base of decisions.** For teams that keep
74
+ decision records beside their code and want each page anchored to the
75
+ code it governs. Nothing above needs it.
76
+
77
+ - [A knowledge base with enola](guides/09-a-knowledge-base-with-enola.md):
78
+ pages that compile into the graph, receipts, a finding ledger.
79
+ - [Knowledge-base hooks](guides/10-hooks.md): the intent-first gate, the
80
+ turn record, the stop-time debt, the session refresh.
81
+ - [The knowledge-base skills, as they run](guides/11-the-skills-as-they-run.md):
82
+ deepdive, claim check, drift, citation hygiene, zoom-out.
83
+ - [The wrapper](guides/12-the-wrapper.md): the command those skills call,
84
+ shipped as a template.
85
+ - *Preview:* [tabula](guides/13-tabula.md) and [taha](guides/14-taha.md),
86
+ the same practice as one program and agents run on it. Neither is
87
+ public yet.
88
+
89
+ ## Worked examples
90
+
91
+ - [`examples/python-service`](examples/python-service),
92
+ [`typescript-service`](examples/typescript-service),
93
+ [`go-service`](examples/go-service) and
94
+ [`rust-service`](examples/rust-service): the same four-layer service in
95
+ each language, with its source, breaking the laws it states on purpose
96
+ so you can watch each one fire.
97
+ - [`examples/rails-shop`](examples/rails-shop): thirteen laws in the Ruby
98
+ DSL, one file each, from "jobs never invoke controller code" to
99
+ "billing keeps to its own tables", with the Prism and Rubydex
100
+ providers configured.
101
+ - [`examples/ember-app`](examples/ember-app): an Ember application bound
102
+ to the conventions recipe in one block.
103
+ - [`examples/laws`](examples/laws/README.md): twenty-six laws, one
104
+ directory each, from foreign keys on a tenant column to parts that may
105
+ not cycle, each a complete declaration you copy and run.
106
+ - [`examples/knowledge-base`](examples/knowledge-base/README.md): two
107
+ pages anchored to code, a cluster config, receipts and a finding
108
+ ledger, for the optional track.
109
+
110
+ ## Skills, hooks, templates and recipes
111
+
112
+ - [`templates/skills/`](templates/skills): skills for a coding agent.
113
+ Four for any repository: `enola` (ask the graph before searching, grade
114
+ after changing), `enola-laws` (write a law with a reason, lint it, read
115
+ its verdict), `enola-grade-before-push` (a declined grade is not a
116
+ pass) and `enola-intent-first` (read the governing decision before the
117
+ file moves). Five more belong to the knowledge-base track and call its
118
+ [wrapper](guides/12-the-wrapper.md) (`enola-guides copy templates/kb`):
119
+ `enola-deepdive`, `enola-ingest-check`, `enola-drift`,
120
+ `enola-citation-hygiene`, `enola-zoom-out`.
121
+ - [`templates/hooks/`](templates/hooks): the knowledge-base hooks of
122
+ [guide 10](guides/10-hooks.md).
123
+ - [`templates/`](templates): the CI check script and its comment
124
+ renderer, a cluster configuration, and a starter of four Rails laws.
125
+ - [`recipes/`](recipes/README.md): recipes to copy into your own
126
+ `enola/recipes/` and bind in one block, each with the count its laws
127
+ held at on a real repository; starting points a team reviews, never
128
+ defaults the tool applies.
129
+
130
+ ## These guides as a command
131
+
132
+ Everything above is also one command, `enola-guides`, with the same items
133
+ and the same output from every package. Take it from the ecosystem you
134
+ already use:
17
135
 
18
136
  ```bash
19
137
  gem install enola-guides # RubyGems
@@ -32,94 +150,14 @@ enola-guides list # every item; list guides, list laws, list
32
150
  enola-guides show guides/01-start-here
33
151
  enola-guides copy laws/foreign-keys # writes enola/constraints/foreign-keys.yaml
34
152
  enola-guides copy skills/enola # writes .claude/skills/enola/SKILL.md
153
+ enola-guides copy hooks/stop-debt # writes .claude/hooks/stop-debt.sh
154
+ enola-guides copy examples/python-service # a project to try the guides on
35
155
  ```
36
156
 
37
157
  `copy` writes an item's files under a directory each kind has a default
38
- for (`enola/constraints` for a law, `.claude/skills` for a skill,
39
- `enola/recipes` for a recipe) or the one you name, and never overwrites:
40
- it names the first file that exists and writes nothing. The gem also
41
- carries the tree itself, so `gem contents enola-guides` lists every file
42
- and a team can pin the guidance it adopted in its `Gemfile`.
43
-
44
- ## Start with an example
45
-
46
- [`examples/rails-shop`](examples/rails-shop): a Rails application declaring
47
- thirteen laws in the Ruby DSL, one file each, from "jobs never invoke controller code" to
48
- "billing keeps to its own tables" and "a mutating action is authorized",
49
- with Prism and Rubydex configured as providers beside the extractors.
50
- [`examples/ember-app`](examples/ember-app): an Ember application bound to
51
- the conventions recipe in one block. [`examples/knowledge-base`](examples/knowledge-base/README.md):
52
- two pages anchored to code, a cluster config, receipts and a finding ledger,
53
- the smallest knowledge base the skills and hooks run against. [`examples/python-service`](examples/python-service),
54
- [`examples/typescript-service`](examples/typescript-service),
55
- [`examples/go-service`](examples/go-service) and
56
- [`examples/rust-service`](examples/rust-service): the same four-layer
57
- service in each language, with its source, breaking the laws it states on
58
- purpose so you can watch each one fire. [`examples/laws`](examples/laws/README.md):
59
- twenty-six laws, one directory each, from foreign keys on a tenant column
60
- to parts that may not cycle, each a complete declaration you copy and run.
61
-
62
- ## Guides
63
-
64
- 1. [Start here](guides/01-start-here.md): install, snapshot, baseline, a
65
- graded change, the hooks, a first law. Ten minutes.
66
- 2. [A Rails application](guides/02-rails.md): what enola measures, the
67
- Prism and Rubydex providers, the recipe, the laws a Rails team writes.
68
- 3. [An Ember application](guides/03-ember.md): the Ember facts, the
69
- conventions as a recipe, an app inside a larger repository.
70
- 4. [Writing laws](guides/04-writing-laws.md): parts, the twenty-one
71
- sentences, modes, dates, exemptions, what a refusal means.
72
- 5. [Constraints in CI](guides/05-constraints-in-ci.md): the check step.
73
- 6. [Hooks and agents](guides/06-hooks-and-agents.md): the session hooks,
74
- the MCP tools, the skills.
75
- 7. [Providers](guides/07-providers.md): the seam, the Ruby pair, the
76
- census, the runtime capture.
77
- 8. [Beyond one repository](guides/08-beyond-one-repo.md): the cluster, the
78
- seams, the laws across them, the history.
79
- 9. [A knowledge base with enola](guides/09-a-knowledge-base-with-enola.md):
80
- what a wiki of decisions gets when its pages anchor to code and every
81
- number it states was read from a receipt.
82
- 10. [Hooks](guides/10-hooks.md): the four agent hooks a knowledge base runs
83
- (intent-first gate, turn record, stop-time debt, session refresh).
84
- 11. [The skills, as they run](guides/11-the-skills-as-they-run.md): deepdive
85
- before shaping, claim check while ingesting, drift on a schedule,
86
- citation hygiene, the blast radius.
87
- 12. [The wrapper](guides/12-the-wrapper.md): the thin command the skills
88
- call, the named skip, the receipts and the ledger.
89
- 13. [tabula](guides/13-tabula.md): the knowledge base kept by a tool that
90
- carries cardo, its laws compiled into `enola/constraints/`, PRDs
91
- graded with `enola check`, and which hand-built piece each verb
92
- replaces.
93
- 14. [taha](guides/14-taha.md): agents run on a tabula project under a
94
- mandate, gated by tabula's verdicts, asking before anything is
95
- published.
96
- 15. [A Python service](guides/15-python.md),
97
- 16. [a TypeScript or JavaScript service](guides/16-typescript.md),
98
- 17. [a Go service](guides/17-go.md), and
99
- 18. [a Rust service](guides/18-rust.md): what enola measures in each
100
- language, the `layered` recipe bound to a service, the law over
101
- `imports` its domain rules need, dependencies, and where v0.4.34 reads
102
- less than the code says.
103
-
104
- ## Skills
105
-
106
- The skills under [`templates/skills/`](templates/skills) are the ones used
107
- day to day with enola's MCP in an agent session: `enola` (ask the graph
108
- before grepping, grade after changing), `enola-laws` (write a law as a
109
- sentence with a reason, lint it, read what it verdicts),
110
- `enola-grade-before-push` (the delta is the deliverable, a declined grade
111
- is not a pass), `enola-intent-first` (read the governing decision before
112
- the file moves), and the five a knowledge base runs: `enola-deepdive`,
113
- `enola-ingest-check`, `enola-drift`, `enola-citation-hygiene`,
114
- `enola-zoom-out`, each described as it runs in
115
- [guide 11](guides/11-the-skills-as-they-run.md). Copy a directory into
116
- your agent's skills folder; the hooks they pair with are under
117
- [`templates/hooks/`](templates/hooks).
118
-
119
- ## Templates and recipes
120
-
121
- [`templates/`](templates): the CI check script and its comment renderer,
122
- a cluster configuration, a constraints starter. [`recipes/`](recipes/README.md) (the catalogue munola binds, each recipe with the number its laws held at):
123
- recipes a repository copies into its own `enola/recipes/` and binds in one
124
- line, starting with the Ember conventions and a house-recipe template;
125
- starting points the team reviews, never defaults the tool applies.
158
+ for (`enola/constraints` for a law, `enola/recipes` for a recipe,
159
+ `.claude/skills` for a skill, `.claude/hooks` for a hook) or the one you
160
+ name, and never overwrites: it names the first file that exists and
161
+ writes nothing. The gem also carries the tree itself, so
162
+ `gem contents enola-guides` lists every file and a team can pin the
163
+ guidance it adopted in its `Gemfile`.