ait-vcs 0.1.1__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.
Files changed (50) hide show
  1. ait_vcs-0.1.1/LICENSE +21 -0
  2. ait_vcs-0.1.1/PKG-INFO +230 -0
  3. ait_vcs-0.1.1/README.md +208 -0
  4. ait_vcs-0.1.1/pyproject.toml +38 -0
  5. ait_vcs-0.1.1/setup.cfg +4 -0
  6. ait_vcs-0.1.1/src/ait/__init__.py +1 -0
  7. ait_vcs-0.1.1/src/ait/app.py +446 -0
  8. ait_vcs-0.1.1/src/ait/cli.py +317 -0
  9. ait_vcs-0.1.1/src/ait/config.py +105 -0
  10. ait_vcs-0.1.1/src/ait/daemon.py +292 -0
  11. ait_vcs-0.1.1/src/ait/daemon_transport.py +84 -0
  12. ait_vcs-0.1.1/src/ait/db/__init__.py +58 -0
  13. ait_vcs-0.1.1/src/ait/db/core.py +88 -0
  14. ait_vcs-0.1.1/src/ait/db/repositories.py +563 -0
  15. ait_vcs-0.1.1/src/ait/db/schema.py +147 -0
  16. ait_vcs-0.1.1/src/ait/events.py +507 -0
  17. ait_vcs-0.1.1/src/ait/harness.py +218 -0
  18. ait_vcs-0.1.1/src/ait/hooks.py +84 -0
  19. ait_vcs-0.1.1/src/ait/idresolver.py +67 -0
  20. ait_vcs-0.1.1/src/ait/ids.py +17 -0
  21. ait_vcs-0.1.1/src/ait/lifecycle.py +58 -0
  22. ait_vcs-0.1.1/src/ait/protocol.py +484 -0
  23. ait_vcs-0.1.1/src/ait/query.py +797 -0
  24. ait_vcs-0.1.1/src/ait/reconcile.py +122 -0
  25. ait_vcs-0.1.1/src/ait/repo.py +54 -0
  26. ait_vcs-0.1.1/src/ait/verifier.py +132 -0
  27. ait_vcs-0.1.1/src/ait/workspace.py +347 -0
  28. ait_vcs-0.1.1/src/ait_vcs.egg-info/PKG-INFO +230 -0
  29. ait_vcs-0.1.1/src/ait_vcs.egg-info/SOURCES.txt +48 -0
  30. ait_vcs-0.1.1/src/ait_vcs.egg-info/dependency_links.txt +1 -0
  31. ait_vcs-0.1.1/src/ait_vcs.egg-info/entry_points.txt +2 -0
  32. ait_vcs-0.1.1/src/ait_vcs.egg-info/top_level.txt +1 -0
  33. ait_vcs-0.1.1/tests/test_app_flow.py +581 -0
  34. ait_vcs-0.1.1/tests/test_claude_code_hook.py +75 -0
  35. ait_vcs-0.1.1/tests/test_config.py +107 -0
  36. ait_vcs-0.1.1/tests/test_daemon_concurrency.py +145 -0
  37. ait_vcs-0.1.1/tests/test_daemon_reaper.py +168 -0
  38. ait_vcs-0.1.1/tests/test_db_migrations.py +103 -0
  39. ait_vcs-0.1.1/tests/test_db_repositories.py +176 -0
  40. ait_vcs-0.1.1/tests/test_events.py +426 -0
  41. ait_vcs-0.1.1/tests/test_harness.py +173 -0
  42. ait_vcs-0.1.1/tests/test_hooks.py +87 -0
  43. ait_vcs-0.1.1/tests/test_idresolver.py +113 -0
  44. ait_vcs-0.1.1/tests/test_lifecycle.py +196 -0
  45. ait_vcs-0.1.1/tests/test_protocol.py +338 -0
  46. ait_vcs-0.1.1/tests/test_protocol_transport.py +95 -0
  47. ait_vcs-0.1.1/tests/test_query.py +235 -0
  48. ait_vcs-0.1.1/tests/test_reconcile.py +81 -0
  49. ait_vcs-0.1.1/tests/test_repo.py +76 -0
  50. ait_vcs-0.1.1/tests/test_workspace.py +133 -0
ait_vcs-0.1.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 sin-chengchen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
ait_vcs-0.1.1/PKG-INFO ADDED
@@ -0,0 +1,230 @@
1
+ Metadata-Version: 2.4
2
+ Name: ait-vcs
3
+ Version: 0.1.1
4
+ Summary: AI-agent-native VCS MVP
5
+ Author: sin-chengchen
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/m24927605/ait
8
+ Project-URL: Repository, https://github.com/m24927605/ait
9
+ Project-URL: Issues, https://github.com/m24927605/ait/issues
10
+ Project-URL: Changelog, https://github.com/m24927605/ait/blob/main/CHANGELOG.md
11
+ Keywords: ai,agents,git,vcs,provenance
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Topic :: Software Development :: Version Control :: Git
18
+ Requires-Python: >=3.14
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+ Dynamic: license-file
22
+
23
+ # ait
24
+
25
+ `ait` is an AI-agent-native version control layer on top of Git.
26
+
27
+ The MVP tracks:
28
+
29
+ - structured intents
30
+ - isolated attempts in Git worktrees
31
+ - daemon-ingested tool events from agent harnesses
32
+ - queryable evidence, file access, and commit linkage
33
+ - verification, promote, discard, and rebase flows
34
+
35
+ ## Status
36
+
37
+ This repository is at `0.1.0` release-candidate quality for local
38
+ dogfood use. It is local-only: metadata lives in `.ait/` inside one Git
39
+ repository and is intentionally not synchronized across machines.
40
+
41
+ ## Requirements
42
+
43
+ - Python 3.14+
44
+ - Git
45
+ - SQLite from the Python standard library
46
+
47
+ ## Install For Development
48
+
49
+ From the repository root:
50
+
51
+ ```bash
52
+ python3.14 -m venv .venv
53
+ .venv/bin/pip install -e .
54
+ .venv/bin/pip install pytest
55
+ ```
56
+
57
+ Verify:
58
+
59
+ ```bash
60
+ .venv/bin/pytest -q
61
+ .venv/bin/ait --help
62
+ ```
63
+
64
+ ## Install From GitHub
65
+
66
+ After `v0.1.0` is published, install the tagged release with `pipx`:
67
+
68
+ ```bash
69
+ pipx install "git+https://github.com/m24927605/ait.git@v0.1.0"
70
+ ```
71
+
72
+ Or install into a virtual environment:
73
+
74
+ ```bash
75
+ python3.14 -m venv .venv
76
+ .venv/bin/pip install "git+https://github.com/m24927605/ait.git@v0.1.0"
77
+ .venv/bin/ait --help
78
+ ```
79
+
80
+ ## Install From PyPI
81
+
82
+ The PyPI distribution name is `ait-vcs` because the shorter `ait` name
83
+ is already owned by another project. The installed command is still
84
+ `ait`.
85
+
86
+ ```bash
87
+ pip install ait-vcs
88
+ ait --help
89
+ ```
90
+
91
+ Or inside a virtual environment:
92
+
93
+ ```bash
94
+ python3.14 -m venv .venv
95
+ .venv/bin/pip install ait-vcs
96
+ .venv/bin/ait --help
97
+ ```
98
+
99
+ ## Quickstart
100
+
101
+ Initialize ait metadata in a Git repository:
102
+
103
+ ```bash
104
+ ait init
105
+ ```
106
+
107
+ Create an intent and attempt:
108
+
109
+ ```bash
110
+ ait intent new "Fix auth expiry" --kind bugfix
111
+ ait attempt new <intent-id> --agent-id cli:human
112
+ ```
113
+
114
+ The attempt command prints:
115
+
116
+ - `attempt_id`
117
+ - `workspace_ref`
118
+ - `base_ref_oid`
119
+ - `ownership_token`
120
+
121
+ Make changes in the attempt worktree, then commit through ait:
122
+
123
+ ```bash
124
+ cd <workspace_ref>
125
+ # edit files
126
+ git add <files>
127
+ cd <repo-root>
128
+ ait attempt commit <attempt-id> -m "fix auth expiry"
129
+ ```
130
+
131
+ Promote the attempt:
132
+
133
+ ```bash
134
+ ait attempt promote <attempt-id> --to main
135
+ ```
136
+
137
+ If `main` advanced while the attempt was running:
138
+
139
+ ```bash
140
+ ait attempt rebase <attempt-id> --onto main
141
+ ait attempt promote <attempt-id> --to main
142
+ ```
143
+
144
+ Inspect state:
145
+
146
+ ```bash
147
+ ait attempt show <attempt-id>
148
+ ait intent show <intent-id>
149
+ ait attempt list --verified-status succeeded
150
+ ait query --on attempt 'observed.tool_calls>0'
151
+ ait blame path/to/file.py
152
+ ```
153
+
154
+ ## Daemon And Harness
155
+
156
+ Start the daemon:
157
+
158
+ ```bash
159
+ ait daemon start
160
+ ait daemon status
161
+ ```
162
+
163
+ The harness API streams lifecycle and tool events to the daemon:
164
+
165
+ ```bash
166
+ python examples/harness_demo.py <attempt-id> <ownership-token> .ait/daemon.sock
167
+ ```
168
+
169
+ After the demo:
170
+
171
+ ```bash
172
+ ait attempt show <attempt-id>
173
+ ```
174
+
175
+ Expected counters include tool calls, reads, writes, commands, and file
176
+ evidence under `files.read` and `files.touched`.
177
+
178
+ ## Claude Code Hook Example
179
+
180
+ `examples/claude_code_hook.py` is a conservative Claude Code hook bridge.
181
+ It creates one ait intent and attempt per Claude session, streams
182
+ `PostToolUse` / `PostToolUseFailure` events through `AitHarness`, sends
183
+ a heartbeat on `Stop`, and finishes the attempt on `SessionEnd`.
184
+
185
+ Example settings are in:
186
+
187
+ ```text
188
+ examples/claude-code-settings.json
189
+ ```
190
+
191
+ To try it, copy the relevant hook entries into your Claude Code
192
+ `settings.json` for this project. The hook expects `ait` to be importable
193
+ by the Python interpreter used in the command, so run it from an
194
+ installed development environment.
195
+
196
+ Current limitation: the hook records provenance, but it does not force
197
+ Claude Code to edit inside the ait attempt worktree. The SessionStart
198
+ hook returns the attempt workspace path as additional context. A deeper
199
+ integration can use Claude Code's worktree hook path or a wrapper command
200
+ to make the ait worktree the actual execution directory.
201
+
202
+ ## Release Checks
203
+
204
+ Before cutting a release:
205
+
206
+ ```bash
207
+ git status --short
208
+ .venv/bin/pytest -q
209
+ ```
210
+
211
+ Clean clone smoke test:
212
+
213
+ ```bash
214
+ tmpdir="$(mktemp -d)"
215
+ git clone https://github.com/m24927605/ait.git "$tmpdir/ait"
216
+ cd "$tmpdir/ait"
217
+ git checkout v0.1.0
218
+ python3.14 -m venv .venv
219
+ .venv/bin/pip install -e . pytest
220
+ .venv/bin/pytest -q
221
+ .venv/bin/ait --help
222
+ ```
223
+
224
+ The release candidate for `0.1.0` should have:
225
+
226
+ - clean working tree
227
+ - passing tests
228
+ - dogfood notes updated
229
+ - changelog updated
230
+ - version in `pyproject.toml` matching the tag
@@ -0,0 +1,208 @@
1
+ # ait
2
+
3
+ `ait` is an AI-agent-native version control layer on top of Git.
4
+
5
+ The MVP tracks:
6
+
7
+ - structured intents
8
+ - isolated attempts in Git worktrees
9
+ - daemon-ingested tool events from agent harnesses
10
+ - queryable evidence, file access, and commit linkage
11
+ - verification, promote, discard, and rebase flows
12
+
13
+ ## Status
14
+
15
+ This repository is at `0.1.0` release-candidate quality for local
16
+ dogfood use. It is local-only: metadata lives in `.ait/` inside one Git
17
+ repository and is intentionally not synchronized across machines.
18
+
19
+ ## Requirements
20
+
21
+ - Python 3.14+
22
+ - Git
23
+ - SQLite from the Python standard library
24
+
25
+ ## Install For Development
26
+
27
+ From the repository root:
28
+
29
+ ```bash
30
+ python3.14 -m venv .venv
31
+ .venv/bin/pip install -e .
32
+ .venv/bin/pip install pytest
33
+ ```
34
+
35
+ Verify:
36
+
37
+ ```bash
38
+ .venv/bin/pytest -q
39
+ .venv/bin/ait --help
40
+ ```
41
+
42
+ ## Install From GitHub
43
+
44
+ After `v0.1.0` is published, install the tagged release with `pipx`:
45
+
46
+ ```bash
47
+ pipx install "git+https://github.com/m24927605/ait.git@v0.1.0"
48
+ ```
49
+
50
+ Or install into a virtual environment:
51
+
52
+ ```bash
53
+ python3.14 -m venv .venv
54
+ .venv/bin/pip install "git+https://github.com/m24927605/ait.git@v0.1.0"
55
+ .venv/bin/ait --help
56
+ ```
57
+
58
+ ## Install From PyPI
59
+
60
+ The PyPI distribution name is `ait-vcs` because the shorter `ait` name
61
+ is already owned by another project. The installed command is still
62
+ `ait`.
63
+
64
+ ```bash
65
+ pip install ait-vcs
66
+ ait --help
67
+ ```
68
+
69
+ Or inside a virtual environment:
70
+
71
+ ```bash
72
+ python3.14 -m venv .venv
73
+ .venv/bin/pip install ait-vcs
74
+ .venv/bin/ait --help
75
+ ```
76
+
77
+ ## Quickstart
78
+
79
+ Initialize ait metadata in a Git repository:
80
+
81
+ ```bash
82
+ ait init
83
+ ```
84
+
85
+ Create an intent and attempt:
86
+
87
+ ```bash
88
+ ait intent new "Fix auth expiry" --kind bugfix
89
+ ait attempt new <intent-id> --agent-id cli:human
90
+ ```
91
+
92
+ The attempt command prints:
93
+
94
+ - `attempt_id`
95
+ - `workspace_ref`
96
+ - `base_ref_oid`
97
+ - `ownership_token`
98
+
99
+ Make changes in the attempt worktree, then commit through ait:
100
+
101
+ ```bash
102
+ cd <workspace_ref>
103
+ # edit files
104
+ git add <files>
105
+ cd <repo-root>
106
+ ait attempt commit <attempt-id> -m "fix auth expiry"
107
+ ```
108
+
109
+ Promote the attempt:
110
+
111
+ ```bash
112
+ ait attempt promote <attempt-id> --to main
113
+ ```
114
+
115
+ If `main` advanced while the attempt was running:
116
+
117
+ ```bash
118
+ ait attempt rebase <attempt-id> --onto main
119
+ ait attempt promote <attempt-id> --to main
120
+ ```
121
+
122
+ Inspect state:
123
+
124
+ ```bash
125
+ ait attempt show <attempt-id>
126
+ ait intent show <intent-id>
127
+ ait attempt list --verified-status succeeded
128
+ ait query --on attempt 'observed.tool_calls>0'
129
+ ait blame path/to/file.py
130
+ ```
131
+
132
+ ## Daemon And Harness
133
+
134
+ Start the daemon:
135
+
136
+ ```bash
137
+ ait daemon start
138
+ ait daemon status
139
+ ```
140
+
141
+ The harness API streams lifecycle and tool events to the daemon:
142
+
143
+ ```bash
144
+ python examples/harness_demo.py <attempt-id> <ownership-token> .ait/daemon.sock
145
+ ```
146
+
147
+ After the demo:
148
+
149
+ ```bash
150
+ ait attempt show <attempt-id>
151
+ ```
152
+
153
+ Expected counters include tool calls, reads, writes, commands, and file
154
+ evidence under `files.read` and `files.touched`.
155
+
156
+ ## Claude Code Hook Example
157
+
158
+ `examples/claude_code_hook.py` is a conservative Claude Code hook bridge.
159
+ It creates one ait intent and attempt per Claude session, streams
160
+ `PostToolUse` / `PostToolUseFailure` events through `AitHarness`, sends
161
+ a heartbeat on `Stop`, and finishes the attempt on `SessionEnd`.
162
+
163
+ Example settings are in:
164
+
165
+ ```text
166
+ examples/claude-code-settings.json
167
+ ```
168
+
169
+ To try it, copy the relevant hook entries into your Claude Code
170
+ `settings.json` for this project. The hook expects `ait` to be importable
171
+ by the Python interpreter used in the command, so run it from an
172
+ installed development environment.
173
+
174
+ Current limitation: the hook records provenance, but it does not force
175
+ Claude Code to edit inside the ait attempt worktree. The SessionStart
176
+ hook returns the attempt workspace path as additional context. A deeper
177
+ integration can use Claude Code's worktree hook path or a wrapper command
178
+ to make the ait worktree the actual execution directory.
179
+
180
+ ## Release Checks
181
+
182
+ Before cutting a release:
183
+
184
+ ```bash
185
+ git status --short
186
+ .venv/bin/pytest -q
187
+ ```
188
+
189
+ Clean clone smoke test:
190
+
191
+ ```bash
192
+ tmpdir="$(mktemp -d)"
193
+ git clone https://github.com/m24927605/ait.git "$tmpdir/ait"
194
+ cd "$tmpdir/ait"
195
+ git checkout v0.1.0
196
+ python3.14 -m venv .venv
197
+ .venv/bin/pip install -e . pytest
198
+ .venv/bin/pytest -q
199
+ .venv/bin/ait --help
200
+ ```
201
+
202
+ The release candidate for `0.1.0` should have:
203
+
204
+ - clean working tree
205
+ - passing tests
206
+ - dogfood notes updated
207
+ - changelog updated
208
+ - version in `pyproject.toml` matching the tag
@@ -0,0 +1,38 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "ait-vcs"
7
+ version = "0.1.1"
8
+ description = "AI-agent-native VCS MVP"
9
+ readme = "README.md"
10
+ requires-python = ">=3.14"
11
+ license = "MIT"
12
+ authors = [
13
+ {name = "sin-chengchen"}
14
+ ]
15
+ keywords = ["ai", "agents", "git", "vcs", "provenance"]
16
+ classifiers = [
17
+ "Development Status :: 3 - Alpha",
18
+ "Environment :: Console",
19
+ "Intended Audience :: Developers",
20
+ "Programming Language :: Python :: 3",
21
+ "Programming Language :: Python :: 3.14",
22
+ "Topic :: Software Development :: Version Control :: Git",
23
+ ]
24
+
25
+ [project.urls]
26
+ Homepage = "https://github.com/m24927605/ait"
27
+ Repository = "https://github.com/m24927605/ait"
28
+ Issues = "https://github.com/m24927605/ait/issues"
29
+ Changelog = "https://github.com/m24927605/ait/blob/main/CHANGELOG.md"
30
+
31
+ [project.scripts]
32
+ ait = "ait.cli:main"
33
+
34
+ [tool.setuptools]
35
+ package-dir = {"" = "src"}
36
+
37
+ [tool.setuptools.packages.find]
38
+ where = ["src"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1 @@
1
+ """AI-agent-native VCS MVP."""