chipgraph 0.1.0__py3-none-any.whl

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 (252) hide show
  1. chipgraph/__init__.py +7 -0
  2. chipgraph/adapters/__init__.py +1 -0
  3. chipgraph/adapters/format/__init__.py +6 -0
  4. chipgraph/adapters/format/__main__.py +16 -0
  5. chipgraph/adapters/format/_yaml_lines.py +54 -0
  6. chipgraph/adapters/format/chip_yaml.py +323 -0
  7. chipgraph/adapters/format/qsoc_contract.py +246 -0
  8. chipgraph/adapters/llm/__init__.py +58 -0
  9. chipgraph/adapters/llm/_budget.py +173 -0
  10. chipgraph/adapters/llm/_errors.py +50 -0
  11. chipgraph/adapters/llm/_nda.py +30 -0
  12. chipgraph/adapters/llm/_retry.py +85 -0
  13. chipgraph/adapters/llm/anthropic.py +247 -0
  14. chipgraph/adapters/llm/decide_backend.py +179 -0
  15. chipgraph/adapters/llm/fake.py +87 -0
  16. chipgraph/adapters/llm/guard.py +68 -0
  17. chipgraph/adapters/parser/__init__.py +22 -0
  18. chipgraph/adapters/parser/cocotb.py +304 -0
  19. chipgraph/adapters/parser/generic_regex.py +75 -0
  20. chipgraph/adapters/parser/verible.py +55 -0
  21. chipgraph/adapters/parser/verilator.py +46 -0
  22. chipgraph/adapters/review/__init__.py +7 -0
  23. chipgraph/adapters/review/file.py +123 -0
  24. chipgraph/adapters/review/github.py +886 -0
  25. chipgraph/adapters/runner/__init__.py +7 -0
  26. chipgraph/adapters/runner/local.py +122 -0
  27. chipgraph/adapters/runtime/__init__.py +5 -0
  28. chipgraph/adapters/runtime/claude_code/__init__.py +24 -0
  29. chipgraph/adapters/runtime/claude_code/agents.py +158 -0
  30. chipgraph/adapters/runtime/claude_code/decisions.py +280 -0
  31. chipgraph/adapters/runtime/claude_code/guarded.py +310 -0
  32. chipgraph/adapters/runtime/claude_code/isolation.py +482 -0
  33. chipgraph/adapters/runtime/claude_code/loop.py +342 -0
  34. chipgraph/adapters/runtime/claude_code/previous.py +419 -0
  35. chipgraph/adapters/runtime/claude_code/review.py +492 -0
  36. chipgraph/adapters/runtime/claude_code/runtime.py +192 -0
  37. chipgraph/adapters/runtime/claude_code/service.py +2285 -0
  38. chipgraph/adapters/tool/__init__.py +7 -0
  39. chipgraph/adapters/tool/cmd.py +229 -0
  40. chipgraph/adapters/tool/edalize.py +773 -0
  41. chipgraph/adapters/tool/filelist.py +259 -0
  42. chipgraph/adapters/tool/pyslang.py +485 -0
  43. chipgraph/adapters/vcs/__init__.py +1 -0
  44. chipgraph/adapters/vcs/git.py +521 -0
  45. chipgraph/app/__init__.py +10 -0
  46. chipgraph/app/baseline.py +339 -0
  47. chipgraph/app/build.py +332 -0
  48. chipgraph/app/checks.py +202 -0
  49. chipgraph/app/context.py +191 -0
  50. chipgraph/app/errors.py +11 -0
  51. chipgraph/app/executors.py +79 -0
  52. chipgraph/app/findings.py +203 -0
  53. chipgraph/app/ingest.py +523 -0
  54. chipgraph/checks/__init__.py +52 -0
  55. chipgraph/checks/_cdc_analyze.py +272 -0
  56. chipgraph/checks/_cdc_elaborate.py +455 -0
  57. chipgraph/checks/_common.py +268 -0
  58. chipgraph/checks/_cross.py +96 -0
  59. chipgraph/checks/_model.py +64 -0
  60. chipgraph/checks/_naming_pyslang.py +235 -0
  61. chipgraph/checks/_naming_rules.py +127 -0
  62. chipgraph/checks/_xref_syntax.py +260 -0
  63. chipgraph/checks/cdc_struct.py +235 -0
  64. chipgraph/checks/connect.py +353 -0
  65. chipgraph/checks/cross_chip.py +454 -0
  66. chipgraph/checks/duplicate.py +153 -0
  67. chipgraph/checks/filelist.py +323 -0
  68. chipgraph/checks/format.py +268 -0
  69. chipgraph/checks/generated.py +151 -0
  70. chipgraph/checks/hardcode.py +233 -0
  71. chipgraph/checks/layout.py +155 -0
  72. chipgraph/checks/naming.py +311 -0
  73. chipgraph/checks/plan_check.py +901 -0
  74. chipgraph/checks/ports_diff.py +203 -0
  75. chipgraph/checks/spec_schema.py +277 -0
  76. chipgraph/checks/style.py +910 -0
  77. chipgraph/checks/tb_static.py +599 -0
  78. chipgraph/checks/trace.py +224 -0
  79. chipgraph/checks/vendor_guard.py +369 -0
  80. chipgraph/checks/wrap_check.py +486 -0
  81. chipgraph/cli/__init__.py +1688 -0
  82. chipgraph/cli/next_steps.py +137 -0
  83. chipgraph/core/__init__.py +1 -0
  84. chipgraph/core/config/__init__.py +93 -0
  85. chipgraph/core/config/defaults.py +14 -0
  86. chipgraph/core/config/errors.py +32 -0
  87. chipgraph/core/config/loader.py +766 -0
  88. chipgraph/core/config/models.py +845 -0
  89. chipgraph/core/config/templates.py +340 -0
  90. chipgraph/core/contracts/__init__.py +75 -0
  91. chipgraph/core/contracts/_paths.py +26 -0
  92. chipgraph/core/contracts/agent.py +49 -0
  93. chipgraph/core/contracts/artifact.py +68 -0
  94. chipgraph/core/contracts/check.py +76 -0
  95. chipgraph/core/contracts/event.py +70 -0
  96. chipgraph/core/contracts/export.py +128 -0
  97. chipgraph/core/contracts/finding.py +171 -0
  98. chipgraph/core/contracts/gate.py +50 -0
  99. chipgraph/core/contracts/rule.py +177 -0
  100. chipgraph/core/contracts/types.py +45 -0
  101. chipgraph/core/engine/__init__.py +70 -0
  102. chipgraph/core/engine/agent_rule.py +1362 -0
  103. chipgraph/core/engine/baseline.py +283 -0
  104. chipgraph/core/engine/decide.py +462 -0
  105. chipgraph/core/engine/fanout.py +1358 -0
  106. chipgraph/core/engine/gate.py +170 -0
  107. chipgraph/core/engine/graph.py +647 -0
  108. chipgraph/core/engine/records.py +60 -0
  109. chipgraph/core/engine/rules.py +92 -0
  110. chipgraph/core/engine/scheduler.py +637 -0
  111. chipgraph/core/engine/select.py +1239 -0
  112. chipgraph/core/engine/targets.py +342 -0
  113. chipgraph/core/model/__init__.py +98 -0
  114. chipgraph/core/model/entities.py +244 -0
  115. chipgraph/core/model/export.py +16 -0
  116. chipgraph/core/model/ingest.py +693 -0
  117. chipgraph/core/model/json_value.py +4 -0
  118. chipgraph/core/model/keys.py +95 -0
  119. chipgraph/core/model/model.py +153 -0
  120. chipgraph/core/model/provenance.py +27 -0
  121. chipgraph/core/model/query.py +583 -0
  122. chipgraph/core/model/registry.py +80 -0
  123. chipgraph/core/model/relations.py +61 -0
  124. chipgraph/core/model/store.py +279 -0
  125. chipgraph/core/plugin_api/__init__.py +81 -0
  126. chipgraph/core/plugin_api/local.py +167 -0
  127. chipgraph/core/plugin_api/pack.py +159 -0
  128. chipgraph/core/plugin_api/protocols.py +177 -0
  129. chipgraph/core/plugin_api/registry.py +111 -0
  130. chipgraph/core/plugin_api/types.py +94 -0
  131. chipgraph/core/runtime/__init__.py +41 -0
  132. chipgraph/core/runtime/executor.py +79 -0
  133. chipgraph/core/runtime/queue.py +565 -0
  134. chipgraph/core/runtime/roles/__init__.py +91 -0
  135. chipgraph/core/runtime/roles/data/author.md +41 -0
  136. chipgraph/core/runtime/roles/data/critic.md +56 -0
  137. chipgraph/core/runtime/roles/data/planner.md +38 -0
  138. chipgraph/core/runtime/roles/data/researcher.md +37 -0
  139. chipgraph/core/runtime/roles/data/rtl-author.md +64 -0
  140. chipgraph/core/runtime/roles/data/tb-author.md +48 -0
  141. chipgraph/core/runtime/roles/data/triage.md +34 -0
  142. chipgraph/core/runtime/roles/policy.py +299 -0
  143. chipgraph/core/runtime/roles/registry.py +52 -0
  144. chipgraph/core/runtime/roles/review.py +275 -0
  145. chipgraph/core/runtime/roles/schema.py +82 -0
  146. chipgraph/core/runtime/roles/skills.py +134 -0
  147. chipgraph/core/runtime/roles/spec.py +232 -0
  148. chipgraph/core/state/__init__.py +1 -0
  149. chipgraph/core/state/artifacts.py +156 -0
  150. chipgraph/core/state/backend.py +117 -0
  151. chipgraph/core/state/findings.py +151 -0
  152. chipgraph/core/state/handoff.py +411 -0
  153. chipgraph/core/state/idempotency.py +59 -0
  154. chipgraph/core/state/journal.py +238 -0
  155. chipgraph/core/state/layout.py +82 -0
  156. chipgraph/core/state/lock.py +195 -0
  157. chipgraph/core/state/trace.py +225 -0
  158. chipgraph/learn/__init__.py +96 -0
  159. chipgraph/learn/draft.py +187 -0
  160. chipgraph/learn/infer.py +580 -0
  161. chipgraph/learn/models.py +145 -0
  162. chipgraph/learn/try_run.py +228 -0
  163. chipgraph/mcp/__init__.py +12 -0
  164. chipgraph/mcp/model_tools.py +167 -0
  165. chipgraph/mcp/server.py +787 -0
  166. chipgraph/orgs/qnsc/naming-v1.yml +113 -0
  167. chipgraph/orgs/qnsc/profile.yml +5 -0
  168. chipgraph/packs/__init__.py +8 -0
  169. chipgraph/packs/assist/__init__.py +16 -0
  170. chipgraph/packs/assist/ask/__init__.py +58 -0
  171. chipgraph/packs/assist/ask/_db.py +57 -0
  172. chipgraph/packs/assist/ask/_project.py +230 -0
  173. chipgraph/packs/assist/ask/answer.py +266 -0
  174. chipgraph/packs/assist/ask/check.py +182 -0
  175. chipgraph/packs/assist/ask/contract.py +115 -0
  176. chipgraph/packs/assist/ask/documents.py +157 -0
  177. chipgraph/packs/assist/ask/fts.py +80 -0
  178. chipgraph/packs/assist/ask/retrieve.py +331 -0
  179. chipgraph/packs/assist/audit/__init__.py +383 -0
  180. chipgraph/packs/assist/pack.yml +13 -0
  181. chipgraph/packs/assist/triage/__init__.py +64 -0
  182. chipgraph/packs/assist/triage/contract.py +94 -0
  183. chipgraph/packs/assist/triage/parse.py +371 -0
  184. chipgraph/packs/assist/triage/question.py +384 -0
  185. chipgraph/packs/assist/triage/report.py +160 -0
  186. chipgraph/packs/assist/triage/rules.py +447 -0
  187. chipgraph/packs/assist/triage/run.py +224 -0
  188. chipgraph/packs/digital_rtl/__init__.py +19 -0
  189. chipgraph/packs/digital_rtl/layout.py +144 -0
  190. chipgraph/packs/digital_rtl/pack.yml +25 -0
  191. chipgraph/packs/digital_rtl/plan/__init__.py +34 -0
  192. chipgraph/packs/digital_rtl/plan/__main__.py +16 -0
  193. chipgraph/packs/digital_rtl/plan/context.py +82 -0
  194. chipgraph/packs/digital_rtl/plan/expand.py +94 -0
  195. chipgraph/packs/digital_rtl/plan/model.py +150 -0
  196. chipgraph/packs/digital_rtl/plan/resolver.py +400 -0
  197. chipgraph/packs/digital_rtl/plan/show.py +176 -0
  198. chipgraph/packs/digital_rtl/pr/__init__.py +11 -0
  199. chipgraph/packs/digital_rtl/pr/body.py +165 -0
  200. chipgraph/packs/digital_rtl/pr/gate.py +110 -0
  201. chipgraph/packs/digital_rtl/pr/open.py +397 -0
  202. chipgraph/packs/digital_rtl/rtl/__init__.py +9 -0
  203. chipgraph/packs/digital_rtl/rtl/context.py +272 -0
  204. chipgraph/packs/digital_rtl/rules/open_pr.yml +30 -0
  205. chipgraph/packs/digital_rtl/rules/plan.yml +28 -0
  206. chipgraph/packs/digital_rtl/rules/plan_expand.yml +29 -0
  207. chipgraph/packs/digital_rtl/rules/pr_gate.yml +27 -0
  208. chipgraph/packs/digital_rtl/rules/review.yml +31 -0
  209. chipgraph/packs/digital_rtl/rules/rtl_module.yml +53 -0
  210. chipgraph/packs/digital_rtl/skills/lang-sv-rtl.md +58 -0
  211. chipgraph/packs/digital_rtl/skills/org-naming.md +29 -0
  212. chipgraph/packs/digital_rtl/skills/plan-modules.md +63 -0
  213. chipgraph/packs/digital_rtl/skills/review-diff.md +41 -0
  214. chipgraph/packs/digital_rtl/targets/plan.yml +11 -0
  215. chipgraph/packs/digital_rtl/targets/rtl.yml +20 -0
  216. chipgraph/packs/digital_rtl/wrapper/__init__.py +24 -0
  217. chipgraph/packs/digital_rtl/wrapper/common.py +171 -0
  218. chipgraph/packs/digital_rtl/wrapper/context.py +222 -0
  219. chipgraph/packs/digital_rtl/wrapper/emacs.py +626 -0
  220. chipgraph/packs/digital_rtl/wrapper/expansion.py +304 -0
  221. chipgraph/packs/digital_rtl/wrapper/lisp.py +504 -0
  222. chipgraph/packs/digital_rtl/wrapper/resolver.py +60 -0
  223. chipgraph/packs/digital_rtl/wrapper/rules/wrapper.yml +41 -0
  224. chipgraph/packs/digital_rtl/wrapper/rules/wrapper_gen.yml +35 -0
  225. chipgraph/packs/digital_rtl/wrapper/skills/wrapper-auto.md +120 -0
  226. chipgraph/packs/dv/__init__.py +15 -0
  227. chipgraph/packs/dv/declaration.py +392 -0
  228. chipgraph/packs/dv/interface.py +596 -0
  229. chipgraph/packs/dv/pack.yml +14 -0
  230. chipgraph/packs/dv/rules/tb_module.yml +42 -0
  231. chipgraph/packs/dv/skills/dv/cocotb.md +72 -0
  232. chipgraph/packs/spec_core/__init__.py +9 -0
  233. chipgraph/packs/spec_core/extract/__init__.py +12 -0
  234. chipgraph/packs/spec_core/extract/_markdown.py +371 -0
  235. chipgraph/packs/spec_core/extract/_text.py +116 -0
  236. chipgraph/packs/spec_core/extract/mas.py +975 -0
  237. chipgraph/packs/spec_core/gen/__init__.py +11 -0
  238. chipgraph/packs/spec_core/gen/agents_md/__init__.py +148 -0
  239. chipgraph/packs/spec_core/gen/agents_md/_context.py +239 -0
  240. chipgraph/packs/spec_core/gen/agents_md/_markers.py +131 -0
  241. chipgraph/packs/spec_core/gen/agents_md/agents_md.md.j2 +178 -0
  242. chipgraph/packs/spec_core/gen/diagram/__init__.py +110 -0
  243. chipgraph/packs/spec_core/gen/diagram/__main__.py +44 -0
  244. chipgraph/packs/spec_core/gen/diagram/_diagrams.py +403 -0
  245. chipgraph/packs/spec_core/gen/diagram/_scene.py +163 -0
  246. chipgraph/packs/spec_core/pack.yml +6 -0
  247. chipgraph/py.typed +0 -0
  248. chipgraph-0.1.0.dist-info/METADATA +53 -0
  249. chipgraph-0.1.0.dist-info/RECORD +252 -0
  250. chipgraph-0.1.0.dist-info/WHEEL +4 -0
  251. chipgraph-0.1.0.dist-info/entry_points.txt +61 -0
  252. chipgraph-0.1.0.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,137 @@
1
+ """What is next after a build of a named target (`chipgraph plan`, `chipgraph rtl`).
2
+
3
+ From the run summary and the graph: each gate the run waits on, with how to approve it
4
+ (and, for a pull request gate, the PR's URL from `pr/<block>.json`); the agent tasks
5
+ queued for the Claude Code session (`/chipgraph:run`); what failed; and, when nothing
6
+ waits, the pull request of the block if there is one.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import json
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from chipgraph.app.context import AppContext
16
+ from chipgraph.core.engine import gate as gate_mod
17
+ from chipgraph.core.engine.graph import BuildGraph
18
+ from chipgraph.core.engine.scheduler import RunSummary
19
+ from chipgraph.core.runtime import ACTIVE_STATUSES, OPEN_STATUSES, TaskQueue
20
+
21
+ RUN_COMMAND = "/chipgraph:run"
22
+ PR_RECORD = "pr/{block}.json"
23
+
24
+
25
+ def _pr(app_ctx: AppContext, block: str | None) -> dict[str, Any] | None:
26
+ if block is None:
27
+ return None
28
+ path = app_ctx.root / PR_RECORD.format(block=block)
29
+ try:
30
+ data = json.loads(path.read_text(encoding="utf-8"))
31
+ except (OSError, ValueError):
32
+ return None
33
+ return data if isinstance(data, dict) else None
34
+
35
+
36
+ def next_steps(app_ctx: AppContext, graph: BuildGraph, summary: RunSummary) -> dict[str, Any]:
37
+ """The next steps after `summary`: `lines` for a person, and the same as data."""
38
+ lines: list[str] = []
39
+ gates: list[dict[str, Any]] = []
40
+ for iid in summary.waiting_gate:
41
+ instance = graph.instances[iid]
42
+ rule = graph.rules[instance.rule_id]
43
+ gate_id = gate_mod.gate_id_for(rule.gate or "", instance.params)
44
+ block = instance.params.get("block")
45
+ item: dict[str, Any] = {"gate": gate_id, "instance": iid}
46
+ pr = _pr(app_ctx, block) if gate_id.startswith("pr:") else None
47
+ if pr is not None and pr.get("url"):
48
+ item["url"] = pr["url"]
49
+ lines.append(
50
+ f"gate {gate_id}: review and approve the pull request {pr['url']} "
51
+ f"(head {str(pr.get('head_sha', ''))[:12]}); then run this again"
52
+ )
53
+ else:
54
+ if gate_id.startswith("plan:") and block is not None:
55
+ lines.append(f"read the plan: chipgraph plan show {block}")
56
+ lines.append(f"gate {gate_id}: chipgraph approve {gate_id} --instance '{iid}'")
57
+ gates.append(item)
58
+
59
+ queue = TaskQueue(app_ctx.layout)
60
+ tasks: list[str] = []
61
+ failed: list[str] = []
62
+ for iid in summary.failed:
63
+ record = queue.get(iid)
64
+ if record is not None and (
65
+ record.status in OPEN_STATUSES or record.status in ACTIVE_STATUSES
66
+ ):
67
+ tasks.append(iid)
68
+ else:
69
+ failed.append(iid)
70
+ if tasks:
71
+ lines.append(f"agent tasks waiting for {RUN_COMMAND} in Claude Code: {', '.join(tasks)}")
72
+ for iid in failed:
73
+ lines.append(f"failed: {iid} (see HANDOFF.md)")
74
+ if summary.blocked and not lines:
75
+ lines.append(f"blocked: {', '.join(summary.blocked)}")
76
+
77
+ pr_done: dict[str, Any] | None = None
78
+ if summary.ok:
79
+ blocks = {
80
+ graph.instances[i].params.get("block") for i in (*summary.done, *summary.skipped_fresh)
81
+ }
82
+ for block in sorted(b for b in blocks if b is not None):
83
+ pr_done = _pr(app_ctx, block) or pr_done
84
+ if pr_done is not None and pr_done.get("url"):
85
+ lines.append(f"done: the pull request {pr_done['url']} is approved; merging is yours")
86
+ elif pr_done is not None:
87
+ lines.append(
88
+ f"done: branch {pr_done.get('branch')} is approved ({pr_done.get('gate')}); "
89
+ "merging is yours"
90
+ )
91
+ else:
92
+ lines.append("done: nothing waits")
93
+ return {"lines": lines, "gates": gates, "tasks": tasks, "failed": failed, "pr": pr_done}
94
+
95
+
96
+ def chain_rows(graph: BuildGraph, target: str, summary: RunSummary) -> list[tuple[str, str]]:
97
+ """The instances of `target` in build order with where each stands after `summary`.
98
+
99
+ `done`, `fresh` (already up to date), `failed`, `waiting <gate>` or `blocked`; an
100
+ instance this run did not reach is `not run`.
101
+ """
102
+ states: dict[str, str] = {}
103
+ for iid in summary.done:
104
+ states[iid] = "done"
105
+ for iid in summary.skipped_fresh:
106
+ states[iid] = "fresh"
107
+ for iid in summary.failed:
108
+ states[iid] = "failed"
109
+ for iid in summary.blocked:
110
+ states[iid] = "blocked"
111
+ for iid in summary.waiting_gate:
112
+ instance = graph.instances[iid]
113
+ gate = gate_mod.gate_id_for(graph.rules[instance.rule_id].gate or "", instance.params)
114
+ states[iid] = f"waiting {gate}"
115
+ selected = graph.select(target)
116
+ return [(iid, states.get(iid, "not run")) for iid in graph.topo_order() if iid in selected]
117
+
118
+
119
+ def write_chain(
120
+ handoff: Path, graph: BuildGraph, target: str, summary: RunSummary
121
+ ) -> list[tuple[str, str]]:
122
+ """Append the target's chain to a run's `HANDOFF.md` (when the file is there).
123
+
124
+ A failure to write it never fails the build. Returns the rows.
125
+ """
126
+ rows = chain_rows(graph, target, summary)
127
+ lines = [f"## Chain of {target}", ""]
128
+ lines += [f"{i + 1}. `{iid}`: {state}" for i, (iid, state) in enumerate(rows)]
129
+ try:
130
+ text = handoff.read_text(encoding="utf-8")
131
+ handoff.write_text(text.rstrip("\n") + "\n\n" + "\n".join(lines) + "\n", encoding="utf-8")
132
+ except OSError:
133
+ pass
134
+ return rows
135
+
136
+
137
+ __all__ = ["RUN_COMMAND", "chain_rows", "next_steps", "write_chain"]
@@ -0,0 +1 @@
1
+ """Core: knows nothing about chips or tools."""
@@ -0,0 +1,93 @@
1
+ """Layered configuration: the project `Profile`, personal `UserConfig`, and their loader.
2
+
3
+ `chipgraph.core.config` knows nothing about chips or tools: no project, bus, PDK or tool
4
+ names appear here. See DESIGN.md 8.3, 8.4, 8.6 and 12.6.
5
+ """
6
+
7
+ from chipgraph.core.config.defaults import DEFAULT_PROFILE
8
+ from chipgraph.core.config.errors import ConfigError
9
+ from chipgraph.core.config.loader import (
10
+ ConfigIssue,
11
+ ResolvedProfile,
12
+ SourceFetcher,
13
+ SourceRef,
14
+ builtin_data_dir,
15
+ find_profile,
16
+ load,
17
+ resolve_data_ref,
18
+ )
19
+ from chipgraph.core.config.models import (
20
+ STYLE_KEYS,
21
+ AdapterCfg,
22
+ BlockOverride,
23
+ BlockSpecOverride,
24
+ DataCfg,
25
+ DecideCfg,
26
+ DecideOverride,
27
+ DecideSettings,
28
+ DecideTier,
29
+ DecisionsCfg,
30
+ EnvCfg,
31
+ FanoutCfg,
32
+ Level,
33
+ ModelsCfg,
34
+ NamingCfg,
35
+ PathRule,
36
+ PlanCfg,
37
+ PolicyCfg,
38
+ Profile,
39
+ RequirementsCfg,
40
+ SelectCfg,
41
+ SourceCfg,
42
+ SpecCfg,
43
+ StateCfg,
44
+ StyleCfg,
45
+ StyleKey,
46
+ TargetCfg,
47
+ TemplatesCfg,
48
+ UserConfig,
49
+ WrapperCfg,
50
+ )
51
+
52
+ __all__ = [
53
+ "DEFAULT_PROFILE",
54
+ "STYLE_KEYS",
55
+ "AdapterCfg",
56
+ "BlockOverride",
57
+ "BlockSpecOverride",
58
+ "ConfigError",
59
+ "ConfigIssue",
60
+ "DataCfg",
61
+ "DecideCfg",
62
+ "DecideOverride",
63
+ "DecideSettings",
64
+ "DecideTier",
65
+ "DecisionsCfg",
66
+ "EnvCfg",
67
+ "FanoutCfg",
68
+ "Level",
69
+ "ModelsCfg",
70
+ "NamingCfg",
71
+ "PathRule",
72
+ "PlanCfg",
73
+ "PolicyCfg",
74
+ "Profile",
75
+ "RequirementsCfg",
76
+ "ResolvedProfile",
77
+ "SelectCfg",
78
+ "SourceCfg",
79
+ "SourceFetcher",
80
+ "SourceRef",
81
+ "SpecCfg",
82
+ "StateCfg",
83
+ "StyleCfg",
84
+ "StyleKey",
85
+ "TargetCfg",
86
+ "TemplatesCfg",
87
+ "UserConfig",
88
+ "WrapperCfg",
89
+ "builtin_data_dir",
90
+ "find_profile",
91
+ "load",
92
+ "resolve_data_ref",
93
+ ]
@@ -0,0 +1,14 @@
1
+ """Tool defaults: the first configuration layer, before org, preset, project or path layers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ DEFAULT_PROFILE: dict[str, Any] = {
8
+ "runtime": "claude-code",
9
+ "data": {"default": "internal"},
10
+ "state": {"backend": "local"},
11
+ "decisions": {"store": "repo"},
12
+ "autonomy": {"spec": "L2", "rtl": "L3", "verify": "L3"},
13
+ }
14
+ """Raw (pre-validation) defaults merged under every other layer. See DESIGN 8.3."""
@@ -0,0 +1,32 @@
1
+ """`ConfigError`: raised for unreadable or invalid configuration, naming file/key/line."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+
7
+
8
+ class ConfigError(Exception):
9
+ """An error loading or validating configuration.
10
+
11
+ Always names the offending file; names the dotted key and, when known from a YAML
12
+ node mark, the line, so a person can find and fix the problem without guessing.
13
+ """
14
+
15
+ def __init__(
16
+ self,
17
+ message: str,
18
+ *,
19
+ file: str | Path | None = None,
20
+ key: str | None = None,
21
+ line: int | None = None,
22
+ ) -> None:
23
+ self.file = str(file) if file is not None else None
24
+ self.key = key
25
+ self.line = line
26
+ parts: list[str] = []
27
+ if self.file is not None:
28
+ parts.append(f"{self.file}:{line}" if line is not None else self.file)
29
+ if key is not None:
30
+ parts.append(f"key '{key}'")
31
+ parts.append(message)
32
+ super().__init__(": ".join(parts))