@shanmukhdheekonda/skillporter 0.0.0-stage → 2.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Shanmukh Dheekonda
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,231 @@
1
- # Temporary Holding Version
1
+ # SKILLPORTER
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ ## ONE SKILL. EVERY AGENT.
4
+
5
+ **Install, manage, validate, security-scan, and synchronize AI-agent skills across the entire agent ecosystem.**
6
+
7
+ [![Python 3.9+](https://img.shields.io/badge/python-3.9%2B-blue)](https://www.python.org/)
8
+ [![Harnesses: 19 Verified](https://img.shields.io/badge/harnesses-19%20supported-00b4d8)](docs/harnesses/README.md)
9
+ [![Tests: 60 Passing](https://img.shields.io/badge/tests-60%20passing-brightgreen)](tests/)
10
+ [![Zero Dependencies](https://img.shields.io/badge/dependencies-0-success)](pyproject.toml)
11
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
12
+
13
+ <p align="center">
14
+ <img src="docs/assets/demo.svg" alt="Skillporter Terminal Demonstration" width="860" />
15
+ </p>
16
+
17
+ Every AI coding and autonomous agent harness reads skills from a **different directory**:
18
+
19
+ | Harness | Project Path | Personal / Global Path | Support |
20
+ |---|---|---|---|
21
+ | **Claude Code** | `.claude/skills/` | `~/.claude/skills/` | `NATIVE` |
22
+ | **OpenAI Codex** | `.agents/skills/` | `~/.agents/skills/` | `NATIVE` |
23
+ | **Cursor** | `.agents/skills/`, `.cursor/skills/` (+2 compat) | `~/.agents/skills/`, `~/.cursor/skills/` | `NATIVE` |
24
+ | **GitHub Copilot** | `.github/skills/`, `.agents/skills/` (+1 compat) | `~/.copilot/skills/`, `~/.agents/skills/` | `NATIVE` |
25
+ | **Gemini CLI** | `.agents/skills/`, `.gemini/skills/` | `~/.agents/skills/`, `~/.gemini/skills/` | `NATIVE` |
26
+ | **Google Antigravity** | `.agents/skills/` (+1 compat) | `~/.gemini/config/skills/` | `NATIVE` |
27
+ | **Windsurf** | `.windsurf/skills/` | `~/.codeium/windsurf/skills/` | `NATIVE` |
28
+ | **Cline** | `.cline/skills/`, `.clinerules/skills/` (+2 compat) | `~/.cline/skills/` | `NATIVE` |
29
+ | **Roo Code** | `.roo/skills/`, `.agents/skills/` | `~/.roo/skills/`, `~/.agents/skills/` | `NATIVE` |
30
+ | **OpenCode** | `.opencode/skills/`, `.agents/skills/` (+1 compat) | `~/.config/opencode/skills/` (+2 compat) | `NATIVE` |
31
+ | **Zed** | `.agents/skills/` | `~/.agents/skills/` | `NATIVE` |
32
+ | **Replit Agent** | `.agents/skills/`, `.claude/skills/` | `~/.config/agents/skills/` | `NATIVE` |
33
+ | **JetBrains Junie** | `.junie/skills/`, `.agents/skills/` | `~/.junie/skills/`, `~/.agents/skills/` | `NATIVE` |
34
+ | **Hermes Agent** | `.hermes/skills/` | `$HERMES_HOME/skills/<category>/<name>` | `NATIVE` |
35
+ | **OpenClaw** | `.openclaw/skills/`, `skills/`, `.agents/skills/` | `~/.openclaw/skills/`, `~/.agents/skills/` | `NATIVE` |
36
+ | **OpenHands** | `.agents/skills/`, `.openhands/skills/` | `~/.agents/skills/`, `~/.openhands/skills/` | `NATIVE` |
37
+ | **Goose** | `.agents/skills/`, `.goose/skills/` | `~/.agents/skills/`, `~/.config/goose/skills/` | `NATIVE` |
38
+ | **Continue** | `.continue/skills/` (`.continue/rules/` adapted) | `~/.continue/skills/` | `COMPATIBLE` |
39
+ | **Aider / AiderDesk** | `.aider-desk/skills/` (`CONVENTIONS.md` adapted) | `~/.aider-desk/skills/` | `ADAPTED` |
40
+
41
+ A skill authored for Claude Code in `.claude/skills/` is silently invisible to OpenAI Codex, Gemini CLI, Zed, and Windsurf. Hand-rolled symlinks break in Docker build contexts, `git worktree`, and Windows checkouts — while manual copies silently drift out of sync.
42
+
43
+ **Skillporter solves the entire lifecycle:** one command resolves skills from GitHub or local paths, runs a static security and supply-chain scan, deduplicates shared destinations (`.agents/skills`), tracks ownership and SHA-256 content hashes, detects content drift across copies, and supports deterministic lockfiles (`skillporter.lock`) and transactional rollback.
44
+
45
+ ---
46
+
47
+ ## One-Command Installation & Zero-Install Execution
48
+
49
+ ```bash
50
+ # 1. Run immediately via uvx from PyPI (zero install)
51
+ uvx skillporter diagnose .
52
+
53
+ # 2. Install globally via uv tool or pipx from PyPI
54
+ uv tool install skillporter
55
+ pipx install skillporter
56
+
57
+ # 3. Run via npx from npm (or directly from GitHub)
58
+ npx @shanmukhdheekonda/skillporter diagnose .
59
+ npx github:Shanmukh-l33t/skillporter diagnose .
60
+
61
+ # 4. Install globally via curl (Linux/macOS — bypasses PEP 668 externally-managed-environment)
62
+ curl -fsSL https://raw.githubusercontent.com/Shanmukh-l33t/skillporter/main/install.sh | sh
63
+ ```
64
+
65
+ ### Native Agent Integration (MCP Server)
66
+
67
+ Register Skillporter directly inside Claude Code, Codex, Cursor, Windsurf, or Hermes so your agent can diagnose, scan, and synchronize skills on command:
68
+
69
+ ```bash
70
+ claude mcp add skillporter -- uvx skillporter mcp
71
+ codex mcp add skillporter -- uvx skillporter mcp
72
+ ```
73
+
74
+ ---
75
+
76
+ ## 60-Second Quick Start
77
+
78
+ ```bash
79
+ # 1. Detect which AI agent harnesses are installed or active in your repo
80
+ skillporter detect .
81
+
82
+ # 2. Install a skill from GitHub across all detected harnesses (validates + security-scans first)
83
+ skillporter add anthropics/skills --skill pdf --harness all
84
+
85
+ # 3. Diagnose reachability, broken symlinks, duplicate loading, and SHA-256 content drift
86
+ skillporter diagnose .
87
+
88
+ # 4. Run a static supply-chain security scan on any skill directory
89
+ skillporter scan .
90
+
91
+ # 5. Initialize skillporter.yaml, synchronize teammates, and pin skillporter.lock
92
+ skillporter init
93
+ skillporter sync
94
+ skillporter lock
95
+ ```
96
+
97
+ ---
98
+
99
+ ## Real-World Evidence: Why Skillporter Exists
100
+
101
+ Built after auditing the exact failure modes reported across upstream agent ecosystems:
102
+
103
+ - **[agentskills/agentskills#15](https://github.com/agentskills/agentskills/issues/15)** (130+ comments) — *"Claude is looking at `.claude/skills/` and GitHub Copilot is looking at `.github/skills/`… create symlinks that match the specific folder of each harness"*
104
+ - **[thn-inc/claude-tweaks#3000](https://github.com/thn-inc/claude-tweaks/issues/3000)** — skill resolution misses `.agents/skills` when the symlink is absent or inside a **git worktree**
105
+ - **[openclaw/openclaw#14593](https://github.com/openclaw/openclaw/issues/14593)** — symlinked skill installs fail inside Docker build contexts
106
+ - **[squne121/loop-protocol](https://github.com/squne121/loop-protocol/issues)** — replacing broken Codex skill symlinks with a fail-closed `.agents/skills` bridge
107
+
108
+ ---
109
+
110
+ ## Key Features
111
+
112
+ ### 1. Universal Source Resolution (`skillporter add`)
113
+ Install skills from:
114
+ - **GitHub shorthand**: `skillporter add owner/repo` or `skillporter add owner/repo/skills/my-skill@v1.2.0`
115
+ - **GitHub tree URLs**: `skillporter add https://github.com/owner/repo/tree/main/skills/my-skill`
116
+ - **Git URLs & commit SHAs**: `skillporter add https://example.com/skills.git --ref ceb64c6`
117
+ - **ZIP & tar.gz archives**: `skillporter add ./bundle.zip` (hardened against Zip-Slip and symlink escapes)
118
+ - **Registry slugs**: `skillporter add registry:anthropics/skills`
119
+ - **Local directories**: `skillporter add ./authoring/my-skill --harness claude-code --harness codex`
120
+
121
+ ### 2. SHA-256 Content-Drift & Duplicate Detection (`skillporter diagnose`)
122
+ Competing tools copy files once and report success forever. Skillporter hashes every file inside every installed skill copy (`SHA-256`).
123
+ - **Drift**: If you edit `.claude/skills/my-skill/SKILL.md` and forget to update `.agents/skills/my-skill/SKILL.md`, `skillporter diagnose` flags `DRIFT` with the exact diverging hashes and exits `1`.
124
+ - **Duplicate loading**: If a skill is installed in both `.agents/skills` and `.cursor/skills`, `diagnose` flags `DUPLICATE` so Cursor does not load the same skill twice.
125
+
126
+ ### 3. Static Security & Supply-Chain Protection (`skillporter scan`)
127
+ Agent skills contain natural-language instructions and executable scripts. Before installing any skill, Skillporter inspects all Markdown and script files for:
128
+ - **Embedded secrets & private keys** (`sec-private-key`, `sec-aws-key`, `sec-github-token`, `sec-api-key`)
129
+ - **Prompt injection & covert overrides** (`sec-prompt-override`, `sec-hidden-unicode`, `sec-html-comment-instruction`)
130
+ - **Dangerous execution patterns** (`sec-curl-pipe-sh`, `sec-reverse-shell`, `sec-credential-harvest`, `sec-dynamic-eval`)
131
+ - **Filesystem escapes** (`sec-symlink-escape`, `sec-path-traversal`, `sec-binary-artifact`)
132
+
133
+ *Transparency note: Static scanning inspects files for known dangerous patterns and structural escapes; it does not guarantee runtime safety.*
134
+
135
+ ### 4. Manifest (`skillporter.yaml`), Lockfile (`skillporter.lock`) & Rollback
136
+ Declare your project's skills in `skillporter.yaml`:
137
+
138
+ ```yaml
139
+ schema_version: 1
140
+ project: acme-platform
141
+ scope: project
142
+ strategy: copy
143
+ security_policy: HIGH
144
+ harnesses:
145
+ - claude-code
146
+ - codex
147
+ - cursor
148
+ - github-copilot
149
+ skills:
150
+ - name: skillporter
151
+ source: Shanmukh-l33t/skillporter/skills/skillporter
152
+ ref: main
153
+ ```
154
+
155
+ Run `skillporter sync` to reconcile the workspace, `skillporter lock` to pin exact git commits and SHA-256 tree hashes in `skillporter.lock`, and `skillporter rollback <skill>` to restore the previous snapshot from `.skillporter/backups/` if an update introduces a regression.
156
+
157
+ ---
158
+
159
+ ## CLI Reference
160
+
161
+ | Command | Description |
162
+ |---|---|
163
+ | `skillporter add <source>` | Resolve, validate, security-scan, and install skills from GitHub, Git, archive, or local path |
164
+ | `skillporter diagnose [path]` | Check reachability, broken symlinks, SHA-256 content drift, duplicates, and spec compliance |
165
+ | `skillporter doctor [path] [--fix]` | Run full workspace health check and optionally auto-repair missing/drifted installs |
166
+ | `skillporter scan [path]` | Run static supply-chain and prompt-injection security assessment |
167
+ | `skillporter validate [path]` | Validate `SKILL.md` frontmatter and body against the [Agent Skills spec](https://agentskills.io/specification) |
168
+ | `skillporter inspect <source>` | Inspect a local or remote skill package (files, scripts, security, adapted previews) before installing |
169
+ | `skillporter detect [path]` | Detect which AI agent harnesses are installed on the machine or active in the project |
170
+ | `skillporter matrix` | Print the 19-harness compatibility and verification matrix (`--json` supported) |
171
+ | `skillporter init [path]` | Generate `skillporter.yaml` from discovered skills and active harnesses |
172
+ | `skillporter sync [path]` | Reconcile workspace skills across target harnesses and update `skillporter.lock` |
173
+ | `skillporter lock [path]` | Write deterministic `skillporter.lock` with SHA-256 content tree hashes |
174
+ | `skillporter list [path]` | List managed and discovered skills with ownership, hashes, and active harnesses |
175
+ | `skillporter update [skill]` | Update tracked skills from their recorded upstream source |
176
+ | `skillporter rollback <skill>` | Restore a skill to its previous backup snapshot in `.skillporter/backups/` |
177
+ | `skillporter install <path>` | Low-level local directory installer (`--strategy copy\|symlink`, `--adapt`, `--force`) |
178
+ | `skillporter remove <skill>` | Remove a skill from target harnesses (`uninstall` alias supported) |
179
+ | `skillporter search [query]` | Search the seed and configured skill registry catalog |
180
+ | `skillporter info <target>` | Show detailed metadata for a harness adapter or registry package |
181
+ | `skillporter pack [path]` | Build an immutable `.tar.gz` release archive and `provenance.json` checksum manifest |
182
+ | `skillporter mcp` | Start the zero-dependency stdio JSON-RPC 2.0 MCP server |
183
+
184
+ ### Exit Codes (CI Contract)
185
+ - `0` — Clean / all checks passed
186
+ - `1` — Findings detected (missing reachability, content drift, broken symlink, spec error, or security policy block)
187
+ - `2` — Usage or runtime error (invalid path, unknown harness, unsafe overwrite refusal)
188
+
189
+ ---
190
+
191
+ ## GitHub Action Integration
192
+
193
+ Validate `SKILL.md` compliance, scan for security risks, and verify harness reachability automatically on every pull request:
194
+
195
+ ```yaml
196
+ name: Skillporter Check
197
+ on: [push, pull_request]
198
+ jobs:
199
+ skills:
200
+ runs-on: ubuntu-latest
201
+ steps:
202
+ - uses: actions/checkout@v4
203
+ - uses: Shanmukh-l33t/skillporter@v2
204
+ with:
205
+ command: validate
206
+ path: .
207
+ run-security-scan: "true"
208
+ ```
209
+
210
+ ---
211
+
212
+ ## Documentation
213
+
214
+ - [Getting Started](docs/getting-started/README.md)
215
+ - [Installation & Distribution (uvx, npx, binaries, MCP)](docs/installation/README.md)
216
+ - [Supported Harnesses & Evidence Directory (19 Harnesses)](docs/harnesses/README.md)
217
+ - [CLI Command Reference](docs/commands/README.md)
218
+ - [Configuration (`skillporter.yaml` & `skillporter.lock`)](docs/configuration/README.md)
219
+ - [Security & Supply-Chain Model](docs/security/README.md)
220
+ - [System Architecture](ARCHITECTURE.md)
221
+ - [Adapter Development SDK](docs/adapters/README.md)
222
+ - [Registry & Immutable Packaging](docs/registry/README.md)
223
+ - [Troubleshooting](docs/troubleshooting/README.md)
224
+ - [Contributing Guide](CONTRIBUTING.md)
225
+ - [Product Roadmap](ROADMAP.md)
226
+
227
+ ---
228
+
229
+ ## License
230
+
231
+ MIT — see [LICENSE](LICENSE).
package/npm/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # skillporter (NPX Wrapper)
2
+
3
+ **ONE SKILL. EVERY AGENT.**
4
+
5
+ This npm package provides the zero-install `npx skillporter` CLI launcher for the [Skillporter](https://github.com/Shanmukh-l33t/skillporter) universal Agent Skill package manager.
6
+
7
+ ## Usage
8
+
9
+ ```bash
10
+ # Diagnose skill reachability and SHA-256 drift across harnesses
11
+ npx skillporter diagnose .
12
+
13
+ # Install a skill from GitHub across all detected harnesses
14
+ npx skillporter add owner/repository --harness all
15
+
16
+ # Static security & supply-chain scan
17
+ npx skillporter scan .
18
+
19
+ # Synchronize skills from skillporter.yaml
20
+ npx skillporter sync
21
+ ```
22
+
23
+ ## Architecture
24
+
25
+ `npx skillporter` is a thin Node.js launcher that invokes the bundled, zero-dependency `skillporter.pyz` Python core (or delegates to `uvx skillporter`), ensuring 100% identical behavior across `npx`, `uvx`, `pipx`, and standalone binaries.
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Skillporter NPX Launcher
4
+ *
5
+ * Thin Node.js wrapper that delegates 100% of execution to the authoritative
6
+ * Skillporter Python core (bundled `skillporter.pyz`, local `python3`/`python`,
7
+ * or `uvx skillporter`). Never duplicates business logic.
8
+ */
9
+
10
+ const { spawnSync } = require("child_process");
11
+ const path = require("path");
12
+ const fs = require("fs");
13
+
14
+ const args = process.argv.slice(2);
15
+ const bundledPyz = path.join(__dirname, "skillporter.pyz");
16
+ const repoRoot = path.resolve(__dirname, "..", "..");
17
+
18
+ function hasCommand(cmd, checkArgs = ["--version"]) {
19
+ const res = spawnSync(cmd, checkArgs, { stdio: "ignore" });
20
+ return res.status === 0;
21
+ }
22
+
23
+ function runAndExit(cmd, cmdArgs, extraEnv = {}) {
24
+ const res = spawnSync(cmd, cmdArgs, {
25
+ stdio: "inherit",
26
+ env: Object.assign({}, process.env, extraEnv),
27
+ });
28
+ if (res.error) {
29
+ console.error(`skillporter launcher error: ${res.error.message}`);
30
+ process.exit(2);
31
+ }
32
+ process.exit(res.status !== null ? res.status : 1);
33
+ }
34
+
35
+ // 1. Prefer bundled zero-dependency zipapp with python3 / python / py -3
36
+ if (fs.existsSync(bundledPyz)) {
37
+ for (const py of ["python3", "python"]) {
38
+ if (hasCommand(py)) {
39
+ runAndExit(py, [bundledPyz, ...args]);
40
+ }
41
+ }
42
+ if (process.platform === "win32" && hasCommand("py", ["-3", "--version"])) {
43
+ runAndExit("py", ["-3", bundledPyz, ...args]);
44
+ }
45
+ }
46
+
47
+ // 2. Fallback: run from source checkout if inside the repository
48
+ if (fs.existsSync(path.join(repoRoot, "skillporter", "__main__.py"))) {
49
+ for (const py of ["python3", "python"]) {
50
+ if (hasCommand(py)) {
51
+ runAndExit(py, ["-m", "skillporter", ...args], { PYTHONPATH: repoRoot });
52
+ }
53
+ }
54
+ }
55
+
56
+ // 3. Fallback: delegate to uvx if installed
57
+ if (hasCommand("uvx")) {
58
+ runAndExit("uvx", ["skillporter", ...args]);
59
+ }
60
+
61
+ console.error(
62
+ "error: Skillporter requires Python 3.9+ or `uvx` in PATH.\n" +
63
+ "Install Python from https://www.python.org/ or uv from https://docs.astral.sh/uv/"
64
+ );
65
+ process.exit(2);
Binary file
package/package.json CHANGED
@@ -1,6 +1,40 @@
1
1
  {
2
2
  "name": "@shanmukhdheekonda/skillporter",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "2.0.1",
4
+ "description": "ONE SKILL. EVERY AGENT. Universal package manager, validator, security scanner, and synchronizer for AI-agent skills.",
5
+ "keywords": [
6
+ "agent-skills",
7
+ "ai-agents",
8
+ "claude-code",
9
+ "codex",
10
+ "cursor",
11
+ "windsurf",
12
+ "github-copilot",
13
+ "gemini-cli",
14
+ "hermes",
15
+ "openclaw",
16
+ "openhands",
17
+ "goose",
18
+ "mcp"
19
+ ],
20
+ "homepage": "https://github.com/Shanmukh-l33t/skillporter",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/Shanmukh-l33t/skillporter.git"
24
+ },
25
+ "license": "MIT",
26
+ "author": "Shanmukh Dheekonda",
27
+ "bin": {
28
+ "skillporter": "./npm/bin/skillporter.js",
29
+ "skillporter-cli": "./npm/bin/skillporter.js"
30
+ },
31
+ "files": [
32
+ "npm/bin/skillporter.js",
33
+ "npm/bin/skillporter.pyz",
34
+ "README.md",
35
+ "LICENSE"
36
+ ],
37
+ "engines": {
38
+ "node": ">=16.0.0"
39
+ }
40
+ }