agentready 2.45.0__tar.gz → 2.46.0__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.
- {agentready-2.45.0/src/agentready.egg-info → agentready-2.46.0}/PKG-INFO +1 -1
- {agentready-2.45.0 → agentready-2.46.0}/pyproject.toml +1 -1
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/patterns.py +109 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/testing.py +22 -11
- {agentready-2.45.0 → agentready-2.46.0/src/agentready.egg-info}/PKG-INFO +1 -1
- {agentready-2.45.0 → agentready-2.46.0}/LICENSE +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/README.md +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/setup.cfg +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/__main__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/base.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/code_quality.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/containers.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/dbt.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/documentation.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/security.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/structure.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/stub_assessors.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/assessors/verification.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/align.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/assess_batch.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/bootstrap.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/demo.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/experiment.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/main.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/main_simplified.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/repomix.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/research.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/schema.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/cli/submit.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/data/.agentready-config.example.yaml +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/data/Python.arsrc +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/data/RESEARCH_REPORT.md +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/data/default-weights.yaml +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/fixers/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/fixers/base.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/fixers/documentation.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/fixers/testing.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/github/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/github/review_formatter.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/assessment.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/attribute.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/batch_assessment.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/citation.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/config.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/discovered_skill.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/eval_harness.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/finding.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/fix.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/metadata.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/repository.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/models/theme.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/prompts/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/prompts/claude_md_generator.md +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/prompts/loader.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/reporters/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/reporters/aggregated_json.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/reporters/base.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/reporters/csv_reporter.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/reporters/html.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/reporters/json_reporter.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/reporters/markdown.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/reporters/multi_html.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/assessment_cache.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/attribute_analyzer.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/batch_scanner.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/bootstrap.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/claudecode_runner.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/experiment_comparer.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/fixer_service.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/github_scanner.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/language_detector.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/llm_cache.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/repomix.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/repository_manager.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/research_formatter.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/research_loader.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/scanner.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/schema_migrator.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/schema_validator.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/scorer.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/sweagent_runner.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/services/swebench_evaluator.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/align/CLAUDE.md.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/CODEOWNERS.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/CODE_OF_CONDUCT.md.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/CONTRIBUTING.md.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/PULL_REQUEST_TEMPLATE.md.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/_base/precommit.yaml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/_base/workflows/security.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/_base/workflows/tests.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/dependabot.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/go/precommit.yaml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/go/workflows/security.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/go/workflows/tests.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/issue_templates/bug_report.md.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/issue_templates/feature_request.md.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/javascript/precommit.yaml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/javascript/workflows/security.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/javascript/workflows/tests.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/python/precommit.yaml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/python/workflows/security.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/python/workflows/tests.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/workflows/agentready-assessment.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/workflows/repomix-update.yml.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/multi_report.html.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/report.html.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/slides.html.j2 +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/utils/__init__.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/utils/privacy.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/utils/security.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready/utils/subprocess_utils.py +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready.egg-info/SOURCES.txt +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready.egg-info/dependency_links.txt +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready.egg-info/entry_points.txt +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready.egg-info/requires.txt +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/src/agentready.egg-info/top_level.txt +0 -0
- {agentready-2.45.0 → agentready-2.46.0}/tests/test_demo_generation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "agentready"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.46.0"
|
|
4
4
|
description = "Assess and bootstrap git repositories for AI-assisted development with automated remediation"
|
|
5
5
|
authors = [{name = "Jeremy Eder", email = "jeder@redhat.com"}]
|
|
6
6
|
readme = "README.md"
|
|
@@ -290,6 +290,13 @@ class DesignIntentAssessor(BaseAssessor):
|
|
|
290
290
|
evidence.append(f"Design intent language found in {filename}")
|
|
291
291
|
break
|
|
292
292
|
|
|
293
|
+
enforcement_pts, enforcement_evidence = self._check_design_enforcement(
|
|
294
|
+
repository
|
|
295
|
+
)
|
|
296
|
+
if enforcement_pts > 0:
|
|
297
|
+
score += enforcement_pts
|
|
298
|
+
evidence.extend(enforcement_evidence)
|
|
299
|
+
|
|
293
300
|
score = min(score, 100.0)
|
|
294
301
|
|
|
295
302
|
if score >= 50:
|
|
@@ -315,6 +322,99 @@ class DesignIntentAssessor(BaseAssessor):
|
|
|
315
322
|
error_message=None,
|
|
316
323
|
)
|
|
317
324
|
|
|
325
|
+
def _check_design_enforcement(
|
|
326
|
+
self, repository: Repository
|
|
327
|
+
) -> tuple[float, list[str]]:
|
|
328
|
+
"""Check for enforcement of design doc updates alongside code changes.
|
|
329
|
+
|
|
330
|
+
Advisory enforcement (10 pts): AGENTS.md/CLAUDE.md rules requiring
|
|
331
|
+
design doc updates with architectural changes.
|
|
332
|
+
Deterministic enforcement (15 pts): Hooks or skills that check for
|
|
333
|
+
design doc updates. Awards the higher of the two, not both.
|
|
334
|
+
"""
|
|
335
|
+
import json
|
|
336
|
+
|
|
337
|
+
doc_ref_pattern = re.compile(
|
|
338
|
+
r"design\s+doc|docs/design|architecture\s+doc|\.adr|design\s+document",
|
|
339
|
+
re.IGNORECASE,
|
|
340
|
+
)
|
|
341
|
+
enforcement_verb_pattern = re.compile(
|
|
342
|
+
r"update|review|create|maintain|must|required|ensure|check",
|
|
343
|
+
re.IGNORECASE,
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
deterministic_score = 0.0
|
|
347
|
+
deterministic_evidence = []
|
|
348
|
+
|
|
349
|
+
settings_path = repository.path / ".claude" / "settings.json"
|
|
350
|
+
if settings_path.exists():
|
|
351
|
+
try:
|
|
352
|
+
settings = json.loads(settings_path.read_text(encoding="utf-8"))
|
|
353
|
+
hooks = settings.get("hooks", {})
|
|
354
|
+
hooks_str = json.dumps(hooks).lower()
|
|
355
|
+
if (
|
|
356
|
+
hooks
|
|
357
|
+
and doc_ref_pattern.search(hooks_str)
|
|
358
|
+
and enforcement_verb_pattern.search(hooks_str)
|
|
359
|
+
):
|
|
360
|
+
deterministic_score = 15.0
|
|
361
|
+
deterministic_evidence.append(
|
|
362
|
+
".claude/settings.json hooks reference design docs (deterministic enforcement)"
|
|
363
|
+
)
|
|
364
|
+
except (json.JSONDecodeError, OSError):
|
|
365
|
+
pass
|
|
366
|
+
|
|
367
|
+
if deterministic_score == 0:
|
|
368
|
+
skills_dir = repository.path / ".claude" / "skills"
|
|
369
|
+
if skills_dir.exists() and skills_dir.is_dir():
|
|
370
|
+
try:
|
|
371
|
+
for skill_dir in skills_dir.iterdir():
|
|
372
|
+
if not skill_dir.is_dir():
|
|
373
|
+
continue
|
|
374
|
+
skill_md = skill_dir / "SKILL.md"
|
|
375
|
+
if not skill_md.exists():
|
|
376
|
+
continue
|
|
377
|
+
try:
|
|
378
|
+
content = skill_md.read_text(encoding="utf-8")
|
|
379
|
+
if doc_ref_pattern.search(
|
|
380
|
+
content
|
|
381
|
+
) and enforcement_verb_pattern.search(content):
|
|
382
|
+
deterministic_score = 15.0
|
|
383
|
+
deterministic_evidence.append(
|
|
384
|
+
f".claude/skills/{skill_dir.name}/ references design doc enforcement (deterministic)"
|
|
385
|
+
)
|
|
386
|
+
break
|
|
387
|
+
except (OSError, UnicodeDecodeError):
|
|
388
|
+
continue
|
|
389
|
+
except OSError:
|
|
390
|
+
pass
|
|
391
|
+
|
|
392
|
+
if deterministic_score > 0:
|
|
393
|
+
return deterministic_score, deterministic_evidence
|
|
394
|
+
|
|
395
|
+
advisory_score = 0.0
|
|
396
|
+
advisory_evidence = []
|
|
397
|
+
context_files = ["AGENTS.md", "CLAUDE.md", ".claude/CLAUDE.md"]
|
|
398
|
+
for filename in context_files:
|
|
399
|
+
filepath = repository.path / filename
|
|
400
|
+
if not filepath.exists():
|
|
401
|
+
continue
|
|
402
|
+
try:
|
|
403
|
+
content = filepath.read_text(encoding="utf-8")
|
|
404
|
+
except (OSError, UnicodeDecodeError):
|
|
405
|
+
continue
|
|
406
|
+
|
|
407
|
+
if doc_ref_pattern.search(content) and enforcement_verb_pattern.search(
|
|
408
|
+
content
|
|
409
|
+
):
|
|
410
|
+
advisory_score = 10.0
|
|
411
|
+
advisory_evidence.append(
|
|
412
|
+
f"{filename} contains design doc update rules (advisory enforcement)"
|
|
413
|
+
)
|
|
414
|
+
break
|
|
415
|
+
|
|
416
|
+
return advisory_score, advisory_evidence
|
|
417
|
+
|
|
318
418
|
def _create_remediation(self) -> Remediation:
|
|
319
419
|
return Remediation(
|
|
320
420
|
summary="Document design intent: preconditions, invariants, and rationale",
|
|
@@ -323,11 +423,14 @@ class DesignIntentAssessor(BaseAssessor):
|
|
|
323
423
|
"For each critical module, document preconditions, invariants, and rationale",
|
|
324
424
|
"Use an AI agent to reverse-engineer initial design docs from code, then enrich with intent",
|
|
325
425
|
"Reference design docs from CLAUDE.md/AGENTS.md",
|
|
426
|
+
"Add a rule to AGENTS.md requiring design doc updates with architectural changes",
|
|
427
|
+
"For stronger enforcement, add a hook or skill that checks for design doc updates",
|
|
326
428
|
],
|
|
327
429
|
tools=[],
|
|
328
430
|
commands=["mkdir -p docs/design"],
|
|
329
431
|
examples=[
|
|
330
432
|
"# docs/design/event-system.md\n## Invariants\n- Event log is append-only; never mutate or delete entries\n- Events are processed exactly-once via idempotency keys\n\n## Preconditions\n- Auth middleware must validate token before event handlers run\n\n## Rationale\n- Polling instead of webhooks: upstream API has 5s delivery SLA, too slow for our use case",
|
|
433
|
+
"# AGENTS.md - Advisory enforcement\n## Design Documentation\nWhen modifying component boundaries, data flows, or API contracts,\nreview and update the corresponding design doc in docs/design/.",
|
|
331
434
|
],
|
|
332
435
|
citations=[
|
|
333
436
|
Citation(
|
|
@@ -336,6 +439,12 @@ class DesignIntentAssessor(BaseAssessor):
|
|
|
336
439
|
url="",
|
|
337
440
|
relevance="Agents cannot infer design intent from code alone",
|
|
338
441
|
),
|
|
442
|
+
Citation(
|
|
443
|
+
source="Red Hat",
|
|
444
|
+
title="Repository Scaffolding for AI Coding Agents, Section 2.3 Practice C",
|
|
445
|
+
url="",
|
|
446
|
+
relevance="Enforce design doc updates as part of architectural changes",
|
|
447
|
+
),
|
|
339
448
|
],
|
|
340
449
|
)
|
|
341
450
|
|
|
@@ -791,18 +791,22 @@ class DeterministicEnforcementAssessor(BaseAssessor):
|
|
|
791
791
|
score = 0.0
|
|
792
792
|
|
|
793
793
|
if precommit_config.exists():
|
|
794
|
-
score +=
|
|
795
|
-
evidence.append(".pre-commit-config.yaml found (
|
|
794
|
+
score += 40.0
|
|
795
|
+
evidence.append(".pre-commit-config.yaml found (git hooks, bypassable)")
|
|
796
796
|
|
|
797
797
|
if claude_settings.exists():
|
|
798
798
|
try:
|
|
799
799
|
import json
|
|
800
800
|
|
|
801
801
|
content = json.loads(claude_settings.read_text())
|
|
802
|
-
|
|
803
|
-
|
|
802
|
+
hooks = content.get("hooks")
|
|
803
|
+
has_configured_hooks = isinstance(hooks, dict) and any(
|
|
804
|
+
isinstance(entries, list) and entries for entries in hooks.values()
|
|
805
|
+
)
|
|
806
|
+
if has_configured_hooks:
|
|
807
|
+
score += 60.0
|
|
804
808
|
evidence.append(
|
|
805
|
-
".claude/settings.json has hooks configured (agent hooks)"
|
|
809
|
+
".claude/settings.json has hooks configured (deterministic agent hooks)"
|
|
806
810
|
)
|
|
807
811
|
else:
|
|
808
812
|
score += 10.0
|
|
@@ -840,16 +844,18 @@ class DeterministicEnforcementAssessor(BaseAssessor):
|
|
|
840
844
|
hook_scripts = []
|
|
841
845
|
evidence.append(".husky directory exists but could not be read")
|
|
842
846
|
if hook_scripts:
|
|
843
|
-
score +=
|
|
847
|
+
score += 40.0
|
|
844
848
|
hooks_list = ", ".join(sorted(hook_scripts))
|
|
845
|
-
evidence.append(
|
|
849
|
+
evidence.append(
|
|
850
|
+
f".husky directory found with hooks: {hooks_list} (git hooks, bypassable)"
|
|
851
|
+
)
|
|
846
852
|
else:
|
|
847
853
|
score += 10.0
|
|
848
854
|
evidence.append(".husky directory found but no hook scripts")
|
|
849
855
|
|
|
850
856
|
score = min(score, 100.0)
|
|
851
857
|
|
|
852
|
-
if score >=
|
|
858
|
+
if score >= 40:
|
|
853
859
|
return Finding(
|
|
854
860
|
attribute=self.attribute,
|
|
855
861
|
status="pass",
|
|
@@ -888,9 +894,9 @@ class DeterministicEnforcementAssessor(BaseAssessor):
|
|
|
888
894
|
return Remediation(
|
|
889
895
|
summary="Set up deterministic enforcement with hooks and lint rules",
|
|
890
896
|
steps=[
|
|
897
|
+
"Configure .claude/settings.json with agent hooks (deterministic, cannot be bypassed)",
|
|
891
898
|
"Start with 2 hooks: auto-format on edit + block destructive operations",
|
|
892
|
-
"
|
|
893
|
-
"Configure .claude/settings.json with agent hooks for team-wide sharing",
|
|
899
|
+
"Optionally add pre-commit (Python) or Husky (Node.js) for git hooks",
|
|
894
900
|
"Add lint rules for import restrictions and architectural boundaries",
|
|
895
901
|
],
|
|
896
902
|
tools=["pre-commit", "husky"],
|
|
@@ -906,7 +912,12 @@ class DeterministicEnforcementAssessor(BaseAssessor):
|
|
|
906
912
|
"PostToolUse": [
|
|
907
913
|
{
|
|
908
914
|
"matcher": "Edit|Write",
|
|
909
|
-
"
|
|
915
|
+
"hooks": [
|
|
916
|
+
{
|
|
917
|
+
"type": "command",
|
|
918
|
+
"command": "npx prettier --write $CLAUDE_FILE_PATH 2>/dev/null || true"
|
|
919
|
+
}
|
|
920
|
+
]
|
|
910
921
|
}
|
|
911
922
|
]
|
|
912
923
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/CODE_OF_CONDUCT.md.j2
RENAMED
|
File without changes
|
{agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/CONTRIBUTING.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
{agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/_base/precommit.yaml.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/dependabot.yml.j2
RENAMED
|
File without changes
|
{agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/go/precommit.yaml.j2
RENAMED
|
File without changes
|
|
File without changes
|
{agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/go/workflows/tests.yml.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentready-2.45.0 → agentready-2.46.0}/src/agentready/templates/bootstrap/python/precommit.yaml.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|