supercmo-skills 0.1.8__tar.gz
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.
- supercmo_skills-0.1.8/.claude-plugin/marketplace.json +19 -0
- supercmo_skills-0.1.8/.claude-plugin/plugin.json +9 -0
- supercmo_skills-0.1.8/.claude-plugin/supercmo.json +18 -0
- supercmo_skills-0.1.8/.codex-plugin/marketplace.json +19 -0
- supercmo_skills-0.1.8/.codex-plugin/mcp.json +8 -0
- supercmo_skills-0.1.8/.codex-plugin/plugin.json +11 -0
- supercmo_skills-0.1.8/.gitattributes +3 -0
- supercmo_skills-0.1.8/.github/CODEOWNERS +3 -0
- supercmo_skills-0.1.8/.github/ISSUE_TEMPLATE/bug_report.yml +35 -0
- supercmo_skills-0.1.8/.github/ISSUE_TEMPLATE/config.yml +8 -0
- supercmo_skills-0.1.8/.github/ISSUE_TEMPLATE/skill_request.yml +21 -0
- supercmo_skills-0.1.8/.github/PULL_REQUEST_TEMPLATE.md +20 -0
- supercmo_skills-0.1.8/.github/dependabot.yml +10 -0
- supercmo_skills-0.1.8/.github/workflows/release.yml +108 -0
- supercmo_skills-0.1.8/.github/workflows/secret-scan.yml +28 -0
- supercmo_skills-0.1.8/.github/workflows/validate.yml +57 -0
- supercmo_skills-0.1.8/.gitignore +30 -0
- supercmo_skills-0.1.8/.mcp.json +8 -0
- supercmo_skills-0.1.8/CONTRIBUTING.md +55 -0
- supercmo_skills-0.1.8/LICENSE +202 -0
- supercmo_skills-0.1.8/NOTICE +5 -0
- supercmo_skills-0.1.8/PKG-INFO +256 -0
- supercmo_skills-0.1.8/README.md +235 -0
- supercmo_skills-0.1.8/SECURITY.md +35 -0
- supercmo_skills-0.1.8/TELEMETRY.md +81 -0
- supercmo_skills-0.1.8/assets/logo.png +0 -0
- supercmo_skills-0.1.8/bin/install.js +496 -0
- supercmo_skills-0.1.8/bin/lib/clihosts.js +71 -0
- supercmo_skills-0.1.8/bin/lib/components.js +94 -0
- supercmo_skills-0.1.8/bin/lib/config.js +80 -0
- supercmo_skills-0.1.8/bin/lib/install.test.js +359 -0
- supercmo_skills-0.1.8/bin/lib/jsonhosts.js +138 -0
- supercmo_skills-0.1.8/gemini-extension.json +11 -0
- supercmo_skills-0.1.8/mcpb/icon.png +0 -0
- supercmo_skills-0.1.8/mcpb/manifest.json +61 -0
- supercmo_skills-0.1.8/package.json +22 -0
- supercmo_skills-0.1.8/pyproject.toml +57 -0
- supercmo_skills-0.1.8/scripts/bump_version.py +119 -0
- supercmo_skills-0.1.8/scripts/check_catalog_sync.py +53 -0
- supercmo_skills-0.1.8/scripts/check_shared_client.py +81 -0
- supercmo_skills-0.1.8/scripts/doctor.py +52 -0
- supercmo_skills-0.1.8/scripts/installer.sh +51 -0
- supercmo_skills-0.1.8/scripts/listing_gate.py +198 -0
- supercmo_skills-0.1.8/scripts/package_plugins.py +95 -0
- supercmo_skills-0.1.8/scripts/quick_validate.py +253 -0
- supercmo_skills-0.1.8/scripts/supercmo_env.py +522 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/__init__.py +23 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/__main__.py +56 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/catalog.py +466 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/client.py +1079 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/__init__.py +8 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/__main__.py +3 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/registry.py +17 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/server.py +122 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/tools/__init__.py +9 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/tools/analyze.py +100 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/tools/audio.py +90 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/tools/extract.py +60 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/tools/image.py +64 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/tools/jobs.py +44 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/tools/setup.py +41 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/tools/stitch.py +30 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/mcp/tools/video.py +73 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/paths.py +19 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/providers/__init__.py +1 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/providers/elevenlabs.py +171 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/providers/fal.py +387 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/providers/firecrawl.py +56 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/providers/gemini.py +131 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/readiness.py +83 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/stitch.py +191 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/telemetry.py +358 -0
- supercmo_skills-0.1.8/scripts/supercmo_skills/tool_specs.py +476 -0
- supercmo_skills-0.1.8/scripts/sync_skills.py +91 -0
- supercmo_skills-0.1.8/server.json +27 -0
- supercmo_skills-0.1.8/skills/analyzing-products/SKILL.md +56 -0
- supercmo_skills-0.1.8/skills/analyzing-products/evals/eval_cases.json +15 -0
- supercmo_skills-0.1.8/skills/analyzing-products/references/photo-analysis.md +44 -0
- supercmo_skills-0.1.8/skills/analyzing-products/references/url-extract.md +62 -0
- supercmo_skills-0.1.8/skills/generating-audio/SKILL.md +130 -0
- supercmo_skills-0.1.8/skills/generating-audio/evals/eval_cases.json +20 -0
- supercmo_skills-0.1.8/skills/generating-audio/references/directing-the-read.md +51 -0
- supercmo_skills-0.1.8/skills/generating-images/SKILL.md +144 -0
- supercmo_skills-0.1.8/skills/generating-images/evals/eval_cases.json +22 -0
- supercmo_skills-0.1.8/skills/generating-images/references/format-cinematic.md +22 -0
- supercmo_skills-0.1.8/skills/generating-images/references/format-portrait.md +49 -0
- supercmo_skills-0.1.8/skills/generating-images/references/format-poster.md +47 -0
- supercmo_skills-0.1.8/skills/generating-images/references/prompt-flux.md +13 -0
- supercmo_skills-0.1.8/skills/generating-images/references/prompt-gpt-image-2.md +26 -0
- supercmo_skills-0.1.8/skills/generating-images/references/prompt-grok.md +11 -0
- supercmo_skills-0.1.8/skills/generating-images/references/prompt-nano-banana.md +53 -0
- supercmo_skills-0.1.8/skills/generating-images/references/prompt-seedream.md +27 -0
- supercmo_skills-0.1.8/skills/generating-videos/SKILL.md +176 -0
- supercmo_skills-0.1.8/skills/generating-videos/evals/eval_cases.json +18 -0
- supercmo_skills-0.1.8/skills/generating-videos/references/prompt-gemini-omni.md +42 -0
- supercmo_skills-0.1.8/skills/generating-videos/references/prompt-grok.md +37 -0
- supercmo_skills-0.1.8/skills/generating-videos/references/prompt-kling.md +40 -0
- supercmo_skills-0.1.8/skills/generating-videos/references/prompt-seedance.md +51 -0
- supercmo_skills-0.1.8/skills/generating-videos/references/prompt-veo.md +61 -0
- supercmo_skills-0.1.8/skills/generating-videos/references/prompt-wan.md +42 -0
- supercmo_skills-0.1.8/tests/evals/run_eval.py +196 -0
- supercmo_skills-0.1.8/tests/test_installer.sh +34 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "superCMO-skills",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "SuperCMO",
|
|
5
|
+
"url": "https://getsupercmo.ai"
|
|
6
|
+
},
|
|
7
|
+
"metadata": {
|
|
8
|
+
"description": "Open, model-agnostic, BYO-keys marketing skills for AI agents",
|
|
9
|
+
"version": "0.1.8",
|
|
10
|
+
"repository": "https://github.com/SupercmoHQ/superCMO-skills"
|
|
11
|
+
},
|
|
12
|
+
"plugins": [
|
|
13
|
+
{
|
|
14
|
+
"name": "supercmo",
|
|
15
|
+
"description": "SuperCMO marketing skills — the whole repo installs as one plugin (everything under skills/ ships with it).",
|
|
16
|
+
"source": "./"
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "supercmo",
|
|
3
|
+
"version": "0.1.8",
|
|
4
|
+
"description": "Open, model-agnostic, BYO-keys marketing skills for AI agents. Installing adds the whole skill set as one plugin; each skill also works standalone.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "SuperCMO"
|
|
7
|
+
},
|
|
8
|
+
"repository": "https://github.com/SupercmoHQ/superCMO-skills"
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"keyword": "SUPERCMO",
|
|
3
|
+
"visible": false,
|
|
4
|
+
"skills": [
|
|
5
|
+
"generating-images",
|
|
6
|
+
"generating-videos",
|
|
7
|
+
"analyzing-products",
|
|
8
|
+
"generating-audio"
|
|
9
|
+
],
|
|
10
|
+
"agents": [],
|
|
11
|
+
"references": [],
|
|
12
|
+
"scripts": [
|
|
13
|
+
"supercmo_env.py"
|
|
14
|
+
],
|
|
15
|
+
"mcp_servers": [
|
|
16
|
+
"supercmo"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "superCMO-skills",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "SuperCMO",
|
|
5
|
+
"url": "https://getsupercmo.ai"
|
|
6
|
+
},
|
|
7
|
+
"metadata": {
|
|
8
|
+
"description": "Open, model-agnostic, BYO-keys marketing skills for AI agents",
|
|
9
|
+
"version": "0.1.8",
|
|
10
|
+
"repository": "https://github.com/SupercmoHQ/superCMO-skills"
|
|
11
|
+
},
|
|
12
|
+
"plugins": [
|
|
13
|
+
{
|
|
14
|
+
"name": "supercmo",
|
|
15
|
+
"description": "SuperCMO marketing skills — the whole repo installs as one plugin (everything under skills/ ships with it).",
|
|
16
|
+
"source": "./"
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "supercmo",
|
|
3
|
+
"version": "0.1.8",
|
|
4
|
+
"description": "Open, model-agnostic, BYO-keys marketing skills for AI agents. Installing adds the whole skill set as one plugin; each skill also works standalone.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "SuperCMO"
|
|
7
|
+
},
|
|
8
|
+
"repository": "https://github.com/SupercmoHQ/superCMO-skills",
|
|
9
|
+
"skills": "./skills/",
|
|
10
|
+
"mcpServers": "./.codex-plugin/mcp.json"
|
|
11
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: A skill or tool isn't behaving as documented.
|
|
3
|
+
labels: [bug]
|
|
4
|
+
body:
|
|
5
|
+
- type: input
|
|
6
|
+
id: skill
|
|
7
|
+
attributes:
|
|
8
|
+
label: Skill / tool
|
|
9
|
+
placeholder: e.g. generating-images
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: expected
|
|
14
|
+
attributes:
|
|
15
|
+
label: What you expected
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: actual
|
|
20
|
+
attributes:
|
|
21
|
+
label: What actually happened
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
- type: textarea
|
|
25
|
+
id: repro
|
|
26
|
+
attributes:
|
|
27
|
+
label: Steps to reproduce
|
|
28
|
+
description: Include the prompt/command. Redact any credentials.
|
|
29
|
+
validations:
|
|
30
|
+
required: true
|
|
31
|
+
- type: input
|
|
32
|
+
id: env
|
|
33
|
+
attributes:
|
|
34
|
+
label: Environment
|
|
35
|
+
placeholder: e.g. Claude Code 2.1.x, macOS 15
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Security vulnerability
|
|
4
|
+
url: https://github.com/SupercmoHQ/superCMO-skills/blob/main/SECURITY.md
|
|
5
|
+
about: Do not file public issues for security problems — see our security policy.
|
|
6
|
+
- name: Question / discussion
|
|
7
|
+
url: https://github.com/SupercmoHQ/superCMO-skills/discussions
|
|
8
|
+
about: Ask questions and discuss ideas in Discussions.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Skill request / idea
|
|
2
|
+
description: Propose a new skill or an improvement to an existing one.
|
|
3
|
+
labels: [enhancement]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: What marketing job should this skill do?
|
|
9
|
+
description: Describe the task and when an operator would reach for it.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: input
|
|
13
|
+
id: category
|
|
14
|
+
attributes:
|
|
15
|
+
label: Category
|
|
16
|
+
placeholder: ads / seo / social / creative / analytics
|
|
17
|
+
- type: textarea
|
|
18
|
+
id: notes
|
|
19
|
+
attributes:
|
|
20
|
+
label: Anything else
|
|
21
|
+
description: Existing tools it would call, references, prior art.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!-- Thanks for contributing to SuperCMO skills! -->
|
|
2
|
+
|
|
3
|
+
## What this changes
|
|
4
|
+
|
|
5
|
+
<!-- Brief description. Link any related issue. -->
|
|
6
|
+
|
|
7
|
+
## Type
|
|
8
|
+
|
|
9
|
+
- [ ] New skill
|
|
10
|
+
- [ ] Change to an existing skill
|
|
11
|
+
- [ ] Shared script / MCP tool (`scripts/`, `scripts/supercmo_skills/mcp/`)
|
|
12
|
+
- [ ] Docs / repo infrastructure
|
|
13
|
+
|
|
14
|
+
## Checklist
|
|
15
|
+
|
|
16
|
+
- [ ] No credentials, tokens, or secrets are committed (keys come from env vars).
|
|
17
|
+
- [ ] `name` matches the folder; `description` says **what + when** and is ≤ 1024 chars.
|
|
18
|
+
- [ ] Passes local validation — `python3 scripts/quick_validate.py`, `scripts/listing_gate.py`, `scripts/check_shared_client.py` (CI runs the same).
|
|
19
|
+
- [ ] SKILL.md body is under ~500 lines; detail is in `references/`.
|
|
20
|
+
- [ ] Any script that mutates remote state supports `--dry-run` and defaults to paused/inactive.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Tag a release — the tag must match package.json "version". scripts/bump_version.py keeps every
|
|
4
|
+
# manifest + uvx pin in sync from that one value; the assert below re-checks it before publishing.
|
|
5
|
+
# python3 scripts/bump_version.py X.Y.Z then git tag vX.Y.Z && git push origin vX.Y.Z
|
|
6
|
+
#
|
|
7
|
+
# Jobs:
|
|
8
|
+
# release — always: build the plugin bundle + GitHub Release (no external publish).
|
|
9
|
+
# pypi-publish — publishes supercmo-skills to PyPI via OIDC Trusted Publishing (the uvx package
|
|
10
|
+
# + the MCP-registry backing package). GATED by the `pypi` environment.
|
|
11
|
+
# npm-publish — publishes @supercmo/skills to npm via OIDC Trusted Publishing. GATED by `npm`.
|
|
12
|
+
# mcp-registry — registers server.json in the official MCP registry (needs the PyPI package live).
|
|
13
|
+
# GATED by `mcp-registry`.
|
|
14
|
+
#
|
|
15
|
+
# THE GATE: the three publish jobs use protected GitHub Environments. Configure each environment with
|
|
16
|
+
# required reviewers (the Final Launch Check approver) so a tag push PAUSES for approval instead of
|
|
17
|
+
# publishing. A tag alone never publishes.
|
|
18
|
+
|
|
19
|
+
on:
|
|
20
|
+
push:
|
|
21
|
+
tags: ["v*"]
|
|
22
|
+
|
|
23
|
+
permissions: {}
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
release:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
permissions:
|
|
29
|
+
contents: write # create the GitHub Release + upload the asset
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
- uses: actions/setup-python@v5
|
|
33
|
+
with:
|
|
34
|
+
python-version: "3.11"
|
|
35
|
+
- uses: actions/setup-node@v4
|
|
36
|
+
with:
|
|
37
|
+
node-version: "20"
|
|
38
|
+
- name: Assert tag matches package.json + every manifest version + uvx pin
|
|
39
|
+
run: python3 scripts/bump_version.py --check --tag "$GITHUB_REF_NAME"
|
|
40
|
+
- name: Build plugin bundle
|
|
41
|
+
run: |
|
|
42
|
+
python3 -m pip install --quiet pyyaml
|
|
43
|
+
python3 scripts/package_plugins.py
|
|
44
|
+
- name: Build .mcpb bundle (Smithery / Claude Desktop)
|
|
45
|
+
run: npx --yes @anthropic-ai/mcpb@latest pack mcpb dist/supercmo.mcpb
|
|
46
|
+
- name: Publish GitHub Release (idempotent)
|
|
47
|
+
env:
|
|
48
|
+
GH_TOKEN: ${{ github.token }}
|
|
49
|
+
run: |
|
|
50
|
+
# A pre-launch re-seed force-pushes the same tag, re-triggering this job. Create the release
|
|
51
|
+
# the first time; on a re-run the release already exists, so just refresh the assets
|
|
52
|
+
# instead of failing on "a release with the same tag name already exists".
|
|
53
|
+
if gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1; then
|
|
54
|
+
gh release upload "$GITHUB_REF_NAME" dist/supercmo-plugin.zip dist/supercmo.mcpb --clobber
|
|
55
|
+
else
|
|
56
|
+
gh release create "$GITHUB_REF_NAME" dist/supercmo-plugin.zip dist/supercmo.mcpb --generate-notes
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
pypi-publish:
|
|
60
|
+
needs: release
|
|
61
|
+
runs-on: ubuntu-latest
|
|
62
|
+
environment: pypi # protect with required reviewers = the Final Launch Check gate
|
|
63
|
+
permissions:
|
|
64
|
+
id-token: write # OIDC Trusted Publishing — no token stored
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/checkout@v4
|
|
67
|
+
- uses: actions/setup-python@v5
|
|
68
|
+
with:
|
|
69
|
+
python-version: "3.11"
|
|
70
|
+
- name: Build wheel + sdist
|
|
71
|
+
run: |
|
|
72
|
+
python3 -m pip install --quiet build
|
|
73
|
+
python3 -m build
|
|
74
|
+
- name: Publish to PyPI (OIDC)
|
|
75
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
76
|
+
|
|
77
|
+
npm-publish:
|
|
78
|
+
needs: release
|
|
79
|
+
runs-on: ubuntu-latest
|
|
80
|
+
environment: npm # protect with required reviewers = the Final Launch Check gate
|
|
81
|
+
permissions:
|
|
82
|
+
contents: read
|
|
83
|
+
id-token: write # OIDC Trusted Publishing — provenance auto-attached, no token
|
|
84
|
+
steps:
|
|
85
|
+
- uses: actions/checkout@v4
|
|
86
|
+
- uses: actions/setup-node@v4
|
|
87
|
+
with:
|
|
88
|
+
node-version: "20"
|
|
89
|
+
registry-url: "https://registry.npmjs.org"
|
|
90
|
+
- run: npm install -g npm@latest # OIDC needs npm >= 11.5.1
|
|
91
|
+
- run: python3 -m pip install --quiet pyyaml # prepublishOnly runs scripts/quick_validate.py
|
|
92
|
+
- run: npm publish --access public
|
|
93
|
+
|
|
94
|
+
mcp-registry:
|
|
95
|
+
needs: pypi-publish # the registry entry points at the PyPI package — it must be live first
|
|
96
|
+
runs-on: ubuntu-latest
|
|
97
|
+
environment: mcp-registry
|
|
98
|
+
permissions:
|
|
99
|
+
id-token: write # `mcp-publisher login github-oidc`
|
|
100
|
+
steps:
|
|
101
|
+
- uses: actions/checkout@v4
|
|
102
|
+
- name: Install mcp-publisher
|
|
103
|
+
run: |
|
|
104
|
+
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_amd64.tar.gz" | tar xz mcp-publisher
|
|
105
|
+
- name: Publish server.json to the MCP registry
|
|
106
|
+
run: |
|
|
107
|
+
./mcp-publisher login github-oidc
|
|
108
|
+
./mcp-publisher publish
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Scans every push and PR for committed secrets over the FULL history.
|
|
2
|
+
# Runs the OSS gitleaks binary directly — NOT gitleaks/gitleaks-action@v2, which requires a
|
|
3
|
+
# paid GITLEAKS_LICENSE for org-owned repos (SupercmoHQ) and hard-fails before scanning.
|
|
4
|
+
# The binary is MIT and needs no license. A local gitleaks pre-commit hook is an optional
|
|
5
|
+
# extra for maintainers.
|
|
6
|
+
name: Secret scan
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
pull_request:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
gitleaks:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
with:
|
|
20
|
+
fetch-depth: 0 # full history so gitleaks scans every commit
|
|
21
|
+
- name: Install gitleaks (OSS binary — no org license)
|
|
22
|
+
run: |
|
|
23
|
+
VERSION=8.21.2
|
|
24
|
+
curl -sSfL "https://github.com/gitleaks/gitleaks/releases/download/v${VERSION}/gitleaks_${VERSION}_linux_x64.tar.gz" \
|
|
25
|
+
| sudo tar -xz -C /usr/local/bin gitleaks
|
|
26
|
+
gitleaks version
|
|
27
|
+
- name: Scan full git history
|
|
28
|
+
run: gitleaks detect --source . --redact --verbose --exit-code 1
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Blocking validation: structural + frontmatter lint (quick_validate), the listing gate
|
|
2
|
+
# (scripts smoke + spend/social --dry-run; listing_gate.py), and a plugin-bundle build smoke,
|
|
3
|
+
# plus the Agent Skills spec validator (skills-ref) as an advisory check.
|
|
4
|
+
name: Validate
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
branches: [main, dev]
|
|
8
|
+
pull_request:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
validate:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.12"
|
|
21
|
+
|
|
22
|
+
- name: Structural + frontmatter validation (blocking)
|
|
23
|
+
run: |
|
|
24
|
+
pip install pyyaml
|
|
25
|
+
python3 scripts/quick_validate.py
|
|
26
|
+
python3 scripts/sync_skills.py --check # README skills catalog must be in sync
|
|
27
|
+
|
|
28
|
+
- name: Listing gate — scripts smoke + spend/social --dry-run (blocking)
|
|
29
|
+
run: |
|
|
30
|
+
python3 scripts/listing_gate.py --selftest # regression-test the gate logic
|
|
31
|
+
python3 scripts/listing_gate.py
|
|
32
|
+
|
|
33
|
+
- name: Shared-client seam — no raw vendor HTTP (blocking)
|
|
34
|
+
run: python3 scripts/check_shared_client.py
|
|
35
|
+
|
|
36
|
+
- name: Provider-key catalog in sync — registry vs .mcp.json/config.js (blocking)
|
|
37
|
+
run: python3 scripts/check_catalog_sync.py
|
|
38
|
+
|
|
39
|
+
- name: Plugin bundle build smoke (blocking)
|
|
40
|
+
run: python3 scripts/package_plugins.py # must build a complete supercmo-plugin.zip (pyyaml installed above)
|
|
41
|
+
|
|
42
|
+
- name: Agent Skills spec validation (skills-ref)
|
|
43
|
+
# Not yet blocking: the skills-ref CLI interface is young — verify it, then
|
|
44
|
+
# remove continue-on-error to make it a hard gate.
|
|
45
|
+
continue-on-error: true
|
|
46
|
+
run: |
|
|
47
|
+
pip install skills-ref 2>/dev/null \
|
|
48
|
+
|| pip install "git+https://github.com/agentskills/agentskills.git#subdirectory=skills-ref" 2>/dev/null \
|
|
49
|
+
|| { echo "skills-ref not installable yet — skipping"; exit 0; }
|
|
50
|
+
for d in skills/*/; do
|
|
51
|
+
[ -f "${d}SKILL.md" ] && skills-ref validate "$d" || true
|
|
52
|
+
done
|
|
53
|
+
|
|
54
|
+
- name: Trigger evals (advisory)
|
|
55
|
+
# should-trigger / should-not-trigger per skill. Reports on PRs; never gates merge.
|
|
56
|
+
continue-on-error: true
|
|
57
|
+
run: python3 tests/evals/run_eval.py
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Build and package output
|
|
2
|
+
dist/
|
|
3
|
+
|
|
4
|
+
# Python caching
|
|
5
|
+
__pycache__/
|
|
6
|
+
*.pyc
|
|
7
|
+
*.pyo
|
|
8
|
+
*.pyd
|
|
9
|
+
.pytest_cache/
|
|
10
|
+
.coverage
|
|
11
|
+
htmlcov/
|
|
12
|
+
|
|
13
|
+
# Local agents and test staging dirs
|
|
14
|
+
.supercmo/
|
|
15
|
+
.claude/
|
|
16
|
+
|
|
17
|
+
# System specific files
|
|
18
|
+
.DS_Store
|
|
19
|
+
Thumbs.db
|
|
20
|
+
|
|
21
|
+
# Environments
|
|
22
|
+
.env
|
|
23
|
+
.env.*
|
|
24
|
+
|
|
25
|
+
# host-smoke generated media (not committed)
|
|
26
|
+
_signoff-media/
|
|
27
|
+
.gstack/
|
|
28
|
+
|
|
29
|
+
# generated media output (default ./supercmo-media; tools write here)
|
|
30
|
+
supercmo-media/
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Contributing to SuperCMO Skills
|
|
2
|
+
|
|
3
|
+
Thanks for adding a skill, agent, or MCP tool. This repo is one cross-host plugin: a skill you author
|
|
4
|
+
runs unchanged in Claude Code, Cursor, Codex, Claude Cowork, and other SKILL.md-compatible hosts. Two
|
|
5
|
+
rules are non-negotiable: **bring-your-own-keys** (never a key in the repo) and **route all
|
|
6
|
+
vendor/network calls through `supercmo_env`** (CI enforces it).
|
|
7
|
+
|
|
8
|
+
`skills/generating-images/` is the reference build — match its shape when in doubt.
|
|
9
|
+
|
|
10
|
+
## Add a skill
|
|
11
|
+
|
|
12
|
+
1. **Create the folder:** `skills/<your-skill>/` (folder name must equal the `name:` in frontmatter —
|
|
13
|
+
lowercase, hyphenated, `^[a-z0-9]+(-[a-z0-9]+)*$`). `skills/generating-images/` is the reference
|
|
14
|
+
layout to model it on.
|
|
15
|
+
2. **Frontmatter:** `name`, `description` (state WHAT it does + WHEN to use it, including the trigger
|
|
16
|
+
phrases a user would say), `license: Apache-2.0`, and `metadata:` (`version`, `category`; add
|
|
17
|
+
`writes: spend | social` **only** for skills that spend money or post — it defaults to `none`, so
|
|
18
|
+
most skills omit it, like the reference skill does). No top-level `version`, no `platforms`, no
|
|
19
|
+
angle brackets in `name`/`description`.
|
|
20
|
+
3. **Keep `SKILL.md` short.** Push doctrine into `references/`, deterministic work into `scripts/`.
|
|
21
|
+
4. **Scripts are self-contained + BYOK:** stdlib-only where possible; read keys from the environment;
|
|
22
|
+
**import `supercmo_env` and call `supercmo_env._request` / `_request_raw`** for any network — never
|
|
23
|
+
`requests`/`httpx`/`urllib` directly. Anything that mutates remote state (posts, ad spend) must
|
|
24
|
+
support `--dry-run` (preview the request, secrets masked, no network) and default to paused.
|
|
25
|
+
5. **Tag money/social actions:** set `metadata.writes: spend` or `social` so the listing gate requires
|
|
26
|
+
your `--dry-run`.
|
|
27
|
+
6. **Add `evals/eval_cases.json`** (schema 2): `trigger_keywords` + should-trigger / should-not-trigger
|
|
28
|
+
`cases`. Copy the shape from `skills/generating-images/evals/`.
|
|
29
|
+
7. **Validate before you push** (see below). Land each skill as a *complete* PR — folder + `SKILL.md` +
|
|
30
|
+
`evals/` together. Never commit an empty skill folder (the orphan gate fails).
|
|
31
|
+
|
|
32
|
+
## Add an agent (subagent)
|
|
33
|
+
|
|
34
|
+
The repo ships no subagents — a skill is portable across every host, while a subagent is
|
|
35
|
+
host-specific and starts in a fresh context that does not inherit loaded skills. Reach for one only
|
|
36
|
+
for genuine multi-step orchestration or a distinct reviewer role.
|
|
37
|
+
|
|
38
|
+
- **Bundled role prompt (preferred):** a plain `skills/<name>/agents/<role>.md` with **no
|
|
39
|
+
frontmatter** — spawned inline by the skill, or run as steps if the host has no subagents. Keeps
|
|
40
|
+
the skill self-contained and portable.
|
|
41
|
+
- **Standalone subagent:** an `agents/<name>.md` at the repo root with frontmatter — `name`,
|
|
42
|
+
`description` (the trigger/when-to-delegate), and optional `tools` / `model` / `skills` (preload).
|
|
43
|
+
Add it to `.claude-plugin/supercmo.json` → `agents`.
|
|
44
|
+
|
|
45
|
+
## Validate (must pass before merge)
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
python3 scripts/quick_validate.py # skills + agents + plugin manifests lint (blocking)
|
|
49
|
+
python3 scripts/listing_gate.py # scripts compile + spend/social --dry-run (blocking)
|
|
50
|
+
python3 scripts/check_shared_client.py # no raw vendor HTTP — the brokering seam (blocking)
|
|
51
|
+
python3 tests/evals/run_eval.py # trigger evals (advisory)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
CI runs the same on every push/PR (`.github/workflows/validate.yml`). Secret scanning
|
|
55
|
+
(`secret-scan.yml`) runs over full history — never commit a key.
|