10 Commits

Author SHA1 Message Date
Oleks 413f78c365 fix(pipeline-doctor): accept branch-deploy as a valid dev-tag guard (#204)
Branch-deploy repos (event: push + branch:, tagging each push from
CI_COMMIT_*/pipeline-number) are a deliberate continuous-deploy guard, not
the absence of one. cms-plugins/emdash/kotkanagrilli -> 9/9; trio + self-test
unchanged; a tagless default-version publish still FAILs.
2026-06-04 21:29:53 +03:00
Oleks a9292e3914 fix(pipeline-doctor): read .woodpecker/ directory configs (#202)
The dev-tag-guard check missed repos whose Woodpecker config is a
.woodpecker/ directory of per-arch workflows (the refs/tags/v* trigger
never entered ci_txt). Now globs .woodpecker/*.yaml|*.yml too.
commonground-legacy + csi-s3 -> 9/9; trio + self-test still 9/9.
2026-06-04 21:04:09 +03:00
Oleks d265a79ddb fix(pipeline-doctor): accept pass-var token form + exempt --password-stdin from leak scan (#199)
The audit sweep wrongly FAILED ~9 converted ci-script repos on two heuristics:
- token-contract now accepts the secure indirection pass "$PASS_ENTRY" /
  pass "$VAR", not only a hard-coded pass <literal-path>.
- leak scan flattens \-continuations + folds the pipe target onto the echo
  line, then exempts the echo "$TOKEN" | <cmd> ... --password-stdin/--pass-stdin
  stdin-feed idiom; bare echo to stdout/file and set -x still FAIL.
Adds --self-test with six inline fixtures locking in both fixes and the
three must-still-catch leaks.
2026-06-03 10:42:26 +03:00
Oleks db0bf3b9ab feat(parity): mkAtticClosurePublish builder + pipeline-doctor non-flake mode (#198, #193)
Adds the attic-closure archetype builder (build closure + attic push, no
registry artifact) so caddy/overlay-xonsh/flake-hub/woodpecker-peek share one
implementation. Adds non-flake mode to pipeline-doctor so ci-script repos
(gitea-mcp, helms) pass the gate. Self-check 9/9; gitea-mcp now passes.
2026-06-02 23:30:59 +03:00
Oleks 79f9a2dd62 feat(parity): gate-ready pipeline-doctor + OCI verify-digest + stage/push-staged audit
pipeline-doctor (#191/#193): add --strict (fail on WARN) so a .woodpecker.yaml
step or pre-receive hook can gate on exit code; add documented ci/local.sh
escape-hatch (#196); fix false-negative — token/dev-tag/dry-run/meta contracts
are guaranteed by parity-lib for a consumer, so consumers PASS by delegation
instead of being penalized for not re-implementing them inline. Self-check and
numpy-s390x both pass 9/9.

mkNix2ContainerPublish (#195): add verify-digest app that builds each local arch
image and prints its OCI manifest digest (no registry contact), formalizing the
content-addressed manifest digest as the parity contract. reproducible=false is
kept deliberately (non-reproducible layer deps); digest-as-contract is the
low-risk path. Generalized from claude-plugin-registry 55f2d0b.

stage/push-staged audit (#194): verified all 8 builders expose stage-<arch> +
push-staged; all already complete, no gaps.
2026-06-02 21:11:49 +03:00
Oleks af64a8ea4c feat(npm): mkS390xNpmPublishMulti — multi-version npm publish per tag (#192)
Mirrors mkPyPiWheelPublishMulti for npm: publishes a fixed {version,file,
distTag?} list, each staged into its own dir and npm-published with its
dist-tag (idempotent). file may be a .node or a plain binary; packageJson
declares main-vs-bin. Unblocks nextjs-swc (next15 dist-tag) + sentry-cli.
Shared parity_npm_publish_dir helper added.
2026-06-02 08:56:38 +03:00
Oleks cda7a190c0 feat(pypi): mkPyPiWheelPublishMulti — publish all versions per tag (#197)
Single-version mkPyPiWheelPublish made consumers ship only the default
version per tag. Add a multi-version builder that loops over a fixed
{version,wheel} list (version parsed from the wheel filename, idempotent
409-skip), plus shared parity_pypi_post/parity_wheel_version helpers.
2026-06-02 05:23:42 +03:00
Oleks 9107923c5a fix(devtag-guard): snapshot explicit VERSION at source time (#194 finding)
The guard read $VERSION, but app bodies set VERSION to the derived default
before calling it, so accidental local --publish without an explicit version
or v* tag still pushed. Capture PARITY_VERSION_EXPLICIT at source time and
gate on that instead.
2026-06-02 05:08:05 +03:00
Oleks 6d4fec3f71 feat(pipeline-doctor): assert no set -x in token-bearing ci scripts (#191) 2026-06-02 04:20:10 +03:00
Oleks 2201257e89 feat: shared per-archetype parity publish-app builders (v0.1.0)
Implements the shared parity flake-module library so the ~51 parity repos
consume one source of truth instead of hand-inlined publish shells.

- lib.mk{PyPiWheel,S390xNpm,GenericBinary,Nix2Container,GoBinary,Helm}Publish
  builders returning stage-<arch>/publish-<arch>/publish-index/publish/
  push-staged apps per the corrected emmett#44 standard (build-parity stages to
  ./.parity-stage with no registry contact; publish dry-runs by default;
  publish-index is build-free + fail-closed; :latest is the last digest copy).
- Shared ci/parity-lib.sh: token resolution ($REGISTRY_TOKEN + pass fallback,
  never printed), dev-tag guard, version derivation, dry-run gate, preflight.
- pipeline-doctor package/app asserting the parity contract (cluster #193).

Refs cluster #192, #193, #194, emmett#44.
2026-06-02 04:15:48 +03:00