mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-27 11:20:42 +01:00
## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - Skills are how operators give agents reusable, reviewable operating instructions without baking every integration into core runtime code. > - Finance setup is a sensitive workflow because account onboarding, incorporation, cards, spend controls, and data sharing can all create real-world effects. > - Ramp publishes an agent-facing setup skill and playbooks, but Paperclip needs a curated wrapper that makes those instructions subordinate to Paperclip governance. > - This pull request adds an optional Ramp catalog skill that fetches Ramp's live entrypoint while preserving Paperclip approval gates. > - The benefit is that companies can opt into Ramp setup assistance while reviewers can see the source model, allowed hosts, and fail-closed safety rules in one shipped catalog entry. ## Linked Issues or Issue Description No public GitHub issue exists for this optional catalog skill. Feature request context: - **Problem / motivation:** Paperclip companies need a safe, installable way for agents to follow Ramp's public agent setup flow without giving those fetched instructions authority over financial, legal, credential, or spend decisions. - **Proposed solution:** Ship a markdown-only optional `paperclipai:optional:finance:ramp` skill that points agents at Ramp's live get-started skill, documents the thin-wrapper source model, allowlists the Ramp host, and requires Paperclip approval for financial, incorporation, credential, connector, third-party tool, and money-movement actions. - **Alternatives considered:** Vendoring a snapshot would reduce runtime source drift but would stale quickly as Ramp updates its own onboarding flow. The wrapper instead fetches fresh instructions while explicitly failing closed on unclear provenance and keeping fetched instructions subordinate to Paperclip instructions. - **Roadmap alignment:** This fits the completed Skills Manager roadmap area by adding a focused optional catalog skill rather than expanding core workflow code. ## What Changed - Added a markdown-only optional Ramp skill under the finance catalog. - Documented the source model for live Ramp instructions, the allowed host, provenance handling, community/unclear playbook approval requirements, and safety rules. - Added mandatory Paperclip approval gates for Ramp account setup, incorporation/legal filings, CLI installers, connector/auth flows, third-party browser/MCP/CLI tooling, financial data sharing, Agent Cards, spend controls, and money movement. - Updated the Skills Store guide to document thin fetch-and-follow wrappers for curated optional skills. - Regenerated the shipped skills catalog manifest. - Added catalog tests for the Ramp entry, approval-gate wording, mixed-provenance handling, and avoiding remote-fetch execution hard-stop patterns. ## Verification - `pnpm --filter @paperclipai/skills-catalog build:manifest` - `pnpm --filter @paperclipai/skills-catalog validate` - `pnpm --filter @paperclipai/skills-catalog test -- src/shipped-catalog.test.ts` — 1 file, 8 tests passed. - `git diff --check` ## Risks - Ramp-hosted instructions can change after install. The wrapper mitigates this by keeping fetched content subordinate to Paperclip instructions, limiting the source host, failing closed on unclear provenance, and requiring scoped approvals before governed actions. - The skill is markdown-only and optional, so it does not add executable package code or install by default. - The generated catalog manifest changes hashes for the shipped catalog entry; catalog validation passed after regeneration. ## Model Used OpenAI Codex, GPT-5-based coding agent, with repository file access, shell execution, GitHub CLI/tooling, and medium-reasoning mode. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [ ] All Paperclip CI gates are green - [ ] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [ ] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <noreply@paperclip.ing>
978 lines
34 KiB
JSON
978 lines
34 KiB
JSON
{
|
|
"schemaVersion": 1,
|
|
"packageName": "@paperclipai/skills-catalog",
|
|
"packageVersion": "0.3.1",
|
|
"generatedAt": "2026-07-07T12:23:29.613Z",
|
|
"skills": [
|
|
{
|
|
"id": "paperclipai:bundled:docs:doc-maintenance",
|
|
"key": "paperclipai/bundled/docs/doc-maintenance",
|
|
"kind": "bundled",
|
|
"category": "docs",
|
|
"slug": "doc-maintenance",
|
|
"name": "doc-maintenance",
|
|
"description": "Keep project docs aligned with recent code and feature changes — detect drift, update affected pages, and add release-relevant notes without rewriting unchanged sections.",
|
|
"path": "catalog/bundled/docs/doc-maintenance",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"engineer",
|
|
"product",
|
|
"devrel"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"docs",
|
|
"documentation",
|
|
"release-notes"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 4478,
|
|
"sha256": "fb0353386c5e5e5e13bcbb3233f044e3dccecf371f429d6328f26c26d7cb6169"
|
|
}
|
|
],
|
|
"contentHash": "sha256:2e02299210fd17c1fe1867b4ee8c144a11b6fe1fe481f83b8268cfbaaf10f9aa"
|
|
},
|
|
{
|
|
"id": "paperclipai:bundled:paperclip-operations:issue-triage",
|
|
"key": "paperclipai/bundled/paperclip-operations/issue-triage",
|
|
"kind": "bundled",
|
|
"category": "paperclip-operations",
|
|
"slug": "issue-triage",
|
|
"name": "issue-triage",
|
|
"description": "Triage Paperclip inbox issues that are stale, blocked, in-review, or assigned-but-not-progressing, and decide a single next action per issue (resume, reassign, unblock, escalate, or close).",
|
|
"path": "catalog/bundled/paperclip-operations/issue-triage",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"manager",
|
|
"ceo",
|
|
"engineer"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"paperclip",
|
|
"triage",
|
|
"inbox",
|
|
"workflow"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 4042,
|
|
"sha256": "df5bdc8bf5e017b7ba5f70a4b5323fad51d0c323278f386580f26cf43ad09160"
|
|
}
|
|
],
|
|
"contentHash": "sha256:88dc13560371fb364963782cb4f6eeb4090fcde92ee3774479428ed6b90e11c1"
|
|
},
|
|
{
|
|
"id": "paperclipai:bundled:paperclip-operations:task-planning",
|
|
"key": "paperclipai/bundled/paperclip-operations/task-planning",
|
|
"kind": "bundled",
|
|
"category": "paperclip-operations",
|
|
"slug": "task-planning",
|
|
"name": "task-planning",
|
|
"description": "Turn a Paperclip issue or request into a structured implementation plan with child task graph, blockers, owners, and acceptance criteria, then save it as the issue `plan` document.",
|
|
"path": "catalog/bundled/paperclip-operations/task-planning",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"manager",
|
|
"engineer",
|
|
"product"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"paperclip",
|
|
"planning",
|
|
"issues",
|
|
"delegation"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 4938,
|
|
"sha256": "9c52a44a30ec8d306119da51bf298e9e3e6c382a9a9559ffd3054bf5e0c75f36"
|
|
}
|
|
],
|
|
"contentHash": "sha256:487c3116eead89fef4f71c984329c41836bd69951b7ef9ed8736c69435e02438"
|
|
},
|
|
{
|
|
"id": "paperclipai:bundled:product:paperclip-capsules",
|
|
"key": "paperclipai/bundled/product/paperclip-capsules",
|
|
"kind": "bundled",
|
|
"category": "product",
|
|
"slug": "paperclip-capsules",
|
|
"name": "paperclip-capsules",
|
|
"description": "Generate, implement, or review Paperclip capsule visuals. Use when the user asks for Paperclip capsule art, capsule banks, agent capsule visuals, heartbeat status capsules, capsule identicons, capsule graphic-generator output, or validation of Paperclip capsule brand usage.",
|
|
"path": "catalog/bundled/product/paperclip-capsules",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"designer",
|
|
"product",
|
|
"engineer",
|
|
"marketing"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"paperclip",
|
|
"brand",
|
|
"capsules",
|
|
"agents",
|
|
"visual-design",
|
|
"hyperframes"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 5930,
|
|
"sha256": "eda40e8f29cae07c2ce8ad1cef3406eae243dbbf52069a85cfb56fe7999a25ff"
|
|
},
|
|
{
|
|
"path": "references/generator-workflows.md",
|
|
"kind": "reference",
|
|
"sizeBytes": 4356,
|
|
"sha256": "b5f72e5b6683e8f93f2d852e84c2cc19e6ab438b250bf777dfb2480dd4f6e1b6"
|
|
},
|
|
{
|
|
"path": "references/hero-capsule-bank.md",
|
|
"kind": "reference",
|
|
"sizeBytes": 5981,
|
|
"sha256": "ec3d34113aa7bb527560d1eb4d8ab7667c73e18284c85a2019122743a767525a"
|
|
},
|
|
{
|
|
"path": "references/identicon-prototyper.md",
|
|
"kind": "reference",
|
|
"sizeBytes": 6669,
|
|
"sha256": "0b19419efa1396a402097decabe24ea9ae649678569449c8ce855e0678df6bfe"
|
|
},
|
|
{
|
|
"path": "references/individual-status-capsules.md",
|
|
"kind": "reference",
|
|
"sizeBytes": 5031,
|
|
"sha256": "be1f2eccf96b4d2deefe45b3bc1dd0a3597278472c2ffedadc43c57161e9103d"
|
|
}
|
|
],
|
|
"contentHash": "sha256:e8f502f9556103bd575bb664a9d21b1004869990802e639a188a720012116909"
|
|
},
|
|
{
|
|
"id": "paperclipai:bundled:product:wireframe",
|
|
"key": "paperclipai/bundled/product/wireframe",
|
|
"kind": "bundled",
|
|
"category": "product",
|
|
"slug": "wireframe",
|
|
"name": "wireframe",
|
|
"description": "Produce low-fidelity black-and-white UI wireframes as standalone SVG files, optionally bundled into a single-page HTML viewer and published via the here-now skill. Use when the user asks to \"wireframe X\", \"sketch a screen for\", \"draft a layout\", \"low-fi mockup\", \"rough mock\", \"make a page to view the wireframes\", \"build a viewer for these screens\", or to \"deploy / publish / host the wireframes\". Do NOT use when the user wants production UI code, branded designs, hi-fi mockups, or animated/interactive prototypes — use frontend-design or similar instead.",
|
|
"path": "catalog/bundled/product/wireframe",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "assets",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"designer",
|
|
"product",
|
|
"engineer"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"design",
|
|
"wireframe",
|
|
"ux",
|
|
"prototyping",
|
|
"svg"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 11887,
|
|
"sha256": "a910d038d8cdd13615b82f44a2195b781ebccf01c49f9c58babd43b0701fe644"
|
|
},
|
|
{
|
|
"path": "assets/site-template.html",
|
|
"kind": "asset",
|
|
"sizeBytes": 14791,
|
|
"sha256": "8886ad77c386c17b0457f11624aab136c33db7f28dcd6f10fc18e9d833d0950f"
|
|
},
|
|
{
|
|
"path": "assets/template-mobile.svg",
|
|
"kind": "asset",
|
|
"sizeBytes": 925,
|
|
"sha256": "dc32af257df1f986b87a7b30a6104de825057dc4d6f12b381f5a28308f0002f0"
|
|
},
|
|
{
|
|
"path": "assets/template.svg",
|
|
"kind": "asset",
|
|
"sizeBytes": 1262,
|
|
"sha256": "63f8adb8eb4b21dea6fd442b9e9312704c419535eb577d4ef0bfb54410fd576b"
|
|
},
|
|
{
|
|
"path": "references/components.md",
|
|
"kind": "reference",
|
|
"sizeBytes": 14806,
|
|
"sha256": "4ce18f418d78b13cdfa6fe8070173044a631576cd2b999571e6703f58894496c"
|
|
},
|
|
{
|
|
"path": "references/examples.md",
|
|
"kind": "reference",
|
|
"sizeBytes": 16108,
|
|
"sha256": "18f486e95a578a50cf6c9f93394b82534392771320692e4876edf17054bfae55"
|
|
},
|
|
{
|
|
"path": "references/grid-system.md",
|
|
"kind": "reference",
|
|
"sizeBytes": 4581,
|
|
"sha256": "017260d2216859d57e5fa869e0efc6b88c7ed4d8a8a4f5af04fe89a3ef2445bd"
|
|
}
|
|
],
|
|
"contentHash": "sha256:0bd9a9fdc656d529e3f97c00cd504dcf72d3a4fecb8b0504ca2fe3e00d63287f"
|
|
},
|
|
{
|
|
"id": "paperclipai:bundled:quality:qa-acceptance",
|
|
"key": "paperclipai/bundled/quality/qa-acceptance",
|
|
"kind": "bundled",
|
|
"category": "quality",
|
|
"slug": "qa-acceptance",
|
|
"name": "qa-acceptance",
|
|
"description": "Produce QA acceptance criteria and a manual validation plan for a feature change — golden path, edge cases, error states, performance limits, and explicit pass/fail evidence.",
|
|
"path": "catalog/bundled/quality/qa-acceptance",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"qa",
|
|
"engineer",
|
|
"product"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"qa",
|
|
"acceptance",
|
|
"validation",
|
|
"testing"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 3861,
|
|
"sha256": "c631b437ab26d104af6cdb963d8f679a9341439041b3cb3ec8835f4ff551b378"
|
|
}
|
|
],
|
|
"contentHash": "sha256:32372dacaf62e93454b9855968c4eec96456ba78b509f450b3dfaa48e31ef356"
|
|
},
|
|
{
|
|
"id": "paperclipai:bundled:software-development:github-pr-workflow",
|
|
"key": "paperclipai/bundled/software-development/github-pr-workflow",
|
|
"kind": "bundled",
|
|
"category": "software-development",
|
|
"slug": "github-pr-workflow",
|
|
"name": "github-pr-workflow",
|
|
"description": "Prepare a GitHub pull request from a feature branch — branch hygiene, commit shape, title/body, verification notes, screenshots for UI work, and replies to review comments.",
|
|
"path": "catalog/bundled/software-development/github-pr-workflow",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"engineer"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"github",
|
|
"pull-requests",
|
|
"code-review",
|
|
"release"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 3970,
|
|
"sha256": "f498ec4ebb1779dea37adeb1db8a8b22316282798e35ee02e2fc5ff627d7e261"
|
|
}
|
|
],
|
|
"contentHash": "sha256:90f278c89aa0711be150c1cd2456ca25620d02f36995b113ca9837d756a37f6c"
|
|
},
|
|
{
|
|
"id": "paperclipai:optional:browser:agent-browser",
|
|
"key": "paperclipai/optional/browser/agent-browser",
|
|
"kind": "optional",
|
|
"category": "browser",
|
|
"slug": "agent-browser",
|
|
"name": "agent-browser",
|
|
"description": "Drive a real browser to inspect or interact with a web page or app — navigate, take screenshots, read console and network, fill simple forms — for verification tasks, not unattended automation.",
|
|
"path": "catalog/optional/browser/agent-browser",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"qa",
|
|
"engineer",
|
|
"researcher"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"browser",
|
|
"puppeteer",
|
|
"playwright",
|
|
"verification"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 5133,
|
|
"sha256": "362f7b9d02297782bc6f0c093f495b8a0304a75bcf4b42e5c280a42b1f757b7d"
|
|
}
|
|
],
|
|
"contentHash": "sha256:eabb2c9f7b5e1a27ebb1e05a711d61433a266478154cd671a685e99e67aadea2"
|
|
},
|
|
{
|
|
"id": "paperclipai:optional:content:release-announcement",
|
|
"key": "paperclipai/optional/content/release-announcement",
|
|
"kind": "optional",
|
|
"category": "content",
|
|
"slug": "release-announcement",
|
|
"name": "release-announcement",
|
|
"description": "Write a release announcement — changelog, blog post, in-app note, or social post — that leads with user impact, names the audience, and includes upgrade/migration steps without filler.",
|
|
"path": "catalog/optional/content/release-announcement",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"devrel",
|
|
"product",
|
|
"writer"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"release",
|
|
"changelog",
|
|
"announcement",
|
|
"communication"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 4416,
|
|
"sha256": "062810ac34e9edc89efa701fec2eee60f16949d1944cc2cae49803cb91e8cbf4"
|
|
}
|
|
],
|
|
"contentHash": "sha256:f22a9ed696e6614c6db2757a149f48b3295e81f78c27d065d9cb164cf4f8a9bd"
|
|
},
|
|
{
|
|
"id": "paperclipai:optional:finance:ramp",
|
|
"key": "paperclipai/optional/finance/ramp",
|
|
"kind": "optional",
|
|
"category": "finance",
|
|
"slug": "ramp",
|
|
"name": "ramp",
|
|
"description": "Fetch and follow Ramp's published agent playbooks inside Paperclip, with mandatory approval gates for spend, incorporation, cards, account setup, and other financial actions.",
|
|
"path": "catalog/optional/finance/ramp",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"finance",
|
|
"operations",
|
|
"founder",
|
|
"engineer"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"ramp",
|
|
"finance",
|
|
"spend",
|
|
"approvals",
|
|
"agent-cards"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 7016,
|
|
"sha256": "698cd69ebf2f2481ed83c8e9477b56ae78288cc4c751d7d35f649ff2483802a3"
|
|
}
|
|
],
|
|
"contentHash": "sha256:276d85e98a4732f278204e26438aa95fde158dd2d15c1e427c4c7c7d492e769d"
|
|
},
|
|
{
|
|
"id": "paperclipai:optional:product:design-critique",
|
|
"key": "paperclipai/optional/product/design-critique",
|
|
"kind": "optional",
|
|
"category": "product",
|
|
"slug": "design-critique",
|
|
"name": "design-critique",
|
|
"description": "Give a structured product design critique — user job clarity, hierarchy, affordance, error states, accessibility, and consistency — focused on what to change, in what order, and why.",
|
|
"path": "catalog/optional/product/design-critique",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"designer",
|
|
"product",
|
|
"engineer"
|
|
],
|
|
"requires": [],
|
|
"tags": [
|
|
"design",
|
|
"product",
|
|
"ux",
|
|
"review"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 4851,
|
|
"sha256": "022e619baf6cc25725946279cb8052d22af090dd6cd6dc8c20f17867f71a5d8e"
|
|
}
|
|
],
|
|
"contentHash": "sha256:429f94df398a0697042b5bbe4755b1ff1a230aa5f41d99118ad37493ac65d21c"
|
|
},
|
|
{
|
|
"id": "paperclipai:optional:research:last30days",
|
|
"key": "paperclipai/optional/research/last30days",
|
|
"kind": "optional",
|
|
"category": "research",
|
|
"slug": "last30days",
|
|
"name": "last30days",
|
|
"description": "Research what people actually say about any topic in the last 30 days. Pulls posts and engagement from Reddit, X, YouTube, TikTok, Hacker News, Polymarket, GitHub, and the web.",
|
|
"path": "catalog/optional/research/last30days",
|
|
"entrypoint": "SKILL.md",
|
|
"trustLevel": "scripts_executables",
|
|
"compatibility": "compatible",
|
|
"defaultInstall": false,
|
|
"recommendedForRoles": [
|
|
"researcher",
|
|
"marketer",
|
|
"product-manager",
|
|
"analyst"
|
|
],
|
|
"requires": [
|
|
"node",
|
|
"python3"
|
|
],
|
|
"tags": [
|
|
"research",
|
|
"last-30-days",
|
|
"social-media",
|
|
"trends",
|
|
"citations",
|
|
"reddit",
|
|
"x",
|
|
"youtube"
|
|
],
|
|
"files": [
|
|
{
|
|
"path": "SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 130813,
|
|
"sha256": "534f0347f304ec51254a7d3a210e07c86cc252175cc6a588e97d32ce94f0f745"
|
|
},
|
|
{
|
|
"path": "agents/openai.yaml",
|
|
"kind": "other",
|
|
"sizeBytes": 448,
|
|
"sha256": "f46e7f09d3118dee7324ac165391ccb7ffe55323d1d75304e34062017913939c"
|
|
},
|
|
{
|
|
"path": "references/save-html-brief.md",
|
|
"kind": "reference",
|
|
"sizeBytes": 5940,
|
|
"sha256": "ca15e03bf63a3af1cfa0347df36b0aee999c6c6c631f31b4171a5df09e765d43"
|
|
},
|
|
{
|
|
"path": "scripts/briefing.py",
|
|
"kind": "script",
|
|
"sizeBytes": 8342,
|
|
"sha256": "d4881d16493f5504c5a947f31ced861d674e2423e5fc668305beaf5e849420b7"
|
|
},
|
|
{
|
|
"path": "scripts/compare.sh",
|
|
"kind": "script",
|
|
"sizeBytes": 2291,
|
|
"sha256": "cdb2538522a60c803aeebc3336673c8702380a902604ad85770206382996a6f5"
|
|
},
|
|
{
|
|
"path": "scripts/last30days.py",
|
|
"kind": "script",
|
|
"sizeBytes": 44282,
|
|
"sha256": "818d6b839eb04417a5d0acf3bee24258fbc70543df968619fd3573597dc88e8e"
|
|
},
|
|
{
|
|
"path": "scripts/lib/__init__.py",
|
|
"kind": "script",
|
|
"sizeBytes": 29,
|
|
"sha256": "3fb925405f898201188f9b5eea04e214ea8c8a64643397fd727f08ffeea234d9"
|
|
},
|
|
{
|
|
"path": "scripts/lib/bird_x.py",
|
|
"kind": "script",
|
|
"sizeBytes": 17960,
|
|
"sha256": "c7cbd33a5b4c317b07eeca7c7e3c1aa57369487cd4cd3602abbe9b6acb019e6a"
|
|
},
|
|
{
|
|
"path": "scripts/lib/bluesky.py",
|
|
"kind": "script",
|
|
"sizeBytes": 12343,
|
|
"sha256": "af7bbaa68f6944a50089447992b95881e15c085de829426360f50740a35cba89"
|
|
},
|
|
{
|
|
"path": "scripts/lib/categories.py",
|
|
"kind": "script",
|
|
"sizeBytes": 7635,
|
|
"sha256": "e4ab8435e09c371f2475751fdc1c58150799b3746afcc7e38d5dad30adb210d5"
|
|
},
|
|
{
|
|
"path": "scripts/lib/chrome_cookies.py",
|
|
"kind": "script",
|
|
"sizeBytes": 10911,
|
|
"sha256": "eeb8f99b92cfc9aa65b20b6dbedfcfd321166f3fa771a95299ffb0b950b1cedc"
|
|
},
|
|
{
|
|
"path": "scripts/lib/cluster.py",
|
|
"kind": "script",
|
|
"sizeBytes": 11018,
|
|
"sha256": "fa9fb8905552e7bb5a2a2854f8b3c620a464054238a008d74ba89d0c247a776e"
|
|
},
|
|
{
|
|
"path": "scripts/lib/competitors.py",
|
|
"kind": "script",
|
|
"sizeBytes": 7332,
|
|
"sha256": "a76c5d679b7f3c93a07e389811f79526f11e1e03411cecd4d9569e3aca32a77d"
|
|
},
|
|
{
|
|
"path": "scripts/lib/cookie_extract.py",
|
|
"kind": "script",
|
|
"sizeBytes": 14450,
|
|
"sha256": "9d34ea3a8565eae8b67f72e8b625c22a29d41274c3b8d6c8b6aa171c18ebad5b"
|
|
},
|
|
{
|
|
"path": "scripts/lib/dates.py",
|
|
"kind": "script",
|
|
"sizeBytes": 3201,
|
|
"sha256": "ae4ec6455021c82ef3321ef5dde6f7ba41e6b91a3e6ff601174ac9aa20e5c8f9"
|
|
},
|
|
{
|
|
"path": "scripts/lib/dedupe.py",
|
|
"kind": "script",
|
|
"sizeBytes": 3315,
|
|
"sha256": "b9acabf496e0743189fbeed43d447280fee17e10a40931f9083d2a1f2894d863"
|
|
},
|
|
{
|
|
"path": "scripts/lib/digg.py",
|
|
"kind": "script",
|
|
"sizeBytes": 13305,
|
|
"sha256": "95a2845d4751efb5738d2a69c7246f8269447395a7da324e0d6ae0feefd7c9d8"
|
|
},
|
|
{
|
|
"path": "scripts/lib/entity_extract.py",
|
|
"kind": "script",
|
|
"sizeBytes": 4211,
|
|
"sha256": "b04103103981915557fd410305f3a8031d5e71d687491ca89976be25d9bc84a4"
|
|
},
|
|
{
|
|
"path": "scripts/lib/env.py",
|
|
"kind": "script",
|
|
"sizeBytes": 25940,
|
|
"sha256": "9ca2e2341565a6c933d51800a510d07b84707825d19234d991eb472454b46933"
|
|
},
|
|
{
|
|
"path": "scripts/lib/fanout.py",
|
|
"kind": "script",
|
|
"sizeBytes": 3155,
|
|
"sha256": "43f21244f9bd1bf143d2f4c478cc2fcc9ffc4e403539e8c08e86e106ed5f0b83"
|
|
},
|
|
{
|
|
"path": "scripts/lib/fusion.py",
|
|
"kind": "script",
|
|
"sizeBytes": 8553,
|
|
"sha256": "c764709a7d4576121c193ae75ded057dd177b6bea512ca57dd72680d74030b41"
|
|
},
|
|
{
|
|
"path": "scripts/lib/github.py",
|
|
"kind": "script",
|
|
"sizeBytes": 34879,
|
|
"sha256": "0f8eb97c20463b975b3bb752d0e3afec98ef853430e495f21fc06f01c27d2baf"
|
|
},
|
|
{
|
|
"path": "scripts/lib/grounding.py",
|
|
"kind": "script",
|
|
"sizeBytes": 11723,
|
|
"sha256": "440386c32afb3c01678fe5dfab197449a9a910018a40cbbc1e9e10ecb9d4843a"
|
|
},
|
|
{
|
|
"path": "scripts/lib/hackernews.py",
|
|
"kind": "script",
|
|
"sizeBytes": 11619,
|
|
"sha256": "95db30a3bf441ee73fb49a04fa8974440e381e56c7d70e87b48e3b69ae0cdfa5"
|
|
},
|
|
{
|
|
"path": "scripts/lib/html_render.py",
|
|
"kind": "script",
|
|
"sizeBytes": 17791,
|
|
"sha256": "5070f6a58d6fcae44a20ecd9108fd204b042bea1d47f8a67efce6d3831aa87ad"
|
|
},
|
|
{
|
|
"path": "scripts/lib/http.py",
|
|
"kind": "script",
|
|
"sizeBytes": 10191,
|
|
"sha256": "760308aa8b8e3abbaa3273a4ca4df5b0bc8cc71ba8864b5740aaac545972731e"
|
|
},
|
|
{
|
|
"path": "scripts/lib/instagram.py",
|
|
"kind": "script",
|
|
"sizeBytes": 18874,
|
|
"sha256": "cda8c8558e6cdc9b4bf3f7bb470c2e223db927acc6a77f139a83ec7987488bb1"
|
|
},
|
|
{
|
|
"path": "scripts/lib/log.py",
|
|
"kind": "script",
|
|
"sizeBytes": 831,
|
|
"sha256": "11c4d61cdb5b1ff91919dcd28ec62ce88e555def30eed62a8071973b5ffe8317"
|
|
},
|
|
{
|
|
"path": "scripts/lib/normalize.py",
|
|
"kind": "script",
|
|
"sizeBytes": 19870,
|
|
"sha256": "e79e294e4ff8ebfa34f7561c63e0846af0380b8be299d484cc8a2f490e82b474"
|
|
},
|
|
{
|
|
"path": "scripts/lib/perplexity.py",
|
|
"kind": "script",
|
|
"sizeBytes": 4789,
|
|
"sha256": "70859e7296035936ae0da441119edfe381158d5d0de06afee87a3504007f91c7"
|
|
},
|
|
{
|
|
"path": "scripts/lib/pinterest.py",
|
|
"kind": "script",
|
|
"sizeBytes": 5366,
|
|
"sha256": "a6ac5085c900072b84930fafab8c81c9e5a792a718c21801d3fa0bd293d279f6"
|
|
},
|
|
{
|
|
"path": "scripts/lib/pipeline.py",
|
|
"kind": "script",
|
|
"sizeBytes": 45491,
|
|
"sha256": "9641f56faff2d685b0c5c483b2113721d151174a2eef265afe644e131c554454"
|
|
},
|
|
{
|
|
"path": "scripts/lib/planner.py",
|
|
"kind": "script",
|
|
"sizeBytes": 30490,
|
|
"sha256": "c0953abea402454a88c2573aa0c97bb6bba4c87e529d9f157a881e15c4123154"
|
|
},
|
|
{
|
|
"path": "scripts/lib/polymarket.py",
|
|
"kind": "script",
|
|
"sizeBytes": 30318,
|
|
"sha256": "cbd54a66988b4ebc4aebf2db6c637d4e516065518c333cd0495332458c2d9080"
|
|
},
|
|
{
|
|
"path": "scripts/lib/preflight.py",
|
|
"kind": "script",
|
|
"sizeBytes": 4541,
|
|
"sha256": "0fafa53bc63a44ad4525d99d6bb37080b0693e2d45265ce36af09b4a0e9b2c9b"
|
|
},
|
|
{
|
|
"path": "scripts/lib/providers.py",
|
|
"kind": "script",
|
|
"sizeBytes": 15817,
|
|
"sha256": "7460004a2e8df0f8c94d764c0eb01f8d782bb160ce2e157105fadd0dd2953a5d"
|
|
},
|
|
{
|
|
"path": "scripts/lib/quality_nudge.py",
|
|
"kind": "script",
|
|
"sizeBytes": 13438,
|
|
"sha256": "69b6d58abea8171c895f105ee62b2db6f7ea35cebbe08d7e6e8884d810891fef"
|
|
},
|
|
{
|
|
"path": "scripts/lib/query.py",
|
|
"kind": "script",
|
|
"sizeBytes": 4018,
|
|
"sha256": "6bc2e0649034cdb28471346a66e2448ba58762cb7774c4fce45c055ab160912a"
|
|
},
|
|
{
|
|
"path": "scripts/lib/reddit_enrich.py",
|
|
"kind": "script",
|
|
"sizeBytes": 9535,
|
|
"sha256": "652a9c5abecf22f3c26ff6d6b732a43703113a559ce31acab7af012eb25d4e7a"
|
|
},
|
|
{
|
|
"path": "scripts/lib/reddit_public.py",
|
|
"kind": "script",
|
|
"sizeBytes": 13066,
|
|
"sha256": "ea25034726aa895c123216e356c03856a8116efedd29620bb2ebc0d01ff4c420"
|
|
},
|
|
{
|
|
"path": "scripts/lib/reddit.py",
|
|
"kind": "script",
|
|
"sizeBytes": 24701,
|
|
"sha256": "dba1019f67f677c869f14a1f892b1562dd10b6f96bffc75ffad37eb4d3bc9877"
|
|
},
|
|
{
|
|
"path": "scripts/lib/relevance.py",
|
|
"kind": "script",
|
|
"sizeBytes": 5941,
|
|
"sha256": "b9f776f9f8e5d4fbf1fcc86f6604bc0c391c988153d3264b8dc431ff34783382"
|
|
},
|
|
{
|
|
"path": "scripts/lib/render.py",
|
|
"kind": "script",
|
|
"sizeBytes": 71577,
|
|
"sha256": "189ffa786428515a3b02f680e71069b7907eaa24c7aadd315e9abaecb0a6a9fc"
|
|
},
|
|
{
|
|
"path": "scripts/lib/rerank.py",
|
|
"kind": "script",
|
|
"sizeBytes": 17106,
|
|
"sha256": "419c52fc08144c41e08f7574093c5b6cd21271900b51680b6393e61441ffea3c"
|
|
},
|
|
{
|
|
"path": "scripts/lib/resolve.py",
|
|
"kind": "script",
|
|
"sizeBytes": 12448,
|
|
"sha256": "b23f3dd54d6ede0986219aacdda81ece72f1a0a629d72a9ec56b24bc645ccb7c"
|
|
},
|
|
{
|
|
"path": "scripts/lib/safari_cookies.py",
|
|
"kind": "script",
|
|
"sizeBytes": 5698,
|
|
"sha256": "4d66c27cbf5725cc7cb815ca42191e70261c52196c2823bab9c6050ca32ccf71"
|
|
},
|
|
{
|
|
"path": "scripts/lib/schema.py",
|
|
"kind": "script",
|
|
"sizeBytes": 11206,
|
|
"sha256": "8d815d3daee8d469e504bb1264fc174af4abc179dd7d1fa87d7313ed01d914c6"
|
|
},
|
|
{
|
|
"path": "scripts/lib/setup_wizard.py",
|
|
"kind": "script",
|
|
"sizeBytes": 18688,
|
|
"sha256": "be0f867e96d15f7458faac2194c444dc0ec9ec4f3c9fe4d74459e083b80c1a73"
|
|
},
|
|
{
|
|
"path": "scripts/lib/signals.py",
|
|
"kind": "script",
|
|
"sizeBytes": 9715,
|
|
"sha256": "4071cf5fa4c99b0ee51d949ca69ec4594d7e1986ec6a8019b55bb877e219d49a"
|
|
},
|
|
{
|
|
"path": "scripts/lib/skill_meta.py",
|
|
"kind": "script",
|
|
"sizeBytes": 1207,
|
|
"sha256": "e922e6ecdb19fa3daf9c6673acb13a9b23f97362eac1cb11211c998dea0fdbd1"
|
|
},
|
|
{
|
|
"path": "scripts/lib/snippet.py",
|
|
"kind": "script",
|
|
"sizeBytes": 1560,
|
|
"sha256": "6bd2143a4264fe11d5be1b805742336ab82397ae0293c13e8b5b3084bfa2612d"
|
|
},
|
|
{
|
|
"path": "scripts/lib/subproc.py",
|
|
"kind": "script",
|
|
"sizeBytes": 2807,
|
|
"sha256": "cf7bf3dcaf79375c5bd014718a8eb5f6565275294eeaa0059fef93d8e4b6452d"
|
|
},
|
|
{
|
|
"path": "scripts/lib/threads.py",
|
|
"kind": "script",
|
|
"sizeBytes": 6728,
|
|
"sha256": "7508629028c3b4a187699797ab0d9e7b179cbae3c53b9fabdaf9d905b1fc2c1d"
|
|
},
|
|
{
|
|
"path": "scripts/lib/tiktok.py",
|
|
"kind": "script",
|
|
"sizeBytes": 20993,
|
|
"sha256": "f0074737c4bbf176118382ad4c0c9e8c8d6f4544bd9fc42d224f7c1da13a8d73"
|
|
},
|
|
{
|
|
"path": "scripts/lib/truthsocial.py",
|
|
"kind": "script",
|
|
"sizeBytes": 5196,
|
|
"sha256": "fd745d0a61b1c69bea813832f3e2c5923b08d476766a378c07f0963b0be2f330"
|
|
},
|
|
{
|
|
"path": "scripts/lib/ui.py",
|
|
"kind": "script",
|
|
"sizeBytes": 25907,
|
|
"sha256": "cdc0ea376fc4ee017449f2aa87a7513add3fa5306f27d4663fb6f7203f12974e"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/bird-search.mjs",
|
|
"kind": "script",
|
|
"sizeBytes": 3998,
|
|
"sha256": "584482e894c38bbde7a915013f741974fa8ea722ac34c56704dccf184f7c3d56"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/cookies.js",
|
|
"kind": "script",
|
|
"sizeBytes": 8153,
|
|
"sha256": "66044440cef3d3b3e3136091b6e224051e8ff97fb1d156f40ccf2d4f3cf203ae"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/features.json",
|
|
"kind": "script",
|
|
"sizeBytes": 523,
|
|
"sha256": "36361f4cae0040255f84709459ebb1f0131566a567269ed7b99d073cad930f66"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/paginate-cursor.js",
|
|
"kind": "script",
|
|
"sizeBytes": 1225,
|
|
"sha256": "5f20227de1d68250ad59b7ad593db4bfb1d0f1a21694963eab3ed413c2d0d5c0"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/query-ids.json",
|
|
"kind": "script",
|
|
"sizeBytes": 815,
|
|
"sha256": "eba47a9d26f87d0b4eb8a4f554833ed8d11b3d8728e363deeae702d09f87fc02"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/runtime-features.js",
|
|
"kind": "script",
|
|
"sizeBytes": 5036,
|
|
"sha256": "f41614d62b6c91dfc85fc4af389e6f49435324bf26460b715a991486609579d8"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/runtime-query-ids.js",
|
|
"kind": "script",
|
|
"sizeBytes": 9424,
|
|
"sha256": "0f5c61dbaad3de7fb44a14c57ed005228e51f9fc361472eff59bff4cb2a1199e"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/twitter-client-base.js",
|
|
"kind": "script",
|
|
"sizeBytes": 4853,
|
|
"sha256": "ea972b7894458e78edd1927d102a052ae45726a7c967b376ac7f5544f5b65499"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/twitter-client-constants.js",
|
|
"kind": "script",
|
|
"sizeBytes": 2535,
|
|
"sha256": "27bd1416ff1f5d4f4516d784a8fb9ee08a87413f07b375752821a32e5b0cd6e3"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/twitter-client-features.js",
|
|
"kind": "script",
|
|
"sizeBytes": 18400,
|
|
"sha256": "4b4f2048069f751a821777cb2084f3b9126d99a958494fef71f0699d8145c4dd"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/twitter-client-search.js",
|
|
"kind": "script",
|
|
"sizeBytes": 7310,
|
|
"sha256": "3dfbe18ea54215d9a6393ff0884d9977dd9ddf0884a06486bdaee8a4e30d4616"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/twitter-client-types.js",
|
|
"kind": "script",
|
|
"sizeBytes": 59,
|
|
"sha256": "6450f74c664db958d703e09288184ef1ca5f622782f9e11a5a9bfa3d3c78c534"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/lib/twitter-client-utils.js",
|
|
"kind": "script",
|
|
"sizeBytes": 19169,
|
|
"sha256": "b230db5583760ccd0b5b5fb1592f449a7d0bc92f6184808e8ffb6f8968df20e9"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/LICENSE",
|
|
"kind": "script",
|
|
"sizeBytes": 1074,
|
|
"sha256": "62316704df7426e5a79d2827ff8aca36e9abb3a73b8e68557030749ebefec667"
|
|
},
|
|
{
|
|
"path": "scripts/lib/vendor/bird-search/package.json",
|
|
"kind": "script",
|
|
"sizeBytes": 331,
|
|
"sha256": "96b65305969a179ee7a7735f1b475599d6035f32fda1fd030ea57ee09380cdb5"
|
|
},
|
|
{
|
|
"path": "scripts/lib/xai_x.py",
|
|
"kind": "script",
|
|
"sizeBytes": 7509,
|
|
"sha256": "6cc244293ed6ea3b0f78a6515b583ff36da96ad30acf1d5457278ab020f1bd47"
|
|
},
|
|
{
|
|
"path": "scripts/lib/xiaohongshu_api.py",
|
|
"kind": "script",
|
|
"sizeBytes": 5321,
|
|
"sha256": "c7a29dfa03f871993dc13a8ad528beed8a648102404b658242ca57878077ef60"
|
|
},
|
|
{
|
|
"path": "scripts/lib/xquik.py",
|
|
"kind": "script",
|
|
"sizeBytes": 6839,
|
|
"sha256": "7c487cb2ba543ff12e38ec6466a2de6ff6762ccd415c1f07093620b49137681a"
|
|
},
|
|
{
|
|
"path": "scripts/lib/xurl_x.py",
|
|
"kind": "script",
|
|
"sizeBytes": 5302,
|
|
"sha256": "8cf6bb235cfc7f39386b282a922487816089fa6ebf4fa49a4d562d95f9686e78"
|
|
},
|
|
{
|
|
"path": "scripts/lib/youtube_yt.py",
|
|
"kind": "script",
|
|
"sizeBytes": 37339,
|
|
"sha256": "787908d06a845ad70654c4939ebabc856311a95b34444f0987ff7ee3db4c0a49"
|
|
},
|
|
{
|
|
"path": "scripts/setup-keychain.sh",
|
|
"kind": "script",
|
|
"sizeBytes": 3229,
|
|
"sha256": "5d2a6b678c905eefe537fbcb98063db3e471c22b7ab4b06d51615d99b14556db"
|
|
},
|
|
{
|
|
"path": "scripts/store.py",
|
|
"kind": "script",
|
|
"sizeBytes": 28534,
|
|
"sha256": "c1e95a00132768e6c38170bee85161a59b5bce3feaa6297a85f1a49d1bfc9fd3"
|
|
},
|
|
{
|
|
"path": "scripts/watchlist.py",
|
|
"kind": "script",
|
|
"sizeBytes": 8929,
|
|
"sha256": "c06378f70f9145f3bd957170dec2549a31463a41b400bbf1ce722911aa2150a1"
|
|
}
|
|
],
|
|
"contentHash": "sha256:9e11e9d2ed3d2062273d131a826cdeedea39bdd269063e2f73ca7f218770c769",
|
|
"source": {
|
|
"type": "github",
|
|
"hostname": "github.com",
|
|
"owner": "mvanhorn",
|
|
"repo": "last30days-skill",
|
|
"ref": "v3.3.0",
|
|
"commit": "daca71f89eb71d0d56d01a43ed7627aa919dba4f",
|
|
"path": "skills/last30days",
|
|
"url": "https://github.com/mvanhorn/last30days-skill/tree/v3.3.0/skills/last30days"
|
|
}
|
|
}
|
|
]
|
|
}
|