{"id":50471893,"url":"https://github.com/semcod/intract","last_synced_at":"2026-06-01T11:01:02.722Z","repository":{"id":361195901,"uuid":"1253426894","full_name":"semcod/intract","owner":"semcod","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-29T14:24:12.000Z","size":327,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T16:12:33.680Z","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":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/semcod.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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-29T12:58:35.000Z","updated_at":"2026-05-29T14:26:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/semcod/intract","commit_stats":null,"previous_names":["semcod/intract"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/semcod/intract","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fintract","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fintract/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fintract/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fintract/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/semcod","download_url":"https://codeload.github.com/semcod/intract/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fintract/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33771629,"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-06-01T02:00:06.963Z","response_time":115,"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-06-01T11:00:28.273Z","updated_at":"2026-06-01T11:01:02.678Z","avatar_url":"https://github.com/semcod.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Intract\n\n\n## AI Cost Tracking\n\n![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.9-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)\n![AI Cost](https://img.shields.io/badge/AI%20Cost-$2.56-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-7.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)\n\n- 🤖 **LLM usage:** $2.5558 (14 commits)\n- 👤 **Human dev:** ~$749 (7.5h @ $100/h, 30min dedup)\n\nGenerated on 2026-06-01 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)\n\n---\n\n**Intract** is an intent-contract layer for codebases and software delivery artifacts.\n\nIt lets you describe, validate and monitor intent across:\n\n```text\ncode\nfunctions\nclasses\nfiles\nproject manifests\nAPI endpoints\nDockerfiles\nCI/CD workflows\nKubernetes manifests\nDevOps artifacts\n```\n\nIntract is not primarily a programming language. It is a **contract system** for short, portable intent declarations.\n\n## Quick example\n\n```python\n# @intract.v1 scope:function intent:validate:user_permission priority:1 domain:security input:user,resource output:allowed effect:none forbid:write,network validate:input_presence,return_value,no_forbidden_effect meaning:\"check whether user can modify resource without changing state\"\ndef can_update_resource(user, resource):\n    return user.is_admin or resource.owner_id == user.id\n```\n\nRun:\n\n```bash\npython -m intract scan .\npython -m intract validate .\n```\n\n## External Target Addressing (Toon Manifests)\n\nIn addition to inline annotations, Intract supports **two ways** of defining quality gates and intent contracts:\n1. **Inline Comments**: Using `@intract.v1` in source files.\n2. **External manifests (Toon Manifests)**: Decoupled files (`.toon` or `intract.toon.yaml`) that specify precise coordinates (targets) for files, functions, lines, and XPaths.\n\n### 1. Płaski format URI linia po linii (`.toon`)\nPliki `.toon` używają struktury URI do prostego i przejrzystego przypisywania kontraktów na poziomie konkretnych linii, funkcji lub selektorów:\n```text\n# Flat target-based URI rules\nintract://src/calc.py?func=add#id=pure-addition\u0026intent=pure-add\u0026forbid=write\nintract://src/calc.py?func=write_to_log\u0026line=13#id=log-write\u0026intent=write-log\u0026require=write\n```\n\n### 2. Manifest YAML z targetowaniem (`intract.toon.yaml`)\nMożesz również zdefiniować zasady w formacie YAML, podając sekcję `target`:\n```yaml\nversion: intract.v1\ncontracts:\n  - id: addition-check\n    intent: pure:addition\n    forbid: [write]\n    target:\n      file: src/calc.py\n      function: add\n```\n\nWięcej informacji i pełne przykłady znajdziesz w katalogu [`examples/toon/`](examples/toon/).\n\n## Documentation\n\nStart here:\n\n- [Docs index](docs/README.md)\n- [Getting Started](docs/getting-started.md)\n- [Commands Reference](docs/commands.md)\n- [Contract Format](docs/contract-format.md)\n- [Manifest `intract.yaml`](docs/manifest.md)\n- [Architecture](docs/architecture.md)\n- [Validation Model](docs/validation.md)\n- [Watch \u0026 Engine](docs/watch-engine.md)\n- [Plugins](docs/plugins.md)\n- [Integrations](docs/integrations.md)\n- [Roadmap](docs/roadmap.md)\n\n## Important project locations\n\nCore:\n\n- [`src/intract/`](src/intract/)\n- [`src/intract/models.py`](src/intract/models.py)\n- [`src/intract/parser.py`](src/intract/parser.py)\n- [`src/intract/signature.py`](src/intract/signature.py)\n- [`src/intract/validation.py`](src/intract/validation.py)\n\nOperational modules:\n\n- [`src/intract/cli.py`](src/intract/cli.py)\n- [`src/intract/config.py`](src/intract/config.py)\n- [`src/intract/policy.py`](src/intract/policy.py)\n- [`src/intract/git.py`](src/intract/git.py)\n- [`src/intract/watch.py`](src/intract/watch.py)\n\nAnalysis engine:\n\n- [`src/intract/engine/`](src/intract/engine/)\n- [`src/intract/engine/scanner.py`](src/intract/engine/scanner.py)\n- [`src/intract/engine/analyzer.py`](src/intract/engine/analyzer.py)\n- [`src/intract/engine/assigner.py`](src/intract/engine/assigner.py)\n- [`src/intract/engine/drift.py`](src/intract/engine/drift.py)\n- [`src/intract/engine/monitor.py`](src/intract/engine/monitor.py)\n\nPlugins and integrations:\n\n- [`src/intract/plugins/`](src/intract/plugins/)\n- [`src/intract/integrations/`](src/intract/integrations/)\n- [`src/intract/integrations/planfile.py`](src/intract/integrations/planfile.py)\n- [`src/intract/artifacts.py`](src/intract/artifacts.py)\n- [`src/intract/reporters/sarif.py`](src/intract/reporters/sarif.py)\n\nSchemas and templates:\n\n- [`schemas/intract.schema.json`](schemas/intract.schema.json)\n- [`templates/`](templates/)\n- [`templates/intract.yaml`](templates/intract.yaml)\n- [`templates/pyproject-intract.toml`](templates/pyproject-intract.toml)\n- [`templates/openapi.intract.yaml`](templates/openapi.intract.yaml)\n- [`templates/Dockerfile.intract`](templates/Dockerfile.intract)\n\nExamples:\n\n- [`examples/README.md`](examples/README.md) — indeks wszystkich przykładów\n- [`examples/web-app/`](examples/web-app/) — **aplikacja webowa**: iteracje v1/v2 + mock UI\n- [`examples/full-stack/`](examples/full-stack/) — graf, duplikaty intencji\n- [`examples/integration_tests/`](examples/integration_tests/)\n\nSDKs:\n\n- [`sdks/python/`](sdks/python/)\n- [`sdks/typescript/`](sdks/typescript/)\n- [`sdks/go/`](sdks/go/)\n- [`sdks/rust/`](sdks/rust/)\n- [`sdks/java/`](sdks/java/)\n- [`sdks/csharp/`](sdks/csharp/)\n\nCI / packaging:\n\n- [`.pre-commit-hooks.yaml`](.pre-commit-hooks.yaml)\n- [`.github/workflows/intract.yml`](.github/workflows/intract.yml)\n- [`Dockerfile`](Dockerfile)\n- [`pyproject.toml`](pyproject.toml)\n\n## Installation\n\n```bash\npip install -e .[dev]\n```\n\n## Main commands\n\n```bash\npython -m intract scan .\npython -m intract validate .\npython -m intract check .\npython -m intract check --staged\npython -m intract check --changed --base main\npython -m intract check . --format sarif --output intract.sarif\npython -m intract check-manifest intract.yaml\npython -m intract coverage .\npython -m intract duplicates .\npython -m intract graph . --format mermaid\npython -m intract watch .\npython -m intract tickets .\npython -m intract artifact Dockerfile\npython -m intract artifact openapi.yaml\npython -m intract engine suggest .\npython -m intract engine drift .\npython -m intract engine run .\n```\n\n## Run examples\n\n```bash\npython examples/integration_tests/run_examples.py\n```\n\nExpected:\n\n```text\nexample_01: pass\nexample_02: violation + planfile-compatible ticket\nexample_03: watch/engine/drift works\n```\n\n## Project manifest\n\nGenerate:\n\n```bash\npython -m intract init .\n```\n\nValidate:\n\n```bash\npython -m intract check-manifest intract.yaml\npython -m intract validate . --manifest intract.yaml\n```\n\n## Pre-commit\n\nExample `.pre-commit-config.yaml`:\n\n```yaml\nrepos:\n  - repo: local\n    hooks:\n      - id: intract\n        name: intract intent contracts\n        entry: intract check --staged\n        language: system\n        pass_filenames: false\n```\n\n## SARIF / GitHub Code Scanning\n\n```bash\npython -m intract check . --format sarif --output intract.sarif\n```\n\nGitHub workflow:\n\n- [`.github/workflows/intract.yml`](.github/workflows/intract.yml)\n\n## License\n\nLicensed under Apache-2.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemcod%2Fintract","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsemcod%2Fintract","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemcod%2Fintract/lists"}