taskboy 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. taskboy/__init__.py +0 -0
  2. taskboy/adapters/__init__.py +0 -0
  3. taskboy/adapters/_util.py +30 -0
  4. taskboy/adapters/aws_read.py +107 -0
  5. taskboy/adapters/confluence.py +88 -0
  6. taskboy/adapters/github_api.py +564 -0
  7. taskboy/adapters/issues.py +435 -0
  8. taskboy/adapters/jira.py +263 -0
  9. taskboy/adapters/sentry.py +82 -0
  10. taskboy/adapters/slack_history.py +204 -0
  11. taskboy/assets.py +27 -0
  12. taskboy/audit.py +78 -0
  13. taskboy/broker.py +266 -0
  14. taskboy/classifier.py +219 -0
  15. taskboy/cli.py +161 -0
  16. taskboy/config.py +539 -0
  17. taskboy/dashboard/__init__.py +5 -0
  18. taskboy/dashboard/api.py +963 -0
  19. taskboy/dashboard/app.py +78 -0
  20. taskboy/dashboard/auth.py +117 -0
  21. taskboy/dashboard/editors.py +140 -0
  22. taskboy/dashboard/gitops.py +60 -0
  23. taskboy/dashboard/render.py +48 -0
  24. taskboy/debug_feed.py +170 -0
  25. taskboy/deploy/env.example +17 -0
  26. taskboy/deploy/git-cred-helper.py +36 -0
  27. taskboy/deploy/install.sh +101 -0
  28. taskboy/deploy/remote-update.sh +52 -0
  29. taskboy/deploy/taskboy-restart.path +10 -0
  30. taskboy/deploy/taskboy-restart.service +8 -0
  31. taskboy/deploy/taskboy.service +22 -0
  32. taskboy/hooks.py +208 -0
  33. taskboy/issue_runs.py +203 -0
  34. taskboy/llm.py +125 -0
  35. taskboy/main.py +269 -0
  36. taskboy/memory.py +59 -0
  37. taskboy/models.py +103 -0
  38. taskboy/mrkdwn.py +19 -0
  39. taskboy/notify.py +41 -0
  40. taskboy/orchestrator.py +401 -0
  41. taskboy/personality.py +17 -0
  42. taskboy/prompts.py +288 -0
  43. taskboy/quick.py +234 -0
  44. taskboy/redact.py +49 -0
  45. taskboy/repocache.py +117 -0
  46. taskboy/review_requests.py +388 -0
  47. taskboy/router.py +146 -0
  48. taskboy/runner.py +581 -0
  49. taskboy/scheduler.py +301 -0
  50. taskboy/secrets.py +83 -0
  51. taskboy/settings.py +19 -0
  52. taskboy/setup_checks.py +184 -0
  53. taskboy/setup_wizard.py +699 -0
  54. taskboy/skills.py +95 -0
  55. taskboy/slack.py +666 -0
  56. taskboy/slack_users.py +32 -0
  57. taskboy/started_messages.py +33 -0
  58. taskboy/store.py +1393 -0
  59. taskboy/task_actions.py +86 -0
  60. taskboy/templates/config.example.yaml +149 -0
  61. taskboy/templates/conventions.md +60 -0
  62. taskboy/templates/help.example.md +29 -0
  63. taskboy/templates/personality_agent.example.md +5 -0
  64. taskboy/templates/personality_reviewer.example.md +5 -0
  65. taskboy/templates/services/aws.yaml +7 -0
  66. taskboy/templates/services/confluence.yaml +4 -0
  67. taskboy/templates/services/github.yaml +14 -0
  68. taskboy/templates/services/jira.yaml +6 -0
  69. taskboy/templates/services/sentry.yaml +4 -0
  70. taskboy/templates/services/slack.yaml +9 -0
  71. taskboy/templates/skills/README.md +33 -0
  72. taskboy/templates/skills/discoverissues/SKILL.md +46 -0
  73. taskboy/templates/skills/implementapprovedissues/SKILL.md +41 -0
  74. taskboy/templates/skills/jira2pr/SKILL.md +66 -0
  75. taskboy/templates/skills/monitor/SKILL.md +32 -0
  76. taskboy/templates/skills/monitornew/SKILL.md +27 -0
  77. taskboy/templates/skills/refineissue/SKILL.md +35 -0
  78. taskboy/templates/skills/release/SKILL.md +36 -0
  79. taskboy/templates/skills/review/SKILL.md +89 -0
  80. taskboy/templates/skills/reviewandmonitor/SKILL.md +22 -0
  81. taskboy/templates/skills/reviews/SKILL.md +26 -0
  82. taskboy/templates/skills/slack2jira/SKILL.md +47 -0
  83. taskboy/templates/skills/slack2pr/SKILL.md +64 -0
  84. taskboy/templates/skills/spec2pr/SKILL.md +35 -0
  85. taskboy/templates/slack_app_manifest.yaml +48 -0
  86. taskboy/templates/task_started_messages.yaml +14 -0
  87. taskboy/ui_dist/assets/index-DmYxR9Qy.css +1 -0
  88. taskboy/ui_dist/assets/index-LDDO4iT2.js +15 -0
  89. taskboy/ui_dist/index.html +15 -0
  90. taskboy/workspace.py +86 -0
  91. taskboy-0.1.1.dist-info/METADATA +120 -0
  92. taskboy-0.1.1.dist-info/RECORD +95 -0
  93. taskboy-0.1.1.dist-info/WHEEL +5 -0
  94. taskboy-0.1.1.dist-info/entry_points.txt +2 -0
  95. taskboy-0.1.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,15 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="color-scheme" content="dark" />
7
+ <title>Mission Control</title>
8
+ <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='42' fill='%2322d3ee'/%3E%3Ccircle cx='50' cy='50' r='18' fill='%230a0f16'/%3E%3C/svg%3E" />
9
+ <script type="module" crossorigin src="/assets/index-LDDO4iT2.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-DmYxR9Qy.css">
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+ </body>
15
+ </html>
taskboy/workspace.py ADDED
@@ -0,0 +1,86 @@
1
+ """per-task workspace directories (EC2-008/009) and the retention sweep (MEM-012, ORC-014)."""
2
+
3
+ import logging
4
+ import shutil
5
+ import time
6
+ from datetime import datetime, timedelta, timezone
7
+ from pathlib import Path
8
+
9
+ from taskboy.models import COMPLETED
10
+ from taskboy.store import Store
11
+
12
+ logger = logging.getLogger("taskboy.workspace")
13
+
14
+
15
+ # task workspaces may only push agent/ branches (#95); git hands the hook the resolved refs
16
+ PRE_PUSH_HOOK = """#!/bin/sh
17
+ while read -r local_ref local_sha remote_ref remote_sha; do
18
+ case "$remote_ref" in
19
+ refs/heads/agent/*) ;;
20
+ *)
21
+ echo "push to $remote_ref is blocked: task workspaces may only push agent/ branches" >&2
22
+ exit 1
23
+ ;;
24
+ esac
25
+ done
26
+ exit 0
27
+ """
28
+
29
+
30
+ def hooks_dir(workspace: Path) -> Path:
31
+ return workspace / "githooks"
32
+
33
+
34
+ def create(workspaces_root: str, task_id: str) -> Path:
35
+ workspace = Path(workspaces_root) / task_id
36
+ for sub in ("repo", "notes", "home", "githooks"):
37
+ (workspace / sub).mkdir(parents=True, exist_ok=True)
38
+ # advisory: the session can rewrite this file — remote branch protection is the enforcement point
39
+ hook = hooks_dir(workspace) / "pre-push"
40
+ hook.write_text(PRE_PUSH_HOOK)
41
+ hook.chmod(0o755)
42
+ workspace.chmod(0o700)
43
+ return workspace
44
+
45
+
46
+ def delete(workspaces_root: str, task_id: str) -> None:
47
+ workspace = Path(workspaces_root) / task_id
48
+ if workspace.exists():
49
+ shutil.rmtree(workspace, ignore_errors=True)
50
+
51
+
52
+ def sweep_once(store: Store, workspaces_root: str, memory_root: str, retention: dict) -> dict:
53
+ """delete expired workspaces, memory summaries, dedup rows, and error rows per the retention config.
54
+
55
+ completed workspaces go early; failed/cancelled are kept longer for diagnosis (REL-007).
56
+ blocked tasks are not terminal and are never swept — their workspace is needed for resume.
57
+ """
58
+ now = datetime.now(timezone.utc)
59
+ completed_cutoff = _cutoff(now, retention.get("workspace_completed_days", 3))
60
+ failed_cutoff = _cutoff(now, retention.get("workspace_failed_days", 7))
61
+ workspaces = 0
62
+ for task in store.terminal_tasks_updated_before(max(completed_cutoff, failed_cutoff)):
63
+ cutoff = completed_cutoff if task.state == COMPLETED else failed_cutoff
64
+ if task.updated_at < cutoff:
65
+ delete(workspaces_root, task.task_id)
66
+ store.set_fields(task.task_id, workspace_path=None)
67
+ workspaces += 1
68
+
69
+ memories = 0
70
+ memory_deadline = time.time() - retention.get("memory_days", 90) * 86400
71
+ memory_dir = Path(memory_root) / "tasks"
72
+ if memory_dir.is_dir():
73
+ for path in memory_dir.glob("*.md"):
74
+ if path.stat().st_mtime < memory_deadline:
75
+ path.unlink(missing_ok=True)
76
+ memories += 1
77
+
78
+ events = store.purge_slack_events(_cutoff(now, retention.get("slack_events_days", 7)))
79
+ errors = store.purge_errors(_cutoff(now, retention.get("errors_days", 30)))
80
+ if workspaces or memories or events or errors:
81
+ logger.info("retention sweep: %s workspaces, %s memory files, %s slack events, %s errors removed", workspaces, memories, events, errors)
82
+ return {"workspaces": workspaces, "memories": memories, "slack_events": events, "errors": errors}
83
+
84
+
85
+ def _cutoff(now: datetime, days: int) -> str:
86
+ return (now - timedelta(days=days)).isoformat(timespec="seconds")
@@ -0,0 +1,120 @@
1
+ Metadata-Version: 2.4
2
+ Name: taskboy
3
+ Version: 0.1.1
4
+ Summary: TaskBoy: self-hosted AI engineering agent — Slack-driven orchestrator running isolated Claude sub-agents
5
+ Requires-Python: >=3.12
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: pyyaml>=6.0
8
+ Requires-Dist: slack-bolt>=1.20
9
+ Requires-Dist: aiohttp>=3.9
10
+ Requires-Dist: claude-agent-sdk>=0.1
11
+ Requires-Dist: pyjwt[crypto]>=2.8
12
+ Requires-Dist: boto3>=1.34
13
+ Requires-Dist: fastapi>=0.115
14
+ Requires-Dist: python-multipart>=0.0.9
15
+ Requires-Dist: uvicorn>=0.30
16
+ Requires-Dist: ruamel.yaml>=0.18
17
+ Provides-Extra: dev
18
+ Requires-Dist: pytest>=8.0; extra == "dev"
19
+ Requires-Dist: pytest-asyncio>=0.24; extra == "dev"
20
+ Requires-Dist: black==25.12.0; extra == "dev"
21
+ Requires-Dist: isort>=5.13; extra == "dev"
22
+ Requires-Dist: flake8>=7.0; extra == "dev"
23
+ Requires-Dist: mypy>=1.10; extra == "dev"
24
+ Requires-Dist: types-PyYAML>=6.0; extra == "dev"
25
+ Requires-Dist: httpx>=0.27; extra == "dev"
26
+
27
+ # TaskBoy
28
+
29
+ TaskBoy is a self-hosted, Slack-native AI engineering agent you brand and configure as your own. It turns Slack mentions and GitHub review requests into durable, policy-controlled engineering tasks that run in isolated Claude Agent SDK sessions — under a name, personality, tool policy, and integration set that you choose at setup time.
30
+
31
+ Everything identity-shaped is configuration: the agent's name, an optional second reviewer persona, personalities, engineering conventions, skills, approved repositories, and integrations all live in `config/config.yaml` and operator-editable files — never in code.
32
+
33
+ ## Quickstart (zero credentials, ~2 minutes)
34
+
35
+ ```bash
36
+ mkdir my-agent && cd my-agent
37
+ python3.12 -m venv .venv && source .venv/bin/activate
38
+ pip install taskboy # or, from a checkout of this repo: pip install -e .
39
+ taskboy setup --local # seeds the example config (echo runner, no integrations)
40
+ taskboy run # start the service in the foreground
41
+ ```
42
+
43
+ In another terminal:
44
+
45
+ ```bash
46
+ taskboy inject "say hi" --watch
47
+ ```
48
+
49
+ You should see the task accepted, run, and complete. That's the whole lifecycle — intake, queue, runner, durable record — with no external accounts.
50
+
51
+ ## Going live
52
+
53
+ Run the interactive setup wizard:
54
+
55
+ ```bash
56
+ taskboy setup
57
+ ```
58
+
59
+ It walks each step — agent identity, Claude auth, Slack app, GitHub App(s), optional Jira/Confluence/Sentry/AWS, dashboard, conventions, personalities, and the skills picker — printing the manual admin-console instructions where needed, validating every credential live, and writing `config/config.yaml` (comment-preserving) plus a sourceable `.env`. Every step is saved as you go, so you can quit and re-run anytime; `taskboy setup --check` re-validates everything non-interactively.
60
+
61
+ This repository is the **application** — a versioned package published to PyPI on every `vX.Y.Z` tag; operators never fork it. Your deployment lives in a separate **shell repository** (created from the `taskboy-shell` template) that pins `taskboy==X.Y.Z` and holds your config, personalities, skills, infrastructure, and deploy pipeline. The shell template's `SETUP.md` carries the full operator runbook: setup, host deployment, CI/CD, and end-to-end verification. Upgrades are a one-line version-bump PR in the shell.
62
+
63
+ ## Features
64
+
65
+ - **Durable task orchestration.** SQLite acts as both the queue and operational record. Guarded state transitions, retries, session IDs, results, costs, errors, and hash-chained events survive restarts.
66
+ - **Model routing.** A classifier selects a configured model tier and execution profile per task. Simple questions can use an optional bounded quick-answer path.
67
+ - **Isolated, resumable sessions.** Each task gets its own workspace, repository context, conventions, skills, personality, tool policy, budget, turn limit, and runtime limit. Interrupted sessions are requeued and resumed.
68
+ - **Policy-controlled integrations.** GitHub, Jira, Confluence, Sentry, AWS, Slack history, and Slack DMs are exposed only when configured and allowed by the routed profile. Hooks enforce repository, branch, environment, workspace, and metadata-service boundaries.
69
+ - **Per-task permission grants.** A session can request access to an approved repository or tool outside its initial profile; operators grant or deny from the dashboard or CLI, and approved tasks resume the same session.
70
+ - **Slack-native request handling.** The agent accepts authorized mentions over Socket Mode, acknowledges work, posts concise requester-facing replies, and links to a detailed debug thread.
71
+ - **GitHub review automation.** Review-request polling uses the same durable intake path. An optional second **reviewer persona** (its own GitHub App identity) provides adversarial reviews of the main agent's pull requests.
72
+ - **Mission Control dashboard.** Task exploration, audit trails, memory and usage views, redacted configuration, live updates, task controls, and in-browser editing of config, personalities, conventions, and skills.
73
+ - **Skill template library.** Thirteen battle-tested workflows (`/review`, `/slack2pr`, `/jira2pr`, `/discoverissues`, …) ship as templates inside the package; the setup wizard instantiates the ones you want with your org's names filled in (`taskboy assets templates` copies them out for manual editing).
74
+ - **Auditable operations.** Tool calls, routing, timing, usage, permission decisions, admin actions, and lifecycle changes are stored and redacted; audit records can ship to an S3 Object Lock bucket.
75
+
76
+ ## How it works
77
+
78
+ 1. Slack Socket Mode or the GitHub review poller deduplicates and authorizes a request, then creates a durable task.
79
+ 2. The request is classified and routed, unless an explicit `/skill` invocation already selects its model tier and profile.
80
+ 3. The concurrency-limited runner creates a task workspace, injects the relevant context and policy (including your `CONVENTIONS.md`), and starts or resumes an isolated session.
81
+ 4. The requester receives a brief started message and a conversational final reply; the debug feed records factual lifecycle, prompt, progress, result, usage, and timing details.
82
+ 5. Terminal records remain queryable through SQLite, the CLI, and the dashboard; retention and audit shipping are configuration.
83
+
84
+ ## Operational notes
85
+
86
+ - `config/config.yaml` is your operator policy. The application itself is a versioned pip package; your instance directory holds only config, personalities, skills, and secrets — commit those to a private repo if you want them version-controlled (the dashboard's auto-commit feature expects that). Most changes apply on restart.
87
+ - Personalities, task-started message pools, conventions, and skills are separate operator-editable files, re-read per task and editable live from the dashboard.
88
+ - All free-text persistence and Slack delivery pass through redaction. The GitHub credential broker mints repository-scoped installation tokens per task; sessions never see private keys.
89
+ - AWS diagnostics are read-only at both the adapter and IAM layers.
90
+ - Releases are green `vX.Y.Z` tags; restarts reconcile in-flight tasks.
91
+
92
+ ## Development
93
+
94
+ Python 3.12+; Node.js 22+ for the dashboard; Docker for the CI-equivalent checks.
95
+
96
+ ```bash
97
+ make check # flake8 + mypy + black/isort --check + pytest, in docker (== CI)
98
+ taskboy run # local service (echo or claude runner per config)
99
+ cd ui && npm ci && npm run dev # dashboard dev server, proxies /api to :8787
100
+ ```
101
+
102
+ ## Repository map
103
+
104
+ ```text
105
+ taskboy/main.py service wiring and housekeeping
106
+ taskboy/orchestrator.py classify, queue, dispatch, recovery, and timing
107
+ taskboy/store.py schema and all SQL
108
+ taskboy/slack.py mention intake and requester notifications
109
+ taskboy/runner.py Claude Agent SDK sessions and reply extraction
110
+ taskboy/setup_wizard.py interactive first-run setup (taskboy setup)
111
+ taskboy/adapters/ integration MCP servers
112
+ taskboy/dashboard/ Mission Control API
113
+ taskboy/templates/ packaged seed material: config example, personalities, skill templates, Slack manifest
114
+ taskboy/deploy/ packaged host files: installer, updater, systemd units, env example, git credential helper
115
+ ui/ Mission Control React application (builds into taskboy/ui_dist)
116
+ config/ your local dev instance's operator policy (created by taskboy setup)
117
+ skills/ locally installed skills (empty until setup)
118
+ ```
119
+
120
+ Operator-owned pieces — pinned version, config, infrastructure (Pulumi), and the deploy workflow — live in your shell repository, created from the `taskboy-shell` template.
@@ -0,0 +1,95 @@
1
+ taskboy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ taskboy/assets.py,sha256=CIhJHnosSVK8EC074xo8O6ypz6SoitKakuMdPEV6x-c,1161
3
+ taskboy/audit.py,sha256=AkXaTA0Al5al15BWIViZ5SsLtFmWdC9TQLRjsiyPqTo,3257
4
+ taskboy/broker.py,sha256=QNeKmzFLN91ua2OwjP0y65RffjYxcxbtm-mxvkDpCkk,13165
5
+ taskboy/classifier.py,sha256=ljgoH3FiO5GAEA3l5XF1F41rNeDIcZ6ajvWIAVAJGfc,12051
6
+ taskboy/cli.py,sha256=Xg-GVciTKolp40o-BPjqur_bvq7iHdBwKTbE1w69j_w,6405
7
+ taskboy/config.py,sha256=hsAJ9rcGcPr8aR8XgR1jnJjAHYtJbl1PbVSSaLw4-Cw,25828
8
+ taskboy/debug_feed.py,sha256=i292-RfmCaxlRGhRbo8Fn3zsFb0_rb1oruyOuLN51Hg,9365
9
+ taskboy/hooks.py,sha256=YC0jOcgReqqxzvsmHryStcxoNX3989oN_agsf8e4BiI,10790
10
+ taskboy/issue_runs.py,sha256=ZTqZgL9iRfEDCicbOaDLybw84DFjs1C423669xj5UqQ,8939
11
+ taskboy/llm.py,sha256=oF9_JsbMlgco3hCwv7lA5wvFBv8gEhew6JPfeixeHwI,5334
12
+ taskboy/main.py,sha256=tCGzfhqsZ_TsfsHjzLprhu5q1C4D3stLVFsJmmotoXs,13634
13
+ taskboy/memory.py,sha256=-sbPT3Pdw22wpbuxGBfDMRBF2jdbZy-0BtIRPZB2fPU,2471
14
+ taskboy/models.py,sha256=zaWVtPpKTHNLDkOntkE_jOtBW8qS3UlH4SXBD-A-6g4,3126
15
+ taskboy/mrkdwn.py,sha256=czk07wYlZTI25W7cbthujn4VqfIsgUs9RhnnT5JrcqY,741
16
+ taskboy/notify.py,sha256=NZlO-m13iaXLKi4sqI168-iwdlme1HqpdepT7QXWL7s,1644
17
+ taskboy/orchestrator.py,sha256=Ob7rpSQhQYysvHu8vLD4eOIH8cxFWXLVDpRVL_TGlnk,22823
18
+ taskboy/personality.py,sha256=ghnaU6bpVcBRPSkDl7S4R9D6ygJEtXAHTXEqOaJx4hY,440
19
+ taskboy/prompts.py,sha256=vA5WhHXzVbLJcKP2o77xeUCWeqrqVgVAPi1vLyfnsCU,18081
20
+ taskboy/quick.py,sha256=5XxdZnc0q22IrZ_juFVLmCpcdF2bksYzJAyTNERC2lg,10701
21
+ taskboy/redact.py,sha256=HyiLPApITJGLh2VHJ_LMaMK4KUujLzre_r5C_UlO1oQ,2445
22
+ taskboy/repocache.py,sha256=J3v35MNmxxQVa6VxEgKA41tVjSpkcAGLzfgvWdGKWlE,4250
23
+ taskboy/review_requests.py,sha256=CBGt-_BZ_JcYnzkul06NLhCEFo5tL9BUDAG9w_f961A,22748
24
+ taskboy/router.py,sha256=uNOxa1_NnJjIw0hiLFEBzyZSGQlpV6qXavKDGInyZYc,7198
25
+ taskboy/runner.py,sha256=51s1nJyjar5JPYpDrWSVKEpNrPGiw6CupQkjnmiwHV0,36727
26
+ taskboy/scheduler.py,sha256=8ajRgHnHH1BBLJNz_3AVUJR1359JUopWUY1JoS2zphk,16362
27
+ taskboy/secrets.py,sha256=8vFwZAn4l1EB8tgbj_ec-Y7BDwRJAbLZEEwcwujT0Bo,4182
28
+ taskboy/settings.py,sha256=2pE6Xs-eglVrscx7oVngF8dYi_nkmaIMsj-4vb5nZbk,1131
29
+ taskboy/setup_checks.py,sha256=QDGaIfwGxyJOS5dC1eaO5xu8choy0IRMufGBuWsdU5o,8325
30
+ taskboy/setup_wizard.py,sha256=Tb6PAV3ai0nxCTCSFs50keQMqRxv-b2IEnH32TaD25M,34362
31
+ taskboy/skills.py,sha256=DLSWrZJuEcxWbuUu5g5DTALt8npX0Y-pGRyZV0c9Rfs,3926
32
+ taskboy/slack.py,sha256=lMCSUoNCN0Jt8OU2yDdyEWfVtJinCz70N0BVq1pDuro,36307
33
+ taskboy/slack_users.py,sha256=kWM9VReWtzVAEv1W7beVyqfjNeS5T6VZlHisIMPcCsg,1093
34
+ taskboy/started_messages.py,sha256=RBWjTRX7vOS0fPdtnf1NNOx-VN6YqMzSXboBoffDUDE,1375
35
+ taskboy/store.py,sha256=7rCGf18XpqEPedVfbCMnayrQRiv2qMGwIdE4F3K8hXg,72470
36
+ taskboy/task_actions.py,sha256=BMG0z6ckku3jTNWbZWvbLAaxmSb_cm-n5BF5d5zJKX4,4911
37
+ taskboy/workspace.py,sha256=xGlTts9TYvCIby12uR1MIpBXDfLBxiBRbWhO9sTgQyI,3376
38
+ taskboy/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ taskboy/adapters/_util.py,sha256=llVhFK1ONlkK7Gt2Rs6btJ3PTg95CpqHFyFeDm1teJs,931
40
+ taskboy/adapters/aws_read.py,sha256=jyjtepurouuwl8_LEhlwIQqaGfImdt4zBpdZ4S2jQZ8,5715
41
+ taskboy/adapters/confluence.py,sha256=mw_a86EbgNdsNta0dG40mvmiFK6XsQM2-NXu677Lf9E,4336
42
+ taskboy/adapters/github_api.py,sha256=7zwSEWqg68lUHU1y9YggBzfUq3A0j4NM75ZoVj-w6kc,33206
43
+ taskboy/adapters/issues.py,sha256=s-WSXaaFSn8S74la4NrZLB0tID-2YG4AdmTqmRnpvhU,26568
44
+ taskboy/adapters/jira.py,sha256=256zfvWOLLu_PTHqelORbQDb9i8LUiqt1QoOe6oO-6M,15923
45
+ taskboy/adapters/sentry.py,sha256=7yBtx7ns7RjL3eWSvdiXfISs7QTv-MTCZ34ODTDM6vU,4529
46
+ taskboy/adapters/slack_history.py,sha256=gkbXy18vTlfYB_yYCtiDFThFE1ESGpNfRLjmegOvnhM,10424
47
+ taskboy/dashboard/__init__.py,sha256=7_IZ8kbEOnKIsbkPyBIetJLzhf-AUh_RZAkFvLAgANA,161
48
+ taskboy/dashboard/api.py,sha256=-ouZIjNk4GPIFJZae2g9xDSJvlwCcc_MrEKYrddbBso,51483
49
+ taskboy/dashboard/app.py,sha256=st7n3X9Ip3INCXFqoURfZzsjKvcYzSpB5SSd5ZjkhLs,3254
50
+ taskboy/dashboard/auth.py,sha256=_aCDBfnLIuYEaBwCnynQBd0_iljTZ7Y2rEtAw1WBEvE,4885
51
+ taskboy/dashboard/editors.py,sha256=jlZrMlRciPQzv0FGOQaASZiXElp7bsRE316J0RVb5yE,6423
52
+ taskboy/dashboard/gitops.py,sha256=QxAmQd5EGAbTbr51XGTu7VB-jKq2RjCA23tT7cpeZFs,2903
53
+ taskboy/dashboard/render.py,sha256=1ou5m5oeTwmNYbpqm8ha1rPTvGtwe7jhrdse5bNEbYE,2008
54
+ taskboy/deploy/env.example,sha256=9lW3QLGBgVdsyCCz75STcwx3KvPkvwNZFRo9E-fcafE,1034
55
+ taskboy/deploy/git-cred-helper.py,sha256=jD6-fXC8HivlW0xxY7aXRkL_Lt9EoNiJ7YgaQnKVF98,1227
56
+ taskboy/deploy/install.sh,sha256=auWTIIS3EjJ6e3dkbFfk_zmNOiTHBtYLKvrIdwaQDH4,5373
57
+ taskboy/deploy/remote-update.sh,sha256=b1M1vNxq0Yh57skH5byHA5PExKlmGNfsdhbOVv1xcwg,2355
58
+ taskboy/deploy/taskboy-restart.path,sha256=iieaMj-JB_gOj9a8UF4IsspI_s_yD7lcTaB-0nhCFZQ,293
59
+ taskboy/deploy/taskboy-restart.service,sha256=sT2ENdJRTyKsMZtwWO504XjQz3UqzOc1ydZajC4ndD8,300
60
+ taskboy/deploy/taskboy.service,sha256=dDuAgs9-u6XgXiFRTSSBMGEskFJt8hfW5xRKHxU4fcE,546
61
+ taskboy/templates/config.example.yaml,sha256=nza5EbW62-j9Bx0A5DIuv9rSzapIizh-6Z-QhsX-heo,10316
62
+ taskboy/templates/conventions.md,sha256=lsrlg7pRYvf_hluExgeutZkhwR4bSaLF1ciMmSFABSw,2455
63
+ taskboy/templates/help.example.md,sha256=j-TkIB2Z9ijpDncC7ZwNXVV1BngwprP5POMBAHU_9Io,2330
64
+ taskboy/templates/personality_agent.example.md,sha256=A0LSvIwdshGAy5IbHtPjHW13SsAhwIMHgB1SjB-swH4,355
65
+ taskboy/templates/personality_reviewer.example.md,sha256=4KMmUIy_0bHVWbV7FBmOjZc2vwhBaMqqKcolw_tXuRc,357
66
+ taskboy/templates/slack_app_manifest.yaml,sha256=Mytv1MGZIaz94lJx-5pI2mCroo3lk7bX1DTCR8cpI5M,1843
67
+ taskboy/templates/task_started_messages.yaml,sha256=prDy4KXpxCmIlQq-4wp70148Mr-viGiK3rnr2Jkymv0,663
68
+ taskboy/templates/services/aws.yaml,sha256=TY13L-8vNx-yNQtrGdCgLm8EZi0of1ViIoa9ur-vFQo,541
69
+ taskboy/templates/services/confluence.yaml,sha256=lMpCgoTyz23fIEQhIG-r03yeut17cnxHPFDlxqtHZlk,299
70
+ taskboy/templates/services/github.yaml,sha256=k5Mon6cD4TkoLSCR2qrq1_OnpS6Za9r2TOwFFgQw5Zw,1173
71
+ taskboy/templates/services/jira.yaml,sha256=MazJrmLYXkgxazg1GZdEyOfTaJwzaMi5sObbOTbSETw,381
72
+ taskboy/templates/services/sentry.yaml,sha256=L7JinLtrcDjLVIw1UT-kk1pGxlcF7fx-bOg9gdx-b0E,191
73
+ taskboy/templates/services/slack.yaml,sha256=A527P8iJvf4AvRIKWZQbcTlJz05Q9sI2nVsaDRCaE8w,756
74
+ taskboy/templates/skills/README.md,sha256=df_h4iJbNTmNWfkJ3lUfj3qH3-jFWeXFLGJ_peRKSlg,2147
75
+ taskboy/templates/skills/discoverissues/SKILL.md,sha256=1hkbP21QVk8TL8tN6sPVhX9sNIBB-_Vx9Fx00DfIROU,3138
76
+ taskboy/templates/skills/implementapprovedissues/SKILL.md,sha256=JDmopfBu_i6wydrN_Pfd6ElvLTM3wy72-Mv1E-UEnO0,1872
77
+ taskboy/templates/skills/jira2pr/SKILL.md,sha256=ziLigiiN9BcCtvbGrLAabGLn7J09okwmc6rrB_CfpoY,4219
78
+ taskboy/templates/skills/monitor/SKILL.md,sha256=ScqOUOnbZzNoraBPX8kAA3PfO6WSOjEz1wTmvrEm7AQ,2727
79
+ taskboy/templates/skills/monitornew/SKILL.md,sha256=fAnEEtEN7T_-v6pM6kZxeLbTQOLNxPy-YIwwrcIJ6Gs,2060
80
+ taskboy/templates/skills/refineissue/SKILL.md,sha256=SBnKqMhZ0vAHIsmBtuv9PxCOOKxO38BPfvzGXsDC6mQ,2024
81
+ taskboy/templates/skills/release/SKILL.md,sha256=UavN2vAQFtb4FdZGxysTuZA8wju50e8dF1OjMim2Wos,2298
82
+ taskboy/templates/skills/review/SKILL.md,sha256=FUfOrVCfG4BmcZRSEL_tGW6mA-NrKjH8knz4xRlxVa0,8580
83
+ taskboy/templates/skills/reviewandmonitor/SKILL.md,sha256=aHc8HYkZf-FnBCe6zVmxmpLnvD7AU-o-lpQYG60a110,1039
84
+ taskboy/templates/skills/reviews/SKILL.md,sha256=aDC7uLgq3VAhlW3FcLpZJtyGUz7zg_MI2AGInRzNc4o,1626
85
+ taskboy/templates/skills/slack2jira/SKILL.md,sha256=J_Ye1Q1kfs9YjzRizBp-592U6Qei6-kEYOtt_Hq_wUk,3259
86
+ taskboy/templates/skills/slack2pr/SKILL.md,sha256=foTcKYuIb24bTFmbvxBY1hDx3hSswtaeBIDb_wCf8As,4051
87
+ taskboy/templates/skills/spec2pr/SKILL.md,sha256=N7gGl9AwEUijAgOm8Znczekyj85Zow9vWZMRZJ8xlLU,1393
88
+ taskboy/ui_dist/index.html,sha256=dOdBqjwQXbQI541Tf4n5NE2FV4DpAoq4TouZ3Ku6jjM,681
89
+ taskboy/ui_dist/assets/index-DmYxR9Qy.css,sha256=8RsAHu8q-KBYcP2knKfTz-hJaH48ufULc3_f9qQa9CY,25661
90
+ taskboy/ui_dist/assets/index-LDDO4iT2.js,sha256=eMUZERuB2z3ya3nj9bucljdF8L16ix5xlb9zMv_hM_k,343234
91
+ taskboy-0.1.1.dist-info/METADATA,sha256=Pt1A_tZgptRxp7sA57aNfuyaqpKuGAIFe8awZ8Ztboc,8609
92
+ taskboy-0.1.1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
93
+ taskboy-0.1.1.dist-info/entry_points.txt,sha256=Tq5bN78RwGMxSKE_7jYNBW0wa5F1BUR2xkoSPLVLrrA,45
94
+ taskboy-0.1.1.dist-info/top_level.txt,sha256=9-Ftd1oLBfnloMgAcl-SVag2bFZ_IhGZsiQAU0jB1e0,8
95
+ taskboy-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ taskboy = taskboy.cli:main
@@ -0,0 +1 @@
1
+ taskboy