Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
47471c6
fix: publish public releases from target package
Jul 14, 2026
f7f4d61
docs: link canonical public skills source
Jul 14, 2026
3f910ed
chore: refresh audited test toolchain
Jul 14, 2026
27c35ec
test(codex): exercise public plugin lifecycle
Jul 14, 2026
6c997d6
test(claude): exercise public plugin lifecycle
Jul 14, 2026
b889c72
test(opencode): gate public OAuth lifecycle
Jul 14, 2026
f84fd6a
fix(release): scope OpenCode gate to public tags
Jul 14, 2026
b4008b4
fix(ci): restrict workflow token permissions
Jul 14, 2026
70d41ac
docs: add public release runbook
Jul 14, 2026
bbfd6eb
ci: pin npm for trusted publishing
Jul 14, 2026
c17ad11
ci: label legacy production smoke accurately
Jul 14, 2026
57db288
fix: align public package beta versions
Jul 14, 2026
0cfa5b3
fix(codex): use canonical workflow input in review case
Jul 14, 2026
6488d60
fix: preserve vendor attribution through OAuth
Jul 14, 2026
34ea042
docs: keep versioned OAuth gate open
Jul 14, 2026
9b3aa1f
fix(codex): require reproducible reviewer fixtures
Jul 14, 2026
b41fd3a
docs: require dedicated reviewer fixture
Jul 14, 2026
c30c2bb
docs(codex): specify reviewer fixture contract
Jul 14, 2026
e7f8f86
test(codex): add deterministic reviewer fixture seed
Jul 14, 2026
f696ee4
docs(opencode): prepare ecosystem submission
Jul 14, 2026
fa4294c
test(opencode): cover package upgrades
Jul 14, 2026
4140707
fix(mcp): use the canonical aictrl server URL
Jul 15, 2026
b85f42f
chore(skills): pin public catalog v1.0.1
Jul 15, 2026
8a95929
docs(release): enforce runtime-first publication
Jul 15, 2026
87823b8
docs(codex): record public reviewer fixture
Jul 15, 2026
9434316
docs(codex): track protected fixture workflow
Jul 15, 2026
3024cf8
chore(ci): refresh supported agent CLIs
Jul 15, 2026
c19364b
docs(release): late-bind OpenAI challenge token
Jul 15, 2026
2847213
fix(release): verify first npm publication
Jul 15, 2026
fba3f2c
docs(release): pin first-publish npm packer
Jul 15, 2026
dadbcd8
test: gate plugin release on production MCP catalog
Jul 15, 2026
d0d972c
docs: record production MCP submission evidence
Jul 15, 2026
e586e57
docs: harden Codex submission listing
Jul 15, 2026
45c581d
docs: record OpenAI publisher readiness
Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"name": "aictrl",
"source": "./claude/aictrl",
"description": "Eight portable engineering skills with optional controlled AICtrl workflow execution",
"version": "0.1.0-beta.1",
"version": "0.1.0-beta.2",
"author": {
"name": "aictrl.dev"
},
Expand Down
62 changes: 61 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ on:
pull_request:
branches: [main]

permissions:
contents: read

jobs:
unit:
name: Unit Tests
Expand All @@ -21,8 +24,65 @@ jobs:
- run: npm test
- run: npm run validate:public

codex-public:
name: E2E (Codex public marketplace)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Install the supported Codex CLI
run: npm install --global @openai/codex@0.144.4
- name: Run clean install, repeat, upgrade, and removal smoke
run: npm run smoke:codex-public

claude-public:
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
name: E2E (Claude public marketplace)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Install the supported Claude Code CLI
run: npm install --global @anthropic-ai/claude-code@2.1.210
- name: Run clean public install, repeat, and removal smoke
env:
AICTRL_CLAUDE_MARKETPLACE_SOURCE: ${{ github.event.pull_request.head.repo.full_name || github.repository }}@${{ github.head_ref || github.ref_name }}
run: npm run smoke:claude-public

opencode-public:
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
name: E2E (OpenCode public package)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Install the supported OpenCode CLI
run: npm install --global opencode-ai@1.18.1
- name: Run packed install, OAuth boundary, repeat, and removal smoke
env:
AICTRL_OPENCODE_CONNECTIVITY_ORIGIN: https://sandbox.aictrl.dev
run: npm run smoke:opencode-public

production-mcp:
name: Smoke (production MCP catalog)
runs-on: ubuntu-latest
if: github.event_name == 'push' || !github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Verify the authenticated six-tool production catalog
env:
AICTRL_API_KEY: ${{ secrets.AICTRL_API_KEY }}
run: npm run smoke:mcp-production

e2e:
name: E2E (OpenCode against production)
name: E2E (legacy installer against production)
runs-on: ubuntu-latest
if: github.event_name == 'push' || !github.event.pull_request.head.repo.fork
steps:
Expand Down
26 changes: 24 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,30 @@ jobs:
with:
node-version: 24
registry-url: https://registry.npmjs.org
cache: npm
- name: Install npm with trusted publishing support
run: npm install --global npm@11.18.0
- run: npm ci
- run: npm run build
- run: npm test
- run: npm publish --access public
- run: npm run validate:public
- name: Verify production OpenCode OAuth boundary
if: startsWith(github.event.release.tag_name, 'public-v')
run: |
npm install --global opencode-ai@1.18.1
npm run smoke:opencode-public
- name: Resolve release target
id: release
env:
RELEASE_TAG: ${{ github.event.release.tag_name }}
run: node scripts/resolve-release-target.mjs "$RELEASE_TAG" >> "$GITHUB_OUTPUT"
- name: Verify existing publication
id: registry
run: >-
node scripts/verify-release-publication.mjs
"${{ steps.release.outputs.package_spec }}" >> "$GITHUB_OUTPUT"
- name: Publish release target
if: steps.registry.outputs.published != 'true'
run: >-
npm publish "${{ steps.release.outputs.package_spec }}"
--access public
--tag "${{ steps.release.outputs.dist_tag }}"
26 changes: 18 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Install eight portable engineering skills across Claude Code, Codex, and
OpenCode. Every skill works locally; connected `implement-code-change` adds
versioned remote execution, approvals, evidence, history, and policy controls.
remote workflow execution, approvals, evidence, history, and policy controls.

## Public packages

Expand Down Expand Up @@ -35,24 +35,34 @@ Use `npx @aictrl/opencode --project .` for a project-local install or

## Reproducible skill source

`public-skills.lock.json` pins an immutable `aictrl-dev/skills` commit and the
digest of its checksum manifest. All three vendor packages contain byte-identical
copies of the eight launch skills.
`public-skills.lock.json` pins an immutable
[`aictrl-dev/skills`](https://github.com/aictrl-dev/skills) release, commit, and
checksum-manifest digest. All three vendor packages contain byte-identical
copies of the eight launch skills and connect the same `aictrl` server identity
to the canonical public workflow endpoint.

```bash
npm run assemble:public
npm run verify:public
```

CI rejects checksum mismatches, missing/extra skills, manual generated drift,
invalid Codex metadata, and package lifecycle regressions.
invalid Codex metadata, and package lifecycle regressions. Clean-client
lifecycle jobs exercise the real Claude Code, Codex, and OpenCode CLIs against
the packed or public distribution paths, including repeated installation and
removal. The npm release job also requires OpenCode's production OAuth boundary
to reach the expected unauthenticated state before publishing.

## Release status

The package tree is a public beta artifact. Connected release remains gated on
the production `https://aictrl.dev/mcp/workflows` endpoint, OAuth hardening,
clean-client lifecycle evidence, publisher verification, and vendor publication
checks. Local skills do not require an AICtrl account or API key.
the production `https://aictrl.dev/mcp` resource, OAuth hardening, clean-client
lifecycle evidence, publisher verification, and vendor publication checks.
Local skills do not require an AICtrl account or API key.

Release owners must follow the [public release runbook](docs/public-release-runbook.md),
including the skills re-pin, first npm publication, vendor smoke tests, evidence,
and rollback gates.

The existing `npx @aictrl/plugin` tenant installer remains supported and is not
silently replaced by this public OAuth path.
Expand Down
2 changes: 1 addition & 1 deletion claude/aictrl/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "aictrl",
"version": "0.1.0-beta.1",
"version": "0.1.0-beta.2",
"description": "Eight portable engineering skills with optional controlled AICtrl workflow execution",
"author": {
"name": "aictrl.dev",
Expand Down
2 changes: 1 addition & 1 deletion claude/aictrl/.mcp.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"mcpServers": {
"aictrl": {
"type": "http",
"url": "https://aictrl.dev/mcp/workflows"
"url": "https://aictrl.dev/mcp"
}
}
}
2 changes: 1 addition & 1 deletion claude/aictrl/skills/code-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,4 @@ Produce high-signal findings for the exact pull or merge request revision. Revie
- Separate verified defects from residual risk and untested hypotheses.

---
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=code-review).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=code-review)
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=code-review&utm_listing=github-skills&utm_platform=portable&utm_skill=code-review).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=code-review&utm_listing=github-skills&utm_platform=portable&utm_skill=code-review)
2 changes: 1 addition & 1 deletion claude/aictrl/skills/create-bug/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,4 @@ Turn symptoms, logs, or an observed regression into a bug that another engineer
- Do not implement the fix, commit, push, or change issue state unless the user asks.

---
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-bug).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-bug)
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-bug&utm_listing=github-skills&utm_platform=portable&utm_skill=create-bug).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-bug&utm_listing=github-skills&utm_platform=portable&utm_skill=create-bug)
2 changes: 1 addition & 1 deletion claude/aictrl/skills/create-issue/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,4 @@ so that <outcome>.
- Never include secrets, credentials, private customer data, or unnecessary source excerpts.

---
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-issue).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-issue)
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-issue&utm_listing=github-skills&utm_platform=portable&utm_skill=create-issue).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-issue&utm_listing=github-skills&utm_platform=portable&utm_skill=create-issue)
13 changes: 7 additions & 6 deletions claude/aictrl/skills/create-workflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Create and validate an AICtrl workflow v2 YAML file with typed para

# Create an AICtrl Workflow

Author a reviewable `.aictrl/workflows/<kebab-name>.yaml` file. Workflow v2 with inline `task` nodes is the default because it keeps task configuration portable in Git.
Author a reviewable `.aictrl/workflows/<kebab-name>.yaml` file. Treat this directory like `.github/workflows/`: create the workflow in the repository whose automation the user is defining. Installing a skill or plugin does not publish a workflow for that repository. Workflow v2 with inline `task` nodes is the default because it keeps task configuration portable in Git.

## Workflow

Expand Down Expand Up @@ -37,17 +37,18 @@ Author a reviewable `.aictrl/workflows/<kebab-name>.yaml` file. Workflow v2 with
schemaVersion: aictrl/workflow/v2
name: implement-change
parameters:
- { name: repository, type: string, required: true }
- { name: issue-id, type: number, required: true }
- { name: repository, type: repository, required: true }
- { name: issue-id, type: number, required: true, validation: { min: 1 } }
nodes:
- id: implement
type: task
skill: implement-code-change@1.0.0
taskType: general
prompt: Implement the requested issue and produce a merge-ready pull request.
timeoutMinutes: 10
parameters:
- { name: repository, type: string, required: true }
- { name: issue-id, type: number, required: true }
- { name: repository, type: repository, required: true }
- { name: issue-id, type: number, required: true, validation: { min: 1 } }
inputs:
repository: { from: input, name: repository }
issue-id: { from: input, name: issue-id }
Expand All @@ -64,4 +65,4 @@ nodes:
- Canvas positions and runtime fields are platform-owned and must not be authored.

---
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-workflow).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-workflow)
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-workflow&utm_listing=github-skills&utm_platform=portable&utm_skill=create-workflow).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=create-workflow&utm_listing=github-skills&utm_platform=portable&utm_skill=create-workflow)
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ triggers: [...] # optional; up to 10 file-declared event tri
the platform on import. Authoring them is a schema error (`additionalProperties`
is `false` at the top level and on every object).

## Parameter types (12 total)
## Parameter types (13 total)

Used for workflow-level `parameters`, `user-input` node `parameters`, and inline
`task` node `parameters`:
Expand All @@ -54,6 +54,7 @@ Used for workflow-level `parameters`, `user-input` node `parameters`, and inline
| `select` | string | Requires `options: [...]` |
| `multi-select` | list<string> | Requires `options: [...]` |
| `json` | dyn | Arbitrary JSON |
| `repository` | string | Connected repository in owner/name form |
| `pull-request` | string | PR URL |
| `story` | string | Story/ticket URL |
| `image` | string | Image URL or base64 |
Expand Down Expand Up @@ -88,6 +89,7 @@ layer-1 error.
skill: code-review@1.0.0 # required; pin when a version is resolvable
taskType: code-review # required; executor tool boundary
prompt: Review the current pull request head and return structured findings.
timeoutMinutes: 10 # optional; executor runtime, integer 1-60
parameters:
- { name: pull-request, type: pull-request, required: true }
inputs:
Expand All @@ -101,6 +103,7 @@ Inline task nodes make the task configuration portable in the workflow file.
Their `inputs` are checked against the in-file `parameters`; their declared
`outputs` may be mapped by downstream nodes. Treat `prompt` as instructions for
the selected skill, not as a way to relax workflow policy or tool boundaries.
`timeoutMinutes` is an optional hard executor bound from 1 to 60 minutes.

### `template` — run a task template
```yaml
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
"name": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" },
"label": { "type": "string" },
"type": {
"enum": ["string", "text", "number", "boolean", "url", "select", "multi-select", "json", "pull-request", "story", "image", "github-issue"]
"enum": ["string", "text", "number", "boolean", "url", "select", "multi-select", "json", "repository", "pull-request", "story", "image", "github-issue"]
},
"description": { "type": "string" },
"required": { "type": "boolean", "default": false },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@
"then": { "required": ["parameters"], "not": { "anyOf": [
{ "required": ["template"] }, { "required": ["templateVersion"] }, { "required": ["workflow"] }, { "required": ["workflowVersion"] }, { "required": ["maxIterations"] }, { "required": ["until"] }, { "required": ["while"] }, { "required": ["onMaxIterations"] }, { "required": ["body"] }, { "required": ["signalSource"] }, { "required": ["timeoutMinutes"] }, { "required": ["checklistItems"] }, { "required": ["assignee"] }, { "required": ["skill"] }, { "required": ["taskType"] }, { "required": ["prompt"] }, { "required": ["outputs"] } ] } } },
{ "if": { "properties": { "type": { "const": "task" } }, "required": ["type"] },
"then": { "required": ["skill"], "not": { "anyOf": [
{ "required": ["template"] }, { "required": ["templateVersion"] }, { "required": ["workflow"] }, { "required": ["workflowVersion"] }, { "required": ["maxIterations"] }, { "required": ["until"] }, { "required": ["while"] }, { "required": ["onMaxIterations"] }, { "required": ["body"] }, { "required": ["signalSource"] }, { "required": ["timeoutMinutes"] }, { "required": ["checklistItems"] }, { "required": ["assignee"] } ] } } }
"then": { "required": ["skill"], "properties": { "timeoutMinutes": { "maximum": 60 } }, "not": { "anyOf": [
{ "required": ["template"] }, { "required": ["templateVersion"] }, { "required": ["workflow"] }, { "required": ["workflowVersion"] }, { "required": ["maxIterations"] }, { "required": ["until"] }, { "required": ["while"] }, { "required": ["onMaxIterations"] }, { "required": ["body"] }, { "required": ["signalSource"] }, { "required": ["checklistItems"] }, { "required": ["assignee"] } ] } } }
]
},
"inputMapping": { "$ref": "../v1/workflow.schema.json#/$defs/inputMapping" },
Expand Down
10 changes: 6 additions & 4 deletions claude/aictrl/skills/implement-code-change/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@ Take one engineering issue to a verified, merge-ready pull request. Never merge

## Connected workflow

1. Call `list_workflows` and confirm `implement-code-change` is available.
2. Call `get_workflow` and show the resolved version, required `{ repository, issue_id }` inputs, side effects, limits, and approval gates.
Connected workflows are repository-owned configuration, analogous to GitHub Actions. Installing this skill or its plugin does not provision one. If the organization has no suitable published workflow, explain that the user can invoke `create-workflow` in the repository they want to automate; do not create or publish a workflow without a separate request.

1. Call `list_workflows` and confirm a suitable `implement-code-change` workflow is available. If it is absent, stop the connected path and offer the repository-owned `create-workflow` path.
2. Call `get_workflow` and show the resolved immutable version, required `{ repository, issue-id }` inputs, side effects, limits, and approval gates. Preserve the hyphenated `issue-id` key exactly in tool input.
3. Obtain explicit confirmation to start if the user has not already authorized connected execution.
4. Call `start_workflow` with the resolved workflow/version, validated inputs, and a stable idempotency key derived from repository and issue.
5. Poll with `get_workflow_run`; report actual status and required action without inventing progress.
6. For a paused gate, show the revision, evidence, cost, and requested decision. Use `approve_workflow_step` only for the user's explicit approve/reject choice.
6. For a paused gate, show the revision, evidence, cost, and requested decision. Use `approve_workflow_step` only for the user's explicit approve/reject choice, passing `decision` and the unchanged 40-character `expected_revision` returned by `get_workflow_run`. If the revision changed or is absent, stop and retrieve the run again instead of deciding the gate.
7. Use `cancel_workflow_run` when explicitly requested or when the documented safety boundary requires termination.
8. Finish with the exact revision, PR/result link, checks, evidence, cost, and any actionable terminal failure.

Expand All @@ -46,4 +48,4 @@ Take one engineering issue to a verified, merge-ready pull request. Never merge
- The result is merge-ready, not automatically merged or deployed.

---
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=implement-code-change).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=implement-code-change)
**Built by [aictrl.dev](https://aictrl.dev/?utm_source=oss-skills&utm_medium=skill&utm_campaign=implement-code-change&utm_listing=github-skills&utm_platform=portable&utm_skill=implement-code-change).** This skill teaches the workflow; aictrl *operationalizes* it — grounded in your backlog, team standards, and codebase knowledge graph. [See how →](https://aictrl.dev/features?utm_source=oss-skills&utm_medium=skill&utm_campaign=implement-code-change&utm_listing=github-skills&utm_platform=portable&utm_skill=implement-code-change)
Loading
Loading