Fix review findings in @probo/skills package

Add ISC header to COMPATIBILITY.md, validate Claude marketplace
json, record access-review notes after API success, checksum npm
pack contents, trim dead package.json files entries, and mark
listUsers organization_id as required.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
This commit is contained in:
Cursor Agent
2026-07-10 13:29:26 +00:00
parent f864482ce1
commit d7e82ca1f6
9 changed files with 37 additions and 14 deletions

View File

@@ -51,11 +51,15 @@ jobs:
- name: "Generate checksums for published files" - name: "Generate checksums for published files"
run: | run: |
cd packages/skills cd packages/skills
find .claude-plugin skills commands agents hooks bin -type f 2>/dev/null \ PACKFILE=$(npm pack --silent)
tar -tzf "$PACKFILE" \
| grep -v '/$' \
| sort \ | sort \
| while read -r file; do | while read -r file; do
echo "$(sha256sum "$file" | head -c 64) $file" hash=$(tar -xOf "$PACKFILE" "$file" | sha256sum | head -c 64)
done > checksums.txt echo "$hash $file"
done > checksums.txt
rm -f "$PACKFILE"
test -s checksums.txt test -s checksums.txt
- run: "npm --workspace @probo/skills publish --access public --dry-run" - run: "npm --workspace @probo/skills publish --access public --dry-run"
- run: "npm --workspace @probo/skills publish --access public" - run: "npm --workspace @probo/skills publish --access public"

View File

@@ -27,3 +27,7 @@ this file.
- Package published as `@probo/skills` in `packages/skills/` (multi-agent - Package published as `@probo/skills` in `packages/skills/` (multi-agent
scope, not Claude-specific) scope, not Claude-specific)
- Access-review skill records entry notes only after successful API writes
- Release checksums derived from `npm pack` tarball contents
- Validation enforces `.claude-plugin/marketplace.json`; `package.json` files
list trimmed to paths that exist

View File

@@ -1,3 +1,19 @@
<!--
Copyright (c) 2026 Probo Inc <hello@probo.com>.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
-->
# Multi-agent compatibility # Multi-agent compatibility
`@probo/skills` targets **Claude Code**, **Codex**, **OpenCode**, and `@probo/skills` targets **Claude Code**, **Codex**, **OpenCode**, and

View File

@@ -76,8 +76,6 @@ claude --plugin-dir ./packages/skills
| MCP | `.mcp.json` | Probo API connection | | MCP | `.mcp.json` | Probo API connection |
| Skills | `skills/` | Compliance workflows | | Skills | `skills/` | Compliance workflows |
| Commands | `commands/` | `access-review`, `missing-signatures` — semi-auto workflows | | Commands | `commands/` | `access-review`, `missing-signatures` — semi-auto workflows |
| Agents | `agents/` | Reserved |
| Hooks | `hooks/` | Reserved |
Skills: `/probo:<skill-name>` (e.g. `/probo:open-source-compliance`, `/probo:missing-signatures`). Skills: `/probo:<skill-name>` (e.g. `/probo:open-source-compliance`, `/probo:missing-signatures`).

View File

@@ -18,9 +18,6 @@
".agents", ".agents",
"skills", "skills",
"commands", "commands",
"agents",
"hooks",
"bin",
".mcp.json", ".mcp.json",
"README.md", "README.md",
"COMPATIBILITY.md" "COMPATIBILITY.md"

View File

@@ -20,6 +20,7 @@ const root = join(dirname(fileURLToPath(import.meta.url)), "..");
const requiredPaths = [ const requiredPaths = [
".claude-plugin/plugin.json", ".claude-plugin/plugin.json",
".claude-plugin/marketplace.json",
".codex-plugin/plugin.json", ".codex-plugin/plugin.json",
".agents/plugins/marketplace.json", ".agents/plugins/marketplace.json",
".mcp.json", ".mcp.json",

View File

@@ -54,15 +54,18 @@ Apply `references/decision-rubric.md`:
| --- | --- | | --- | --- |
| **Auto** | Queue for `recordAccessReviewEntryDecisions` | | **Auto** | Queue for `recordAccessReviewEntryDecisions` |
| **Ambiguous** | Present to user; do not write yet | | **Ambiguous** | Present to user; do not write yet |
| **Skip** | Log in notes only | | **Skip** | Log in notes only (no API write) |
Append each auto decision to the notes file before writing. Hold auto decisions in memory until step 4 succeeds — do not append them to the
notes file yet.
### 4. Write auto decisions ### 4. Write auto decisions
- Batch via `recordAccessReviewEntryDecisions` when possible. - Batch via `recordAccessReviewEntryDecisions` when possible.
- Non-`APPROVED` decisions **must** include `decision_note`. - Non-`APPROVED` decisions **must** include `decision_note`.
- On MCP error, stop and do not advance `last_cursor`. - On MCP error, stop and do not advance `last_cursor` or update entry notes.
- After a successful API response, append each recorded auto decision to the
notes file `## Entry notes` table.
### 5. Present ambiguous entries ### 5. Present ambiguous entries

View File

@@ -40,7 +40,7 @@ updated_at: <ISO-8601 UTC>
| --- | --- | | --- | --- |
| `last_cursor` | Empty on fresh run. Set to `listAccessEntries` `next_cursor` after each successful batch. Clear when null (pagination done). | | `last_cursor` | Empty on fresh run. Set to `listAccessEntries` `next_cursor` after each successful batch. Clear when null (pagination done). |
| `updated_at` | Update on every file write | | `updated_at` | Update on every file write |
| `auto` column | `yes` if written via semi-auto rubric; `no` if user confirmed | | `auto` column | `yes` after a successful API write via semi-auto rubric; `no` if user confirmed |
| Session log | Append-only; one line per batch or major event | | Session log | Append-only; one line per batch or major event |
| Ambiguous table | Remove rows after user confirms and decision is recorded | | Ambiguous table | Remove rows after user confirms and decision is recorded |
@@ -51,7 +51,7 @@ updated_at: <ISO-8601 UTC>
3. Continue `listAccessEntries` from `last_cursor` if set; otherwise start from 3. Continue `listAccessEntries` from `last_cursor` if set; otherwise start from
the first pending page. the first pending page.
4. Do not duplicate entry notes for IDs already in the table with a final 4. Do not duplicate entry notes for IDs already in the table with a final
decision. decision recorded after a successful API write.
## Git ## Git

View File

@@ -16,7 +16,7 @@ Resolve profile display fields. `users[]` entries are `Profile` objects.
| Field | Usage | | Field | Usage |
| --- | --- | | --- | --- |
| `organization_id` | Organization GID | | `organization_id` | Required — organization GID |
| `size` | Page size; use `100` when prefetching is helpful | | `size` | Page size; use `100` when prefetching is helpful |
| `cursor` | Pagination | | `cursor` | Pagination |