@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.
- package/_skeletons/plugin-template/.githooks/pre-commit +30 -4
- package/_skeletons/plugin-template/scripts/py-dependency-audit.sh +26 -1
- package/_skeletons/sibling-template/.githooks/pre-commit +30 -4
- package/_skeletons/sibling-template/scripts/py-dependency-audit.sh +26 -1
- package/package.json +1 -1
|
@@ -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.
|
|
20
|
-
#
|
|
21
|
-
#
|
|
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
|
-
|
|
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.
|
|
20
|
-
#
|
|
21
|
-
#
|
|
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
|
-
|
|
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
|