riskrails 3.0.0 → 3.1.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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/README.md +259 -812
- package/agents/ai-reviewer.md.tmpl +6 -4
- package/ai/policies/model-routing.md +7 -7
- package/ai/policies/production.md +3 -3
- package/ai/policies/release.md +2 -2
- package/ai/policies/review-economy.md +34 -32
- package/ai/using-riskrails.md +15 -0
- package/bin/claude-1m +15 -14
- package/bin/riskrails.js +113 -37
- package/codex/hooks.json +25 -2
- package/hooks/AGENTS.md +2 -2
- package/hooks/CLAUDE.md +2 -2
- package/hooks/ai-guard.py +29 -8
- package/hooks/ai-path-guard-defaults.json +3 -1
- package/hooks/codex-hooks.json +25 -2
- package/hooks/context-guard.py +252 -36
- package/hooks/dialog-gate.py +105 -0
- package/hooks/guard/common.py +7 -0
- package/hooks/guard/decision.py +123 -0
- package/hooks/guard/dialog.py +598 -0
- package/hooks/guard/git.py +49 -3
- package/hooks/guard/paths.py +89 -19
- package/hooks/hooks.json +37 -2
- package/hooks/memory-pre-push.py +28 -0
- package/hooks/project-scaffold.py +1 -5
- package/hooks/runtime-gate.py +65 -18
- package/hooks/update_notice.py +141 -0
- package/instructions/routing.md +4 -4
- package/instructions/stub.md +3 -3
- package/package.json +1 -1
- package/profiles/max.json +3 -1
- package/profiles/pro.json +3 -1
- package/scripts/merge-codex-config.py +134 -0
- package/scripts/resolve-profile.py +15 -3
- package/settings.common.json +39 -2
- package/skills/AGENTS.md +3 -3
- package/skills/CLAUDE.md +3 -3
- package/skills/ai-init/templates/.ai/AGENTS.md +3 -3
- package/skills/ai-init/templates/.ai/VERSION +1 -1
- package/skills/ai-init/templates/.ai/policies/dialog.json +1 -0
- package/skills/ai-init/templates/.ai/policies/safety.md +22 -2
- package/skills/ai-init/templates/.ai/policies/security.md +7 -1
- package/skills/ai-init/templates/.ai/policies/testing.md +19 -6
- package/skills/ai-init/templates/.ai/policies/weight.json +1 -0
- package/skills/ai-init/templates/.ai/policies/weight.md +2 -2
- package/skills/ai-init/templates/.ai/state/README.md +9 -6
- package/skills/ai-init/templates/AGENTS.block.md +2 -2
- package/skills/ai-init/templates/CLAUDE.block.md +2 -2
- package/skills/ai-init/templates/GEMINI.block.md +2 -2
- package/skills/ai-init/templates/gitignore.snippet +1 -0
- package/skills/ai-init/templates/junie-guidelines.block.md +2 -2
- package/skills/ai-task/memory_compact.py +968 -0
- package/skills/ai-task/memory_format.py +775 -0
- package/skills/ai-task/memory_store.py +528 -0
- package/skills/ai-task/memory_sync.py +1571 -0
- package/skills/ai-task/sensors.py +25 -5
- package/skills/ai-task/state.py +999 -79
- package/skills/ai-task/weight.py +3 -3
- package/skills/project-init/templates/constitution.md +1 -1
- package/skills/project-init/templates/sdlc-README.md +20 -14
- package/skills/project-update/history/blobs/00289f98434fed230eebe768dfb3425f83d737866a3aebc97aa95167c4fa0c6e +131 -0
- package/skills/project-update/history/blobs/079a91f976ad69b5cf49ccb9a28849576e4735ddd9485fc26599e528a69fd2f4 +30 -0
- package/skills/project-update/history/blobs/07ff7fa6f93d471ff533f553b4e523e4105ccde1f3dab70132c5237728f68422 +13 -0
- package/skills/project-update/history/blobs/0ef4a360c76da290173dea0f8073949cb0f8113710a38df95acae5d96bdd1286 +123 -0
- package/skills/project-update/history/blobs/164cd34c182de88c33de7df35beb29200d792419e1c13a5f0b2104f944e57be7 +1 -0
- package/skills/project-update/history/blobs/18c7a2753ce9cb6f6d3d1e9d5d1125d75950b879d56b7325225b200869631b29 +15 -0
- package/skills/project-update/history/blobs/1d1d907449ec74594d0ee923ac142ae746b9aedf0a1eda9469f075a44d23e3d7 +13 -0
- package/skills/project-update/history/blobs/23a42febbacaa7b52a802d428033a99c0694391c81d51fe3b6e1dff608a641d5 +67 -0
- package/skills/project-update/history/blobs/25d4f2a86deb5e2574bb3210b67bb24fcc4afb19f93a7b65a057daa874a9d18e +1 -0
- package/skills/project-update/history/blobs/48d9950f16e31d55475f566a80dc95f64b35f1c804d2f51729e313a4f29bac8d +13 -0
- package/skills/project-update/history/blobs/5353ca529c46f2443e12947ec205a6887fb594a4de1f87f0eb1c0e6c0f826133 +49 -0
- package/skills/project-update/history/blobs/5a93f78b4ed4d416c171139b2ce610a117f9c1dd46fbb56ca86729cb4c53d10c +6 -0
- package/skills/project-update/history/blobs/5f65bc7ab3fc3c4e75ae05d49eaf4331fafc398c661abe33c69f7380a720344c +32 -0
- package/skills/project-update/history/blobs/6a3be0e624e5ad91e44d08857b7183ee53b7903e1e8d56ff196dbc9dde271e4a +75 -0
- package/skills/project-update/history/blobs/7170553410bba904ffb7edb4b231e3b3579b85542d84de717299980938f82c9d +13 -0
- package/skills/project-update/history/blobs/774b1e3a04ef0d49d33c44a2cfecd92eb6f6b738a12b6a681103ba7fc13e7b86 +67 -0
- package/skills/project-update/history/blobs/7be527cd648b27cca6e267de30f8e33a2ce17d5631a82694f23ae5c0623efe1f +15 -0
- package/skills/project-update/history/blobs/7ee99edafe7cec45ff577376c0d0178fdb2690134d4656488f46e129aba3cc5a +67 -0
- package/skills/project-update/history/blobs/7f063e79195a5c85c37b7260dd20c184d3b9bea85e37202e0bbca73ad84bba49 +13 -0
- package/skills/project-update/history/blobs/8b3ef9586491a426767c01da5d01bdd6b0655c576c68c4cc6dfb093367817dc0 +67 -0
- package/skills/project-update/history/blobs/917df3320d778ddbaa5c5c7742bc4046bf803c36ed2b050f30844ed206783469 +1 -0
- package/skills/project-update/history/blobs/935af1019931058ec3a0b834fe230e127ec914f75edcc4a6c589cfe733b0b979 +13 -0
- package/skills/project-update/history/blobs/ae5ce131d6bae401199ff32d8c3dc4d8aec188010a9111624ac64506e2116ff4 +84 -0
- package/skills/project-update/history/blobs/c8573ca1f810ce6c4ac49456a4c1725b93e0d3b74c54ce95d46d8747777895f0 +13 -0
- package/skills/project-update/history/blobs/ca4499d829268c8766fb3b825a515e88dc55c237e9d202816b50959b4dac031f +13 -0
- package/skills/project-update/history/blobs/d6e5b34d475e7187d2a8cb2aac7e7f1a427142baf6461bda387d70ceb4d8a8c1 +30 -0
- package/skills/project-update/history/blobs/e120ff4e32b2e950fc94ada4e787d57dc9c790da37223e5a202d74f7e3aadf80 +13 -0
- package/skills/project-update/history/blobs/e9adb7a9905eb719ac78ab96671f055da53e5001810f5ad6d6c94306b0323fe7 +74 -0
- package/skills/project-update/history/blobs/fae3064e648cdc55be4aeb1177525b302a5e34ebd752e4a904f47dc0f4557b96 +71 -0
- package/skills/project-update/history/index.json +60 -20
- package/skills/project-update/migrations/0009_state_file.py +25 -0
- package/skills/project-update/migrations/0010_dialog_switch.py +30 -0
- package/skills/project-update/migrations/0011_retire_risk_tiers.py +37 -0
- package/skills/project-update/migrations/README.md +2 -1
- package/skills/project-update/migrations/__init__.py +6 -1
- package/skills/project-update/render_instructions.py +1 -1
- package/skills/project-update/update.py +385 -89
- package/skills/rr-build/SKILL.md +14 -5
- package/skills/rr-build-all/SKILL.md +190 -0
- package/skills/rr-plan/SKILL.md +16 -4
- package/skills/rr-review/SKILL.md +24 -9
- package/skills/rr-setup/SKILL.md +15 -2
- package/skills/rr-setup/setup.py +7 -1
- package/skills/rr-ship/SKILL.md +16 -8
- package/skills/rr-spec/SKILL.md +4 -2
- package/skills/rr-status/SKILL.md +2 -2
- package/skills/usage-report/usage-report.py +45 -10
- package/skills/ai-init/templates/.ai/policies/risk-tiers.json +0 -628
- package/skills/ai-init/templates/.ai/policies/risk-tiers.md +0 -180
|
@@ -121,7 +121,7 @@ def snapshot_tree(root):
|
|
|
121
121
|
if git(root, ["add", "-A", "--", "."], env=env)[0] != 0:
|
|
122
122
|
return None
|
|
123
123
|
git(root, ["rm", "-r", "--cached", "--quiet", "--ignore-unmatch", "--",
|
|
124
|
-
".ai/state", ".ai/reports"], env=env)
|
|
124
|
+
".ai/state", ".ai/reports", ".ai/memory"], env=env)
|
|
125
125
|
code, out = git(root, ["write-tree"], env=env)
|
|
126
126
|
return out.strip() if code == 0 and out.strip() else None
|
|
127
127
|
finally:
|
|
@@ -135,8 +135,10 @@ def snapshot_tree(root):
|
|
|
135
135
|
def numstat(root, from_tree, to_tree):
|
|
136
136
|
"""[{path, added, deleted, binary}] between two trees, NUL-separated so a
|
|
137
137
|
path with a space, a quote or a newline survives. Renames are off: a rename
|
|
138
|
-
is an add plus a delete, as diff_files reports it.
|
|
139
|
-
|
|
138
|
+
is an add plus a delete, as diff_files reports it. --relative (git runs in
|
|
139
|
+
root): paths are relative to the project root, as task files and policy globs
|
|
140
|
+
are, and a change outside root, below the git top level, is left out."""
|
|
141
|
+
code, out = git(root, ["diff", "--relative", "--numstat", "--no-renames", "-z",
|
|
140
142
|
from_tree, to_tree])
|
|
141
143
|
if code != 0:
|
|
142
144
|
return None
|
|
@@ -170,7 +172,8 @@ def diff_files(root, from_tree, to_tree):
|
|
|
170
172
|
None when either tree is missing: an unmeasured diff is not an empty one."""
|
|
171
173
|
if not from_tree or not to_tree:
|
|
172
174
|
return None
|
|
173
|
-
code, out = git(root, ["diff", "--name-status", "--no-renames", "-z",
|
|
175
|
+
code, out = git(root, ["diff", "--relative", "--name-status", "--no-renames", "-z",
|
|
176
|
+
from_tree, to_tree])
|
|
174
177
|
if code != 0:
|
|
175
178
|
return None
|
|
176
179
|
fields = [f for f in out.split("\0") if f != ""]
|
|
@@ -202,7 +205,8 @@ def scope_any(path, patterns):
|
|
|
202
205
|
# ------------------------------------------------------------------- running
|
|
203
206
|
|
|
204
207
|
TESTING_FIELDS = ("verify_command", "step_test_command", "e2e_command",
|
|
205
|
-
"lint_command", "typecheck_command", "single_test"
|
|
208
|
+
"lint_command", "typecheck_command", "single_test", "doc_tests",
|
|
209
|
+
"bite_codes")
|
|
206
210
|
|
|
207
211
|
SCOPE_FIELD = {"suite": "verify_command", "step": "step_test_command",
|
|
208
212
|
"e2e": "e2e_command", "single": "single_test"}
|
|
@@ -232,10 +236,26 @@ def read_commands(root):
|
|
|
232
236
|
value = match.group(1).strip()
|
|
233
237
|
if value.startswith("#"):
|
|
234
238
|
value = ""
|
|
239
|
+
# A trailing ` # comment` is not part of `none` or of the code list; a
|
|
240
|
+
# command value is left exactly as written (a `#` can be part of it).
|
|
241
|
+
bare = re.sub(r"\s+#.*$", "", value)
|
|
242
|
+
if field == "bite_codes" or bare.lower() == "none":
|
|
243
|
+
value = bare
|
|
235
244
|
commands[field] = value
|
|
236
245
|
return commands
|
|
237
246
|
|
|
238
247
|
|
|
248
|
+
def bite_codes(root):
|
|
249
|
+
"""The exit codes that count as "the test fails" under --expect fail: the
|
|
250
|
+
testing.md `bite_codes` list of integers, 1 when absent or not a clean list."""
|
|
251
|
+
raw = read_commands(root).get("bite_codes", "")
|
|
252
|
+
try:
|
|
253
|
+
codes = tuple(int(part) for part in raw.split(","))
|
|
254
|
+
except ValueError:
|
|
255
|
+
return (1,)
|
|
256
|
+
return codes or (1,)
|
|
257
|
+
|
|
258
|
+
|
|
239
259
|
def command_for(root, scope):
|
|
240
260
|
return (read_commands(root).get(SCOPE_FIELD.get(scope, ""), "") or "").strip()
|
|
241
261
|
|