@biffo/cli 0.249.7 → 0.249.9

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.
@@ -16,13 +16,39 @@ cd "$root" || exit 0
16
16
  #
17
17
  # Unlike commit-msg, which now has a built-in fallback because Conventional
18
18
  # Commits is a RULE that can be checked with nothing but `sh`, this hook runs a
19
- # TOOLCHAIN. Checked 2026-08-03: no satellite carries `lint-staged` anywhere --
20
- # not at the root, not in any workspace -- so there is genuinely nothing to
21
- # resolve and nothing to fall back to. Making it fatal would block all work in
22
- # those repos, which is how a safety measure gets ripped out.
19
+ # TOOLCHAIN. There is genuinely nothing to resolve and nothing to fall back to
20
+ # where it is absent, and making it fatal would block all work in those repos,
21
+ # which is how a safety measure gets ripped out.
23
22
  #
24
23
  # So it still exits 0. It just no longer implies it checked anything, and it
25
24
  # says what would make it real.
25
+ #
26
+ # ## The abstention is not the end state, and the count is moving
27
+ #
28
+ # An earlier version of this comment recorded "Checked 2026-08-03: no satellite
29
+ # carries `lint-staged` anywhere". That is no longer true, and leaving it would
30
+ # have made a fixable gap read as a permanent fact about satellites -- the
31
+ # abstention would look like the design rather than a backlog.
32
+ #
33
+ # Re-measured 2026-08-06 across the nine tabsii satellites:
34
+ #
35
+ # - `tabsii-crm` DOES carry it, and its gate is real.
36
+ # - `tabsii-ui` gained it the same day (tabsii-ui#24), which also showed the
37
+ # abstention is cheap to clear: add prettier + lint-staged and a config.
38
+ # - Seven others still abstain. THREE of those have no root `package.json` at
39
+ # all, so they hit the FIRST branch below, and no config file can fix them --
40
+ # they need a root manifest before they need a lint-staged entry.
41
+ #
42
+ # The deeper reason it keeps happening: **`.prettierrc` is not in
43
+ # `shared-files.json`**, so nothing ever carries the estate's formatting rules
44
+ # to a satellite. Each one is left to invent them or have none, and a satellite
45
+ # that adopts prettier with DEFAULTS drifts away from the estate's style rather
46
+ # than towards it -- measured in tabsii-ui, where prettier's defaults reformatted
47
+ # all 7 source files and the template's settings reformatted 3.
48
+ #
49
+ # Do not re-freeze a measured count into this comment without a date and a way
50
+ # to re-derive it. The number is a snapshot of a backlog, not a property of
51
+ # satellites.
26
52
  if [ ! -f package.json ]; then
27
53
  echo "pre-commit: ABSTAINED — no root package.json, so lint-staged cannot run here." >&2
28
54
  echo " Staged files were NOT linted or formatted. CI still checks them." >&2
@@ -205,7 +205,32 @@ for lock in $ALL_LOCKS; do
205
205
 
206
206
  # `--no-emit-project` drops the tree's own package (nothing published to
207
207
  # audit); `--no-dev` keeps the audit to what actually ships.
208
- if (cd "$dir" && uv export --frozen --no-dev --no-emit-project) >"$reqs" 2>/dev/null && [ -s "$reqs" ]; then
208
+ #
209
+ # `--no-emit-local` drops LOCAL PATH dependencies, and without it this gate
210
+ # cannot scan a plugin tree at all (#1340). `biffo-plugin-sdk` is pulled in
211
+ # as `-e ./packages/python-sdk`; pip-audit tries to resolve it on PyPI, fails
212
+ # with "Dependency not found on PyPI and could not be audited", and produces
213
+ # no parseable output -- so the whole tree came back INCONCLUSIVE and blocked.
214
+ # Every vendored Python plugin tree in every instance has that dependency, so
215
+ # this was not a niche shape: it blocked all of them.
216
+ #
217
+ # Skipping it costs nothing real. A local path dependency is first-party
218
+ # source, audited in its own repo, and never a published artefact an advisory
219
+ # could name. Its TRANSITIVE dependencies are still exported and still
220
+ # audited -- verified on `services/ideation`, where the export keeps 25
221
+ # packages including three carried `via biffo-plugin-sdk`. So the answer this
222
+ # gate gives is unchanged for every package an advisory can actually be about.
223
+ if (cd "$dir" && uv export --frozen --no-dev --no-emit-project --no-emit-local) >"$reqs" 2>/dev/null && [ -s "$reqs" ]; then
224
+ # Report what was skipped rather than skipping it quietly: "audited
225
+ # everything except the bits we could not" must never read the same as
226
+ # "audited everything", which is the failure this whole file exists to
227
+ # fight. Counted from the same lockfile, so the number is the tree's, not
228
+ # a guess.
229
+ local_deps=$( (cd "$dir" && uv export --frozen --no-dev --no-emit-project) 2>/dev/null \
230
+ | grep -cE '^-e |@ file://' || true )
231
+ if [ "${local_deps:-0}" -gt 0 ]; then
232
+ echo " (${rel}: ${local_deps} local path dependenc$([ "$local_deps" -eq 1 ] && echo y || echo ies) excluded -- first-party, audited in their own repo; their transitive dependencies are still scanned)"
233
+ fi
209
234
  audit_deps "pip-audit (${rel})" "-r $reqs" || failed=1
210
235
  else
211
236
  # An export failure is "couldn't run", not "clean" — same discipline as a
@@ -16,13 +16,39 @@ cd "$root" || exit 0
16
16
  #
17
17
  # Unlike commit-msg, which now has a built-in fallback because Conventional
18
18
  # Commits is a RULE that can be checked with nothing but `sh`, this hook runs a
19
- # TOOLCHAIN. Checked 2026-08-03: no satellite carries `lint-staged` anywhere --
20
- # not at the root, not in any workspace -- so there is genuinely nothing to
21
- # resolve and nothing to fall back to. Making it fatal would block all work in
22
- # those repos, which is how a safety measure gets ripped out.
19
+ # TOOLCHAIN. There is genuinely nothing to resolve and nothing to fall back to
20
+ # where it is absent, and making it fatal would block all work in those repos,
21
+ # which is how a safety measure gets ripped out.
23
22
  #
24
23
  # So it still exits 0. It just no longer implies it checked anything, and it
25
24
  # says what would make it real.
25
+ #
26
+ # ## The abstention is not the end state, and the count is moving
27
+ #
28
+ # An earlier version of this comment recorded "Checked 2026-08-03: no satellite
29
+ # carries `lint-staged` anywhere". That is no longer true, and leaving it would
30
+ # have made a fixable gap read as a permanent fact about satellites -- the
31
+ # abstention would look like the design rather than a backlog.
32
+ #
33
+ # Re-measured 2026-08-06 across the nine tabsii satellites:
34
+ #
35
+ # - `tabsii-crm` DOES carry it, and its gate is real.
36
+ # - `tabsii-ui` gained it the same day (tabsii-ui#24), which also showed the
37
+ # abstention is cheap to clear: add prettier + lint-staged and a config.
38
+ # - Seven others still abstain. THREE of those have no root `package.json` at
39
+ # all, so they hit the FIRST branch below, and no config file can fix them --
40
+ # they need a root manifest before they need a lint-staged entry.
41
+ #
42
+ # The deeper reason it keeps happening: **`.prettierrc` is not in
43
+ # `shared-files.json`**, so nothing ever carries the estate's formatting rules
44
+ # to a satellite. Each one is left to invent them or have none, and a satellite
45
+ # that adopts prettier with DEFAULTS drifts away from the estate's style rather
46
+ # than towards it -- measured in tabsii-ui, where prettier's defaults reformatted
47
+ # all 7 source files and the template's settings reformatted 3.
48
+ #
49
+ # Do not re-freeze a measured count into this comment without a date and a way
50
+ # to re-derive it. The number is a snapshot of a backlog, not a property of
51
+ # satellites.
26
52
  if [ ! -f package.json ]; then
27
53
  echo "pre-commit: ABSTAINED — no root package.json, so lint-staged cannot run here." >&2
28
54
  echo " Staged files were NOT linted or formatted. CI still checks them." >&2
@@ -205,7 +205,32 @@ for lock in $ALL_LOCKS; do
205
205
 
206
206
  # `--no-emit-project` drops the tree's own package (nothing published to
207
207
  # audit); `--no-dev` keeps the audit to what actually ships.
208
- if (cd "$dir" && uv export --frozen --no-dev --no-emit-project) >"$reqs" 2>/dev/null && [ -s "$reqs" ]; then
208
+ #
209
+ # `--no-emit-local` drops LOCAL PATH dependencies, and without it this gate
210
+ # cannot scan a plugin tree at all (#1340). `biffo-plugin-sdk` is pulled in
211
+ # as `-e ./packages/python-sdk`; pip-audit tries to resolve it on PyPI, fails
212
+ # with "Dependency not found on PyPI and could not be audited", and produces
213
+ # no parseable output -- so the whole tree came back INCONCLUSIVE and blocked.
214
+ # Every vendored Python plugin tree in every instance has that dependency, so
215
+ # this was not a niche shape: it blocked all of them.
216
+ #
217
+ # Skipping it costs nothing real. A local path dependency is first-party
218
+ # source, audited in its own repo, and never a published artefact an advisory
219
+ # could name. Its TRANSITIVE dependencies are still exported and still
220
+ # audited -- verified on `services/ideation`, where the export keeps 25
221
+ # packages including three carried `via biffo-plugin-sdk`. So the answer this
222
+ # gate gives is unchanged for every package an advisory can actually be about.
223
+ if (cd "$dir" && uv export --frozen --no-dev --no-emit-project --no-emit-local) >"$reqs" 2>/dev/null && [ -s "$reqs" ]; then
224
+ # Report what was skipped rather than skipping it quietly: "audited
225
+ # everything except the bits we could not" must never read the same as
226
+ # "audited everything", which is the failure this whole file exists to
227
+ # fight. Counted from the same lockfile, so the number is the tree's, not
228
+ # a guess.
229
+ local_deps=$( (cd "$dir" && uv export --frozen --no-dev --no-emit-project) 2>/dev/null \
230
+ | grep -cE '^-e |@ file://' || true )
231
+ if [ "${local_deps:-0}" -gt 0 ]; then
232
+ echo " (${rel}: ${local_deps} local path dependenc$([ "$local_deps" -eq 1 ] && echo y || echo ies) excluded -- first-party, audited in their own repo; their transitive dependencies are still scanned)"
233
+ fi
209
234
  audit_deps "pip-audit (${rel})" "-r $reqs" || failed=1
210
235
  else
211
236
  # An export failure is "couldn't run", not "clean" — same discipline as a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@biffo/cli",
3
- "version": "0.249.7",
3
+ "version": "0.249.9",
4
4
  "description": "Biffo project scaffolding CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",