Report unsatisfied dependencies on add and install
Found while verifying the repo against INTENT.md's eight success criteria for a first practical release, after CANP-WP-0002 finished. Criterion 5 is "publish a version to a registry and install it elsewhere". Installing practice/pqrst-estimate into a fresh catalog reported success, and rendering it then failed with "included package not found: practice/house-style". CANP-WP-0002-T03 introduced this — composition made a package installable but unrenderable, and nothing said so at install time. The error was honest, but reaching it after a successful-looking install is the silently-incomplete failure section 23 now names as the thing this format avoids. `add` and `install` now name declared prompt dependencies the target catalog cannot satisfy, including a package present at no matching version. They do not fetch anything: section 10 leaves dependency resolution to the consumer, and auto-installing transitively is a resolver — a separate decision from refusing to hand over a package that looks fine and is not. Whether `install` should offer `--with-dependencies` is left open as a design question rather than smuggled in as a bug fix. Tests 81 -> 84. Recorded as CANP-WP-ADHOC-2026-09-06. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bjefh8NUiEiahN4JLwoSKM Assistant: claude-code Assistant-Model: opus Assistant-Process: 388925@bnt-lap001 Assistant-Session: 3507023f-e0fd-4a1e-9d90-a0d4217d1502
This commit is contained in:
parent
526e9abdfd
commit
4b2bda0013
5 changed files with 130 additions and 0 deletions
|
|
@ -678,6 +678,38 @@ def copy_package(src: Path, dst: Path, manifest: dict[str, Any], what: str) -> l
|
|||
return skipped
|
||||
|
||||
|
||||
def missing_dependencies(catalog: Path, manifest: dict[str, Any]) -> list[str]:
|
||||
"""Declared prompt dependencies that this catalog cannot satisfy.
|
||||
|
||||
CPF leaves dependency *resolution* to the consumer (§ 10), so this tool does
|
||||
not fetch anything. It does refuse to hand over a package that looks
|
||||
installed but cannot render.
|
||||
"""
|
||||
missing: list[str] = []
|
||||
for reference, entry in prompt_dependencies(manifest).items():
|
||||
registry, package_id = parse_reference(reference)
|
||||
names = [registry] if registry is not None else catalog_registries(catalog)
|
||||
selector = entry.get("version")
|
||||
if any(
|
||||
select_version(versions_at(id_path(catalog / name, package_id)), selector)
|
||||
for name in names
|
||||
):
|
||||
continue
|
||||
missing.append(f"{reference}@{selector}" if selector else reference)
|
||||
return missing
|
||||
|
||||
|
||||
def report_missing_dependencies(catalog: Path, manifest: dict[str, Any]) -> None:
|
||||
missing = missing_dependencies(catalog, manifest)
|
||||
if missing:
|
||||
print(
|
||||
"declared dependencies not in this catalog: "
|
||||
+ ", ".join(missing)
|
||||
+ " — install them, or composition referencing them will not resolve",
|
||||
file=sys.stderr,
|
||||
)
|
||||
|
||||
|
||||
def report_skipped(skipped: list[str]) -> None:
|
||||
if skipped:
|
||||
print(
|
||||
|
|
@ -705,6 +737,7 @@ def cmd_add(args: argparse.Namespace) -> None:
|
|||
registry = check_registry_name(args.as_registry)
|
||||
dst = catalog_package_path(catalog, registry, manifest["id"], manifest["version"])
|
||||
report_skipped(copy_package(src.resolve(), dst, manifest, "catalog package"))
|
||||
report_missing_dependencies(catalog, manifest)
|
||||
print(f"added {registry}:{manifest['id']}@{manifest['version']} -> {dst}")
|
||||
|
||||
|
||||
|
|
@ -745,6 +778,7 @@ def cmd_install(args: argparse.Namespace) -> None:
|
|||
manifest = validate_package(src)
|
||||
dst = catalog_package_path(catalog, name, manifest["id"], manifest["version"])
|
||||
copy_package(src, dst, manifest, "catalog package")
|
||||
report_missing_dependencies(catalog, manifest)
|
||||
print(f"installed {name}:{manifest['id']}@{manifest['version']} -> {dst}")
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue