Projects as configuration entries (M1.4, D8)
CI / checks (push) Skipped
CI / checks (pull_request) Failing after 5m7s
CI / checks (push) Skipped
CI / checks (pull_request) Failing after 5m7s
- Config: `projects: {name: entry}` with repo, base_branch, workspace,
build_host, push credential, labels (defaults added to every issue),
secrets by ${VAR} reference with visibility (commands | harness), and
egress (recorded, not enforced). Every problem in every entry is
reported at once; an inline secret, a bad visibility, a repeated repo or
a non-slug name is an error.
- The old loop runs exactly one project (only_project) and refuses more.
- The new loop is per project: each its own clone, workspace (with its
commands-visible secrets, redacted on return), push credential and
milestones; intake polls every project's repository; items are scoped
to their project for every run, publish and PR watch. Issues are named
project#14 when there is more than one project, and a bare #14 that
matches two is asked about. Switching projects parks the one worked on
last (all others after a boot).
- A restatement that ends in a question is sent back to the driver, not
posted: the e2e driver kept asking "Is this the right interpretation?",
which a plain yes can't answer.
Tests: config entries and errors, two-project assembly, two-project loop
tests (intake, own workspaces and repos, #14 in both, do-next, label
defaults, parking across projects), the property walk over two projects
with a new own_repository_only property (an item using the first
project's repo fails 15 of 16 seeds), and the restatement check.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
This commit is contained in:
1 parent
4ecff19933
commit
064d9bf554
17 files changed
+1139
-315
No files matched your search
@@ -157,6 +157,18 @@ class Forge:
|
||||
|
||||
@pytest.fixture
|
||||
def world(ssh_host: SSHHost, tmp_path: Path) -> dict[str, Any]:
|
||||
return make_world(ssh_host, tmp_path)
|
||||
|
||||
|
||||
def make_world(
|
||||
ssh_host: SSHHost,
|
||||
tmp_path: Path,
|
||||
store: StateStore | None = None,
|
||||
repo_name: str = "don/sandbox",
|
||||
) -> dict[str, Any]:
|
||||
"""A project's forge (a bare repository and a fake Gitea over it), its
|
||||
clone and milestones; a second one can share the first's store."""
|
||||
tmp_path.mkdir(parents=True, exist_ok=True)
|
||||
bare = tmp_path / "forge.git"
|
||||
git("init", "-q", "--bare", "-b", "main", str(bare))
|
||||
seed = tmp_path / "seed"
|
||||
@@ -179,13 +191,16 @@ def world(ssh_host: SSHHost, tmp_path: Path) -> dict[str, Any]:
|
||||
repo.clone(str(bare))
|
||||
repo.configure_identity("nisse-dev", "n@t")
|
||||
repo.install_excludes()
|
||||
store = StateStore(tmp_path / "state.db", oplog=OpLog("nisse-dev", io.StringIO()))
|
||||
if store is None:
|
||||
store = StateStore(
|
||||
tmp_path / "state.db", oplog=OpLog("nisse-dev", io.StringIO())
|
||||
)
|
||||
forge = Forge(bare)
|
||||
milestones = Milestones(
|
||||
store,
|
||||
repo,
|
||||
forge,
|
||||
repo="don/sandbox", # type: ignore[arg-type]
|
||||
forge, # type: ignore[arg-type]
|
||||
repo=repo_name,
|
||||
remote=str(bare),
|
||||
credential=None,
|
||||
)
|
||||
@@ -197,6 +212,7 @@ def world(ssh_host: SSHHost, tmp_path: Path) -> dict[str, Any]:
|
||||
"host": ssh_host,
|
||||
"bare": bare,
|
||||
"seed": seed,
|
||||
"repo_name": repo_name,
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user