feat(resource): add cloud infrastructure resources
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 16s
CI / lint (pull_request) Successful in 17s
CI / quality (pull_request) Successful in 29s
CI / typecheck (pull_request) Successful in 59s
CI / security (pull_request) Successful in 59s
CI / unit_tests (pull_request) Successful in 3m9s
CI / integration_tests (pull_request) Successful in 3m34s
CI / e2e_tests (pull_request) Successful in 3m54s
CI / docker (pull_request) Successful in 55s
CI / coverage (pull_request) Successful in 6m1s
CI / build (push) Successful in 15s
CI / lint (push) Successful in 16s
CI / quality (push) Successful in 27s
CI / typecheck (push) Successful in 38s
CI / benchmark-regression (push) Has been skipped
CI / security (push) Successful in 48s
CI / unit_tests (push) Successful in 3m14s
CI / integration_tests (push) Successful in 3m30s
CI / docker (push) Successful in 56s
CI / e2e_tests (push) Successful in 4m43s
CI / coverage (push) Successful in 6m1s
CI / benchmark-publish (push) Successful in 19m50s
CI / benchmark-regression (pull_request) Successful in 37m17s

Implement cloud resource types (aws, gcp, azure) with credential
fields, region/tenant metadata, and stubbed sandbox strategies.
Credential resolution uses environment variables and profile names
with no secrets logged.

Key changes:
- Add CloudResourceHandler with aws/gcp/azure type definitions
- Add credential resolution from env vars and profile names
- Add stubbed sandbox strategies (validate config, raise NotImplementedError)
- Register cloud types in bootstrap_builtin_types
- Credential masking via existing redaction patterns
- Add Behave BDD tests, Robot integration tests, ASV benchmarks

ISSUES CLOSED: #343
This commit was merged in pull request #669.
This commit is contained in:
2026-03-10 06:25:28 +00:00
parent ff2d824f17
commit c65e8a5285
24 changed files with 2700 additions and 47 deletions
+6 -7
View File
@@ -132,7 +132,7 @@ def _build_status_badge(status: str, extra_class: str = "") -> str:
def _resolve_adr_link(adr_number: int, files: Any) -> str | None:
"""Find the relative URL for an ADR by its number, using the MkDocs files collection."""
"""Find the relative URL for an ADR by its number."""
prefix = f"adr/ADR-{adr_number:03d}"
for f in files:
if f.src_path.startswith(prefix) and f.src_path.endswith(".md"):
@@ -189,7 +189,10 @@ def _build_header(
f'<a href="{link}">ADR-{superseded_by:03d}</a>'
)
else:
superseded_part = f' <span class="adr-label">— superseded by ADR-{superseded_by:03d}</span>'
superseded_part = (
f' <span class="adr-label">'
f"— superseded by ADR-{superseded_by:03d}</span>"
)
line2 = (
f'<div class="adr-header-line">'
@@ -664,12 +667,8 @@ def on_page_markdown(
generated_h1 = f"# ADR-{int(adr_number):03d}: {adr_title}\n"
else:
# Fallback: keep whatever H1 already exists
generated_h1 = ""
h1_match = re.match(r"(#\s+.+?\n)", markdown)
if h1_match:
generated_h1 = "" # leave it in the markdown
else:
generated_h1 = ""
generated_h1 = "" # leave existing H1 or use empty
# ── build header + timeline ─────────────────────────────────────
header_html = _build_header(