{"id":50318649,"url":"https://github.com/jonathanlight/context_os","last_synced_at":"2026-05-29T02:01:10.338Z","repository":{"id":360733383,"uuid":"1251021524","full_name":"Jonathanlight/context_os","owner":"Jonathanlight","description":"context_os","archived":false,"fork":false,"pushed_at":"2026-05-27T18:01:58.000Z","size":60,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2026-05-27T18:06:08.018Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Jonathanlight.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-27T07:08:49.000Z","updated_at":"2026-05-27T16:03:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Jonathanlight/context_os","commit_stats":null,"previous_names":["jonathanlight/context_os"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Jonathanlight/context_os","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jonathanlight%2Fcontext_os","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jonathanlight%2Fcontext_os/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jonathanlight%2Fcontext_os/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jonathanlight%2Fcontext_os/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Jonathanlight","download_url":"https://codeload.github.com/Jonathanlight/context_os/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jonathanlight%2Fcontext_os/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33633468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-29T02:01:09.341Z","updated_at":"2026-05-29T02:01:10.323Z","avatar_url":"https://github.com/Jonathanlight.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"https://raw.githubusercontent.com/Jonathanlight/context_os/develop/logo.png\" alt=\"ContextOS — The Operating System for AI Context\" width=\"420\"\u003e\n\n# ContextOS\n\n**The complete toolchain for LLM context engineering — lint, compile, audit, evaluate, auto-fix, and ship.**\n\n**English** · [Français](README.fr.md)\n\n[![CI](https://github.com/Jonathanlight/context_os/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/Jonathanlight/context_os/actions/workflows/ci.yml)\n[![Docs](https://github.com/Jonathanlight/context_os/actions/workflows/docs.yml/badge.svg?branch=develop)](https://jonathanlight.github.io/context_os/)\n[![PyPI](https://img.shields.io/pypi/v/context-os-ctx.svg)](https://pypi.org/project/context-os-ctx/)\n[![Python](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\n\u003c/div\u003e\n\n---\n\n## The problem\n\nA developer working seriously with LLMs in 2026 maintains **5–10 context files** scattered across incompatible formats:\n\n```\nyour-repo/\n├── CLAUDE.md                          ← Claude Code\n├── AGENTS.md                          ← Codex / Aider\n├── .cursorrules                       ← Cursor\n├── .cursor/rules/*.mdc                ← Cursor (new format)\n├── .clinerules                        ← Cline\n├── .windsurfrules                     ← Windsurf\n├── .github/copilot-instructions.md    ← GitHub Copilot\n├── skills/\u003cname\u003e/SKILL.md             ← Anthropic Skills\n└── rag.ctx                            ← RAG corpus config\n```\n\nThey **drift**. They **contradict**. Nobody catches the rule that says `Always use type hints` in `CLAUDE.md` while `.cursorrules` says `Never use type hints in benchmarks`. The model sees both; one wins; the choice is invisible to the author.\n\n## The solution\n\nContextOS treats LLM context as **source code**: parsed into a typed AST, validated against 27 lint rules, kept in sync across targets, evaluated against real LLMs, auto-fixed where unambiguous.\n\n```\n   ┌─────────────────┐\n   │  project.ctx    │   ← write once\n   └────────┬────────┘\n            │\n   ┌────────▼─────────┐\n   │   ContextOS      │   ← parse · lint · evaluate · fix\n   └────────┬─────────┘\n            │\n   ┌────────┼────────┬────────┬────────┬─────────┐\n   ▼        ▼        ▼        ▼        ▼         ▼\nCLAUDE.md AGENTS.md cursor copilot windsurf  SKILL.md\n                                              rag.manifest.json\n```\n\n## What's in the box\n\n|     | Capability | One-liner |\n| --- | --- | --- |\n| 📝 | **`ctx compile`** | One `.ctx` source → eight target formats |\n| 🔎 | **`ctx lint`** | 27 rules across A / C / F / K / P / R / S / X / XA categories |\n| 🌳 | **`ctx audit`** | Walk a repo, lint every file, surface cross-artifact collisions |\n| 📊 | **`ctx stats`** | Aggregate corpus-wide diagnostics + top rule codes |\n| 🔀 | **`ctx diff`** | Semantic diff between two context versions |\n| 🧪 | **`ctx eval`** | Functional evaluation against Anthropic Skills + RAG retrieval |\n| 📉 | **`ctx eval-diff`** | Compare runs, gate CI on regressions |\n| 🛠 | **`ctx fix`** | Auto-apply structured fixes (X003, F001, X001, S005) |\n| 🧠 | **`ctx lsp`** | LSP server for VSCode / Neovim / Helix / Sublime |\n| 📺 | **`--html`** | Self-contained HTML reports for audit + eval |\n\n## Install\n\n\u003e **PyPI publication is pending** — the `context-os-ctx` distribution\n\u003e on PyPI is not (yet) the package from this repository. Until the\n\u003e first release is published, install from the git source. See\n\u003e [`docs/release.md`](docs/release.md) for the publishing setup.\n\n### From the git source (recommended today)\n\n```bash\n# Core CLI\npipx install git+https://github.com/Jonathanlight/context_os.git\n\n# With editor (LSP) support\npipx install 'git+https://github.com/Jonathanlight/context_os.git#egg=context-os-ctx[lsp]'\n\n# With evaluation (Anthropic + OpenAI + numpy)\npipx install 'git+https://github.com/Jonathanlight/context_os.git#egg=context-os-ctx[eval]'\n```\n\nPin to a specific release by appending `@vX.Y.Z`:\n\n```bash\npipx install git+https://github.com/Jonathanlight/context_os.git@v4.0.0\n```\n\n### Once PyPI publishing is configured\n\n```bash\npipx install context-os-ctx\npipx install 'context-os-ctx[lsp]'\npipx install 'context-os-ctx[eval]'\n```\n\n### Verify\n\n```bash\nctx --version\n# contextos 4.0.0\n```\n\n## Five-minute tour\n\n### 1 — Write your project context once\n\n```toml\n# project.ctx\nproject = \"MyApp\"\nartifacts = [\"context\"]\n\n[stack]\nrequired = [\"python\u003e=3.12\", \"fastapi\"]\nforbidden = [\"django\"]\n\n[[rules]]\nid = \"TDD-001\"\ntitle = \"Write a failing test before any production code change\"\nseverity = \"must\"\nrationale = \"Catches regressions before they reach PR review.\"\n\n[[rules]]\nid = \"SEC-042\"\ntitle = \"Sanitize every input crossing a trust boundary\"\nseverity = \"must\"\nrationale = \"Prevents path-traversal and injection attacks.\"\nexample_good = \"bleach.clean(user_html)\"\n```\n\n### 2 — Compile to every target\n\n```bash\nctx compile project.ctx --target claude_code --output-dir .   # → ./CLAUDE.md\nctx compile project.ctx --target codex       --output-dir .   # → ./AGENTS.md\nctx compile project.ctx --target cursor      --output-dir .   # → ./.cursor/rules/agent.mdc\nctx compile project.ctx --target copilot     --output-dir .   # → ./.github/copilot-instructions.md\n```\n\n### 3 — Lint existing files\n\n```text\n$ ctx lint CLAUDE.md --target claude_code\nwarning[A001]: vague directive: 'Be concise'\n  --\u003e CLAUDE.md:42:1\n   = help: rephrase with a measurable criterion (e.g. 'public functions\n     \u003c= 40 lines' instead of 'be concise')\n   = doc:  https://contextos.dev/rules/A001\n\nwarning[K002]: must-severity rule 'TDD-001' has no rationale\n  --\u003e CLAUDE.md:14:1\n   = help: add `rationale = \"...\"` explaining why this rule is mandatory\n```\n\n### 4 — Audit a whole repo\n\n```text\n$ ctx audit .\n\n--- ./CLAUDE.md\nwarning[F002]: rule title is 145 characters long (limit: 120)\n  --\u003e ./CLAUDE.md:12:1\n\n--- ./AGENTS.md\nno diagnostics\n\n--- Cross-artifact\nwarning[XA001]: rule id 'TDD-001' collides across 2 files with different\ncontent: ['./AGENTS.md', './CLAUDE.md']\n\nsummary: 2 diagnostic(s)\n```\n\n### 5 — Evaluate your skills functionally\n\n```bash\nctx eval skills.eval.toml --skills-dir skills/ --json --output current.json\nctx eval-diff baseline.json current.json\n# exit 1 if a previously-passing case now fails\n```\n\n### 6 — Auto-fix what we can\n\n```bash\nctx fix CLAUDE.md           # dry-run: prints a unified diff\nctx fix CLAUDE.md --apply   # writes the fix back\n```\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│                       ContextOS v4.0                            │\n├─────────────────────────────────────────────────────────────────┤\n│                                                                 │\n│  ┌────────────────────────────────────────────────────────┐     │\n│  │  AST (Pydantic v2, mypy --strict)                      │     │\n│  │  Agent · Skill · RAG · Eval                            │     │\n│  └────────────────────────────────────────────────────────┘     │\n│                                                                 │\n│  ┌────────────┬─────────────┬────────────┬────────────────┐     │\n│  │  Parsers   │  Analyzers  │  Emitters  │  Eval runners  │     │\n│  │  .ctx      │  27 rules   │  8 targets │  Anthropic     │     │\n│  │  CLAUDE.md │  A/C/F/K/P/ │  Markdown  │  OpenAI        │     │\n│  │  SKILL.md  │  R/S/X/XA   │  JSON      │  Mock          │     │\n│  └────────────┴─────────────┴────────────┴────────────────┘     │\n│                                                                 │\n│  ┌────────────────────────────────────────────────────────┐     │\n│  │  Surfaces                                              │     │\n│  │  CLI · Python library · LSP server · VSCode extension  │     │\n│  │      · GitHub Action · HTML reports                    │     │\n│  └────────────────────────────────────────────────────────┘     │\n│                                                                 │\n└─────────────────────────────────────────────────────────────────┘\n```\n\nThree artifact families: **agent context files** · **Anthropic Skills** · **RAG corpora**.\nThree operating modes: **structural lint** · **functional eval** · **auto-fix**.\nFive consumption surfaces: **CLI** · **Python library** · **LSP** · **VSCode extension** · **GitHub Action**.\n\n## Supported targets\n\n| Target            | Parse | Emit | Filename                              |\n|-------------------|:-----:|:----:|---------------------------------------|\n| `claude_code`     |  ✅   |  ✅  | `CLAUDE.md`                           |\n| `codex`           |  ✅   |  ✅  | `AGENTS.md`                           |\n| `cursor`          |  ⏳   |  ✅  | `.cursor/rules/agent.mdc`             |\n| `copilot`         |  ⏳   |  ✅  | `.github/copilot-instructions.md`     |\n| `cline`           |  ⏳   |  ✅  | `.clinerules`                         |\n| `windsurf`        |  ⏳   |  ✅  | `.windsurfrules`                      |\n| `anthropic_skill` |  ✅   |  ✅  | `SKILL.md`                            |\n| `rag_manifest`    |  N/A  |  ✅  | `rag.manifest.json`                   |\n\n## CLI reference\n\nThe **Input** column tells you what the command expects on the command line:\n\n- _none_ — no positional argument, the command is self-contained\n- _file_ — a path to an existing file (e.g. `CLAUDE.md`, `project.ctx`)\n- _dir_ — a directory path (typically a repo root)\n- _two files_ — two paths (diff and eval-diff)\n\n| Command         | Input            | Output                                | Purpose                                                              |\n|-----------------|------------------|---------------------------------------|----------------------------------------------------------------------|\n| `ctx create`    | _none_           | new `\u003cproject\u003e.ctx`                   | Scaffold a starter `.ctx` from `--lang python,fastapi,react,...`     |\n| `ctx init`      | dir (default `.`)| new `\u003croot\u003e/\u003cdirname\u003e.ctx`            | Walk repo recursively, detect stack from manifests, write a `.ctx`   |\n| `ctx eval-init` | _none_           | new `\u003cname\u003e.eval.toml`                | Scaffold a minimal `.eval.toml` (sample suite to feed `ctx eval`)    |\n| `ctx parse`     | file             | JSON or TOML on stdout                | `.ctx` / Markdown / SKILL.md → AST                                   |\n| `ctx compile`   | file (`.ctx`)    | target file on stdout or via `-o`     | `.ctx` → CLAUDE.md / AGENTS.md / cursor / copilot / cline / windsurf |\n| `ctx lint`      | file             | diagnostics on stdout                 | Run the 27 analyzers on a single file                                |\n| `ctx diff`      | two files        | unified diff on stdout                | Semantic AST-level diff of two Documents                             |\n| `ctx audit`     | dir              | report on stdout / HTML via `-o`      | Walk a repo, lint everything, run cross-artifact rules               |\n| `ctx stats`     | dir              | aggregate JSON / text                 | Aggregate corpus-wide statistics from an audit                       |\n| `ctx fix`       | file             | unified diff or modified file         | Auto-apply structured fixes; `--dry-run` default, `--apply` to write |\n| `ctx eval`      | file (`.eval.toml`)| pass/fail report                    | Run a `.eval.toml` suite against a real (or mock) provider           |\n| `ctx eval-diff` | two files        | regression report                     | Compare two `ctx eval --json` outputs; exit 1 on regression          |\n| `ctx lsp`       | _none_           | LSP over stdio                        | Language server (requires `[lsp]` extras)                            |\n| `ctx upgrade`   | _none_           | upgrades the install                  | Check PyPI and `pip install --upgrade context-os-ctx`                |\n\n### Worked examples\n\n```bash\n# === Starting from scratch ==================================================\n\n# 1. Build a starter .ctx for a brand new project\nctx create church-manager --lang php,symfony,doctrine --domain \"parish management\"\n# → ./church-manager.ctx\n\n# 2. Mix several stacks; aliases like Next.js / c# / spring boot are accepted\nctx create acme --lang python,fastapi,react,tailwind --domain fintech\n# → ./acme.ctx\n\n# 3. Discover the registry (90+ slugs across 4 waves)\nctx create --list-languages\n\n# === Starting from an existing repo =========================================\n\n# 4. Auto-detect the stack of the current directory (recursive by default)\nctx init                          # → ./\u003cdirname\u003e.ctx\nctx init . --project demo         # → ./demo.ctx\nctx init . --dry-run              # print the .ctx, write nothing\nctx init . --no-recursive         # only inspect the root manifest\nctx init . --depth 2              # cap recursion to 2 levels\n\n# === Compiling a .ctx into agent files ======================================\n\n# 5. .ctx → target file (one of 8 supported targets)\nctx compile project.ctx --target claude_code  --output-dir .   # → ./CLAUDE.md\nctx compile project.ctx --target codex        --output-dir .   # → ./AGENTS.md\nctx compile project.ctx --target cursor       --output-dir .   # → ./.cursor/rules/agent.mdc\nctx compile project.ctx --target copilot      --output-dir .   # → ./.github/copilot-instructions.md\n\n# === Linting an existing agent file =========================================\n\n# 6. Lint a CLAUDE.md / AGENTS.md / SKILL.md (target is required for .md)\nctx lint CLAUDE.md --target claude_code\nctx lint SKILL.md  --target anthropic_skill\n\n# 7. Walk the whole repo and lint every agent file at once\nctx audit .\nctx audit . --html --output audit.html       # self-contained HTML report\n\n# === Evaluating skills / RAG ================================================\n\n# 8. ctx eval needs a hand-written .eval.toml. Scaffold one first:\nctx eval-init skills                           # → ./skills.eval.toml (Skill target)\nctx eval-init policy --target rag              # → ./policy.eval.toml (RAG target)\n\n# 9. Smoke-test with --dry-run (no API key, no spend)\nctx eval skills.eval.toml --dry-run\nctx eval policy.eval.toml --dry-run --rag-chunks chunks.json\n\n# 10. Real run (requires ANTHROPIC_API_KEY or OPENAI_API_KEY)\nctx eval skills.eval.toml --skills-dir ./skills/\n\n# === Maintenance ============================================================\n\n# 11. Upgrade the CLI itself\nctx upgrade --check              # report only\nctx upgrade                      # pip install --upgrade context-os-ctx\n```\n\n**Universal flags:** every command has `--json` for machine-readable output.\n**HTML reports:** `ctx audit --html` and `ctx eval --html` emit self-contained HTML pages.\n**Exit codes:** 0 on success, 1 only when an error-severity diagnostic fires (or a structured failure occurs).\n**Per-command help:** every command prints concrete examples under `--help` (e.g. `ctx init --help`, `ctx eval --help`).\n\n## Project status\n\n| Phase | What                                                          | Status     |\n|-------|---------------------------------------------------------------|------------|\n| 1     | Parser + AST + Claude emitter                                 | ✅ shipped |\n| 2     | 15 lint rules (A / C / F / K / P / X / XA)                    | ✅ shipped |\n| 3     | 5 more emitters + diff + audit                                | ✅ shipped |\n| 4     | Corpus stats + docs site + **v1.0** launch                    | ✅ shipped |\n| 5     | Anthropic Skills (`SKILL.md`) + 6 skill rules                 | ✅ shipped |\n| 6     | RAG corpora + 6 RAG rules + **v2.0** launch                   | ✅ shipped |\n| 7A    | LSP server + VSCode extension + GitHub Action + **v2.1**      | ✅ shipped |\n| 7B    | Live evaluation (Skills + RAG) + **v3.0** launch              | ✅ shipped |\n| 8     | PyPI/Marketplace + HTML reports + `ctx fix` + **v4.0** launch | ✅ shipped |\n| 9+    | Multi-provider Skills, embedding helpers, PDF in RAG, …       | ⏳ planned |\n\n## Editor integration\n\nContextOS speaks LSP and ships a VSCode extension wrapping it.\n\n```bash\npipx install 'git+https://github.com/Jonathanlight/context_os.git#egg=context-os-ctx[lsp]'\n```\n\n- **VSCode** — extension at [`extensions/vscode/`](extensions/vscode).\n- **Neovim / Helix / Sublime** — three-line LSP client configs in [`docs/editor.md`](docs/editor.md).\n- **GitHub CI** — composite Action at [`actions/lint/`](actions/lint):\n  ```yaml\n  - uses: Jonathanlight/context_os/actions/lint@v4.0.0\n  ```\n  Posts a sticky audit report as a PR comment.\n\nThe 27 lint rules, completion, hover, and quick-fix code actions surface identically in every shape — the editor is just an alternate window onto the same Python core.\n\n## Live evaluation\n\nMove from validating **structure** to validating **behavior**: does the skill actually fire on the right prompts? Does RAG retrieval actually find the expected sources?\n\n```bash\npipx install 'git+https://github.com/Jonathanlight/context_os.git#egg=context-os-ctx[eval]'\n\nctx eval skills.eval.toml --dry-run             # mock smoke, no API calls\nctx eval skills.eval.toml --skills-dir skills/  # real Anthropic run\nctx eval-diff baseline.json current.json        # exit 1 on regression\n```\n\n- **Skills routing** via the Anthropic Messages API tool-use feature (`ANTHROPIC_API_KEY`).\n- **RAG retrieval** via in-process cosine over pre-indexed embeddings (`OPENAI_API_KEY` for query embeddings; bring your own for other vendors via the Python API).\n- **Mock providers** drive every test in CI without spending tokens.\n\nSee [`docs/eval.md`](docs/eval.md) for the full workflow.\n\n## Visualization \u0026 auto-fix\n\n```bash\nctx audit . --html --output audit.html\nctx eval skills.eval.toml --dry-run --html --output eval.html\nctx fix CLAUDE.md          # dry-run unified diff\nctx fix CLAUDE.md --apply  # write fixes\n```\n\nSee [`docs/dashboard.md`](docs/dashboard.md).\n\n## Docs\n\n- 📚 [Documentation site](https://jonathanlight.github.io/context_os/)\n- 🛠 [Getting started](docs/getting-started.md)\n- 🧠 [Editor integration](docs/editor.md)\n- 🧪 [Live evaluation](docs/eval.md)\n- 📺 [Visualization \u0026 auto-fix](docs/dashboard.md)\n- 📦 [Releasing](docs/release.md)\n- 📋 [Rules catalog](docs/rules/index.md)\n- 🏛 [Specs](docs/specs/) (Vision · Spec · Architecture · Roadmap)\n\n## Stack\n\n- **Python 3.12+**, `mypy --strict` clean on every file.\n- [Pydantic v2](https://docs.pydantic.dev) — strict-typed AST.\n- [Typer](https://typer.tiangolo.com) — the `ctx` CLI.\n- [mistletoe](https://github.com/miyuchina/mistletoe) — Markdown parser.\n- [tomlkit](https://github.com/python-poetry/tomlkit) — TOML preserving comments + order.\n- [ruamel.yaml](https://yaml.readthedocs.io) — YAML preserving comments + order (SKILL.md frontmatter).\n- [pygls](https://github.com/openlawlibrary/pygls) (optional) — LSP server.\n- [anthropic](https://docs.anthropic.com), [openai](https://platform.openai.com), [numpy](https://numpy.org) (optional) — eval runtime.\n- pytest + [hypothesis](https://hypothesis.readthedocs.io) — **1129 tests**, 94 % coverage, 1000-example property tests on the round-trip.\n- [ruff](https://docs.astral.sh/ruff/) — lint + format.\n\n## Install for development\n\n```bash\ngit clone git@github.com:Jonathanlight/context_os.git\ncd context_os\npip install -e \".[dev]\"\npre-commit install\n./scripts/check.sh    # ruff + mypy --strict + pytest\n```\n\nFor the docs site:\n\n```bash\npip install -e \".[docs]\"\nmkdocs serve   # http://127.0.0.1:8000/\n```\n\n## Contributing\n\nPull requests welcome. Read [`tasks/CONTRIBUTING.md`](tasks/CONTRIBUTING.md) first — ContextOS enforces strict PR discipline (one subject per PR, ≤ 400 lines diff excluding tests, conventional commits prefixed by phase).\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n## Author\n\n[Jonathan KABLAN](https://github.com/Jonathanlight) — Senior Full Stack Developer.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanlight%2Fcontext_os","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonathanlight%2Fcontext_os","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanlight%2Fcontext_os/lists"}