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.
- taskboy/__init__.py +0 -0
- taskboy/adapters/__init__.py +0 -0
- taskboy/adapters/_util.py +30 -0
- taskboy/adapters/aws_read.py +107 -0
- taskboy/adapters/confluence.py +88 -0
- taskboy/adapters/github_api.py +564 -0
- taskboy/adapters/issues.py +435 -0
- taskboy/adapters/jira.py +263 -0
- taskboy/adapters/sentry.py +82 -0
- taskboy/adapters/slack_history.py +204 -0
- taskboy/assets.py +27 -0
- taskboy/audit.py +78 -0
- taskboy/broker.py +266 -0
- taskboy/classifier.py +219 -0
- taskboy/cli.py +161 -0
- taskboy/config.py +539 -0
- taskboy/dashboard/__init__.py +5 -0
- taskboy/dashboard/api.py +963 -0
- taskboy/dashboard/app.py +78 -0
- taskboy/dashboard/auth.py +117 -0
- taskboy/dashboard/editors.py +140 -0
- taskboy/dashboard/gitops.py +60 -0
- taskboy/dashboard/render.py +48 -0
- taskboy/debug_feed.py +170 -0
- taskboy/deploy/env.example +17 -0
- taskboy/deploy/git-cred-helper.py +36 -0
- taskboy/deploy/install.sh +101 -0
- taskboy/deploy/remote-update.sh +52 -0
- taskboy/deploy/taskboy-restart.path +10 -0
- taskboy/deploy/taskboy-restart.service +8 -0
- taskboy/deploy/taskboy.service +22 -0
- taskboy/hooks.py +208 -0
- taskboy/issue_runs.py +203 -0
- taskboy/llm.py +125 -0
- taskboy/main.py +269 -0
- taskboy/memory.py +59 -0
- taskboy/models.py +103 -0
- taskboy/mrkdwn.py +19 -0
- taskboy/notify.py +41 -0
- taskboy/orchestrator.py +401 -0
- taskboy/personality.py +17 -0
- taskboy/prompts.py +288 -0
- taskboy/quick.py +234 -0
- taskboy/redact.py +49 -0
- taskboy/repocache.py +117 -0
- taskboy/review_requests.py +388 -0
- taskboy/router.py +146 -0
- taskboy/runner.py +581 -0
- taskboy/scheduler.py +301 -0
- taskboy/secrets.py +83 -0
- taskboy/settings.py +19 -0
- taskboy/setup_checks.py +184 -0
- taskboy/setup_wizard.py +699 -0
- taskboy/skills.py +95 -0
- taskboy/slack.py +666 -0
- taskboy/slack_users.py +32 -0
- taskboy/started_messages.py +33 -0
- taskboy/store.py +1393 -0
- taskboy/task_actions.py +86 -0
- taskboy/templates/config.example.yaml +149 -0
- taskboy/templates/conventions.md +60 -0
- taskboy/templates/help.example.md +29 -0
- taskboy/templates/personality_agent.example.md +5 -0
- taskboy/templates/personality_reviewer.example.md +5 -0
- taskboy/templates/services/aws.yaml +7 -0
- taskboy/templates/services/confluence.yaml +4 -0
- taskboy/templates/services/github.yaml +14 -0
- taskboy/templates/services/jira.yaml +6 -0
- taskboy/templates/services/sentry.yaml +4 -0
- taskboy/templates/services/slack.yaml +9 -0
- taskboy/templates/skills/README.md +33 -0
- taskboy/templates/skills/discoverissues/SKILL.md +46 -0
- taskboy/templates/skills/implementapprovedissues/SKILL.md +41 -0
- taskboy/templates/skills/jira2pr/SKILL.md +66 -0
- taskboy/templates/skills/monitor/SKILL.md +32 -0
- taskboy/templates/skills/monitornew/SKILL.md +27 -0
- taskboy/templates/skills/refineissue/SKILL.md +35 -0
- taskboy/templates/skills/release/SKILL.md +36 -0
- taskboy/templates/skills/review/SKILL.md +89 -0
- taskboy/templates/skills/reviewandmonitor/SKILL.md +22 -0
- taskboy/templates/skills/reviews/SKILL.md +26 -0
- taskboy/templates/skills/slack2jira/SKILL.md +47 -0
- taskboy/templates/skills/slack2pr/SKILL.md +64 -0
- taskboy/templates/skills/spec2pr/SKILL.md +35 -0
- taskboy/templates/slack_app_manifest.yaml +48 -0
- taskboy/templates/task_started_messages.yaml +14 -0
- taskboy/ui_dist/assets/index-DmYxR9Qy.css +1 -0
- taskboy/ui_dist/assets/index-LDDO4iT2.js +15 -0
- taskboy/ui_dist/index.html +15 -0
- taskboy/workspace.py +86 -0
- taskboy-0.1.1.dist-info/METADATA +120 -0
- taskboy-0.1.1.dist-info/RECORD +95 -0
- taskboy-0.1.1.dist-info/WHEEL +5 -0
- taskboy-0.1.1.dist-info/entry_points.txt +2 -0
- 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 @@
|
|
|
1
|
+
taskboy
|