{"id":50521136,"url":"https://github.com/dryvist/claude-code-routines","last_synced_at":"2026-06-03T04:03:18.083Z","repository":{"id":352055763,"uuid":"1213500585","full_name":"dryvist/claude-code-routines","owner":"dryvist","description":"Scheduled Claude Code routines for automated GitHub portfolio management — PR triage, repo polish, health scoring, and daily briefings","archived":false,"fork":false,"pushed_at":"2026-05-29T02:51:12.000Z","size":214,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T05:23:28.895Z","etag":null,"topics":["ai-agents","automation","claude-code","claude-code-routines","cron-jobs","developer-tools","devops","github-actions","github-automation","scheduled-tasks"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dryvist.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-17T12:56:35.000Z","updated_at":"2026-05-29T02:51:14.000Z","dependencies_parsed_at":"2026-05-03T03:02:46.109Z","dependency_job_id":null,"html_url":"https://github.com/dryvist/claude-code-routines","commit_stats":null,"previous_names":["jacobpevans/claude-code-routines","dryvist/claude-code-routines"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dryvist/claude-code-routines","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dryvist%2Fclaude-code-routines","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dryvist%2Fclaude-code-routines/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dryvist%2Fclaude-code-routines/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dryvist%2Fclaude-code-routines/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dryvist","download_url":"https://codeload.github.com/dryvist/claude-code-routines/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dryvist%2Fclaude-code-routines/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33847265,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-03T02:00:06.370Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","automation","claude-code","claude-code-routines","cron-jobs","developer-tools","devops","github-actions","github-automation","scheduled-tasks"],"created_at":"2026-06-03T04:03:15.472Z","updated_at":"2026-06-03T04:03:18.060Z","avatar_url":"https://github.com/dryvist.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# claude-code-routines\n\nVersion-controlled prompt files for\n[Claude Code Routines][routines] — scheduled agents\nthat manage a GitHub portfolio. The routine prompts\nare owner-agnostic; the operator sets `$GH_OWNER`\n(or `$GH_OWNERS` for The Sentinel) and a few related\nenv vars (see\n[`docs/CLOUD_ROUTINES_AUTH.md`](docs/CLOUD_ROUTINES_AUTH.md)).\n\nSee [DESIGN.md](DESIGN.md) for the origin story,\ndesign decisions, and lessons learned.\n\n[routines]: https://docs.anthropic.com/en/docs/claude-code/routines\n\n## Routines\n\n| Routine                | Schedule           | Purpose                       |\n| ---------------------- | ------------------ | ----------------------------- |\n| [Morning Briefing][mb] | Daily 5:00 AM CT   | Read-only activity summary    |\n| [The Sentinel][se]     | Daily 12:33 AM CT  | Param/secret audit + 1 PR     |\n| [The Custodian][cu]    | Daily 2:00 AM CT   | Weighted-random maintenance   |\n| [Issue Solver][is]     | Daily 7am + 7pm CT | Solve one issue → draft PR    |\n| [Daily Polish][dp]     | Daily 11:00 PM CT  | Deep-clean one repo per day   |\n| [Weekly Scorecard][ws] | Mondays 5:00 AM CT | Portfolio health scores       |\n\n[mb]: routines/morning-briefing.prompt.md\n[se]: routines/sentinel.prompt.md\n[cu]: routines/custodian.prompt.md\n[is]: routines/issue-solver.prompt.md\n[dp]: routines/daily-polish.prompt.md\n[ws]: routines/weekly-scorecard.prompt.md\n\n## Architecture\n\nAll 6 routines share a single Claude Code cloud\nenvironment and post results to Slack via MCP.\n\n```text\n┌─────────────┐   ┌────────────────┐   ┌───────┐\n│ Cron Trigger │──▶│ Cloud Sandbox  │──▶│ Slack │\n│  (Anthropic) │   │ gh + GH_TOKEN  │   │  MCP  │\n└─────────────┘   └────────────────┘   └───────┘\n                          │\n                          ▼\n                  ┌──────────────┐\n                  │  GitHub API  │\n                  └──────────────┘\n```\n\n## Installation\n\nClaude Code cloud routines run in a shared environment.\nConfigure it at [claude.ai/code](https://claude.ai/code)\nunder environment settings.\n\n```bash\n# 1. Install gh CLI in the cloud sandbox (cached after first run)\napt update \u0026\u0026 apt install -y gh\n\n# 2. Set GH_TOKEN as an environment variable in the trigger config\nexport GH_TOKEN=\u003cyour GitHub PAT\u003e\n```\n\n### Setup Script\n\n```bash\napt update \u0026\u0026 apt install -y gh\n```\n\nThe result is cached after the first run —\n`gh` is instantly available on subsequent sessions.\n\n### Environment Variables\n\n```text\nGH_TOKEN=\u003cyour GitHub PAT\u003e\nGH_OWNER=\u003csingle owner for most routines\u003e\nGH_OWNERS=\u003ccomma-separated list, Sentinel only\u003e\nSENTINEL_OPERATOR_PATTERNS=\u003coptional, comma-separated regex list\u003e\n```\n\n`gh` reads `GH_TOKEN` automatically. `GH_OWNERS` (e.g.\n`user-a,org-b`) is consumed only by The Sentinel —\nexisting routines keep using the singular `GH_OWNER`.\n`SENTINEL_OPERATOR_PATTERNS` is an optional list of\nadditional regexes The Sentinel flags as operator-specific\nfindings (e.g. internal hostnames, project codenames).\n\n### Routine registration (cloud-hosted routines only)\n\nCloud routines are kept in sync by Claude itself during editing\nsessions in this repo — the GHA deploy workflow is currently\ndisabled (see [Deploying Changes](#deploying-changes) below).\nThe procedure lives in\n[`.claude/skills/deploy-routine-changes/SKILL.md`][skill]. A\nrepo-level hook in `.claude/settings.json` reminds Claude to\ninvoke the skill whenever a `routines/*.prompt.md` file is\nedited. For new routines, the skill opens a small follow-up PR to\nback-commit the issued `trigger_id`.\n\nCloud routines vs. GHA-managed prompts are distinguished by the\npresence of a `cron` field in YAML frontmatter; prompts without\n`cron` (e.g. `issue-solver.prompt.md`) run via their own native\nworkflows and are not touched by the skill.\n\nEnv vars and MCP connections still need a one-time setting in the\nshared cloud env at\n[`claude.ai/code/routines`](https://claude.ai/code/routines) —\nthose values are secrets and live outside the repo.\n\n[skill]: .claude/skills/deploy-routine-changes/SKILL.md\n\n### Required PAT Scopes\n\n| Scope         | Used By                                |\n| ------------- | -------------------------------------- |\n| `repo`        | All routines — read/write repo data    |\n| `delete_repo` | Custodian — branch deletion via API    |\n| `gist`        | Polish, Solver, Scorecard, Sentinel    |\n| `workflow`    | Custodian — workflow run checks        |\n| `read:org`    | All routines — org-level search        |\n| `project`     | Morning Briefing — project queries     |\n\n### MCP Connections\n\nEach routine connects to Slack for output:\n\n- **Name**: `Slack`\n- **URL**: `https://mcp.slack.com/mcp`\n\n## Deploying Changes\n\nThe GHA-based deploy at [`.github/workflows/deploy-routines.yml`][dw]\nis **currently disabled**. The `CLAUDE_CODE_OAUTH_TOKEN` it injects\ninto `anthropics/claude-code-action@v1` does not carry the org\nbinding the Anthropic Routines API needs — every `RemoteTrigger`\ncall returned `Unable to resolve organization UUID`, verified\n2026-05-19 across two consecutive token rotations. The workflow\nheader has the full diagnosis and re-enablement instructions.\n\nWhile that's upstream-blocked, the active deploy path is\n[`.claude/skills/deploy-routine-changes/SKILL.md`][skill] —\nClaude invokes it during an editing session in this repo (the\ninteractive harness has working RemoteTrigger access). A\nrepo-level hook nudges Claude to run the skill whenever a\n`routines/*.prompt.md` file is touched.\n\nFor background and the manual `/schedule update` last-resort\nfallback, see [CLAUDE.md](CLAUDE.md).\n\n[dw]: .github/workflows/deploy-routines.yml\n\n## File Structure\n\n```text\nclaude-code-routines/\n├── README.md\n├── CLAUDE.md\n├── DESIGN.md\n├── docs/\n│   └── CLOUD_ROUTINES_AUTH.md\n├── .gitignore\n├── .markdownlint-cli2.yaml\n├── .readme-validator.yaml\n├── .github/\n│   └── workflows/\n│       ├── deploy-routines.yml\n│       └── prompts/\n│           └── deploy-routines.prompt.md\n└── routines/\n    ├── .markdownlint.yaml\n    ├── custodian.prompt.md\n    ├── daily-polish.prompt.md\n    ├── issue-solver.prompt.md\n    ├── morning-briefing.prompt.md\n    ├── sentinel.prompt.md\n    └── weekly-scorecard.prompt.md\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdryvist%2Fclaude-code-routines","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdryvist%2Fclaude-code-routines","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdryvist%2Fclaude-code-routines/lists"}