Files
PaperClipAI/packages/skills-catalog/generated/catalog.json
T
1f1f545238 feat: add built-in summarizer and summary slots (#9713)
## Thinking Path

> - Paperclip is the open source control plane people use to organize,
govern, and understand AI-agent work
> - Operators need concise, current status views across projects and
execution workspaces without manually reading every issue and run
> - Paperclip already has auditable issues, documents, built-in agents,
routines, and live run events, but no first-class summary-slot workflow
connecting those systems
> - A built-in Summarizer can generate status prose through ordinary
governed tasks while summary slots provide stable, revisioned
destinations for that output
> - The UI needs to show current summaries, generation progress,
failures, revisions, and streaming draft status in the places operators
already work
> - This pull request adds the end-to-end summary-slot data, API, agent,
orchestration, and UI surfaces behind an experimental setting
> - The benefit is decision-oriented status context that remains
company-scoped, auditable, retryable, and inexpensive by default

## Linked Issues or Issue Description

No public GitHub issue exists for this feature.

**Problem**

Operators currently have to reconstruct project and workspace status by
reading many issues, runs, and comments. This makes it hard to identify
decisions, review queues, recent work, and the next event worth
watching.

**Proposed capability**

Add an experimental summary system with revisioned summary slots for
projects and workspaces, a paused-by-default built-in Summarizer agent,
governed generation tasks, live draft status, and reusable UI cards.

**Expected behavior**

- Summary data remains company-scoped and revisions remain auditable.
- Generation runs through normal issue/agent orchestration and
deduplicates active requests.
- Only the linked built-in Summarizer generation task can author a slot
revision.
- Operators can generate, retry, inspect revisions, and follow draft
progress from project and workspace views.
- The feature remains opt-in and background generation remains paused by
default.

## What Changed

- Added summary-slot schema, idempotent migrations, shared contracts,
validators, API paths, and service tests.
- Added company-scoped summary-slot routes for reading revisions,
requesting generation, and guarded Summarizer writes with activity
logging.
- Added terminal generation finalization, failure reasons, assignment
wakeups, and orchestration integration.
- Added the paused-by-default built-in Summarizer bundle, low-cost
runtime defaults, status-summarization skill, and stale-summary routine.
- Added summary cards, revision selection, retry/configuration states,
live draft streaming, transcript chunk handling, and project/workspace
integrations.
- Updated Claude local parsing for streamed status output and expanded
server, adapter, shared, database, catalog, and UI coverage.

## Verification

- `pnpm -r typecheck`
- `pnpm exec vitest run packages/db/src/summary-slots-schema.test.ts
packages/shared/src/summary-slot.test.ts
server/src/__tests__/summary-slot-routes.test.ts
server/src/__tests__/summary-slots.test.ts
server/src/__tests__/built-in-agents.test.ts
ui/src/components/SummarySlotCard.test.tsx
ui/src/components/SummarySlotCard.status.test.tsx
ui/src/components/useSummaryDraftStream.test.tsx
ui/src/lib/summary-draft-stream.test.ts
ui/src/lib/run-log-chunks.test.ts
ui/src/context/LiveUpdatesProvider.hook.test.tsx` — 113 tests passed
- `pnpm test:run` — server and UI suites passed; one CLI AWS doctor test
was affected by inherited `AWS_ACCESS_KEY_ID`/`AWS_SECRET_ACCESS_KEY`,
and passed when those host credentials were removed
- `pnpm exec vitest run cli/src/__tests__/secrets.test.ts` with
inherited AWS credential variables removed — 8 tests passed
- `pnpm build`
- `pnpm check:token-gates` currently reports nine `#9627` comment
references introduced by current `master`; none are in this PR diff

## Risks

- Database risk is limited by incrementally ordered, idempotent
migrations and migration safety checks.
- Summary generation creates normal issues/runs, so misconfiguration can
produce failed slots; the UI exposes retryable failure reasons and agent
configuration entry points.
- Streaming draft parsing depends on the documented `STATUS:` protocol;
final persisted revisions remain the source of truth.
- The feature is experimental, opt-in, and its built-in routine is
paused with no background token spend by default.

> For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and
discuss it in `#dev` before opening the PR. Feature PRs that overlap
with planned core work may need to be redirected — check the roadmap
first. See `CONTRIBUTING.md`.

## Model Used

- OpenAI GPT-5.3 Codex with reasoning, repository tool use, code
execution, GitHub CLI, and Paperclip control-plane integration. Earlier
branch commits also record Claude model co-authorship where applicable.

## 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
- [x] All Paperclip CI gates are green
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:03:07 -05:00

1048 lines
36 KiB
JSON

{
"schemaVersion": 1,
"packageName": "@paperclipai/skills-catalog",
"packageVersion": "0.3.1",
"generatedAt": "2026-07-15T22:20:53.895Z",
"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:reflection-coach",
"key": "paperclipai/bundled/paperclip-operations/reflection-coach",
"kind": "bundled",
"category": "paperclip-operations",
"slug": "reflection-coach",
"name": "reflection-coach",
"description": "Reflect on another agent's recent execution record and propose the smallest durable instruction, skill, or tool-description change. Use for evidence-backed coaching proposals, never hot-swaps.",
"path": "catalog/bundled/paperclip-operations/reflection-coach",
"entrypoint": "SKILL.md",
"trustLevel": "markdown_only",
"compatibility": "compatible",
"defaultInstall": false,
"recommendedForRoles": [
"manager",
"general"
],
"requires": [],
"tags": [
"paperclip",
"reflection",
"coaching",
"agents",
"skills"
],
"files": [
{
"path": "SKILL.md",
"kind": "skill",
"sizeBytes": 11837,
"sha256": "86d6e382c32c626213b46c010cc7fc1ec460821a8c777cfa5b8e86fa9d6a86b2"
}
],
"contentHash": "sha256:1c7a82cd9638a1d845b238032da3ff4ad80c5b6a87dca46082f501fa4583db55"
},
{
"id": "paperclipai:bundled:paperclip-operations:summarize-status",
"key": "paperclipai/bundled/paperclip-operations/summarize-status",
"kind": "bundled",
"category": "paperclip-operations",
"slug": "summarize-status",
"name": "summarize-status",
"description": "Write a short, colloquial summary for a Paperclip summary slot: open with the one or two decisions the reader must make — or, when nothing needs deciding, what to review — each with a recommendation, close with one or two recent pieces of work and where they stand, streaming status as it works.",
"path": "catalog/bundled/paperclip-operations/summarize-status",
"entrypoint": "SKILL.md",
"trustLevel": "markdown_only",
"compatibility": "compatible",
"defaultInstall": false,
"recommendedForRoles": [
"general",
"manager"
],
"requires": [],
"tags": [
"paperclip",
"summary",
"status",
"reporting",
"operations"
],
"files": [
{
"path": "SKILL.md",
"kind": "skill",
"sizeBytes": 16744,
"sha256": "6bfacf153b602cdbba4c0edef64956adf8d11c1819bf1b9494a67abb6d4705eb"
}
],
"contentHash": "sha256:d7e2a979d95f99ee9d7a341a860602dcdfb7a2feb4d2390fccbaddc838d2da51"
},
{
"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 for capsule art, agent capsules, heartbeat status capsules, identicons, capsule banks, or brand-usage validation.",
"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": 5831,
"sha256": "dd659ccb46e105336eb00fbe689b1d5531347fc69493c3156390d40ee413c93e"
},
{
"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:a2b26cf6895affeeb70c85567a061094450a59bd3c4fdcf28ee65858599ac12c"
},
{
"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 SVGs or viewer pages. Use when asked to wireframe, sketch a screen, draft a layout, make a low-fi mockup, or publish wireframes.",
"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": 11509,
"sha256": "6992047cc97b67211cc8c1183718ab9aa26b8afc34c70d54d20558c215daaf48"
},
{
"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:7106d84fc9db2053090f692706e41cfc586e7dd85a44f568e3319c4eefbdde46"
},
{
"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": 6945,
"sha256": "d745cca96350518fabae14f5c407d779e1df2c5d091b5b4a5c55bb888b569e5f"
}
],
"contentHash": "sha256:efe8ea89b552df95222609867c9c75f1b40e16f457d34e7e4a124f54daa33efa"
},
{
"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"
}
}
]
}