@arbiterforge/ca-pi 0.17.2 → 0.17.3
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/README.md +1 -1
- package/package.json +1 -1
- package/plugins/ca-pi/CHANGELOG.md +7 -0
- package/plugins/ca-pi/helpers/artifacts/release.json +18 -18
- package/plugins/ca-pi/hooks/_githooks.py +24 -14
- package/plugins/ca-pi/hooks/_host.py +1 -1
- package/plugins/ca-pi/hooks/hostapi.py +1 -1
- package/plugins/ca-pi/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ and durable project context. You decide. codeArbiter enforces.
|
|
|
10
10
|
<img alt="Claude Code plugin" src="https://img.shields.io/badge/Claude_Code-plugin-d97757">
|
|
11
11
|
<img alt="Codex plugin" src="https://img.shields.io/badge/OpenAI_Codex-plugin-10a37f">
|
|
12
12
|
<img alt="Pi Feature Forge preview" src="https://img.shields.io/badge/ca--pi-Feature_Forge_preview-d97757">
|
|
13
|
-
<img alt="version 2.25.
|
|
13
|
+
<img alt="version 2.25.3" src="https://img.shields.io/badge/version-2.25.3-2b7489">
|
|
14
14
|
<img alt="core lanes" src="https://img.shields.io/badge/core_lanes-18-555">
|
|
15
15
|
<img alt="skills" src="https://img.shields.io/badge/skills-22-555">
|
|
16
16
|
<img alt="agents" src="https://img.shields.io/badge/agents-20-555">
|
package/package.json
CHANGED
|
@@ -4,6 +4,13 @@ All notable changes to `ca-pi` are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.17.3] - 2026-10-09
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Keep managed Git hooks working with a restricted PATH while preserving
|
|
12
|
+
trusted executable identities, cross-host path resolution and stale-registration checks.
|
|
13
|
+
|
|
7
14
|
## [0.17.2] - 2026-10-08
|
|
8
15
|
|
|
9
16
|
### Fixed
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
},
|
|
38
38
|
"context_qualification": {
|
|
39
39
|
"darwin/amd64": {
|
|
40
|
-
"source_commit": "
|
|
40
|
+
"source_commit": "f5160861dbfde0b231d9fe557961bf3117ad7039",
|
|
41
41
|
"workflow": ".github/workflows/ci.yml",
|
|
42
|
-
"run_id": "
|
|
42
|
+
"run_id": "37888003877",
|
|
43
43
|
"binary_sha256": "433780fa59913512346069f9e1891e306a8bec41ed6fcc7cd26b50748d03ae06",
|
|
44
|
-
"observation_sha256": "
|
|
44
|
+
"observation_sha256": "ca81998a6da2435635942bfaf8fb385c953f4879c7c9b42793060009182cfc76",
|
|
45
45
|
"module_sha256": "421b4db5fa1afc9a8620c5538161d8b23f193d6a1042ad1c5aa004facdd77844",
|
|
46
46
|
"native_cases": [
|
|
47
47
|
"TestContextBoundedRender",
|
|
@@ -53,11 +53,11 @@
|
|
|
53
53
|
]
|
|
54
54
|
},
|
|
55
55
|
"darwin/arm64": {
|
|
56
|
-
"source_commit": "
|
|
56
|
+
"source_commit": "f5160861dbfde0b231d9fe557961bf3117ad7039",
|
|
57
57
|
"workflow": ".github/workflows/ci.yml",
|
|
58
|
-
"run_id": "
|
|
58
|
+
"run_id": "37888003877",
|
|
59
59
|
"binary_sha256": "b68192c7a1da2cd2f9031f71ab4c7e015673f060d6bfdfa3aa4b57d9f090bf34",
|
|
60
|
-
"observation_sha256": "
|
|
60
|
+
"observation_sha256": "e35ee74a7b33dd195f2ae32a575cb9cffe5546367879d0ab81af59804f5115ed",
|
|
61
61
|
"module_sha256": "421b4db5fa1afc9a8620c5538161d8b23f193d6a1042ad1c5aa004facdd77844",
|
|
62
62
|
"native_cases": [
|
|
63
63
|
"TestContextBoundedRender",
|
|
@@ -69,11 +69,11 @@
|
|
|
69
69
|
]
|
|
70
70
|
},
|
|
71
71
|
"linux/amd64": {
|
|
72
|
-
"source_commit": "
|
|
72
|
+
"source_commit": "f5160861dbfde0b231d9fe557961bf3117ad7039",
|
|
73
73
|
"workflow": ".github/workflows/ci.yml",
|
|
74
|
-
"run_id": "
|
|
74
|
+
"run_id": "37888003877",
|
|
75
75
|
"binary_sha256": "09582eabdef3f828a12de21b85ccc7b52a188651c2a4f69f3f776a2e62c86036",
|
|
76
|
-
"observation_sha256": "
|
|
76
|
+
"observation_sha256": "302266907f2ecc6ac4bc3db169d0ea119d76dedd3c286d0495caf073878ea817",
|
|
77
77
|
"module_sha256": "421b4db5fa1afc9a8620c5538161d8b23f193d6a1042ad1c5aa004facdd77844",
|
|
78
78
|
"native_cases": [
|
|
79
79
|
"TestContextBoundedRender",
|
|
@@ -85,11 +85,11 @@
|
|
|
85
85
|
]
|
|
86
86
|
},
|
|
87
87
|
"linux/arm64": {
|
|
88
|
-
"source_commit": "
|
|
88
|
+
"source_commit": "f5160861dbfde0b231d9fe557961bf3117ad7039",
|
|
89
89
|
"workflow": ".github/workflows/ci.yml",
|
|
90
|
-
"run_id": "
|
|
90
|
+
"run_id": "37888003877",
|
|
91
91
|
"binary_sha256": "f7699ce8f2f07200ea8508f21a6d369506443392aa8897d84e9d5e7dd6469770",
|
|
92
|
-
"observation_sha256": "
|
|
92
|
+
"observation_sha256": "3497e9d18b7a6b255119460a6fe41edffc08c27043c9d8805ea4d1cec6395f81",
|
|
93
93
|
"module_sha256": "421b4db5fa1afc9a8620c5538161d8b23f193d6a1042ad1c5aa004facdd77844",
|
|
94
94
|
"native_cases": [
|
|
95
95
|
"TestContextBoundedRender",
|
|
@@ -101,11 +101,11 @@
|
|
|
101
101
|
]
|
|
102
102
|
},
|
|
103
103
|
"windows/amd64": {
|
|
104
|
-
"source_commit": "
|
|
104
|
+
"source_commit": "f5160861dbfde0b231d9fe557961bf3117ad7039",
|
|
105
105
|
"workflow": ".github/workflows/ci.yml",
|
|
106
|
-
"run_id": "
|
|
106
|
+
"run_id": "37888003877",
|
|
107
107
|
"binary_sha256": "9a0f186e2a1bcfd92c8f9db5cb0aa2f6dfb128dd6f0dad2708a78596f0364e16",
|
|
108
|
-
"observation_sha256": "
|
|
108
|
+
"observation_sha256": "c3b9c4bd123596887b4d04b7d5b1f88e0dcdeaae51fc6f92ba4fe0d298039683",
|
|
109
109
|
"module_sha256": "421b4db5fa1afc9a8620c5538161d8b23f193d6a1042ad1c5aa004facdd77844",
|
|
110
110
|
"native_cases": [
|
|
111
111
|
"TestContextBoundedRender",
|
|
@@ -117,11 +117,11 @@
|
|
|
117
117
|
]
|
|
118
118
|
},
|
|
119
119
|
"windows/arm64": {
|
|
120
|
-
"source_commit": "
|
|
120
|
+
"source_commit": "f5160861dbfde0b231d9fe557961bf3117ad7039",
|
|
121
121
|
"workflow": ".github/workflows/ci.yml",
|
|
122
|
-
"run_id": "
|
|
122
|
+
"run_id": "37888003877",
|
|
123
123
|
"binary_sha256": "3f1bc7d00f9488b4a4a9f21e5ca414fd5c97031ad7b1c2b52c02f5d7f2956e3a",
|
|
124
|
-
"observation_sha256": "
|
|
124
|
+
"observation_sha256": "31a5b206eccbf6fd80916f7e4b6803d36d906e5171e43ee279373a619517f3ce",
|
|
125
125
|
"module_sha256": "421b4db5fa1afc9a8620c5538161d8b23f193d6a1042ad1c5aa004facdd77844",
|
|
126
126
|
"native_cases": [
|
|
127
127
|
"TestContextBoundedRender",
|
|
@@ -349,13 +349,23 @@ def _resolve_live_dir(path):
|
|
|
349
349
|
# semantics like `_path_form_candidates` on POSIX -- embedded verbatim into
|
|
350
350
|
# every generated shim so the REAL git-hook execution path (not just Python
|
|
351
351
|
# diagnostics) resolves a foreign-but-translatable spelling instead of
|
|
352
|
-
# failing closed on it.
|
|
353
|
-
#
|
|
354
|
-
#
|
|
352
|
+
# failing closed on it. POSIX shell builtins only: the trusted-identity path
|
|
353
|
+
# must also work when PATH contains no trusted utilities (ADR-0015).
|
|
354
|
+
# Prints the resolved path and returns 0 on the
|
|
355
355
|
# first candidate that exists; returns 1 with nothing printed when NONE of
|
|
356
356
|
# the (as-is, plus up to two translated) candidates resolves -- callers must
|
|
357
357
|
# treat that as "does not exist," preserving ADR-0014's fail-closed contract.
|
|
358
|
+
_CX_DRIVE_CASE_SH = "".join(
|
|
359
|
+
f" {letter.lower()}|{letter}) DRL={letter.lower()}; DRU={letter} ;;\n"
|
|
360
|
+
for letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
361
|
+
)
|
|
358
362
|
_CX_RESOLVE_SH = (
|
|
363
|
+
"_cx_drive_case() {\n"
|
|
364
|
+
' case "$1" in\n'
|
|
365
|
+
f"{_CX_DRIVE_CASE_SH}"
|
|
366
|
+
" *) return 1 ;;\n"
|
|
367
|
+
" esac\n"
|
|
368
|
+
"}\n"
|
|
359
369
|
"_cx_resolve() {\n"
|
|
360
370
|
" P=$1\n"
|
|
361
371
|
" K=-f\n"
|
|
@@ -364,17 +374,15 @@ _CX_RESOLVE_SH = (
|
|
|
364
374
|
" /mnt/[A-Za-z]/*)\n"
|
|
365
375
|
' [ "$K" "$P" ] && { printf \'%s\' "$P"; return 0; }\n'
|
|
366
376
|
' REST=${P#/mnt/?/}\n'
|
|
367
|
-
' DR=$
|
|
368
|
-
'
|
|
369
|
-
' DRU=$(printf \'%s\' "$DR" | tr \'a-z\' \'A-Z\')\n'
|
|
377
|
+
' DR=${P#/mnt/}; DR=${DR%%/*}\n'
|
|
378
|
+
' _cx_drive_case "$DR" || return 1\n'
|
|
370
379
|
' A1="/$DRL/$REST"; A2="$DRU:/$REST"\n'
|
|
371
380
|
" ;;\n"
|
|
372
381
|
" /[A-Za-z]/*)\n"
|
|
373
382
|
' [ "$K" "$P" ] && { printf \'%s\' "$P"; return 0; }\n'
|
|
374
383
|
' REST=${P#/?/}\n'
|
|
375
|
-
' DR=$
|
|
376
|
-
'
|
|
377
|
-
' DRU=$(printf \'%s\' "$DR" | tr \'a-z\' \'A-Z\')\n'
|
|
384
|
+
' DR=${P#/}; DR=${DR%%/*}\n'
|
|
385
|
+
' _cx_drive_case "$DR" || return 1\n'
|
|
378
386
|
' A1="/mnt/$DRL/$REST"; A2="$DRU:/$REST"\n'
|
|
379
387
|
" ;;\n"
|
|
380
388
|
" [A-Za-z]:/*)\n"
|
|
@@ -387,7 +395,8 @@ _CX_RESOLVE_SH = (
|
|
|
387
395
|
" # Git-Bash resolves this same spelling too, but via A1 (\"/<drive>/\n"
|
|
388
396
|
" # ...\"), which Git-Bash ALSO resolves -- so nothing is lost by\n"
|
|
389
397
|
" # withholding the raw as-is test for this one grammar.\n"
|
|
390
|
-
' DR=$
|
|
398
|
+
' DR=${P%%:*}\n'
|
|
399
|
+
' _cx_drive_case "$DR" || return 1\n'
|
|
391
400
|
" # ??: (two wildcards, literal colon) never matches a drive-letter\n"
|
|
392
401
|
" # path like C:/... (its 3rd char is / , not the required literal\n"
|
|
393
402
|
" # ':'), so it left REST completely unstripped -- a confirmed\n"
|
|
@@ -396,7 +405,7 @@ _CX_RESOLVE_SH = (
|
|
|
396
405
|
" # correct 3-char match for this branch's own case pattern.\n"
|
|
397
406
|
' REST=${P#?:/}\n'
|
|
398
407
|
' REST=${REST#/}\n'
|
|
399
|
-
' A1="/$
|
|
408
|
+
' A1="/$DRL/$REST"; A2="/mnt/$DRL/$REST"\n'
|
|
400
409
|
" ;;\n"
|
|
401
410
|
" *)\n"
|
|
402
411
|
' [ "$K" "$P" ] && { printf \'%s\' "$P"; return 0; }\n'
|
|
@@ -801,14 +810,15 @@ def _shim(dropin_dir, phase):
|
|
|
801
810
|
f"{_FRESHNESS_PY}"
|
|
802
811
|
"CODEARBITER_556_FRESHNESS\n"
|
|
803
812
|
")\n"
|
|
804
|
-
# Match
|
|
805
|
-
"
|
|
813
|
+
# Match whole LF/CRLF lines without executing a PATH-resolved utility.
|
|
814
|
+
"CR=$(printf '\\r')\n"
|
|
815
|
+
"NL='\n'\n"
|
|
806
816
|
"SEEN=0\n"
|
|
807
817
|
'for c in "$D"/*.path; do\n'
|
|
808
818
|
' [ -f "$c" ] || continue\n'
|
|
809
819
|
' N=${c##*/}\n'
|
|
810
820
|
' case "$N" in [0-9]*.[0-9]*.[0-9]*.path) continue ;; esac\n'
|
|
811
|
-
' case "
|
|
821
|
+
' case "$NL$SKIP$NL" in *"$NL${N%.path}$NL"*|*"$NL${N%.path}$CR$NL"*) continue ;; esac\n'
|
|
812
822
|
' IFS= read -r E < "$c" || continue\n'
|
|
813
823
|
' E=$(_cx_resolve "$E") || continue\n'
|
|
814
824
|
' SEEN=1\n'
|
|
@@ -11,7 +11,7 @@ import hostapi # noqa: E402
|
|
|
11
11
|
class PiHost(hostapi.Host):
|
|
12
12
|
name = "pi"
|
|
13
13
|
adapter_name = "@arbiterforge/ca-pi"
|
|
14
|
-
adapter_version = "0.17.
|
|
14
|
+
adapter_version = "0.17.3"
|
|
15
15
|
update_target = "ca-pi"
|
|
16
16
|
update_tag_prefix = "ca-pi-v"
|
|
17
17
|
update_command = "pi update npm:@arbiterforge/ca-pi"
|
|
@@ -313,7 +313,7 @@ class Host:
|
|
|
313
313
|
|
|
314
314
|
name = "claude"
|
|
315
315
|
adapter_name = "ca"
|
|
316
|
-
adapter_version = "2.25.
|
|
316
|
+
adapter_version = "2.25.3"
|
|
317
317
|
|
|
318
318
|
# Update-notifier descriptor. Each independently versioned host overrides
|
|
319
319
|
# these three values in its per-plugin _host.py. Keeping the target,
|