From 7d4a3d86ef7a8649b90670b95d56617017939a74 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Sun, 6 Sep 2026 12:56:11 -0400 Subject: [PATCH 1/2] docs: adopt the org README header, badges, and table of contents --- README.md | 68 ++++++++++++++++++++++++++++++++++++++----- docs/assets/logo.png | Bin 0 -> 33069 bytes 2 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 docs/assets/logo.png diff --git a/README.md b/README.md index aa64da3..818ded8 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,59 @@ -# codeanalyzer-iac - -`codeanalyzer-iac` is the CLDK infrastructure-as-code analyzer backend. It reads -a repository (or a graph that already holds one) and publishes one typed model -of its infrastructure sources as JSON and as a matching Neo4j projection. Helm -is the first dialect; every other file stays an ordinary `Artifact` and is never -dropped. - +
+ +CodeLLM-DevKit + +# codeanalyzer-iac (`caniac`) + +**An infrastructure-as-code static-analysis toolkit — the CLDK backend that turns Helm charts into the canonical schema v2 IaC model, as `analysis.json` or a Neo4j property graph.** + +[![PyPI](https://img.shields.io/pypi/v/codeanalyzer-iac?style=for-the-badge&logo=pypi&logoColor=white)](https://pypi.org/project/codeanalyzer-iac/) +[![GitHub release](https://img.shields.io/github/v/release/codellm-devkit/codeanalyzer-iac?style=for-the-badge&logo=github&label=GitHub&color=2dba4e)](https://github.com/codellm-devkit/codeanalyzer-iac/releases/latest) +[![Release](https://img.shields.io/github/actions/workflow/status/codellm-devkit/codeanalyzer-iac/release.yml?style=for-the-badge&label=release&logo=githubactions&logoColor=white)](https://github.com/codellm-devkit/codeanalyzer-iac/actions/workflows/release.yml) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue?style=for-the-badge)](./LICENSE) + +
+ +--- + +`caniac` is a static analyzer for infrastructure-as-code built on the +[Helm](https://helm.sh/) SDK (pinned to 4.2.4, never the `helm` CLI). It reads a repository — or a +Neo4j graph that already holds one — and publishes one typed model of its infrastructure sources +as `analysis.json` and as a matching **Neo4j property graph**. It is the IaC backend behind +[CLDK](https://github.com/codellm-devkit/python-sdk), a sibling of the +[Python](https://github.com/codellm-devkit/codeanalyzer-python) (`canpy`), +[TypeScript](https://github.com/codellm-devkit/codeanalyzer-typescript) (`cants`) and +[Java](https://github.com/codellm-devkit/codeanalyzer-java) analyzers. Helm is the first dialect; +every other file stays an ordinary `Artifact` and is never dropped. + +The model grows one layer at a time across three analysis levels (`-a 1|2|3`): source facts, chart +and value resolution, and rendered Kubernetes desired state. Each level is a strict superset of the +one below it, so a consumer can request exactly the depth it needs; the graph projections always +carry level 3. + +## Table of Contents + +- [Install](#install) +- [Build](#build) +- [Filesystem analysis](#filesystem-analysis) +- [Graph enrichment](#graph-enrichment) +- [Typed render configuration](#typed-render-configuration) +- [Analysis levels](#analysis-levels) +- [Output modes and exit channels](#output-modes-and-exit-channels) + - [Credentials](#credentials) +- [Progressive Artifact facets](#progressive-artifact-facets) +- [What the analyzer never does](#what-the-analyzer-never-does) + - [Secret-derived data](#secret-derived-data) +- [Helm support matrix](#helm-support-matrix) +- [Known limitations in 0.1.0](#known-limitations-in-010) +- [Explicitly not in scope](#explicitly-not-in-scope) +- [Future dialects](#future-dialects) +- [Development gates](#development-gates) +- [Live acceptance gate](#live-acceptance-gate) + - [Prerequisites](#prerequisites) + - [The pinned repositories](#the-pinned-repositories) + - [Expected semantics](#expected-semantics) + - [When upstream changes](#when-upstream-changes) +- [License](#license) ## Install @@ -578,3 +626,7 @@ never rewrites an expectation. An upstream change is adopted only by review: 3. If it is, update `tests/live/repositories.json` and the affected assertions in the same pull request, with the upstream diff cited in the description. 4. If it is not, leave the pin alone and open an upstream issue. + +## License + +Apache 2.0 — see [LICENSE](./LICENSE). diff --git a/docs/assets/logo.png b/docs/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..93cab6b32b56689a72feed803d80527ecb2636be GIT binary patch literal 33069 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

iqrpI|C|Qg&ZFvHAb;q1@usr;(?|IajbHsA D$z4=+ literal 0 HcmV?d00001 From d5c8b8a76197cdb45e5baea4ef81f7756ff24baa Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Sun, 6 Sep 2026 12:59:32 -0400 Subject: [PATCH 2/2] docs: restore the schema pin sentence the pin-parity test guards --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 818ded8..a07649d 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,10 @@ and value resolution, and rendered Kubernetes desired state. Each level is a str one below it, so a consumer can request exactly the depth it needs; the graph projections always carry level 3. +The repository pins the accepted `codeanalyzer-schema` contract at +[`b84428f1accebe2b259d32c15387f04a00167f2c`](https://github.com/codellm-devkit/codeanalyzer-schema/commit/b84428f1accebe2b259d32c15387f04a00167f2c); +`make schema-check` and the pin-parity test keep every copy of that commit in step. + ## Table of Contents - [Install](#install)