@probo/skills 0.1.0
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/.agents/plugins/marketplace.json +30 -0
- package/.claude-plugin/marketplace.json +28 -0
- package/.claude-plugin/plugin.json +21 -0
- package/.codex-plugin/plugin.json +21 -0
- package/.mcp.json +8 -0
- package/COMPATIBILITY.md +170 -0
- package/README.md +96 -0
- package/commands/access-review.md +17 -0
- package/commands/missing-signatures.md +17 -0
- package/package.json +49 -0
- package/skills/access-review/SKILL.md +85 -0
- package/skills/access-review/references/decision-rubric.md +60 -0
- package/skills/access-review/references/mcp-tools.md +93 -0
- package/skills/access-review/references/notes-format.md +59 -0
- package/skills/missing-signatures/SKILL.md +109 -0
- package/skills/missing-signatures/references/mcp-tools.md +143 -0
- package/skills/missing-signatures/references/notes-format.md +57 -0
- package/skills/missing-signatures/references/report-format.md +89 -0
- package/skills/open-source-compliance/SKILL.md +51 -0
- package/skills/open-source-compliance/references/workflows.md +48 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "probo",
|
|
3
|
+
"interface": {
|
|
4
|
+
"displayName": "Probo"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "probo",
|
|
9
|
+
"description": "Open-source compliance workflows powered by Probo MCP",
|
|
10
|
+
"source": {
|
|
11
|
+
"source": "local",
|
|
12
|
+
"path": "./"
|
|
13
|
+
},
|
|
14
|
+
"policy": {
|
|
15
|
+
"installation": "AVAILABLE",
|
|
16
|
+
"authentication": "ON_INSTALL"
|
|
17
|
+
},
|
|
18
|
+
"category": "Productivity",
|
|
19
|
+
"homepage": "https://github.com/getprobo/probo/tree/main/packages/skills",
|
|
20
|
+
"repository": "https://github.com/getprobo/probo",
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"keywords": [
|
|
23
|
+
"probo",
|
|
24
|
+
"compliance",
|
|
25
|
+
"grc",
|
|
26
|
+
"mcp"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "probo",
|
|
3
|
+
"description": "Probo Claude Code plugins",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "Probo Inc",
|
|
6
|
+
"email": "hello@probo.com"
|
|
7
|
+
},
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "probo",
|
|
11
|
+
"description": "Open-source compliance workflows powered by Probo MCP",
|
|
12
|
+
"source": {
|
|
13
|
+
"source": "npm",
|
|
14
|
+
"package": "@probo/skills"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://github.com/getprobo/probo/tree/main/packages/skills",
|
|
17
|
+
"repository": "https://github.com/getprobo/probo",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"keywords": [
|
|
20
|
+
"probo",
|
|
21
|
+
"compliance",
|
|
22
|
+
"grc",
|
|
23
|
+
"mcp",
|
|
24
|
+
"agent-skills"
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "probo",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Open-source compliance workflows powered by Probo MCP (Claude Code, Codex, OpenCode)",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Probo Inc",
|
|
7
|
+
"email": "hello@probo.com"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/getprobo/probo/tree/main/packages/skills",
|
|
10
|
+
"repository": "https://github.com/getprobo/probo",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"probo",
|
|
14
|
+
"compliance",
|
|
15
|
+
"grc",
|
|
16
|
+
"mcp",
|
|
17
|
+
"open-source"
|
|
18
|
+
],
|
|
19
|
+
"skills": "./skills/",
|
|
20
|
+
"mcpServers": "./.mcp.json"
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "probo",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Open-source compliance workflows powered by Probo MCP (Codex, OpenCode, Claude Code)",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Probo Inc",
|
|
7
|
+
"email": "hello@probo.com"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/getprobo/probo/tree/main/packages/skills",
|
|
10
|
+
"repository": "https://github.com/getprobo/probo",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"probo",
|
|
14
|
+
"compliance",
|
|
15
|
+
"grc",
|
|
16
|
+
"mcp",
|
|
17
|
+
"open-source"
|
|
18
|
+
],
|
|
19
|
+
"skills": "./skills/",
|
|
20
|
+
"mcpServers": "./.mcp.json"
|
|
21
|
+
}
|
package/.mcp.json
ADDED
package/COMPATIBILITY.md
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Copyright (c) 2026 Probo Inc <hello@probo.com>.
|
|
3
|
+
|
|
4
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
5
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
6
|
+
copyright notice and this permission notice appear in all copies.
|
|
7
|
+
|
|
8
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
9
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
10
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
11
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
12
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
13
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
14
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
15
|
+
-->
|
|
16
|
+
|
|
17
|
+
# Multi-agent compatibility
|
|
18
|
+
|
|
19
|
+
`@probo/skills` targets **Claude Code**, **Codex**, **OpenCode**, and
|
|
20
|
+
other MCP-capable agents (including **Cursor**). The portable core is Probo
|
|
21
|
+
MCP plus Agent Skills–compatible `SKILL.md` files.
|
|
22
|
+
|
|
23
|
+
## What works where
|
|
24
|
+
|
|
25
|
+
| Component | Claude Code | Codex | OpenCode | Cursor |
|
|
26
|
+
| --- | --- | --- | --- | --- |
|
|
27
|
+
| Probo MCP (OAuth) | ✅ Plugin `.mcp.json` | ✅ `.codex-plugin` + `.mcp.json` | ✅ Manual MCP config | ✅ IDE MCP settings |
|
|
28
|
+
| Skills (`SKILL.md`) | ✅ `skills/` | ✅ `skills/` via `.codex-plugin` | ✅ `.opencode/skills/` or `.claude/skills/` | ✅ Copy/symlink to `.cursor/skills/` |
|
|
29
|
+
| Commands | ✅ `commands/` → `/probo:…` | ⚠️ Use skills instead | ⚠️ Native `skill` tool | ❌ Use skill or rules |
|
|
30
|
+
| Plugin manifest | `.claude-plugin/` | `.codex-plugin/` | Discovery paths (no manifest) | No native manifest |
|
|
31
|
+
| Marketplace catalog | `.claude-plugin/marketplace.json` (repo root or package) | `.agents/plugins/marketplace.json` (repo root or package) | — | — |
|
|
32
|
+
|
|
33
|
+
## Probo MCP (all agents)
|
|
34
|
+
|
|
35
|
+
Set the instance URL:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
export PROBO_BASE_URL="https://your-probo-instance.example.com"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Endpoint: `${PROBO_BASE_URL}/mcp/v1` (HTTP, OAuth 2.0). Do not configure a
|
|
42
|
+
static bearer token — OAuth discovery uses
|
|
43
|
+
`/.well-known/oauth-protected-resource`.
|
|
44
|
+
|
|
45
|
+
### Claude Code
|
|
46
|
+
|
|
47
|
+
**From the monorepo or GitHub** (repo-root catalog at
|
|
48
|
+
`.claude-plugin/marketplace.json`):
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
claude plugin marketplace add getprobo/probo
|
|
52
|
+
# or, from a local clone:
|
|
53
|
+
claude plugin marketplace add .
|
|
54
|
+
claude plugin install probo@probo
|
|
55
|
+
claude mcp login probo # or /mcp in session
|
|
56
|
+
/probo:access-review Q3 GitHub review
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**From the package directory** (catalog resolves `@probo/skills` from npm):
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
claude plugin marketplace add ./packages/skills/.claude-plugin
|
|
63
|
+
claude plugin install probo@probo
|
|
64
|
+
claude mcp login probo
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Or install the plugin directory directly:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
claude --plugin-dir ./packages/skills
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Codex
|
|
74
|
+
|
|
75
|
+
**From the monorepo or GitHub** (repo-root catalog at
|
|
76
|
+
`.agents/plugins/marketplace.json`):
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
codex plugin marketplace add getprobo/probo
|
|
80
|
+
# or, from a local clone:
|
|
81
|
+
codex plugin marketplace add .
|
|
82
|
+
codex plugin install probo@probo
|
|
83
|
+
codex mcp login probo
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**From the package directory** (catalog at
|
|
87
|
+
`packages/skills/.agents/plugins/marketplace.json`):
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
codex plugin marketplace add ./packages/skills
|
|
91
|
+
codex plugin install probo@probo
|
|
92
|
+
codex mcp login probo
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Or install the plugin directory directly:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
codex plugin install ./packages/skills
|
|
99
|
+
codex mcp login probo
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Skills load from `./skills/` via `.codex-plugin/plugin.json`. The repo-root
|
|
103
|
+
marketplace `source.path` is `./packages/skills`; the package-level
|
|
104
|
+
catalog uses `./` (plugin package root).
|
|
105
|
+
|
|
106
|
+
### OpenCode
|
|
107
|
+
|
|
108
|
+
OpenCode discovers skills at `.opencode/skills/`, `.claude/skills/`, and
|
|
109
|
+
`~/.config/opencode/skills/`. Options:
|
|
110
|
+
|
|
111
|
+
**Option A — symlink from this package:**
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
mkdir -p .opencode/skills
|
|
115
|
+
ln -s ../../packages/skills/skills/access-review .opencode/skills/access-review
|
|
116
|
+
ln -s ../../packages/skills/skills/open-source-compliance .opencode/skills/open-source-compliance
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Option B — Claude Code bridge:** install
|
|
120
|
+
[`opencode-claude-code-bridge`](https://www.npmjs.com/package/opencode-claude-code-bridge)
|
|
121
|
+
to import Claude plugins and MCP configs into OpenCode.
|
|
122
|
+
|
|
123
|
+
Configure Probo MCP in `opencode.json` or global OpenCode MCP settings, then
|
|
124
|
+
authenticate. Invoke via the native `skill` tool (`access-review`).
|
|
125
|
+
|
|
126
|
+
### Cursor
|
|
127
|
+
|
|
128
|
+
1. Add Probo MCP in Cursor settings (HTTP URL: `${PROBO_BASE_URL}/mcp/v1`,
|
|
129
|
+
OAuth).
|
|
130
|
+
2. Copy or symlink skills into `.cursor/skills/`:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
mkdir -p .cursor/skills
|
|
134
|
+
cp -r packages/skills/skills/access-review .cursor/skills/
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Reference the skill in chat or add a Cursor rule pointing at the skill.
|
|
138
|
+
|
|
139
|
+
## Portable vs agent-specific paths
|
|
140
|
+
|
|
141
|
+
| Path | Portable? |
|
|
142
|
+
| --- | --- |
|
|
143
|
+
| `skills/<name>/SKILL.md` | ✅ Agent Skills standard |
|
|
144
|
+
| `skills/<name>/references/*.md` | ✅ Relative to skill directory |
|
|
145
|
+
| `.mcp.json` with `${PROBO_BASE_URL}` | ✅ Standard env var |
|
|
146
|
+
| `${CLAUDE_PLUGIN_ROOT}` | ❌ Claude Code only — avoid in skill bodies |
|
|
147
|
+
| `commands/*.md` | Claude Code slash commands only |
|
|
148
|
+
|
|
149
|
+
Skill bodies use **relative** `references/` paths so they work once the skill
|
|
150
|
+
directory is discovered, regardless of which agent loads it.
|
|
151
|
+
|
|
152
|
+
## npm package layout
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
@probo/skills/
|
|
156
|
+
.claude-plugin/plugin.json # Claude Code manifest
|
|
157
|
+
.claude-plugin/marketplace.json # Claude marketplace (npm)
|
|
158
|
+
.codex-plugin/plugin.json # Codex manifest
|
|
159
|
+
.agents/plugins/marketplace.json # Codex marketplace (package-local)
|
|
160
|
+
.mcp.json # Shared MCP wiring
|
|
161
|
+
skills/ # Shared skills (all agents)
|
|
162
|
+
commands/ # Claude Code commands only
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Repo root (monorepo / `getprobo/probo` Git installs):
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
.claude-plugin/marketplace.json # Claude marketplace → packages/skills
|
|
169
|
+
.agents/plugins/marketplace.json # Codex marketplace → packages/skills
|
|
170
|
+
```
|
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# @probo/skills
|
|
2
|
+
|
|
3
|
+
Multi-agent compliance skills for open-source GRC workflows. Ships Agent
|
|
4
|
+
Skills–compatible instructions and wires agents to the [Probo MCP
|
|
5
|
+
API](https://github.com/getprobo/probo/tree/main/pkg/server/api/mcp/v1) via
|
|
6
|
+
OAuth 2.0.
|
|
7
|
+
|
|
8
|
+
**Supported agents:** Claude Code, Codex, OpenCode, Cursor (MCP + skills).
|
|
9
|
+
|
|
10
|
+
Marketplace catalogs: `.claude-plugin/marketplace.json` at the repo root or
|
|
11
|
+
under `packages/skills/` (Claude Code), `.agents/plugins/marketplace.json` at
|
|
12
|
+
the repo root or under `packages/skills/` (Codex). See
|
|
13
|
+
[COMPATIBILITY.md](./COMPATIBILITY.md).
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
### From GitHub or npm
|
|
18
|
+
|
|
19
|
+
**From GitHub** (repo-root catalog at `.claude-plugin/marketplace.json`):
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
claude plugin marketplace add getprobo/probo
|
|
23
|
+
# or, from a local clone:
|
|
24
|
+
claude plugin marketplace add .
|
|
25
|
+
claude plugin install probo@probo
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**From the package directory** (catalog at
|
|
29
|
+
`packages/skills/.claude-plugin/marketplace.json`, resolves `@probo/skills`
|
|
30
|
+
from npm):
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
claude plugin marketplace add ./packages/skills/.claude-plugin
|
|
34
|
+
claude plugin install probo@probo
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
When consuming the published package, the package-level marketplace entry
|
|
38
|
+
resolves `@probo/skills` from npm (see
|
|
39
|
+
`packages/skills/.claude-plugin/marketplace.json`).
|
|
40
|
+
|
|
41
|
+
### Configure Probo MCP
|
|
42
|
+
|
|
43
|
+
Set your Probo instance URL before starting Claude Code:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
export PROBO_BASE_URL="https://your-probo-instance.example.com"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The plugin `.mcp.json` connects to `${PROBO_BASE_URL}/mcp/v1`. Probo MCP
|
|
50
|
+
authenticates with **OAuth 2.0** — no API token or bearer header is required in
|
|
51
|
+
the plugin config. On first use, sign in from Claude Code:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
/mcp
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Or from your shell:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
claude mcp login probo
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Claude Code discovers Probo's authorization server via
|
|
64
|
+
`/.well-known/oauth-protected-resource` and stores tokens securely.
|
|
65
|
+
|
|
66
|
+
### Local development
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
claude --plugin-dir ./packages/skills
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## What's included
|
|
73
|
+
|
|
74
|
+
| Component | Location | Purpose |
|
|
75
|
+
| --- | --- | --- |
|
|
76
|
+
| MCP | `.mcp.json` | Probo API connection |
|
|
77
|
+
| Skills | `skills/` | Compliance workflows |
|
|
78
|
+
| Commands | `commands/` | `access-review`, `missing-signatures` — semi-auto workflows |
|
|
79
|
+
|
|
80
|
+
Skills: `/probo:<skill-name>` (e.g. `/probo:open-source-compliance`, `/probo:missing-signatures`).
|
|
81
|
+
|
|
82
|
+
Commands: `/probo:<command-name>` (e.g. `/probo:access-review`, `/probo:missing-signatures`).
|
|
83
|
+
|
|
84
|
+
## Adding content
|
|
85
|
+
|
|
86
|
+
See [`contrib/claude/skills.md`](../../contrib/claude/skills.md).
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm --workspace @probo/skills run validate
|
|
90
|
+
claude --plugin-dir ./packages/skills
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Release
|
|
94
|
+
|
|
95
|
+
Published to npm as `@probo/skills`. See
|
|
96
|
+
[`contrib/claude/release/skills.md`](../../contrib/claude/release/skills.md).
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Run a semi-automated access review on a Probo campaign (Claude Code slash command).
|
|
3
|
+
argument-hint: [campaign name or id]
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Access review command
|
|
8
|
+
|
|
9
|
+
Execute the `access-review` skill for campaign `$ARGUMENTS`.
|
|
10
|
+
|
|
11
|
+
1. Load `skills/access-review/SKILL.md` from the plugin package root.
|
|
12
|
+
2. Load reference docs from `skills/access-review/references/` as directed by
|
|
13
|
+
the skill.
|
|
14
|
+
3. Follow the skill workflow exactly.
|
|
15
|
+
|
|
16
|
+
Do not duplicate skill logic here — the skill is the canonical workflow shared
|
|
17
|
+
with Codex and OpenCode.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Report missing document signatures and pending quorum approvals per person (Claude Code slash command).
|
|
3
|
+
argument-hint: [organization name or id]
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Missing signatures command
|
|
8
|
+
|
|
9
|
+
Execute the `missing-signatures` skill for organization `$ARGUMENTS`.
|
|
10
|
+
|
|
11
|
+
1. Load `skills/missing-signatures/SKILL.md` from the plugin package root.
|
|
12
|
+
2. Load reference docs from `skills/missing-signatures/references/` as directed
|
|
13
|
+
by the skill.
|
|
14
|
+
3. Follow the skill workflow exactly.
|
|
15
|
+
|
|
16
|
+
Do not duplicate skill logic here — the skill is the canonical workflow shared
|
|
17
|
+
with Codex and OpenCode.
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@probo/skills",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Multi-agent compliance skills for open-source GRC (Claude Code, Codex, OpenCode) powered by Probo MCP",
|
|
5
|
+
"private": false,
|
|
6
|
+
"scripts": {
|
|
7
|
+
"validate": "node scripts/validate.mjs",
|
|
8
|
+
"release": "npm run validate && npm publish --access public",
|
|
9
|
+
"prepublishOnly": "npm run validate"
|
|
10
|
+
},
|
|
11
|
+
"author": {
|
|
12
|
+
"name": "Probo Inc",
|
|
13
|
+
"email": "hello@probo.com"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
".claude-plugin",
|
|
17
|
+
".codex-plugin",
|
|
18
|
+
".agents",
|
|
19
|
+
"skills",
|
|
20
|
+
"commands",
|
|
21
|
+
".mcp.json",
|
|
22
|
+
"README.md",
|
|
23
|
+
"COMPATIBILITY.md"
|
|
24
|
+
],
|
|
25
|
+
"keywords": [
|
|
26
|
+
"claude-code",
|
|
27
|
+
"agent-skills",
|
|
28
|
+
"codex",
|
|
29
|
+
"opencode",
|
|
30
|
+
"probo",
|
|
31
|
+
"compliance",
|
|
32
|
+
"grc",
|
|
33
|
+
"mcp",
|
|
34
|
+
"open-source"
|
|
35
|
+
],
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/getprobo/probo.git",
|
|
40
|
+
"directory": "packages/skills"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/getprobo/probo/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/getprobo/probo/tree/main/packages/skills#readme",
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: access-review
|
|
3
|
+
description: Run a semi-automated Probo access review campaign. Use when the user wants to review access entries, decide approve/revoke/escalate, or resume an in-progress campaign with MCP and .probo/access-reviews/ notes.
|
|
4
|
+
compatibility: Requires Probo MCP (OAuth 2.0) and file write access for .probo/access-reviews/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Access review
|
|
8
|
+
|
|
9
|
+
Run a **semi-automated** access review for campaign `$ARGUMENTS` (or ask the
|
|
10
|
+
user for the campaign name). Review entries only — do not create, start,
|
|
11
|
+
cancel, or close campaigns.
|
|
12
|
+
|
|
13
|
+
Before executing, read these files **relative to this skill directory**:
|
|
14
|
+
|
|
15
|
+
- `references/mcp-tools.md` — MCP tool names, inputs, pagination
|
|
16
|
+
- `references/decision-rubric.md` — semi-auto decision rules
|
|
17
|
+
- `references/notes-format.md` — working memory file schema
|
|
18
|
+
|
|
19
|
+
## Preconditions
|
|
20
|
+
|
|
21
|
+
1. Probo MCP must be connected. If tools fail with auth errors, stop and tell
|
|
22
|
+
the user to complete OAuth sign-in for the Probo MCP server in their agent
|
|
23
|
+
(Claude Code: `/mcp` or `claude mcp login probo`; Codex: `codex mcp login
|
|
24
|
+
probo`; OpenCode/Cursor: configure MCP in settings then authenticate).
|
|
25
|
+
2. Resolve the campaign from `$ARGUMENTS` (name match or GID). If ambiguous,
|
|
26
|
+
list `listAccessReviewCampaigns` results and ask the user to pick one.
|
|
27
|
+
3. Campaign `status` must be `IN_PROGRESS` or `PENDING_ACTIONS`. Stop with a
|
|
28
|
+
clear message for `DRAFT`, `COMPLETED`, or `CANCELLED`.
|
|
29
|
+
|
|
30
|
+
## Working notes file
|
|
31
|
+
|
|
32
|
+
Create or resume `.probo/access-reviews/<campaign-slug>.md` per
|
|
33
|
+
`references/notes-format.md`. Create `.probo/access-reviews/` if missing.
|
|
34
|
+
|
|
35
|
+
## Workflow
|
|
36
|
+
|
|
37
|
+
### 1. Orient
|
|
38
|
+
|
|
39
|
+
- Call `getAccessReviewStatistics` for the campaign.
|
|
40
|
+
- Summarize totals and pending count for the user.
|
|
41
|
+
- If no pending entries, report completion and stop.
|
|
42
|
+
|
|
43
|
+
### 2. Fetch batch
|
|
44
|
+
|
|
45
|
+
- Call `listAccessEntries` with `campaign_id`, `filter.decision: PENDING`,
|
|
46
|
+
`size: 50`.
|
|
47
|
+
- Use `last_cursor` from the notes file when resuming.
|
|
48
|
+
|
|
49
|
+
### 3. Classify each entry
|
|
50
|
+
|
|
51
|
+
Apply `references/decision-rubric.md`:
|
|
52
|
+
|
|
53
|
+
| Class | Action |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| **Auto** | Queue for `recordAccessReviewEntryDecisions` |
|
|
56
|
+
| **Ambiguous** | Present to user; do not write yet |
|
|
57
|
+
| **Skip** | Log in notes only (no API write) |
|
|
58
|
+
|
|
59
|
+
Hold auto decisions in memory until step 4 succeeds — do not append them to the
|
|
60
|
+
notes file yet.
|
|
61
|
+
|
|
62
|
+
### 4. Write auto decisions
|
|
63
|
+
|
|
64
|
+
- Batch via `recordAccessReviewEntryDecisions` when possible.
|
|
65
|
+
- Non-`APPROVED` decisions **must** include `decision_note`.
|
|
66
|
+
- On MCP error, stop and do not advance `last_cursor` or update entry notes.
|
|
67
|
+
- After a successful API response, append each recorded auto decision to the
|
|
68
|
+
notes file `## Entry notes` table.
|
|
69
|
+
|
|
70
|
+
### 5. Present ambiguous entries
|
|
71
|
+
|
|
72
|
+
Show email, roles, flags, proposed decision, rationale. Record only after
|
|
73
|
+
explicit user confirmation.
|
|
74
|
+
|
|
75
|
+
### 6. Checkpoint
|
|
76
|
+
|
|
77
|
+
Update notes: `last_cursor`, session log, `updated_at`. Ask to continue if
|
|
78
|
+
`next_cursor` is set.
|
|
79
|
+
|
|
80
|
+
## Hard rules
|
|
81
|
+
|
|
82
|
+
- Never call `closeAccessReviewCampaign` or campaign setup mutations unless
|
|
83
|
+
the user explicitly requests setup work outside this skill.
|
|
84
|
+
- Never invent entry IDs or decisions — use MCP responses only.
|
|
85
|
+
- Never record non-`APPROVED` without `decision_note`.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Semi-auto decision rubric
|
|
2
|
+
|
|
3
|
+
Classify each `PENDING` entry before writing to Probo.
|
|
4
|
+
|
|
5
|
+
## Auto — record without asking
|
|
6
|
+
|
|
7
|
+
Apply the **first matching rule** (top to bottom). Always set `decision_note`
|
|
8
|
+
for non-`APPROVED` decisions.
|
|
9
|
+
|
|
10
|
+
| Condition | Decision | decision_note template |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| `TERMINATED_USER` flag | `REVOKE` | Terminated user — access no longer required |
|
|
13
|
+
| `CONTRACTOR_EXPIRED` flag | `REVOKE` | Contractor engagement ended |
|
|
14
|
+
| `active === false` and no `NEW` tag | `REVOKE` | Account inactive at source |
|
|
15
|
+
| `ORPHANED` flag and `active === false` | `REVOKE` | Orphaned inactive account |
|
|
16
|
+
| `ORPHANED` flag only, `active !== false` | `ESCALATE` | Orphaned account still active — needs owner |
|
|
17
|
+
| `SHARED_ACCOUNT` flag | `ESCALATE` | Shared account — assign individual owner |
|
|
18
|
+
| `SOD_CONFLICT` flag | `ESCALATE` | Segregation of duties conflict |
|
|
19
|
+
| `PRIVILEGED_ACCESS` or `ROLE_CREEP` flag | `ESCALATE` | Privileged access requires explicit approval |
|
|
20
|
+
| `is_admin === true` and (`DORMANT` flag or last_login very stale) | `ESCALATE` | Admin access dormant — confirm business need |
|
|
21
|
+
| `account_type === SERVICE_ACCOUNT`, active, no danger flags | `APPROVED` | Service account with expected access |
|
|
22
|
+
| Active user, no flags (or only `NONE`), not admin, `incremental_tag !== NEW` | `APPROVED` | Routine access reaffirmed |
|
|
23
|
+
|
|
24
|
+
"Very stale" last_login: no login in 90+ days when `last_login` is present.
|
|
25
|
+
|
|
26
|
+
## Ambiguous — show user, do not write
|
|
27
|
+
|
|
28
|
+
| Condition | Suggested default | Why ambiguous |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| `incremental_tag === NEW` | `ESCALATE` | New access since last campaign |
|
|
31
|
+
| `NO_BUSINESS_JUSTIFICATION` flag | `ESCALATE` or `REVOKE` | Needs human judgment |
|
|
32
|
+
| `OUT_OF_DEPARTMENT` flag | `ESCALATE` | Role/department mismatch |
|
|
33
|
+
| `EXCESSIVE` or `ROLE_MISMATCH` flag | `ESCALATE` | Role change needs context |
|
|
34
|
+
| `is_admin === true` without dormant signals | `ESCALATE` | Admin approvals need explicit sign-off |
|
|
35
|
+
| `mfa_status === DISABLED` and (`is_admin` or privileged flags) | `ESCALATE` | MFA gap on sensitive access |
|
|
36
|
+
| `auth_method === API_KEY` or `PASSWORD` on production-like roles | `ESCALATE` | Non-SSO auth on sensitive access |
|
|
37
|
+
| Multiple conflicting flags | `ESCALATE` | Rubric rules disagree |
|
|
38
|
+
| `active === null` with revoke-leaning flags | `ESCALATE` | Unknown activity state |
|
|
39
|
+
|
|
40
|
+
Present the suggested decision; wait for explicit user confirmation.
|
|
41
|
+
|
|
42
|
+
## Flagging before decision
|
|
43
|
+
|
|
44
|
+
Do not auto-flag unless the user asks. When reviewing ambiguous entries, you
|
|
45
|
+
may **suggest** `flagAccessReviewEntry` if Probo shows `NONE` but signals are
|
|
46
|
+
obvious (e.g. admin + 180d no login → suggest `DORMANT`).
|
|
47
|
+
|
|
48
|
+
## Decision notes
|
|
49
|
+
|
|
50
|
+
- `APPROVED` — `decision_note` optional
|
|
51
|
+
- `REVOKE`, `DEFER`, `ESCALATE` — `decision_note` **required** (MCP rejects empty)
|
|
52
|
+
- Keep notes short, factual, auditable. Reference flags and activity signals.
|
|
53
|
+
|
|
54
|
+
## DEFER vs ESCALATE
|
|
55
|
+
|
|
56
|
+
- `ESCALATE` — needs another reviewer or manager (security, HR, app owner)
|
|
57
|
+
- `DEFER` — modify access (role change, downgrade) before final approval; use
|
|
58
|
+
when the user indicates access should change rather than fully revoke
|
|
59
|
+
|
|
60
|
+
Default to `ESCALATE` when unsure.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Access review MCP tools
|
|
2
|
+
|
|
3
|
+
All tools are on the Probo MCP server (`probo`). Read each tool schema before
|
|
4
|
+
calling.
|
|
5
|
+
|
|
6
|
+
## Read
|
|
7
|
+
|
|
8
|
+
### `listAccessReviewCampaigns`
|
|
9
|
+
|
|
10
|
+
List campaigns for an organization. Use to resolve `$ARGUMENTS` to a campaign
|
|
11
|
+
when the user provides a name instead of a GID.
|
|
12
|
+
|
|
13
|
+
Required: `organization_id`
|
|
14
|
+
|
|
15
|
+
### `listAccessEntries`
|
|
16
|
+
|
|
17
|
+
List entries for a campaign. Primary data source for this command.
|
|
18
|
+
|
|
19
|
+
| Field | Usage |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| `campaign_id` | Campaign GID |
|
|
22
|
+
| `filter.decision` | Use `PENDING` for review batches |
|
|
23
|
+
| `filter.flag` | Optional — focus on a flag (e.g. `TERMINATED_USER`) |
|
|
24
|
+
| `filter.incremental_tag` | Optional — `NEW`, `REMOVED`, `UNCHANGED` |
|
|
25
|
+
| `filter.is_admin` | Optional boolean |
|
|
26
|
+
| `filter.active` | Optional boolean |
|
|
27
|
+
| `size` | Page size; use `50` per batch |
|
|
28
|
+
| `cursor` | Resume pagination; store in notes file as `last_cursor` |
|
|
29
|
+
|
|
30
|
+
Returns `entries[]` and `next_cursor`.
|
|
31
|
+
|
|
32
|
+
### `getAccessReviewStatistics`
|
|
33
|
+
|
|
34
|
+
Required: `campaign_id`
|
|
35
|
+
|
|
36
|
+
Returns `statistics` with `total_count`, `decision_counts`, `flag_counts`,
|
|
37
|
+
`incremental_tag_counts`. Call at the start of each run and after large batches.
|
|
38
|
+
|
|
39
|
+
## Write (semi-auto command)
|
|
40
|
+
|
|
41
|
+
### `recordAccessReviewEntryDecisions`
|
|
42
|
+
|
|
43
|
+
Preferred for auto batch. Input `decisions[]` with:
|
|
44
|
+
|
|
45
|
+
- `access_review_entry_id` (required)
|
|
46
|
+
- `decision` — `APPROVED`, `REVOKE`, `DEFER`, `ESCALATE` (not `PENDING`)
|
|
47
|
+
- `decision_note` — required for non-`APPROVED`
|
|
48
|
+
|
|
49
|
+
### `recordAccessReviewEntryDecision`
|
|
50
|
+
|
|
51
|
+
Use for single entries after user confirms an ambiguous case.
|
|
52
|
+
|
|
53
|
+
### `flagAccessReviewEntry`
|
|
54
|
+
|
|
55
|
+
Optional when the user agrees a flag is missing. Input:
|
|
56
|
+
|
|
57
|
+
- `access_review_entry_id`
|
|
58
|
+
- `flags[]` — see rubric for valid values
|
|
59
|
+
- `flag_reasons[]` — optional strings
|
|
60
|
+
|
|
61
|
+
## Out of scope for this command
|
|
62
|
+
|
|
63
|
+
Do not call unless the user explicitly asks for campaign setup:
|
|
64
|
+
|
|
65
|
+
- `closeAccessReviewCampaign`
|
|
66
|
+
- `cancelAccessReviewCampaign`
|
|
67
|
+
- `startAccessReviewCampaign`
|
|
68
|
+
- `createAccessReviewCampaign`
|
|
69
|
+
- `createAccessReviewSource` / source mutations
|
|
70
|
+
|
|
71
|
+
## Entry fields (review signals)
|
|
72
|
+
|
|
73
|
+
| Field | Review use |
|
|
74
|
+
| --- | --- |
|
|
75
|
+
| `email`, `full_name` | Identity |
|
|
76
|
+
| `roles`, `job_title` | Access level |
|
|
77
|
+
| `is_admin` | Heightened scrutiny |
|
|
78
|
+
| `active` | `false` often supports revoke |
|
|
79
|
+
| `mfa_status` | `DISABLED` on privileged access → escalate |
|
|
80
|
+
| `auth_method` | `API_KEY`, `SERVICE_ACCOUNT` context |
|
|
81
|
+
| `account_type` | `SERVICE_ACCOUNT` vs `USER` |
|
|
82
|
+
| `last_login` | Dormancy signal |
|
|
83
|
+
| `incremental_tag` | `NEW` needs extra scrutiny |
|
|
84
|
+
| `flags`, `flag_reasons` | Primary risk signals |
|
|
85
|
+
| `decision` | Target `PENDING` entries only |
|
|
86
|
+
|
|
87
|
+
## Pagination and resume
|
|
88
|
+
|
|
89
|
+
1. Read `last_cursor` from the notes file.
|
|
90
|
+
2. Pass it to `listAccessEntries` to continue where the last batch stopped.
|
|
91
|
+
3. Write the new `next_cursor` back after each successful batch.
|
|
92
|
+
4. When `next_cursor` is null/empty, the pending page is exhausted — refresh
|
|
93
|
+
statistics to confirm remaining `PENDING` count.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Access review notes file
|
|
2
|
+
|
|
3
|
+
Path: `.probo/access-reviews/<campaign-slug>.md`
|
|
4
|
+
|
|
5
|
+
`<campaign-slug>` — lowercase campaign name with non-alphanumerics replaced by
|
|
6
|
+
hyphens (e.g. `Q3 GitHub Review` → `q3-github-review`).
|
|
7
|
+
|
|
8
|
+
## Template
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
# Access review: <campaign name>
|
|
12
|
+
|
|
13
|
+
campaign_id: <gid>
|
|
14
|
+
organization_id: <gid>
|
|
15
|
+
campaign_status: <IN_PROGRESS|PENDING_ACTIONS>
|
|
16
|
+
last_cursor:
|
|
17
|
+
updated_at: <ISO-8601 UTC>
|
|
18
|
+
|
|
19
|
+
## Session log
|
|
20
|
+
|
|
21
|
+
- <ISO-8601> — Started review. Pending: <n>.
|
|
22
|
+
- <ISO-8601> — Batch complete. Auto: <a> approved, <r> revoked, <e> escalated, <d> deferred. Ambiguous: <u>. Cursor: <cursor or done>.
|
|
23
|
+
|
|
24
|
+
## Entry notes
|
|
25
|
+
|
|
26
|
+
| entry_id | email | decision | auto | rationale |
|
|
27
|
+
|----------|-------|----------|------|-----------|
|
|
28
|
+
| gid://… | user@example.com | REVOKE | yes | Terminated user flag |
|
|
29
|
+
|
|
30
|
+
## Ambiguous (awaiting user)
|
|
31
|
+
|
|
32
|
+
| entry_id | email | flags | suggested | question |
|
|
33
|
+
|----------|-------|-------|-----------|----------|
|
|
34
|
+
| gid://… | admin@example.com | NEW, PRIVILEGED_ACCESS | ESCALATE | New admin — approve or revoke? |
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Field rules
|
|
38
|
+
|
|
39
|
+
| Field | Rule |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| `last_cursor` | Empty on fresh run. Set to `listAccessEntries` `next_cursor` after each successful batch. Clear when null (pagination done). |
|
|
42
|
+
| `updated_at` | Update on every file write |
|
|
43
|
+
| `auto` column | `yes` after a successful API write via semi-auto rubric; `no` if user confirmed |
|
|
44
|
+
| Session log | Append-only; one line per batch or major event |
|
|
45
|
+
| Ambiguous table | Remove rows after user confirms and decision is recorded |
|
|
46
|
+
|
|
47
|
+
## Resume behavior
|
|
48
|
+
|
|
49
|
+
1. If the file exists, read `campaign_id`, `last_cursor`, and ambiguous rows.
|
|
50
|
+
2. Confirm with the user that resuming the same campaign is intended.
|
|
51
|
+
3. Continue `listAccessEntries` from `last_cursor` if set; otherwise start from
|
|
52
|
+
the first pending page.
|
|
53
|
+
4. Do not duplicate entry notes for IDs already in the table with a final
|
|
54
|
+
decision recorded after a successful API write.
|
|
55
|
+
|
|
56
|
+
## Git
|
|
57
|
+
|
|
58
|
+
Do not commit or push this file unless the user asks. It is working memory for
|
|
59
|
+
the review session.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: missing-signatures
|
|
3
|
+
description: Report who is missing document signatures or quorum approvals in Probo. Use when the user wants a per-person recap of unsigned signature requests, pending approval decisions, or document signing compliance status.
|
|
4
|
+
compatibility: Requires Probo MCP (OAuth 2.0) and file write access for .probo/missing-signatures/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Missing signatures report
|
|
8
|
+
|
|
9
|
+
Build a **read-only, per-person recap** of outstanding document obligations for
|
|
10
|
+
organization `$ARGUMENTS` (or ask the user for the organization name). Cover:
|
|
11
|
+
|
|
12
|
+
1. **Signature requests** — `REQUESTED` but not `SIGNED` on a published version
|
|
13
|
+
2. **Quorum approvals** — `PENDING` decisions on a `PENDING` approval quorum
|
|
14
|
+
while the version is `PENDING_APPROVAL`
|
|
15
|
+
|
|
16
|
+
Before executing, read these files **relative to this skill directory**:
|
|
17
|
+
|
|
18
|
+
- `references/mcp-tools.md` — MCP tool names, inputs, pagination
|
|
19
|
+
- `references/report-format.md` — per-person recap and summary layout
|
|
20
|
+
- `references/notes-format.md` — working memory for resumable scans
|
|
21
|
+
|
|
22
|
+
## Preconditions
|
|
23
|
+
|
|
24
|
+
1. Probo MCP must be connected. If tools fail with auth errors, stop and tell
|
|
25
|
+
the user to complete OAuth sign-in for the Probo MCP server in their agent
|
|
26
|
+
(Claude Code: `/mcp` or `claude mcp login probo`; Codex: `codex mcp login
|
|
27
|
+
probo`; OpenCode/Cursor: configure MCP in settings then authenticate).
|
|
28
|
+
2. Resolve the organization from `$ARGUMENTS` (name match or GID). If ambiguous,
|
|
29
|
+
call `listOrganizations` and ask the user to pick one.
|
|
30
|
+
3. This skill is **reporting only**. Do not request signatures, cancel requests,
|
|
31
|
+
publish documents, or submit approval decisions unless the user explicitly
|
|
32
|
+
asks for follow-up actions outside this report.
|
|
33
|
+
|
|
34
|
+
## Working notes file
|
|
35
|
+
|
|
36
|
+
Create or resume `.probo/missing-signatures/<org-slug>.md` per
|
|
37
|
+
`references/notes-format.md`. Create `.probo/missing-signatures/` if missing.
|
|
38
|
+
|
|
39
|
+
## Workflow
|
|
40
|
+
|
|
41
|
+
### 1. Orient
|
|
42
|
+
|
|
43
|
+
- Record `organization_id` in the notes file.
|
|
44
|
+
- If resuming, read `last_document_cursor` and cached `profile_cache` from
|
|
45
|
+
notes.
|
|
46
|
+
- Tell the user whether this is a fresh scan or a resume.
|
|
47
|
+
|
|
48
|
+
### 2. Scan documents (paginated)
|
|
49
|
+
|
|
50
|
+
For each page from `listDocuments`:
|
|
51
|
+
|
|
52
|
+
- Skip `ARCHIVED` documents.
|
|
53
|
+
- Call `listDocumentVersions` for the document.
|
|
54
|
+
- For each version, branch on `status`:
|
|
55
|
+
|
|
56
|
+
| Version status | What to check |
|
|
57
|
+
| --- | --- |
|
|
58
|
+
| `PUBLISHED` | `listDocumentVersionSignatures` with `filter.states: ["REQUESTED"]` |
|
|
59
|
+
| `PENDING_APPROVAL` | `listDocumentVersionApprovalQuorums`; for each quorum with `status: PENDING`, `listDocumentVersionApprovalDecisions` with `filter.states: ["PENDING"]` |
|
|
60
|
+
|
|
61
|
+
Prefer the **current published** version (`current_published_major` /
|
|
62
|
+
`current_published_minor` on the document) when multiple published minors exist.
|
|
63
|
+
Still scan all `PUBLISHED` versions if the user asked for exhaustive coverage.
|
|
64
|
+
|
|
65
|
+
Paginate every list call. Store `last_document_cursor` after each document page
|
|
66
|
+
so a large org can be resumed.
|
|
67
|
+
|
|
68
|
+
### 3. Resolve people
|
|
69
|
+
|
|
70
|
+
Collect unique `signed_by` and `approver_id` profile GIDs. Resolve each once via
|
|
71
|
+
`getUser` and cache `full_name` and `email_address` in the notes file. Never
|
|
72
|
+
invent names.
|
|
73
|
+
|
|
74
|
+
### 4. Build per-person recap
|
|
75
|
+
|
|
76
|
+
Aggregate findings by profile. Each item is either:
|
|
77
|
+
|
|
78
|
+
| Type | Meaning |
|
|
79
|
+
| --- | --- |
|
|
80
|
+
| `signature` | Signature requested, not yet signed |
|
|
81
|
+
| `approval` | Quorum approval decision still pending |
|
|
82
|
+
|
|
83
|
+
Use `references/report-format.md` for the output layout. Sort people by
|
|
84
|
+
`full_name`, then email.
|
|
85
|
+
|
|
86
|
+
### 5. Present summary
|
|
87
|
+
|
|
88
|
+
Show:
|
|
89
|
+
|
|
90
|
+
- Total people with at least one outstanding item
|
|
91
|
+
- Count by type (signatures vs approvals)
|
|
92
|
+
- Count by document
|
|
93
|
+
- The per-person recap tables
|
|
94
|
+
|
|
95
|
+
If the scan is incomplete (more document pages), say so and offer to continue.
|
|
96
|
+
|
|
97
|
+
### 6. Checkpoint
|
|
98
|
+
|
|
99
|
+
Update notes: `last_document_cursor`, `profile_cache`, session log, `updated_at`.
|
|
100
|
+
Clear `last_document_cursor` when the document pagination is exhausted.
|
|
101
|
+
|
|
102
|
+
## Hard rules
|
|
103
|
+
|
|
104
|
+
- Never call write mutations (`requestDocumentVersionSignature`,
|
|
105
|
+
`cancelSignatureRequest`, `publishDocument`, `voidDocumentVersionApproval`)
|
|
106
|
+
unless the user explicitly requests action after reviewing the report.
|
|
107
|
+
- Never invent profile IDs, document titles, or states — use MCP responses only.
|
|
108
|
+
- Include document title, version (`major.minor`), and `requested_at` or quorum
|
|
109
|
+
`created_at` on every line item so the report is audit-ready.
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Missing signatures MCP tools
|
|
2
|
+
|
|
3
|
+
All tools are on the Probo MCP server (`probo`). Read each tool schema before
|
|
4
|
+
calling.
|
|
5
|
+
|
|
6
|
+
## Organization scope
|
|
7
|
+
|
|
8
|
+
### `listOrganizations`
|
|
9
|
+
|
|
10
|
+
List organizations the caller can access. Use to resolve `$ARGUMENTS` when the
|
|
11
|
+
user provides a name instead of a GID.
|
|
12
|
+
|
|
13
|
+
### `listUsers`
|
|
14
|
+
|
|
15
|
+
Resolve profile display fields. `users[]` entries are `Profile` objects.
|
|
16
|
+
|
|
17
|
+
| Field | Usage |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| `organization_id` | Required — organization GID |
|
|
20
|
+
| `size` | Page size; use `100` when prefetching is helpful |
|
|
21
|
+
| `cursor` | Pagination |
|
|
22
|
+
|
|
23
|
+
Prefer `getUser` for individual lookups when building the recap; use `listUsers`
|
|
24
|
+
only when bulk prefetch is faster.
|
|
25
|
+
|
|
26
|
+
### `getUser`
|
|
27
|
+
|
|
28
|
+
Required: `id` (profile GID)
|
|
29
|
+
|
|
30
|
+
Returns `user` with `full_name`, `email_address`, `state`. Cache results in the
|
|
31
|
+
notes file to avoid repeat calls.
|
|
32
|
+
|
|
33
|
+
## Documents and versions
|
|
34
|
+
|
|
35
|
+
### `listDocuments`
|
|
36
|
+
|
|
37
|
+
Primary iterator for the scan.
|
|
38
|
+
|
|
39
|
+
| Field | Usage |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| `organization_id` | Required |
|
|
42
|
+
| `size` | Use `25` per page |
|
|
43
|
+
| `cursor` | Store in notes as `last_document_cursor` |
|
|
44
|
+
| `filter.status` | Optional — omit archived docs in post-processing or pass active-only if supported |
|
|
45
|
+
|
|
46
|
+
Returns `documents[]` and `next_cursor`. Each document includes
|
|
47
|
+
`current_published_major`, `current_published_minor`, `status`.
|
|
48
|
+
|
|
49
|
+
### `getDocument`
|
|
50
|
+
|
|
51
|
+
Use when you need fresh `current_published_*` fields for one document.
|
|
52
|
+
|
|
53
|
+
### `listDocumentVersions`
|
|
54
|
+
|
|
55
|
+
Required: `document_id`
|
|
56
|
+
|
|
57
|
+
| Field | Usage |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| `filter.statuses` | `["PUBLISHED"]` or `["PENDING_APPROVAL"]` to narrow |
|
|
60
|
+
| `size` / `cursor` | Paginate when a document has many versions |
|
|
61
|
+
|
|
62
|
+
Returns `document_versions[]` with `title`, `major`, `minor`, `status`.
|
|
63
|
+
|
|
64
|
+
### `getDocumentVersion`
|
|
65
|
+
|
|
66
|
+
Use when you need a single version's metadata without listing all versions.
|
|
67
|
+
|
|
68
|
+
## Signature gaps (published versions)
|
|
69
|
+
|
|
70
|
+
### `listDocumentVersionSignatures`
|
|
71
|
+
|
|
72
|
+
Required: `document_version_id`
|
|
73
|
+
|
|
74
|
+
| Field | Usage |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| `filter.states` | `["REQUESTED"]` for outstanding signature requests |
|
|
77
|
+
| `size` / `cursor` | Paginate |
|
|
78
|
+
|
|
79
|
+
Returns `document_version_signatures[]`. Key fields:
|
|
80
|
+
|
|
81
|
+
| Field | Report use |
|
|
82
|
+
| --- | --- |
|
|
83
|
+
| `signed_by` | Profile GID — group by person |
|
|
84
|
+
| `state` | `REQUESTED` = missing signature |
|
|
85
|
+
| `requested_at` | When the request was sent |
|
|
86
|
+
| `signed_at` | `null` while outstanding |
|
|
87
|
+
|
|
88
|
+
### `getDocumentVersionSignature`
|
|
89
|
+
|
|
90
|
+
Use for detail on a single signature row if needed.
|
|
91
|
+
|
|
92
|
+
## Quorum approval gaps (pending approval versions)
|
|
93
|
+
|
|
94
|
+
### `listDocumentVersionApprovalQuorums`
|
|
95
|
+
|
|
96
|
+
Required: `document_version_id`
|
|
97
|
+
|
|
98
|
+
Returns `approval_quorums[]`. Only process quorums with `status: PENDING`.
|
|
99
|
+
|
|
100
|
+
### `getDocumentVersionApprovalQuorum`
|
|
101
|
+
|
|
102
|
+
Use when you need quorum metadata for one version.
|
|
103
|
+
|
|
104
|
+
### `listDocumentVersionApprovalDecisions`
|
|
105
|
+
|
|
106
|
+
Required: `quorum_id`
|
|
107
|
+
|
|
108
|
+
| Field | Usage |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| `filter.states` | `["PENDING"]` for outstanding approvers |
|
|
111
|
+
| `size` / `cursor` | Paginate |
|
|
112
|
+
|
|
113
|
+
Returns `approval_decisions[]`. Key fields:
|
|
114
|
+
|
|
115
|
+
| Field | Report use |
|
|
116
|
+
| --- | --- |
|
|
117
|
+
| `approver_id` | Profile GID — group by person |
|
|
118
|
+
| `state` | `PENDING` = missing approval |
|
|
119
|
+
| `decided_at` | `null` while outstanding |
|
|
120
|
+
| `comment` | Include if present |
|
|
121
|
+
|
|
122
|
+
### `getDocumentVersionApprovalDecision`
|
|
123
|
+
|
|
124
|
+
Use for detail on a single decision row if needed.
|
|
125
|
+
|
|
126
|
+
## Out of scope for this skill
|
|
127
|
+
|
|
128
|
+
Do not call unless the user explicitly asks after reviewing the report:
|
|
129
|
+
|
|
130
|
+
- `requestDocumentVersionSignature`
|
|
131
|
+
- `cancelSignatureRequest`
|
|
132
|
+
- `publishDocument`
|
|
133
|
+
- `voidDocumentVersionApproval`
|
|
134
|
+
|
|
135
|
+
Signing and approving are GraphQL-only today (`signDocument`,
|
|
136
|
+
`approveDocumentVersion`, `rejectDocumentVersion`) — not available via MCP.
|
|
137
|
+
|
|
138
|
+
## Pagination and resume
|
|
139
|
+
|
|
140
|
+
1. Outer loop: `listDocuments` — persist `last_document_cursor` in notes.
|
|
141
|
+
2. Inner loops: paginate versions, signatures, quorums, and decisions.
|
|
142
|
+
3. When `listDocuments` returns no `next_cursor`, clear `last_document_cursor`
|
|
143
|
+
and mark the scan complete in the session log.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Missing signatures notes file
|
|
2
|
+
|
|
3
|
+
Path: `.probo/missing-signatures/<org-slug>.md`
|
|
4
|
+
|
|
5
|
+
`<org-slug>` — lowercase organization name with non-alphanumerics replaced by
|
|
6
|
+
hyphens (e.g. `Acme Corp` → `acme-corp`).
|
|
7
|
+
|
|
8
|
+
## Template
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
# Missing signatures: <organization name>
|
|
12
|
+
|
|
13
|
+
organization_id: <gid>
|
|
14
|
+
last_document_cursor:
|
|
15
|
+
scan_status: <in_progress|complete>
|
|
16
|
+
updated_at: <ISO-8601 UTC>
|
|
17
|
+
|
|
18
|
+
## Profile cache
|
|
19
|
+
|
|
20
|
+
| profile_id | full_name | email_address |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| gid://… | Jane Doe | jane@example.com |
|
|
23
|
+
|
|
24
|
+
## Session log
|
|
25
|
+
|
|
26
|
+
- <ISO-8601> — Started scan.
|
|
27
|
+
- <ISO-8601> — Processed document page. Cursor: <cursor or done>.
|
|
28
|
+
- <ISO-8601> — Scan complete. <n> people, <s> signatures, <a> approvals.
|
|
29
|
+
|
|
30
|
+
## Findings (raw)
|
|
31
|
+
|
|
32
|
+
| profile_id | type | document_id | version_id | title | version | since | record_id |
|
|
33
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Field rules
|
|
37
|
+
|
|
38
|
+
| Field | Rule |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| `last_document_cursor` | Empty on fresh run. Set to `listDocuments` `next_cursor` after each document page. Clear when pagination is done. |
|
|
41
|
+
| `scan_status` | `in_progress` until all document pages are processed |
|
|
42
|
+
| `updated_at` | Update on every file write |
|
|
43
|
+
| Profile cache | Append rows as `getUser` resolves profiles; reuse on resume |
|
|
44
|
+
| Findings table | Append rows as gaps are discovered; dedupe by `record_id` on resume |
|
|
45
|
+
|
|
46
|
+
## Resume behavior
|
|
47
|
+
|
|
48
|
+
1. If the file exists, read `organization_id`, `last_document_cursor`, profile
|
|
49
|
+
cache, and findings.
|
|
50
|
+
2. Confirm with the user that resuming the same organization is intended.
|
|
51
|
+
3. Continue `listDocuments` from `last_document_cursor` if set.
|
|
52
|
+
4. Do not duplicate findings rows with the same `record_id`.
|
|
53
|
+
|
|
54
|
+
## Git
|
|
55
|
+
|
|
56
|
+
Do not commit or push this file unless the user asks. It is working memory for
|
|
57
|
+
the reporting session.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Missing signatures report format
|
|
2
|
+
|
|
3
|
+
Present the report in this order: executive summary, per-person recap, optional
|
|
4
|
+
document index.
|
|
5
|
+
|
|
6
|
+
## Executive summary
|
|
7
|
+
|
|
8
|
+
```markdown
|
|
9
|
+
# Missing signatures: <organization name>
|
|
10
|
+
|
|
11
|
+
organization_id: <gid>
|
|
12
|
+
generated_at: <ISO-8601 UTC>
|
|
13
|
+
scan_status: <complete|in_progress>
|
|
14
|
+
|
|
15
|
+
## Summary
|
|
16
|
+
|
|
17
|
+
| Metric | Count |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| People with outstanding items | <n> |
|
|
20
|
+
| Outstanding signature requests | <n> |
|
|
21
|
+
| Pending quorum approvals | <n> |
|
|
22
|
+
| Documents affected | <n> |
|
|
23
|
+
|
|
24
|
+
<One paragraph in plain language for auditors or managers.>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Per-person recap (primary view)
|
|
28
|
+
|
|
29
|
+
Sort alphabetically by `full_name`. One section per person with outstanding
|
|
30
|
+
items. Omit people with zero items.
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
## <full_name> (<email_address>)
|
|
34
|
+
|
|
35
|
+
profile_id: <gid>
|
|
36
|
+
profile_state: <ACTIVE|INACTIVE>
|
|
37
|
+
|
|
38
|
+
| Type | Document | Version | Since | ID |
|
|
39
|
+
| --- | --- | --- | --- | --- |
|
|
40
|
+
| signature | Information Security Policy | 2.1 | 2026-06-01 | <signature gid> |
|
|
41
|
+
| approval | Data Retention Policy | 3.0 | 2026-06-10 | <decision gid> |
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Column rules
|
|
45
|
+
|
|
46
|
+
| Column | Rule |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| Type | `signature` or `approval` |
|
|
49
|
+
| Document | `document_versions[].title` from MCP |
|
|
50
|
+
| Version | `major.minor` (e.g. `2.1`) |
|
|
51
|
+
| Since | `requested_at` for signatures; quorum `created_at` or decision `created_at` for approvals (ISO date, UTC) |
|
|
52
|
+
| ID | `document_version_signature.id` or `approval_decision.id` for traceability |
|
|
53
|
+
|
|
54
|
+
### Person with multiple items
|
|
55
|
+
|
|
56
|
+
Keep one table per person. Do not split signatures and approvals into separate
|
|
57
|
+
top-level sections — the per-person view is the reporting unit.
|
|
58
|
+
|
|
59
|
+
## Document index (optional appendix)
|
|
60
|
+
|
|
61
|
+
When the user wants a document-centric view, add after the per-person recap:
|
|
62
|
+
|
|
63
|
+
```markdown
|
|
64
|
+
## By document
|
|
65
|
+
|
|
66
|
+
### <document title> (<document_id>)
|
|
67
|
+
|
|
68
|
+
| Person | Type | Version | Since |
|
|
69
|
+
| --- | --- | --- | --- |
|
|
70
|
+
| Jane Doe | signature | 2.1 | 2026-06-01 |
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Empty result
|
|
74
|
+
|
|
75
|
+
If no outstanding signatures or approvals exist:
|
|
76
|
+
|
|
77
|
+
```markdown
|
|
78
|
+
No outstanding signature requests or pending quorum approvals were found for
|
|
79
|
+
<organization name> as of <generated_at>.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Still write the notes file with `scan_status: complete`.
|
|
83
|
+
|
|
84
|
+
## Presentation tips
|
|
85
|
+
|
|
86
|
+
- Lead with the summary table, then the per-person recap.
|
|
87
|
+
- Flag `INACTIVE` profiles with outstanding items — they may need escalation.
|
|
88
|
+
- For `PENDING_APPROVAL` versions, note that publication is blocked until the
|
|
89
|
+
quorum resolves (unanimous approval required).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: open-source-compliance
|
|
3
|
+
description: This skill should be used when the user wants to assess, track, or automate open-source compliance work in Probo — vendor reviews, control mapping, evidence collection, risk registers, or policy workflows using Probo MCP tools.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Open-source compliance with Probo
|
|
7
|
+
|
|
8
|
+
Use the Probo MCP server bundled with this plugin to read and write GRC data.
|
|
9
|
+
Do not guess entity IDs or organization scope — discover them with MCP tools
|
|
10
|
+
first.
|
|
11
|
+
|
|
12
|
+
## Before you start
|
|
13
|
+
|
|
14
|
+
1. Confirm the Probo MCP server is connected. If not, ask the user to run
|
|
15
|
+
`/mcp` or `claude mcp login probo` to complete the OAuth 2.0 sign-in.
|
|
16
|
+
2. Identify the target organization. List organizations if the user did not
|
|
17
|
+
provide one.
|
|
18
|
+
3. Prefer MCP tools over manual API calls. The Probo MCP API mirrors the
|
|
19
|
+
platform's GraphQL surface.
|
|
20
|
+
|
|
21
|
+
## Common workflows
|
|
22
|
+
|
|
23
|
+
### Vendor / third-party review
|
|
24
|
+
|
|
25
|
+
1. List or search third parties for the organization.
|
|
26
|
+
2. Pull existing risk assessments and contacts.
|
|
27
|
+
3. Record findings and update assessment status through MCP mutations.
|
|
28
|
+
4. Summarize residual risk and recommended follow-ups for the user.
|
|
29
|
+
|
|
30
|
+
### Control and obligation tracking
|
|
31
|
+
|
|
32
|
+
1. List controls, measures, or obligations relevant to the user's question.
|
|
33
|
+
2. Link evidence (documents, audits) where appropriate.
|
|
34
|
+
3. Report gaps between required and implemented controls.
|
|
35
|
+
|
|
36
|
+
### Evidence and documentation
|
|
37
|
+
|
|
38
|
+
1. Locate the relevant document or audit in Probo.
|
|
39
|
+
2. Fetch version history or published versions as needed.
|
|
40
|
+
3. Draft updates; use MCP upload tools when the user asks to attach files.
|
|
41
|
+
|
|
42
|
+
## Output expectations
|
|
43
|
+
|
|
44
|
+
- Cite Probo entity IDs (GIDs) for anything you create or update.
|
|
45
|
+
- Separate facts pulled from Probo from your analysis.
|
|
46
|
+
- Flag missing data instead of inventing compliance status.
|
|
47
|
+
- Keep recommendations actionable and mapped to Probo entities where possible.
|
|
48
|
+
|
|
49
|
+
## References
|
|
50
|
+
|
|
51
|
+
See `references/workflows.md` for extended workflow notes.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Open-source compliance workflows
|
|
2
|
+
|
|
3
|
+
This plugin wraps Probo's MCP API for Claude Code. Probo is a self-hostable
|
|
4
|
+
GRC platform; its MCP server exposes tools for third parties, controls,
|
|
5
|
+
obligations, risks, documents, audits, access reviews, and more.
|
|
6
|
+
|
|
7
|
+
## Authentication
|
|
8
|
+
|
|
9
|
+
Probo MCP uses OAuth 2.0. Users sign in once via `/mcp` or
|
|
10
|
+
`claude mcp login probo`; Claude Code stores and refreshes tokens
|
|
11
|
+
automatically. Do not ask the user for API keys or bearer tokens for MCP
|
|
12
|
+
access.
|
|
13
|
+
|
|
14
|
+
| Variable | Purpose |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| `PROBO_BASE_URL` | Probo instance root URL (no trailing slash) |
|
|
17
|
+
|
|
18
|
+
MCP endpoint: `${PROBO_BASE_URL}/mcp/v1`
|
|
19
|
+
|
|
20
|
+
OAuth discovery:
|
|
21
|
+
|
|
22
|
+
- Protected resource metadata: `/.well-known/oauth-protected-resource`
|
|
23
|
+
- Authorization server metadata: `/.well-known/oauth-authorization-server`
|
|
24
|
+
|
|
25
|
+
## Tool discovery
|
|
26
|
+
|
|
27
|
+
When unsure which MCP tool to use:
|
|
28
|
+
|
|
29
|
+
1. Search available Probo MCP tools by entity name (third party, control, risk,
|
|
30
|
+
document, etc.).
|
|
31
|
+
2. Read the tool schema before calling it.
|
|
32
|
+
3. Paginate list operations; default page sizes may truncate results.
|
|
33
|
+
|
|
34
|
+
## Scope rules
|
|
35
|
+
|
|
36
|
+
- Always operate within the organization the user specified.
|
|
37
|
+
- Do not exfiltrate tokens or raw credentials in responses.
|
|
38
|
+
- Treat all customer data as confidential even in open-source compliance
|
|
39
|
+
contexts.
|
|
40
|
+
|
|
41
|
+
## Roadmap
|
|
42
|
+
|
|
43
|
+
Future skills in this plugin may cover:
|
|
44
|
+
|
|
45
|
+
- SOC 2 / ISO 27001 control mapping helpers
|
|
46
|
+
- Vendor questionnaire ingestion
|
|
47
|
+
- Access review preparation
|
|
48
|
+
- Policy drafting with Probo document workflows
|