{"id":50455153,"url":"https://github.com/gay00ung/workcue","last_synced_at":"2026-06-01T02:01:24.571Z","repository":{"id":361130098,"uuid":"1252989186","full_name":"gay00ung/workcue","owner":"gay00ung","description":"Local-first morning brief for GitHub, Jira, and Obsidian, with more connectors planned.","archived":false,"fork":false,"pushed_at":"2026-05-29T09:24:22.000Z","size":1418,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T10:24:38.088Z","etag":null,"topics":["ai","automation","cli","developer-tools","docker","github","jira","llm","local-first","markdown","mcp","morning-brief","nodejs","obsidian","open-source","productivity","self-hosted","task-management","typescript","workflow"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gay00ung.png","metadata":{"files":{"readme":"README.ko.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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-05-29T04:04:11.000Z","updated_at":"2026-05-29T09:24:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/gay00ung/workcue","commit_stats":null,"previous_names":["gay00ung/workcue"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/gay00ung/workcue","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gay00ung%2Fworkcue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gay00ung%2Fworkcue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gay00ung%2Fworkcue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gay00ung%2Fworkcue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gay00ung","download_url":"https://codeload.github.com/gay00ung/workcue/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gay00ung%2Fworkcue/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33756581,"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-01T02:00:06.963Z","response_time":115,"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","automation","cli","developer-tools","docker","github","jira","llm","local-first","markdown","mcp","morning-brief","nodejs","obsidian","open-source","productivity","self-hosted","task-management","typescript","workflow"],"created_at":"2026-06-01T02:01:23.829Z","updated_at":"2026-06-01T02:01:24.559Z","avatar_url":"https://github.com/gay00ung.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WorkCue\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"README.md\"\u003e\u003cimg alt=\"Language English\" src=\"https://img.shields.io/badge/lang-English-2563eb?style=flat\"\u003e\u003c/a\u003e\n  \u003ca href=\"README.ko.md\"\u003e\u003cimg alt=\"Language Korean\" src=\"https://img.shields.io/badge/lang-%ED%95%9C%EA%B5%AD%EC%96%B4-16a34a?style=flat\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"Local first\" src=\"https://img.shields.io/badge/local--first-yes-0f766e?style=flat\"\u003e\n  \u003cimg alt=\"MCP ready\" src=\"https://img.shields.io/badge/MCP-ready-7c3aed?style=flat\"\u003e\n  \u003cimg alt=\"No telemetry\" src=\"https://img.shields.io/badge/telemetry-none-111827?style=flat\"\u003e\n  \u003cimg alt=\"Release alpha\" src=\"https://img.shields.io/badge/release-v0.1.0--alpha.2-f59e0b?style=flat\"\u003e\n  \u003cimg alt=\"TypeScript\" src=\"https://img.shields.io/badge/TypeScript-5.x-3178c6?style=flat\"\u003e\n  \u003cimg alt=\"pnpm\" src=\"https://img.shields.io/badge/pnpm-10.x-f69220?style=flat\"\u003e\n  \u003cimg alt=\"Docker\" src=\"https://img.shields.io/badge/Docker-ready-2496ed?style=flat\"\u003e\n  \u003cimg alt=\"License Apache 2.0\" src=\"https://img.shields.io/badge/license-Apache--2.0-64748b?style=flat\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/workcue-hero.png\" alt=\"WorkCue morning brief hero\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n업무 도구는 그대로, 오늘 할 일만 자동으로.\n\nWorkCue는 Jira, GitHub, Obsidian 같은 기존 업무 도구에 흩어진 일을 읽고, 오늘 집중해야 할 작업을 근거와 함께 추천하는 로컬 우선 morning planner입니다. 새로운 todo 앱이나 칸반 보드를 만들지 않습니다. 이미 쓰는 업무 시스템을 source of truth로 유지하고, 그 위에 아침 브리핑 레이어를 얹습니다.\n\n## 설치\n\n배포된 CLI package를 쓰려면 WorkCue source checkout 밖에서 npm을 사용합니다.\n\n```bash\nnpm install -g workcue@alpha\nworkcue today --demo\n```\n\nglobal install 없이 바로 실행할 수도 있습니다.\n\n```bash\nnpx workcue@alpha today --demo\n```\n\n이 repository를 clone해서 개발할 때는 pnpm을 사용합니다.\n\n```bash\npnpm install\npnpm today --demo\n```\n\n이 source checkout 안에서는 `npm install workcue`를 실행하지 않습니다. 이 repository는 pnpm workspace를 사용하므로 npm과 pnpm이 관리하는 `node_modules`를 섞으면 npm arborist 오류가 날 수 있습니다.\n\n## Demo\n\n내장 fixture만으로 실행할 수 있습니다. API token이나 외부 서비스가 필요 없습니다.\n\n```bash\npnpm install\npnpm demo --date 2026-05-29\n```\n\nCLI package를 직접 실행할 수도 있습니다.\n\n```bash\npnpm today --demo --date 2026-05-29\n```\n\n로컬 Obsidian vault의 unchecked task를 읽으려면:\n\n```bash\npnpm today --obsidian-vault /path/to/vault --date 2026-05-29\n```\n\nNotion 칸반 데이터베이스나 data source를 읽으려면:\n\n```bash\nexport NOTION_TOKEN=\"secret_...\"\npnpm today --notion-board \"https://www.notion.so/workspace/Tasks-0123456789abcdef0123456789abcdef\" --date 2026-05-29\n```\n\nWorkCue는 Notion row의 title, status, due date, priority, assignee, project, labels, estimate 같은 속성을 읽습니다. 이 preview에서는 page body 내용 전체를 읽지 않습니다.\n\nbrief를 만들기 전에 정규화된 source item만 확인하려면:\n\n```bash\npnpm sync --demo --date 2026-05-29\n```\n\nsync 결과를 로컬 SQLite cache에 저장하려면:\n\n```bash\npnpm sync --demo --date 2026-05-29 --cache .workcue/workcue.sqlite\n```\n\n특정 추천 항목의 점수 근거를 설명하려면:\n\n```bash\npnpm explain github:pr-184 --demo --date 2026-05-29\n```\n\nObsidian connector는 이런 markdown task를 읽습니다.\n\n```markdown\n- [ ] Review billing PR #work 2026-05-30 [estimate:: 25m]\n- [ ] Follow up with design #waiting [due:: 2026-05-31]\n```\n\nbrief를 markdown 파일로 저장하려면:\n\n```bash\npnpm today --obsidian-vault /path/to/vault --output ./briefs/2026-05-29.md\n```\n\n기존 Obsidian daily note에 WorkCue block만 upsert하려면:\n\n```bash\npnpm today --obsidian-vault /path/to/vault --daily-note /path/to/vault/Daily/2026-05-29.md\n```\n\n반복 실행 시 `\u003c!-- workcue:start --\u003e`부터 `\u003c!-- workcue:end --\u003e` 사이의 managed block만 교체됩니다. 사용자가 직접 작성한 note 내용은 보존됩니다.\n\n예시 출력:\n\n```markdown\n# WorkCue Morning Brief - 2026-05-29\n\nTop recommendation: Review PR #184: Fix payment retry race condition\n\n## Today's Focus\n\n1. Review PR #184: Fix payment retry race condition\n   Why now:\n   - 사용자 리뷰가 요청된 항목입니다.\n   - 현재 milestone에 포함된 작업입니다.\n   - production 영향이 있는 작업입니다.\n```\n\n## 현재 범위\n\n- TypeScript와 pnpm 기반 monorepo\n- WorkItem, Signal, Recommendation, Brief core model\n- deterministic demo scoring\n- Obsidian markdown task connector\n- GitHub Issues/PR connector\n- Jira issue connector\n- Notion kanban database/data source connector preview\n- Markdown morning brief renderer\n- Markdown file output\n- Obsidian daily note upsert\n- MCP stdio server: `workcue_sync`, `workcue_today`, `workcue_explain`, `workcue_doctor`\n- sync 결과용 로컬 SQLite cache\n- 로컬 container 실행용 Dockerfile\n- CLI commands: `workcue sync`, `workcue explain`, `workcue today --demo`\n- CLI source options: `--obsidian-vault \u003cpath\u003e`, `--notion-board \u003curl-or-id\u003e`\n\n## 제품 원칙\n\n- 새로운 todo 앱을 만들지 않습니다.\n- 초기 버전은 read-first, write-later 원칙을 지킵니다.\n- optional LLM summary보다 deterministic scoring을 먼저 수행합니다.\n- 모든 추천에는 evidence가 있어야 합니다.\n- local-first와 self-hostable을 기본으로 합니다.\n- source와 output은 pluggable하게 확장합니다.\n\n## 개발\n\n```bash\npnpm install\npnpm build\npnpm typecheck\npnpm test\npnpm today --demo\n```\n\n## Alpha Release Check\n\nWorkCue alpha package는 Node.js 24 이상을 기준으로 합니다.\n\n```bash\npnpm install --frozen-lockfile\npnpm release:check\n```\n\nrelease check는 `dist` build, test, 공개 파일 개인정보 패턴 scan, compiled CLI와 MCP tool handler smoke, package tarball 생성, 임시 prefix 설치 검증까지 수행합니다.\n\n## 로컬 설정\n\n로컬 config 파일을 생성합니다.\n\n```bash\npnpm --filter workcue dev init --output .workcue/config.yml\n```\n\nObsidian과 output path를 함께 설정합니다.\n\n```bash\npnpm --filter workcue dev init \\\n  --output .workcue/config.yml \\\n  --obsidian-vault /path/to/vault \\\n  --markdown-output ./briefs/{{date}}.md \\\n  --daily-note /path/to/vault/Daily/{{date}}.md\n```\n\nNotion 칸반 링크를 함께 설정할 수도 있습니다.\n\n```bash\npnpm --filter workcue dev init \\\n  --output .workcue/config.yml \\\n  --notion-board \"https://www.notion.so/workspace/Tasks-0123456789abcdef0123456789abcdef\"\n```\n\nNotion token 값은 config에 저장하지 않고 환경변수에 둡니다.\n\n```bash\nexport NOTION_TOKEN=\"secret_...\"\n```\n\nconfig를 점검합니다.\n\n```bash\npnpm doctor --config .workcue/config.yml\n```\n\nconfig 기반으로 실행합니다.\n\n```bash\npnpm today --config .workcue/config.yml --date 2026-05-29\n```\n\nGitHub config는 token 값이 아니라 환경변수 이름만 저장합니다.\n\n```yaml\nsources:\n  github:\n    enabled: true\n    tokenEnv: GITHUB_TOKEN\n    owner: your-org\n    repos:\n      - your-repo\n    user: your-github-login\n```\n\nJira config도 credential 값이 아니라 환경변수 이름만 저장합니다.\n\n```yaml\nsources:\n  jira:\n    enabled: true\n    baseUrl: https://your-domain.atlassian.net\n    emailEnv: JIRA_EMAIL\n    tokenEnv: JIRA_API_TOKEN\n    jql:\n      - assignee = currentUser() AND statusCategory != Done\n```\n\nNotion config는 board link나 ID와 token 환경변수 이름만 저장합니다.\n\n```yaml\nsources:\n  notion:\n    enabled: true\n    tokenEnv: NOTION_TOKEN\n    boards:\n      - url: https://www.notion.so/workspace/Tasks-0123456789abcdef0123456789abcdef\n        titleProperty: Name\n        statusProperty: Status\n        dueProperty: Due\n        priorityProperty: Priority\n        assigneeProperty: Owner\n        projectProperty: Project\n```\n\n`workcue init`으로 생성되는 local config는 SQLite cache를 기본으로 켭니다.\n\n```yaml\ncache:\n  sqlite:\n    enabled: true\n    path: .workcue/workcue.sqlite\n```\n\ndeterministic scoring은 signal multiplier로 조정할 수 있습니다.\n\n```yaml\nscoring:\n  signalWeights:\n    review_requested: 1.3\n    due_soon: 1.2\n    waiting_external: 0.7\n```\n\nLLM summary는 기본적으로 꺼져 있습니다. OpenAI-compatible endpoint나 Ollama를 켜려면 `llm.enabled`를 설정하고 API key 값은 환경변수에 둡니다.\n\n```yaml\nllm:\n  enabled: true\n  provider: openai-compatible\n  baseUrl: https://api.openai.com\n  model: model-name\n  apiKeyEnv: OPENAI_API_KEY\n```\n\n## MCP Server\n\nWorkCue는 Codex, Claude Desktop, Cursor 같은 MCP client에서 같은 morning brief를 조회할 수 있도록 로컬 MCP server를 제공합니다.\n\n제공 tools:\n\n- `workcue_sync`: source를 읽고 raw connector payload 없는 normalized item summary를 반환합니다.\n- `workcue_today`: demo data, Obsidian vault, configured sources에서 morning brief를 생성합니다.\n- `workcue_explain`: 특정 work item의 deterministic score와 추천 근거를 설명합니다.\n- `workcue_doctor`: 외부 source fetch 없이 config readiness를 점검합니다.\n\nstdio server를 실행합니다.\n\n```bash\npnpm mcp\n```\n\nMCP client config 예시입니다.\n\n```json\n{\n  \"mcpServers\": {\n    \"workcue\": {\n      \"command\": \"pnpm\",\n      \"args\": [\"--dir\", \"/path/to/workcue\", \"mcp\"]\n    }\n  }\n}\n```\n\ntool arguments 예시입니다.\n\n```json\n{\n  \"demo\": true,\n  \"date\": \"2026-05-29\",\n  \"top\": 3\n}\n```\n\n`configPath`로 로컬 `.workcue/config.yml`을 지정할 수 있습니다. `GITHUB_TOKEN`, `JIRA_EMAIL`, `JIRA_API_TOKEN` 같은 credential 값은 환경변수에 두고, WorkCue config에는 환경변수 이름만 저장합니다.\n\n## 문서\n\n- [Automation](docs/automation.md)\n- [Local cache](docs/cache.md)\n- [Docker](docs/docker.md)\n- [LLM summaries](docs/llm.md)\n- [MCP server](docs/mcp.md)\n- [Release guide](docs/release.md)\n- [Scoring](docs/scoring.md)\n- [Obsidian daily note recipe](docs/recipes/obsidian-daily-note.md)\n- [GitHub PR review radar recipe](docs/recipes/github-pr-review-radar.md)\n- [Notion kanban recipe](docs/recipes/notion-kanban.md)\n- [Troubleshooting](docs/troubleshooting.md)\n- [Changelog](CHANGELOG.md)\n\n프로젝트 하네스는 `.codex/harnesses/workcue-engineering/`에 있습니다. 로컬 경로는 Git에 올라가지 않는 `.codex/local.env`에만 둡니다. 공개 template은 `.codex/local.example.env`를 사용합니다.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgay00ung%2Fworkcue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgay00ung%2Fworkcue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgay00ung%2Fworkcue/lists"}