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.
Files changed (41) hide show
  1. package/README.md +49 -0
  2. package/agents/README.md +10 -0
  3. package/agents/horizon-component-library/AGENTS.md +184 -0
  4. package/agents/horizon-component-library/README.md +10 -0
  5. package/agents/horizon-component-library/scripts/td-guard.sh +49 -0
  6. package/bin/cli.js +209 -0
  7. package/package.json +23 -0
  8. package/scripts/smoke-install.sh +56 -0
  9. package/skills/README.md +15 -0
  10. package/skills/cache-reset/SKILL.md +18 -0
  11. package/skills/cache-reset/agents/openai.yaml +4 -0
  12. package/skills/car-ticket-generator/SKILL.md +130 -0
  13. package/skills/car-ticket-generator/agents/openai.yaml +4 -0
  14. package/skills/everhour-basecamp-estimates/.env.example +2 -0
  15. package/skills/everhour-basecamp-estimates/SKILL.md +73 -0
  16. package/skills/everhour-basecamp-estimates/agents/openai.yaml +4 -0
  17. package/skills/everhour-basecamp-estimates/scripts/update_estimates.py +518 -0
  18. package/skills/everhour-basecamp-estimates/tests/test_update_estimates.py +93 -0
  19. package/skills/horizon-component-migration/SKILL.md +59 -0
  20. package/skills/horizon-component-migration/agents/openai.yaml +4 -0
  21. package/skills/pr-solver/SKILL.md +50 -0
  22. package/skills/pr-solver/agents/openai.yaml +4 -0
  23. package/skills/pr-solver/references/github-pr-reviewthreads-graphql.md +63 -0
  24. package/skills/pr-solver/scripts/list_unresolved_threads.py +307 -0
  25. package/skills/pull-request/SKILL.md +216 -0
  26. package/skills/pull-request/agents/openai.yaml +4 -0
  27. package/skills/record-changes/SKILL.md +75 -0
  28. package/skills/record-changes/agents/openai.yaml +4 -0
  29. package/skills/record-changes/scripts/branch_diff_context.py +190 -0
  30. package/skills/stylesheet-migration/SKILL.md +36 -0
  31. package/skills/stylesheet-migration/agents/openai.yaml +6 -0
  32. package/skills/stylesheet-migration/scripts/__pycache__/liquid_stylesheet_migrator.cpython-312.pyc +0 -0
  33. package/skills/stylesheet-migration/scripts/__pycache__/test_liquid_stylesheet_migrator.cpython-312.pyc +0 -0
  34. package/skills/stylesheet-migration/scripts/liquid_stylesheet_migrator.py +204 -0
  35. package/skills/stylesheet-migration/scripts/migrate_stylesheet_tags.py +172 -0
  36. package/skills/stylesheet-migration/scripts/test_liquid_stylesheet_migrator.py +254 -0
  37. package/skills/td-js-vanilla-rules/SKILL.md +70 -0
  38. package/skills/td-js-vanilla-rules/agents/openai.yaml +3 -0
  39. package/skills/td-review/SKILL.md +122 -0
  40. package/skills/td-review/agents/openai.yaml +4 -0
  41. 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,4 @@
1
+ interface:
2
+ display_name: 'Car Ticket Generator'
3
+ short_description: 'Generate a car ticket for the user'
4
+ default_prompt: 'Generate a car ticket for the user'
@@ -0,0 +1,2 @@
1
+ EVERHOUR_API_KEY=replace-with-everhour-api-key
2
+ EVERHOUR_PROJECT_ID=ev:1234567890
@@ -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.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: 'Everhour Estimates'
3
+ short_description: 'Bulk sync Everhour estimates from Basecamp todos.'
4
+ default_prompt: 'Use $everhour-basecamp-estimates to update Everhour task estimates from a Basecamp todo or todolist URL.'