assertion-cli 0.5.4__tar.gz → 0.5.5__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.
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/PKG-INFO +18 -11
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/README.md +17 -10
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/assertion_cli.egg-info/PKG-INFO +18 -11
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/assertion_cli.egg-info/SOURCES.txt +1 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/main.py +47 -21
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/pyproject.toml +1 -1
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/templates/SKILL.md +3 -3
- assertion_cli-0.5.5/tests/test_new.py +121 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/api.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/assertion_cli.egg-info/dependency_links.txt +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/assertion_cli.egg-info/entry_points.txt +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/assertion_cli.egg-info/requires.txt +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/assertion_cli.egg-info/top_level.txt +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/bundle.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/git.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/link.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/models.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/session.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/setup.cfg +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/templates/ACTIVATION.md +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/templates/__init__.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/tests/test_api.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/tests/test_bundle.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/tests/test_decision.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/tests/test_git.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/tests/test_init.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/tests/test_link.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/tests/test_main.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/tests/test_prompt.py +0 -0
- {assertion_cli-0.5.4 → assertion_cli-0.5.5}/tests/test_session.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: assertion-cli
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.5
|
|
4
4
|
Summary: CLI for the Assertion API
|
|
5
5
|
Requires-Python: >=3.13
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -39,6 +39,7 @@ that set is `httpx`, `pydantic`, `python-dotenv`, and `typer`.
|
|
|
39
39
|
After installation:
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
+
asrt new # reset local run state for a fresh session
|
|
42
43
|
asrt stacks
|
|
43
44
|
asrt checkpoint --stack <stack-id> "Implemented X\nUpdated Y"
|
|
44
45
|
asrt checkpoint --continue "Implemented Y"
|
|
@@ -49,13 +50,19 @@ asrt verify-status # one-shot poll; loop with your own sleep
|
|
|
49
50
|
|
|
50
51
|
## Publishing a new version
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
53
|
+
1. **Bump the version** in `cli/pyproject.toml`.
|
|
54
|
+
2. **Commit and push** to `main`.
|
|
55
|
+
|
|
56
|
+
That's it. The `Publish CLI to PyPI` workflow auto-triggers on pushes that
|
|
57
|
+
change `cli/pyproject.toml`. It reads the version from the file, runs tests,
|
|
58
|
+
builds, publishes to PyPI, pushes a `cli-v<version>` tag, and creates a
|
|
59
|
+
GitHub Release with auto-generated notes.
|
|
60
|
+
|
|
61
|
+
If the version hasn't changed (e.g. you updated a dependency), the workflow
|
|
62
|
+
skips publishing — only version bumps trigger a release.
|
|
63
|
+
|
|
64
|
+
You can also trigger the workflow manually from the GitHub Actions UI — it
|
|
65
|
+
reads the version from the current `pyproject.toml` on `main`.
|
|
66
|
+
|
|
67
|
+
**Prerequisite**: `PYPI_TOKEN` must be set as a GitHub Actions secret — a
|
|
68
|
+
PyPI API token with upload scope for `assertion-cli`.
|
|
@@ -25,6 +25,7 @@ that set is `httpx`, `pydantic`, `python-dotenv`, and `typer`.
|
|
|
25
25
|
After installation:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
+
asrt new # reset local run state for a fresh session
|
|
28
29
|
asrt stacks
|
|
29
30
|
asrt checkpoint --stack <stack-id> "Implemented X\nUpdated Y"
|
|
30
31
|
asrt checkpoint --continue "Implemented Y"
|
|
@@ -35,13 +36,19 @@ asrt verify-status # one-shot poll; loop with your own sleep
|
|
|
35
36
|
|
|
36
37
|
## Publishing a new version
|
|
37
38
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
39
|
+
1. **Bump the version** in `cli/pyproject.toml`.
|
|
40
|
+
2. **Commit and push** to `main`.
|
|
41
|
+
|
|
42
|
+
That's it. The `Publish CLI to PyPI` workflow auto-triggers on pushes that
|
|
43
|
+
change `cli/pyproject.toml`. It reads the version from the file, runs tests,
|
|
44
|
+
builds, publishes to PyPI, pushes a `cli-v<version>` tag, and creates a
|
|
45
|
+
GitHub Release with auto-generated notes.
|
|
46
|
+
|
|
47
|
+
If the version hasn't changed (e.g. you updated a dependency), the workflow
|
|
48
|
+
skips publishing — only version bumps trigger a release.
|
|
49
|
+
|
|
50
|
+
You can also trigger the workflow manually from the GitHub Actions UI — it
|
|
51
|
+
reads the version from the current `pyproject.toml` on `main`.
|
|
52
|
+
|
|
53
|
+
**Prerequisite**: `PYPI_TOKEN` must be set as a GitHub Actions secret — a
|
|
54
|
+
PyPI API token with upload scope for `assertion-cli`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: assertion-cli
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.5
|
|
4
4
|
Summary: CLI for the Assertion API
|
|
5
5
|
Requires-Python: >=3.13
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -39,6 +39,7 @@ that set is `httpx`, `pydantic`, `python-dotenv`, and `typer`.
|
|
|
39
39
|
After installation:
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
+
asrt new # reset local run state for a fresh session
|
|
42
43
|
asrt stacks
|
|
43
44
|
asrt checkpoint --stack <stack-id> "Implemented X\nUpdated Y"
|
|
44
45
|
asrt checkpoint --continue "Implemented Y"
|
|
@@ -49,13 +50,19 @@ asrt verify-status # one-shot poll; loop with your own sleep
|
|
|
49
50
|
|
|
50
51
|
## Publishing a new version
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
53
|
+
1. **Bump the version** in `cli/pyproject.toml`.
|
|
54
|
+
2. **Commit and push** to `main`.
|
|
55
|
+
|
|
56
|
+
That's it. The `Publish CLI to PyPI` workflow auto-triggers on pushes that
|
|
57
|
+
change `cli/pyproject.toml`. It reads the version from the file, runs tests,
|
|
58
|
+
builds, publishes to PyPI, pushes a `cli-v<version>` tag, and creates a
|
|
59
|
+
GitHub Release with auto-generated notes.
|
|
60
|
+
|
|
61
|
+
If the version hasn't changed (e.g. you updated a dependency), the workflow
|
|
62
|
+
skips publishing — only version bumps trigger a release.
|
|
63
|
+
|
|
64
|
+
You can also trigger the workflow manually from the GitHub Actions UI — it
|
|
65
|
+
reads the version from the current `pyproject.toml` on `main`.
|
|
66
|
+
|
|
67
|
+
**Prerequisite**: `PYPI_TOKEN` must be set as a GitHub Actions secret — a
|
|
68
|
+
PyPI API token with upload scope for `assertion-cli`.
|
|
@@ -3,33 +3,13 @@ import importlib.metadata
|
|
|
3
3
|
import importlib.resources
|
|
4
4
|
import json
|
|
5
5
|
import re
|
|
6
|
+
import shutil
|
|
6
7
|
from datetime import datetime, timezone
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
|
|
9
10
|
import httpx
|
|
10
11
|
import typer
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
_VERSION: str | None = None
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def _get_version() -> str:
|
|
17
|
-
global _VERSION
|
|
18
|
-
if _VERSION is not None:
|
|
19
|
-
return _VERSION
|
|
20
|
-
try:
|
|
21
|
-
_VERSION = importlib.metadata.version("assertion-cli")
|
|
22
|
-
except importlib.metadata.PackageNotFoundError:
|
|
23
|
-
pyproject = Path(__file__).resolve().parent / "pyproject.toml"
|
|
24
|
-
if pyproject.exists():
|
|
25
|
-
import tomllib
|
|
26
|
-
|
|
27
|
-
data = tomllib.loads(pyproject.read_text(encoding="utf-8"))
|
|
28
|
-
_VERSION = data["project"]["version"]
|
|
29
|
-
else:
|
|
30
|
-
_VERSION = "0.0.0"
|
|
31
|
-
return _VERSION
|
|
32
|
-
|
|
33
13
|
from api import AssertionClient
|
|
34
14
|
from bundle import build_bundle
|
|
35
15
|
from git import (
|
|
@@ -54,6 +34,27 @@ from session import (
|
|
|
54
34
|
update_metadata_anchor,
|
|
55
35
|
)
|
|
56
36
|
|
|
37
|
+
_VERSION: str | None = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _get_version() -> str:
|
|
41
|
+
global _VERSION
|
|
42
|
+
if _VERSION is not None:
|
|
43
|
+
return _VERSION
|
|
44
|
+
try:
|
|
45
|
+
_VERSION = importlib.metadata.version("assertion-cli")
|
|
46
|
+
except importlib.metadata.PackageNotFoundError:
|
|
47
|
+
pyproject = Path(__file__).resolve().parent / "pyproject.toml"
|
|
48
|
+
if pyproject.exists():
|
|
49
|
+
import tomllib
|
|
50
|
+
|
|
51
|
+
data = tomllib.loads(pyproject.read_text(encoding="utf-8"))
|
|
52
|
+
_VERSION = data["project"]["version"]
|
|
53
|
+
else:
|
|
54
|
+
_VERSION = "0.0.0"
|
|
55
|
+
return _VERSION
|
|
56
|
+
|
|
57
|
+
|
|
57
58
|
app = typer.Typer(help="Assertion CLI")
|
|
58
59
|
|
|
59
60
|
|
|
@@ -261,6 +262,31 @@ def init() -> None:
|
|
|
261
262
|
typer.echo(" - asrt verify at completion, then PR")
|
|
262
263
|
|
|
263
264
|
|
|
265
|
+
@app.command("new")
|
|
266
|
+
def new() -> None:
|
|
267
|
+
"""Reset local Assertion run state and record current HEAD as the diff base."""
|
|
268
|
+
repo_root = find_git_root(Path.cwd())
|
|
269
|
+
base_sha = get_head_sha(repo_root)
|
|
270
|
+
assertion_dir = repo_root / ASSERTION_DIR_NAME
|
|
271
|
+
assertion_dir.mkdir(exist_ok=True)
|
|
272
|
+
|
|
273
|
+
removed = 0
|
|
274
|
+
for child in assertion_dir.iterdir():
|
|
275
|
+
if child.is_dir():
|
|
276
|
+
shutil.rmtree(child)
|
|
277
|
+
else:
|
|
278
|
+
child.unlink()
|
|
279
|
+
removed += 1
|
|
280
|
+
|
|
281
|
+
base_sha_path = assertion_dir / BASE_SHA_FILE_NAME
|
|
282
|
+
base_sha_path.write_text(base_sha + "\n", encoding="utf-8")
|
|
283
|
+
|
|
284
|
+
typer.echo(f"Cleared {removed} .assertion entr{'y' if removed == 1 else 'ies'}.")
|
|
285
|
+
typer.echo(
|
|
286
|
+
f"Recorded diff base {base_sha[:12]} → {base_sha_path.relative_to(repo_root)}"
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
|
|
264
290
|
@app.command("prompt")
|
|
265
291
|
def prompt_cmd(
|
|
266
292
|
text: str = typer.Argument(..., help="User prompt text to record."),
|
|
@@ -16,9 +16,9 @@ Before any `asrt` call:
|
|
|
16
16
|
- You are inside a git repository.
|
|
17
17
|
- `asrt init` has been run in this repo. It records the current HEAD as the diff base that every checkpoint/verify diffs against, and installs the skill files you are reading right now. If `asrt checkpoint` or `asrt verify` errors with "No diff base recorded", run `asrt init` and retry.
|
|
18
18
|
|
|
19
|
-
**Starting a fresh session:** when beginning a new session,
|
|
19
|
+
**Starting a fresh session:** when beginning a new session, run `asrt new` first. This clears the previous session's in-flight state (metadata, prompts log, link, verification status, screenshots) and records the current `HEAD` as the new diff base, so a new session starts clean on the current branch and anchors to the stack you pick on the first checkpoint. Only the user should do this — it resets the session.
|
|
20
20
|
|
|
21
|
-
Treat `.assertion/metadata.json`, `.assertion/prompts`, and `.assertion/base_sha` as internal state owned by the CLI. Do not create, edit, or delete those files manually — use `asrt prompt` to append to the prompts log.
|
|
21
|
+
Treat `.assertion/metadata.json`, `.assertion/prompts`, and `.assertion/base_sha` as internal state owned by the CLI. Do not create, edit, or delete those files manually — use `asrt prompt` to append to the prompts log and `asrt new` to reset for a fresh session.
|
|
22
22
|
|
|
23
23
|
`asrt stacks` is read-only and lists every verification stack in the user's workspace, along with the repo each is configured for. Run it once per session before your first checkpoint so you can pick a stack ID; do not hardcode IDs from memory.
|
|
24
24
|
|
|
@@ -105,7 +105,7 @@ When you pass `--stack`, briefly state which stack you chose and why ("Picked st
|
|
|
105
105
|
| CLI error starts with | What it means | What to do |
|
|
106
106
|
|---|---|---|
|
|
107
107
|
| `No session exists yet and no --stack given.` | First checkpoint of a fresh `.assertion/`, but you didn't pick a stack. | Run `asrt stacks`, pick one using the signals above, pass `--stack <id>`. |
|
|
108
|
-
| `This session is already anchored to a stack.` | You passed `--stack` after a session was already created. The CLI locks the stack at session creation. | Drop the `--stack` flag and re-run `asrt checkpoint "<message>"
|
|
108
|
+
| `This session is already anchored to a stack.` | You passed `--stack` after a session was already created. The CLI locks the stack at session creation. | Drop the `--stack` flag and re-run `asrt checkpoint "<message>"`, or ask the user to run `asrt new` if this should be a fresh session. |
|
|
109
109
|
| `ERROR: Unknown stack '<id>'.` | The `--stack` you passed is not in the workspace. | Re-run `asrt stacks` (the list may have changed) and pass a valid id. |
|
|
110
110
|
| `No diff base recorded for this repo.` | `asrt init` wasn't run. | Run `asrt init` and retry. |
|
|
111
111
|
| `ERROR: No active session to continue.` | You passed `--continue` but there is no session. | Drop `--continue` and pass `--stack <id>` to start one. |
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import subprocess
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from typer.testing import CliRunner
|
|
7
|
+
|
|
8
|
+
import main
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
runner = CliRunner()
|
|
12
|
+
|
|
13
|
+
_GIT_COMMIT_ENV = {
|
|
14
|
+
"GIT_AUTHOR_NAME": "T",
|
|
15
|
+
"GIT_AUTHOR_EMAIL": "t@t",
|
|
16
|
+
"GIT_COMMITTER_NAME": "T",
|
|
17
|
+
"GIT_COMMITTER_EMAIL": "t@t",
|
|
18
|
+
"PATH": "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _run_git(repo: Path, *args: str) -> str:
|
|
23
|
+
result = subprocess.run(
|
|
24
|
+
["git", *args],
|
|
25
|
+
cwd=repo,
|
|
26
|
+
capture_output=True,
|
|
27
|
+
check=True,
|
|
28
|
+
env={**_GIT_COMMIT_ENV, "HOME": str(repo)},
|
|
29
|
+
text=True,
|
|
30
|
+
)
|
|
31
|
+
return result.stdout.strip()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _init_repo(tmp_path: Path) -> str:
|
|
35
|
+
_run_git(tmp_path, "init")
|
|
36
|
+
_run_git(tmp_path, "commit", "--allow-empty", "-m", "init")
|
|
37
|
+
return _run_git(tmp_path, "rev-parse", "HEAD")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_new_clears_run_state_and_records_current_head(
|
|
41
|
+
tmp_path: Path,
|
|
42
|
+
monkeypatch,
|
|
43
|
+
) -> None:
|
|
44
|
+
head = _init_repo(tmp_path)
|
|
45
|
+
monkeypatch.chdir(tmp_path)
|
|
46
|
+
|
|
47
|
+
assertion_dir = tmp_path / ".assertion"
|
|
48
|
+
(assertion_dir / "screenshots" / "verification-1").mkdir(parents=True)
|
|
49
|
+
(assertion_dir / "metadata.json").write_text("{}")
|
|
50
|
+
(assertion_dir / "prompts").write_text("old prompt")
|
|
51
|
+
(assertion_dir / "checkpoint").write_text("old checkpoint")
|
|
52
|
+
(assertion_dir / "link").write_text("old link")
|
|
53
|
+
(assertion_dir / "verify_session_id").write_text("old verification")
|
|
54
|
+
(assertion_dir / "base_sha").write_text("old-base")
|
|
55
|
+
(
|
|
56
|
+
assertion_dir / "screenshots" / "verification-1" / "screenshot_000.png"
|
|
57
|
+
).write_bytes(b"png")
|
|
58
|
+
|
|
59
|
+
result = runner.invoke(main.app, ["new"])
|
|
60
|
+
|
|
61
|
+
assert result.exit_code == 0, result.stderr
|
|
62
|
+
assert (assertion_dir / "base_sha").read_text() == head + "\n"
|
|
63
|
+
assert not (assertion_dir / "metadata.json").exists()
|
|
64
|
+
assert not (assertion_dir / "prompts").exists()
|
|
65
|
+
assert not (assertion_dir / "checkpoint").exists()
|
|
66
|
+
assert not (assertion_dir / "link").exists()
|
|
67
|
+
assert not (assertion_dir / "verify_session_id").exists()
|
|
68
|
+
assert not (assertion_dir / "screenshots").exists()
|
|
69
|
+
assert "Recorded diff base" in result.stdout
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_new_succeeds_when_assertion_dir_missing(
|
|
73
|
+
tmp_path: Path,
|
|
74
|
+
monkeypatch,
|
|
75
|
+
) -> None:
|
|
76
|
+
head = _init_repo(tmp_path)
|
|
77
|
+
monkeypatch.chdir(tmp_path)
|
|
78
|
+
|
|
79
|
+
result = runner.invoke(main.app, ["new"])
|
|
80
|
+
|
|
81
|
+
assert result.exit_code == 0, result.stderr
|
|
82
|
+
assert (tmp_path / ".assertion" / "base_sha").read_text() == head + "\n"
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_new_updates_base_sha_after_head_changes(
|
|
86
|
+
tmp_path: Path,
|
|
87
|
+
monkeypatch,
|
|
88
|
+
) -> None:
|
|
89
|
+
first_head = _init_repo(tmp_path)
|
|
90
|
+
monkeypatch.chdir(tmp_path)
|
|
91
|
+
|
|
92
|
+
first_result = runner.invoke(main.app, ["new"])
|
|
93
|
+
assert first_result.exit_code == 0, first_result.stderr
|
|
94
|
+
assert (tmp_path / ".assertion" / "base_sha").read_text() == first_head + "\n"
|
|
95
|
+
|
|
96
|
+
_run_git(tmp_path, "commit", "--allow-empty", "-m", "second")
|
|
97
|
+
second_head = _run_git(tmp_path, "rev-parse", "HEAD")
|
|
98
|
+
|
|
99
|
+
second_result = runner.invoke(main.app, ["new"])
|
|
100
|
+
|
|
101
|
+
assert second_result.exit_code == 0, second_result.stderr
|
|
102
|
+
assert second_head != first_head
|
|
103
|
+
assert (tmp_path / ".assertion" / "base_sha").read_text() == second_head + "\n"
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def test_new_leaves_next_checkpoint_requiring_stack(
|
|
107
|
+
tmp_path: Path,
|
|
108
|
+
monkeypatch,
|
|
109
|
+
) -> None:
|
|
110
|
+
_init_repo(tmp_path)
|
|
111
|
+
monkeypatch.chdir(tmp_path)
|
|
112
|
+
|
|
113
|
+
assertion_dir = tmp_path / ".assertion"
|
|
114
|
+
assertion_dir.mkdir()
|
|
115
|
+
(assertion_dir / "metadata.json").write_text("{}")
|
|
116
|
+
(assertion_dir / "prompts").write_text("old prompt")
|
|
117
|
+
|
|
118
|
+
result = runner.invoke(main.app, ["new"])
|
|
119
|
+
|
|
120
|
+
assert result.exit_code == 0, result.stderr
|
|
121
|
+
assert not (assertion_dir / "metadata.json").exists()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|