td-ai-tools 1.0.2
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.
- package/README.md +49 -0
- package/agents/README.md +10 -0
- package/agents/horizon-component-library/AGENTS.md +184 -0
- package/agents/horizon-component-library/README.md +10 -0
- package/agents/horizon-component-library/scripts/td-guard.sh +49 -0
- package/bin/cli.js +209 -0
- package/package.json +23 -0
- package/scripts/smoke-install.sh +56 -0
- package/skills/README.md +15 -0
- package/skills/cache-reset/SKILL.md +18 -0
- package/skills/cache-reset/agents/openai.yaml +4 -0
- package/skills/car-ticket-generator/SKILL.md +130 -0
- package/skills/car-ticket-generator/agents/openai.yaml +4 -0
- package/skills/everhour-basecamp-estimates/.env.example +2 -0
- package/skills/everhour-basecamp-estimates/SKILL.md +73 -0
- package/skills/everhour-basecamp-estimates/agents/openai.yaml +4 -0
- package/skills/everhour-basecamp-estimates/scripts/update_estimates.py +518 -0
- package/skills/everhour-basecamp-estimates/tests/test_update_estimates.py +93 -0
- package/skills/horizon-component-migration/SKILL.md +59 -0
- package/skills/horizon-component-migration/agents/openai.yaml +4 -0
- package/skills/pr-solver/SKILL.md +50 -0
- package/skills/pr-solver/agents/openai.yaml +4 -0
- package/skills/pr-solver/references/github-pr-reviewthreads-graphql.md +63 -0
- package/skills/pr-solver/scripts/list_unresolved_threads.py +307 -0
- package/skills/pull-request/SKILL.md +216 -0
- package/skills/pull-request/agents/openai.yaml +4 -0
- package/skills/record-changes/SKILL.md +75 -0
- package/skills/record-changes/agents/openai.yaml +4 -0
- package/skills/record-changes/scripts/branch_diff_context.py +190 -0
- package/skills/stylesheet-migration/SKILL.md +36 -0
- package/skills/stylesheet-migration/agents/openai.yaml +6 -0
- package/skills/stylesheet-migration/scripts/__pycache__/liquid_stylesheet_migrator.cpython-312.pyc +0 -0
- package/skills/stylesheet-migration/scripts/__pycache__/test_liquid_stylesheet_migrator.cpython-312.pyc +0 -0
- package/skills/stylesheet-migration/scripts/liquid_stylesheet_migrator.py +204 -0
- package/skills/stylesheet-migration/scripts/migrate_stylesheet_tags.py +172 -0
- package/skills/stylesheet-migration/scripts/test_liquid_stylesheet_migrator.py +254 -0
- package/skills/td-js-vanilla-rules/SKILL.md +70 -0
- package/skills/td-js-vanilla-rules/agents/openai.yaml +3 -0
- package/skills/td-review/SKILL.md +122 -0
- package/skills/td-review/agents/openai.yaml +4 -0
- package/skills/td-review/agents/td-theme-reviewer.md +221 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: car-ticket-generator
|
|
3
|
+
description: Generate a ticket for the codex-auto-runner queue
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# CAR Ticket Skill
|
|
8
|
+
|
|
9
|
+
Generate a ticket for the Codex-Auto-Runner ticket queue
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1) Ticket files
|
|
14
|
+
|
|
15
|
+
- Filename: `TICKET-###*.md`
|
|
16
|
+
Examples: `TICKET-001.md`, `TICKET-120-api-parity.md`
|
|
17
|
+
- Tickets **must be in ascending numeric order**.
|
|
18
|
+
- Numbers **do not need to be consecutive**.
|
|
19
|
+
Leave gaps if follow-up tickets are likely.
|
|
20
|
+
- Location: `.codex-autorunner/tickets`
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2) Required frontmatter (minimum)
|
|
25
|
+
|
|
26
|
+
```yaml
|
|
27
|
+
---
|
|
28
|
+
agent: 'codex'
|
|
29
|
+
done: false
|
|
30
|
+
---
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Required (linted):
|
|
34
|
+
|
|
35
|
+
- `agent`: registered CAR agent id for this repo (for example `codex`, `opencode`) or the special value `user`
|
|
36
|
+
- `done`: boolean
|
|
37
|
+
|
|
38
|
+
Do not use assistant product names as `agent` values (for example `chatgpt` or `claude`) unless those exact ids are configured in CAR for this repo.
|
|
39
|
+
|
|
40
|
+
Common optional fields:
|
|
41
|
+
|
|
42
|
+
- `title`: short, outcome-focused summary
|
|
43
|
+
- `goal`: one-sentence statement of intent
|
|
44
|
+
- `model`: pin a specific model when necessary
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 3) Recommended ticket body structure
|
|
49
|
+
|
|
50
|
+
Keep tickets concise and independently verifiable.
|
|
51
|
+
|
|
52
|
+
Preferred sections:
|
|
53
|
+
|
|
54
|
+
- `## Tasks` - concrete implementation steps
|
|
55
|
+
- `## Acceptance criteria` (or `## Exit criteria`) - observable outcomes
|
|
56
|
+
- `## Tests` - commands or explicit verification steps
|
|
57
|
+
- `## Notes` - only if necessary
|
|
58
|
+
|
|
59
|
+
Write criteria so another agent can prove completion without guesswork.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 4) Sequencing rules (critical)
|
|
64
|
+
|
|
65
|
+
CAR's `ticket_flow`:
|
|
66
|
+
|
|
67
|
+
- Executes tickets in ascending order
|
|
68
|
+
- Picks the first ticket where `done != true`
|
|
69
|
+
|
|
70
|
+
Implications:
|
|
71
|
+
|
|
72
|
+
- Put prerequisites in lower-numbered tickets.
|
|
73
|
+
- Never make a lower-numbered ticket depend on a higher-numbered one.
|
|
74
|
+
- If reverse dependencies appear, reorder or split tickets.
|
|
75
|
+
- Each ticket must be independently completable when its turn arrives.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 5) Assignment defaults
|
|
80
|
+
|
|
81
|
+
- Implementation work -> repo agents (`codex`, `opencode`, etc.).
|
|
82
|
+
- Final human review/signoff -> user-assigned ticket near the end.
|
|
83
|
+
- In PMA mode, prefer delegation, not direct code edits.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 6) Quality bar for good tickets
|
|
88
|
+
|
|
89
|
+
A good ticket:
|
|
90
|
+
|
|
91
|
+
- Has a single, well-scoped outcome
|
|
92
|
+
- References specific files/modules when useful
|
|
93
|
+
- Includes explicit verification (tests, checks, or observable behavior)
|
|
94
|
+
- Avoids vague language (`"improve"`, `"clean up"`, `"fix issues"`) without criteria
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 7) Copy-paste ticket template
|
|
99
|
+
|
|
100
|
+
```md
|
|
101
|
+
---
|
|
102
|
+
title: '<Outcome-focused title>'
|
|
103
|
+
agent: 'codex'
|
|
104
|
+
done: false
|
|
105
|
+
goal: '<What will be true when this ticket is complete>.'
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Tasks
|
|
109
|
+
|
|
110
|
+
- <Concrete implementation step>
|
|
111
|
+
- <Concrete implementation step>
|
|
112
|
+
|
|
113
|
+
## Acceptance criteria
|
|
114
|
+
|
|
115
|
+
- <Observable behavior or artifact>
|
|
116
|
+
- <Observable behavior or artifact>
|
|
117
|
+
|
|
118
|
+
## Tests
|
|
119
|
+
|
|
120
|
+
- <Commands to run or explicit checks>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 8) Anti-patterns to reject
|
|
126
|
+
|
|
127
|
+
- Missing or invalid frontmatter
|
|
128
|
+
- Cross-ticket dependency deadlocks
|
|
129
|
+
- Tickets that rely on unstated or hidden context
|
|
130
|
+
- `done: true` without evidence against acceptance criteria
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: everhour-basecamp-estimates
|
|
3
|
+
description: Bulk update Everhour task estimates from a Basecamp todo or todolist URL, then append bracketed hours to the Basecamp todo titles.
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Use this skill when the user wants to update Everhour task estimates in bulk from a Basecamp todo or todolist URL.
|
|
8
|
+
|
|
9
|
+
## Files
|
|
10
|
+
|
|
11
|
+
- Local config: `.agents/skills/everhour-basecamp-estimates/.env`
|
|
12
|
+
- Example config: `.agents/skills/everhour-basecamp-estimates/.env.example`
|
|
13
|
+
- Workflow script: `.agents/skills/everhour-basecamp-estimates/scripts/update_estimates.py`
|
|
14
|
+
|
|
15
|
+
## Required inputs
|
|
16
|
+
|
|
17
|
+
- A Basecamp todo or todolist URL
|
|
18
|
+
- Either one estimate in hours to apply to every active task, or a JSON array of per-task estimates in hours
|
|
19
|
+
|
|
20
|
+
## Workflow
|
|
21
|
+
|
|
22
|
+
1. Confirm `.agents/skills/everhour-basecamp-estimates/.env` exists and contains:
|
|
23
|
+
- `EVERHOUR_API_KEY`
|
|
24
|
+
- `EVERHOUR_PROJECT_ID`
|
|
25
|
+
2. Run the bundled script from the repo root:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
python3 .agents/skills/everhour-basecamp-estimates/scripts/update_estimates.py \
|
|
29
|
+
"https://3.basecamp.com/..." \
|
|
30
|
+
2.5
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
3. For todolists that need different estimates per todo, pass a JSON array. The array length must match the number of active todos after completed items are skipped:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
python3 .agents/skills/everhour-basecamp-estimates/scripts/update_estimates.py \
|
|
37
|
+
"https://3.basecamp.com/..." \
|
|
38
|
+
"[1,2.5,4]"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
4. Use `--dry-run` first if the user wants to review matches before mutating anything:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
python3 .agents/skills/everhour-basecamp-estimates/scripts/update_estimates.py \
|
|
45
|
+
"https://3.basecamp.com/..." \
|
|
46
|
+
"[1,2.5,4]" \
|
|
47
|
+
--dry-run
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Behavior
|
|
51
|
+
|
|
52
|
+
- The script parses the Basecamp URL with the Basecamp CLI.
|
|
53
|
+
- For a todo URL, it loads one todo title.
|
|
54
|
+
- For a todolist URL, it loads every todo title in that list.
|
|
55
|
+
- Completed Basecamp todos are skipped.
|
|
56
|
+
- A scalar estimate is applied to each active todo.
|
|
57
|
+
- A JSON estimate array is applied in active-todo order and must match the active todo count exactly.
|
|
58
|
+
- It matches Basecamp titles against Everhour task names inside the configured project.
|
|
59
|
+
- Matching is exact after normalization:
|
|
60
|
+
- trim whitespace
|
|
61
|
+
- collapse repeated spaces
|
|
62
|
+
- case-insensitive compare
|
|
63
|
+
- strip a trailing estimate suffix like `[2.5h]` before matching
|
|
64
|
+
- It updates Everhour estimates first, converting hours to seconds and sending an overall estimate.
|
|
65
|
+
- Only after all Everhour updates succeed does it rename the Basecamp todos to append the bracketed hours suffix.
|
|
66
|
+
|
|
67
|
+
## Guardrails
|
|
68
|
+
|
|
69
|
+
- If any Basecamp title has no Everhour match, stop and report it.
|
|
70
|
+
- If any Basecamp title matches more than one Everhour task, stop and report the ambiguity.
|
|
71
|
+
- If an estimate array length does not match the active todo count, stop before any updates.
|
|
72
|
+
- If the provided todo URL is already completed, stop without updating anything.
|
|
73
|
+
- Do not update Basecamp titles before Everhour updates complete.
|