@caddis/cli 0.4.10 → 0.4.12

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 (73) hide show
  1. package/bundles/antigravity-plugin/plugin.json +1 -1
  2. package/bundles/antigravity-plugin/scripts/caddis_spawn.py +60 -6
  3. package/bundles/antigravity-plugin/scripts/setup_project_ai.py +10 -0
  4. package/bundles/antigravity-plugin/skills/_registry.md +0 -1
  5. package/bundles/antigravity-plugin/skills/brainstorming/SKILL.md +2 -2
  6. package/bundles/antigravity-plugin/skills/explainer-doc/SKILL.md +1 -1
  7. package/bundles/antigravity-plugin/skills/ship-pr/SKILL.md +1 -1
  8. package/bundles/antigravity-plugin/skills/spawn-session/SKILL.md +15 -0
  9. package/bundles/antigravity-plugin/skills/ui-brief/SKILL.md +6 -1
  10. package/bundles/antigravity-plugin-extras/plugin.json +1 -1
  11. package/bundles/antigravity-plugin-extras/skills/_registry.md +1 -19
  12. package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +1 -1
  13. package/bundles/codex/.codex/skills/workflow/brainstorming/SKILL.md +2 -2
  14. package/bundles/manifest.json +3 -3
  15. package/package.json +1 -1
  16. package/bundles/antigravity-plugin-extras/skills/competitive-ads-extractor/SKILL.md +0 -294
  17. package/bundles/antigravity-plugin-extras/skills/content-research-writer/SKILL.md +0 -539
  18. package/bundles/antigravity-plugin-extras/skills/domain-name-brainstormer/SKILL.md +0 -213
  19. package/bundles/antigravity-plugin-extras/skills/humanizer/SKILL.md +0 -194
  20. package/bundles/antigravity-plugin-extras/skills/image-enhancer/SKILL.md +0 -100
  21. package/bundles/antigravity-plugin-extras/skills/invoice-organizer/SKILL.md +0 -447
  22. package/bundles/antigravity-plugin-extras/skills/job-application/SKILL.md +0 -188
  23. package/bundles/antigravity-plugin-extras/skills/lead-research-assistant/SKILL.md +0 -200
  24. package/bundles/antigravity-plugin-extras/skills/meeting-insights-analyzer/SKILL.md +0 -328
  25. package/bundles/antigravity-plugin-extras/skills/notebooklm/AUTHENTICATION.md +0 -154
  26. package/bundles/antigravity-plugin-extras/skills/notebooklm/SKILL.md +0 -270
  27. package/bundles/antigravity-plugin-extras/skills/notebooklm/references/api_reference.md +0 -309
  28. package/bundles/antigravity-plugin-extras/skills/notebooklm/references/troubleshooting.md +0 -376
  29. package/bundles/antigravity-plugin-extras/skills/notebooklm/references/usage_patterns.md +0 -338
  30. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/__init__.py +0 -81
  31. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/ask_question.py +0 -256
  32. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/auth_manager.py +0 -358
  33. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/browser_session.py +0 -255
  34. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/browser_utils.py +0 -107
  35. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/cleanup_manager.py +0 -302
  36. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/config.py +0 -44
  37. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/notebook_manager.py +0 -410
  38. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/run.py +0 -102
  39. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/setup_environment.py +0 -204
  40. package/bundles/antigravity-plugin-extras/skills/onboard-project/SKILL.md +0 -192
  41. package/bundles/antigravity-plugin-extras/skills/pipeline-state/SKILL.md +0 -208
  42. package/bundles/antigravity-plugin-extras/skills/raffle-winner-picker/SKILL.md +0 -159
  43. package/bundles/antigravity-plugin-extras/skills/relay/SKILL.md +0 -246
  44. package/bundles/antigravity-plugin-extras/skills/requesting-code-review/SKILL.md +0 -105
  45. package/bundles/antigravity-plugin-extras/skills/requesting-code-review/code-reviewer.md +0 -146
  46. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/LICENSE.txt +0 -202
  47. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/SKILL.md +0 -646
  48. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/color_palettes.py +0 -302
  49. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/easing.py +0 -230
  50. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/frame_composer.py +0 -469
  51. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/gif_builder.py +0 -246
  52. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/typography.py +0 -357
  53. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/validators.py +0 -264
  54. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/visual_effects.py +0 -494
  55. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/requirements.txt +0 -4
  56. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/bounce.py +0 -106
  57. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/explode.py +0 -331
  58. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/fade.py +0 -329
  59. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/flip.py +0 -291
  60. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/kaleidoscope.py +0 -211
  61. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/morph.py +0 -329
  62. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/move.py +0 -293
  63. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/pulse.py +0 -268
  64. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/shake.py +0 -127
  65. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/slide.py +0 -291
  66. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/spin.py +0 -269
  67. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/wiggle.py +0 -300
  68. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/zoom.py +0 -312
  69. package/bundles/antigravity-plugin-extras/skills/state-tracking/SKILL.md +0 -131
  70. package/bundles/antigravity-plugin-extras/skills/video-downloader/SKILL.md +0 -107
  71. package/bundles/antigravity-plugin-extras/skills/youtube-transcript/SKILL.md +0 -416
  72. package/bundles/codex/.codex/skills/workflow/golden-plan/SKILL.md +0 -586
  73. /package/bundles/{antigravity-plugin → antigravity-plugin-extras}/skills/golden-plan/SKILL.md +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "caddis",
3
- "version": "1.3.97",
3
+ "version": "1.3.101",
4
4
  "description": "caddis — agent-agnostic dev harness as an Antigravity (agy) plugin: TDD skills + commands, single-sourced with the Claude Code plugin."
5
5
  }
@@ -546,14 +546,58 @@ def handshake_read(repo_root: Path, spawn_id: str) -> dict | None:
546
546
  return None
547
547
 
548
548
 
549
+ MAX_REJECTS = 2
550
+
551
+
549
552
  def handshake_record(repo_root: Path, spawn_id: str, event: str,
550
- peer: str = "") -> tuple[dict | None, str]:
551
- """Advance the handshake. Never rewinds: a verdict cannot un-answer the questions, and an
552
- out-of-order event is a sign the operator has lost track of which round they are in — which
553
- is exactly when a silent overwrite would hurt."""
553
+ peer: str = "", verdict: str = "") -> tuple[dict | None, str]:
554
+ """Advance the handshake. One step forward, with exactly one named exception.
555
+
556
+ **REJECT sends it back to `awaiting-answers`, and that is the whole point of this function
557
+ having a rewind at all.** `spawn-session.md` defines REJECT as "an instruction to re-read named
558
+ sections and re-answer", and says "two REJECTs on one spawn means the HANDOVER is at fault —
559
+ regenerate it". Neither was possible until 2026-09-10: the states were strictly linear, so
560
+ after `verdict-sent` the only legal event was `ack`, and the handshake did not even record
561
+ WHICH verdict was sent. ACCEPT and REJECT were indistinguishable in the state file, so nothing
562
+ could count REJECTs and the two-strike rule was unenforceable prose.
563
+
564
+ Every other rewind is still refused. An out-of-order event is an operator who has lost track of
565
+ the round, which is exactly when a silent overwrite would hurt.
566
+ """
554
567
  state = handshake_read(repo_root, spawn_id)
555
568
  if state is None:
556
569
  return None, f"no handshake for {spawn_id} — run `handshake open --id {spawn_id}` first"
570
+
571
+ verdict = (verdict or "").strip().upper()
572
+ if event == "verdict" and verdict == "REJECT":
573
+ if state["state"] != "answered":
574
+ return state, (f"at `{state['state']}` — a REJECT only follows `answered`. "
575
+ "There is nothing to reject yet.")
576
+ n = int(state.get("rejects", 0)) + 1
577
+ if n > MAX_REJECTS - 1:
578
+ state["rejects"] = n
579
+ # Recorded even though it is refused. The counter is the enforceable fact, but a
580
+ # history showing one REJECT beside a count of two is a state file that contradicts
581
+ # itself, and the next reader has to work out which half to believe.
582
+ state["history"].append({"event": "verdict", "verdict": "REJECT", "refused": True,
583
+ "at": int(time.time()),
584
+ **({"peer": peer} if peer else {})})
585
+ _handshake_path(repo_root, spawn_id).write_text(
586
+ json.dumps(state, indent=2) + chr(10), encoding="utf-8")
587
+ return state, (
588
+ f"REJECT #{n}. `spawn-session.md`: two REJECTs on one spawn means the HANDOVER is "
589
+ "at fault, not the successor. Regenerate it — do not coach the child through a "
590
+ "third round. Close this handshake and open a new one on a rewritten handover.")
591
+ state["rejects"] = n
592
+ state["state"] = "awaiting-answers"
593
+ state["history"].append({"event": "verdict", "verdict": "REJECT", "at": int(time.time()),
594
+ **({"peer": peer} if peer else {})})
595
+ if peer:
596
+ state["peer"] = peer
597
+ _handshake_path(repo_root, spawn_id).write_text(
598
+ json.dumps(state, indent=2) + chr(10), encoding="utf-8")
599
+ return state, ""
600
+
557
601
  target = _EVENT_STATE[event]
558
602
  here = HANDSHAKE_STATES.index(state["state"])
559
603
  there = HANDSHAKE_STATES.index(target)
@@ -571,6 +615,7 @@ def handshake_record(repo_root: Path, spawn_id: str, event: str,
571
615
  if peer:
572
616
  state["peer"] = peer
573
617
  state["history"].append({"event": event, "at": int(time.time()),
618
+ **({"verdict": verdict} if event == "verdict" and verdict else {}),
574
619
  **({"peer": peer} if peer else {})})
575
620
  state["state"] = target
576
621
  _handshake_path(repo_root, spawn_id).write_text(
@@ -659,6 +704,12 @@ def main(argv: list[str] | None = None) -> int:
659
704
  h.add_argument("--id", required=True)
660
705
  h.add_argument("--repo-root", default=".")
661
706
  h.add_argument("--event", choices=sorted(_EVENT_STATE))
707
+ h.add_argument("--verdict", default="",
708
+ choices=["", "ACCEPT", "ACCEPT-WITH-CORRECTION", "REJECT"],
709
+ help="with `--event verdict`. REJECT returns the handshake to "
710
+ "`awaiting-answers` so the child re-reads and re-answers, and counts the "
711
+ "strike; the second REJECT refuses and tells you to regenerate the "
712
+ "handover instead of coaching the child through a third round")
662
713
  h.add_argument("--transport", choices=["auto", "message", "paste"], default="auto")
663
714
  h.add_argument("--peer", default="",
664
715
  help="the child's name as ListAgents shows it — take it from the `from-name` "
@@ -763,11 +814,14 @@ def main(argv: list[str] | None = None) -> int:
763
814
  if not a.event:
764
815
  sys.stderr.write("[spawn] --event is required for `record`" + chr(10))
765
816
  return EXIT_REFUSED
766
- st, err = handshake_record(root, a.id, a.event, a.peer)
817
+ st, err = handshake_record(root, a.id, a.event, a.peer, a.verdict)
767
818
  if err:
768
819
  sys.stderr.write("[spawn] " + err + chr(10))
769
820
  return EXIT_REFUSED
770
- print(f"[spawn] {a.id}: {st['state']}")
821
+ rejects = int((st or {}).get("rejects", 0))
822
+ tail = f" (REJECT #{rejects} — re-read and re-answer)" if \
823
+ (a.verdict.upper() == "REJECT" and rejects) else ""
824
+ print(f"[spawn] {a.id}: {st['state']}{tail}")
771
825
  return EXIT_OK
772
826
  if a.action == "close" and not (st.get("peer") or "").strip() \
773
827
  and st["state"] != HANDSHAKE_STATES[0]:
@@ -699,6 +699,16 @@ repo**: an access request, a decision from another team, a change only someone e
699
699
  table stops a sent message from going unchased. Comms are almost always sent to get an *action*, and
700
700
  an unanswered ask looks exactly like a forgotten one unless something is tracking it.
701
701
 
702
+ **Read that rule the other way round: THIS TABLE IS WHERE YOU LOOK BEFORE YOU WRITE ONE.** Check it
703
+ before drafting, not only after filing. A handover transfers a task, and for the whole overlap
704
+ window two sessions can both believe an outbound note is theirs - on 2026-09-08 two of them wrote
705
+ the same note five minutes apart, and both sat here marked ready to send. Two notes on one subject
706
+ reaching one team reads as one team not talking to itself.
707
+
708
+ **If you do find a duplicate, do not delete it.** Verify its unique contributions independently,
709
+ fold them into the survivor, and archive the loser with a banner saying why. The second draft is a
710
+ second reading - the one in that incident found a defect in the first.
711
+
702
712
  | Raised | Audience | Subject | Status | Blocks | File |
703
713
  |---|---|---|---|---|---|
704
714
  | _(none yet)_ | | | | | |
@@ -124,7 +124,6 @@
124
124
  | Best Practices | `best-practices/` | >- |
125
125
  | Brainstorming | `brainstorming/` | You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation. |
126
126
  | Context Curator | `context-curator/` | Compress and prioritize codebase context before handing work to reasoning agents, minimizing token waste while preserving the required decision inputs. |
127
- | Golden Plan | `golden-plan/` | USE THIS SKILL whenever a user asks for a comprehensive implementation plan, a full-stack build plan, a UI+backend plan, or says 'create a plan for building X' where X spans multiple phases or systems. Also activate when the user says 'plan this project', 'I need a detailed plan', 'build plan', 'implementation plan', or attaches a mockup/wireframe and asks how to build it. Produces a zero-ambiguity, evidence-gated plan with self-contained per-phase prompts, exhaustive data binding tables, per-phase validation checklists, and a global quality gate. Evidence-gated: before writing phases, verify required artefacts (mockup, data sample, API contract, scaffold inventory); if any BLOCKER is missing, ask for it and wait before proceeding. Dual-mode: generic by default, junai-pipeline only when explicitly requested. Agent-agnostic - any agent with read/search/edit tools can use this skill. |
128
127
  | Preflight | `preflight/` | Plan-vs-codebase validation — verifies API contracts, type names, field accuracy, dependencies, and paths before implementation begins |
129
128
  | Setup Project Ai | `setup-project-ai/` | Install or refresh the agent-agnostic dev harness in this project (AGENTS.md-canonical rules hierarchy + CLAUDE.md @import shims, subagents, commands, settings) |
130
129
  | Skill Creator | `skill-creator/` | Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. |
@@ -44,8 +44,8 @@ Start by understanding the current project context, then ask questions one at a
44
44
 
45
45
  **Implementation (if continuing):**
46
46
  - Ask: "Ready to set up for implementation?"
47
- - Use superpowers:using-git-worktrees to create isolated workspace
48
- - Use superpowers:writing-plans to create detailed implementation plan
47
+ - Use the `using-git-worktrees` skill (caddis, devops/) to create an isolated workspace
48
+ - Use `/caddis:feature-plan` for a phased plan, or the `writing-plans` skill (caddis, docs/)
49
49
 
50
50
  ## Key Principles
51
51
 
@@ -13,7 +13,7 @@ either follows it blindly or argues with it. **The fix is not "add more detail"
13
13
 
14
14
  Proven in anger on a Genesys→ETL cutover spec handed to an external vendor team. The user's verdict:
15
15
  *"nailed it — the document was perfect, simple, this should be the standard for explainer documents."*
16
- Reference implementation to study: `serve-sight/docs/genesys-cutover/etl-implementation-spec.md` (full
16
+ Reference implementation to study: `a fleet app/docs/genesys-cutover/etl-implementation-spec.md` (full
17
17
  spec) and `pega-cticallid-change-request.md` (the same pattern compressed to one page for a single ask).
18
18
 
19
19
  ## When this is NOT the right skill
@@ -69,7 +69,7 @@ over 400 changed lines. No judgement in any of those — deliberately, because j
69
69
  what failed.
70
70
  <!-- /shared:cross-review-trigger -->
71
71
 
72
- > **Why this is mechanical and not "consider a review here".** serve-sight shipped four
72
+ > **Why this is mechanical and not "consider a review here".** a fleet app shipped four
73
73
  > production releases in one day — sixteen fixes across SQL, caches, refresh jobs and React — and
74
74
  > `/caddis:cross-review` ran **zero times**. Nothing was broken: the tool reported itself ready
75
75
  > with two providers keyed. Nothing decided *when* to call it. Measured there: 4 of 39 plan files
@@ -360,6 +360,21 @@ The vocabulary matches `/caddis:validate-phase` on purpose: same discipline, dif
360
360
  **Two REJECTs on one spawn means the HANDOVER is at fault, not the successor. Regenerate it** rather
361
361
  than coaching the child through it.
362
362
 
363
+ **Record the verdict — the machine enforces both of those rules only if you tell it which one:**
364
+
365
+ ```
366
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_spawn.py" handshake record --id <id> --event verdict --verdict REJECT
367
+ ```
368
+
369
+ A REJECT returns the handshake to `awaiting-answers`, so `record --event answers` is legal again
370
+ and the child re-answers. The **second** REJECT is refused: it tells you to regenerate the handover,
371
+ and the only way forward is then ACCEPT or abandoning the handshake.
372
+
373
+ Until 2026-09-10 `--verdict` did not exist. The states were strictly linear, so after `verdict-sent`
374
+ the only legal event was `ack`, and nothing recorded WHICH verdict was sent — ACCEPT and REJECT were
375
+ indistinguishable in the state file. So "re-read and re-answer" was impossible and "two REJECTs
376
+ means regenerate" was unenforceable, because nothing counted them.
377
+
363
378
  ### When the fault is yours, fix the class
364
379
 
365
380
  If validation finds an error that came from your handover, **fix the source document in the same
@@ -74,7 +74,12 @@ Every component must reflect the agreed colour story and font pairing — no fal
74
74
 
75
75
  **Motion discipline:**
76
76
  - Use animation as communication, not decoration
77
- - Always respect `prefers-reduced-motion` media query
77
+ - Always respect `prefers-reduced-motion` media query — but treat it as a DEFAULT, not a verdict.
78
+ Windows Server ships with animations off with no user preference expressed, so a build that only
79
+ checks the media query once at load and never offers a way back can freeze a genuinely correct
80
+ animation for the whole session with no override (found in `.caddis/second-brain.html`: the OS
81
+ read is captured into a `var` at script start and never re-read). Read the OS default into a
82
+ visible toggle, and have the draw loop read the toggle's current state, not a captured constant.
78
83
  - One hero animation moment — not every element animating on load
79
84
  - 44px minimum touch targets on mobile
80
85
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "caddis-extras",
3
- "version": "1.3.28",
3
+ "version": "1.3.29",
4
4
  "description": "caddis-extras — the long-tail skills for the Antigravity (agy) caddis plugin; install alongside caddis for the full set."
5
5
  }
@@ -99,30 +99,16 @@
99
99
  | Architecture Diagram | `architecture-diagram/` | Generate dark-themed technical architecture diagrams as self-contained HTML/SVG files. No external libraries or render tools needed — just a browser. Use for software system architecture, cloud infrastructure, microservice topologies, and deployment diagrams. |
100
100
  | Ascii Art | `ascii-art/` | Create text-based ASCII art using the right tool for the job — banners, borders, image conversion, pre-made art, and LLM-generated custom art. Decision-routing framework across pyfiglet, cowsay, TOIlet, boxes, and more. |
101
101
  | Excalidraw | `excalidraw/` | Brand-themed Excalidraw diagrams for project documentation |
102
- | Image Enhancer | `image-enhancer/` | Improves the quality of images, especially screenshots, by enhancing resolution, sharpness, and clarity. Perfect for preparing images for presentations, documentation, or social media posts. |
103
- | Notebooklm | `notebooklm/` | Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses. |
104
102
  | Plantuml | `plantuml/` | Brand-themed PlantUML diagrams for project documentation |
105
- | Slack Gif Creator | `slack-gif-creator/` | Toolkit for creating animated GIFs optimized for Slack, with validators for size constraints and composable animation primitives. This skill applies when users request animated GIFs or emoji animations for Slack from descriptions like "make me a GIF for Slack of X doing Y". |
106
103
  | Svg Create | `svg-create/` | Brand-themed SVG diagrams with consistent color palette and accessible design |
107
- | Video Downloader | `video-downloader/` | Downloads videos from YouTube and other platforms for offline viewing, editing, or archival. Handles various formats and quality options. |
108
- | Youtube Transcript | `youtube-transcript/` | Download YouTube video transcripts when user provides a YouTube URL or asks to download/get/fetch a transcript from YouTube. Also use when user wants to transcribe or get captions/subtitles from a YouTube video. |
109
104
 
110
105
  ### Productivity
111
106
 
112
107
  | Skill | Path | When to Use |
113
108
  |-------|------|-------------|
114
- | Competitive Ads Extractor | `competitive-ads-extractor/` | Extracts and analyzes competitors' ads from ad libraries (Facebook, LinkedIn, etc.) to understand what messaging, problems, and creative approaches are working. Helps inspire and improve your own ad campaigns. |
115
- | Content Research Writer | `content-research-writer/` | Assists in writing high-quality content by conducting research, adding citations, improving hooks, iterating on outlines, and providing real-time feedback on each section. Transforms your writing process from solo effort to collaborative partnership. |
116
- | Domain Name Brainstormer | `domain-name-brainstormer/` | Generates creative domain name ideas for your project and checks availability across multiple TLDs (.com, .io, .dev, .ai, etc.). Saves hours of brainstorming and manual checking. |
117
109
  | Github Issues | `github-issues/` | Create well-structured GitHub issues with proper labels, descriptions, and acceptance criteria. Use when creating bug reports, feature requests, or tracking tasks. |
118
- | Humanizer | `humanizer/` | Identify and remove AI writing patterns from text to make it sound natural and human. Covers 29 documented LLM output patterns. Use when asked to humanize, de-AI, un-ChatGPT, or rewrite drafts (blogs, docs, emails, PRs, releases) to sound authentic. |
119
110
  | Internal Comms | `internal-comms/` | Write internal communications using company formats. Use when writing status reports, leadership updates, company newsletters, FAQs, incident reports, project updates, or any internal communications. |
120
- | Invoice Organizer | `invoice-organizer/` | Automatically organizes invoices and receipts for tax preparation by reading messy files, extracting key information, renaming them consistently, and sorting them into logical folders. Turns hours of manual bookkeeping into minutes of automated organization. |
121
111
  | Jira Issues | `jira-issues/` | Create, update, and manage Jira issues from natural language. Use when the user wants to log bugs, create tickets, update issue status, or manage their Jira backlog. |
122
- | Job Application | `job-application/` | Write tailored cover letters and job applications using a structured methodology. Analyzes job descriptions, maps experience, and generates personalized applications. |
123
- | Lead Research Assistant | `lead-research-assistant/` | Identifies high-quality leads for your product or service by analyzing your business, searching for target companies, and providing actionable contact strategies. Perfect for sales, business development, and marketing professionals. |
124
- | Meeting Insights Analyzer | `meeting-insights-analyzer/` | Analyzes meeting transcripts and recordings to uncover behavioral patterns, communication insights, and actionable feedback. Identifies when you avoid conflict, use filler words, dominate conversations, or miss opportunities to listen. Perfect for professionals seeking to improve their communication and leadership skills. |
125
- | Raffle Winner Picker | `raffle-winner-picker/` | Picks random winners from lists, spreadsheets, or Google Sheets for giveaways, raffles, and contests. Ensures fair, unbiased selection with transparency. |
126
112
 
127
113
  ### Testing
128
114
 
@@ -144,12 +130,8 @@
144
130
  | File Organizer | `file-organizer/` | Intelligently organizes your files and folders across your computer by understanding context, finding duplicates, suggesting better structures, and automating cleanup tasks. Reduces cognitive load and keeps your digital workspace tidy without manual effort. |
145
131
  | Game Changing Features | `game-changing-features/` | Find 10x product opportunities and high-leverage improvements. Use when user wants strategic product thinking, mentions '10x', wants to find high-impact features, or says 'what would make this 10x better', 'product strategy', or 'what should we build next'. |
146
132
  | Golden Nuggets | `golden-nuggets/` | Extract durable tribal knowledge ('gold nuggets') from a codebase or a set of changed files and route each to its correct destination - instruction file, runbook, hub, or (in CI capture mode) a review inbox. This SKILL.md is the single source of truth for nugget categories, routing rules, write rules, inbox format, and verification gates. It is read by the knowledge-transfer agent (pipeline mode), by the /golden-nuggets prompt (independent mode), and referenced by the CI extraction script (capture mode). Use when capturing what was learned after a feature, fix, sprint, incident, or release. |
133
+ | Golden Plan | `golden-plan/` | USE THIS SKILL whenever a user asks for a comprehensive implementation plan, a full-stack build plan, a UI+backend plan, or says 'create a plan for building X' where X spans multiple phases or systems. Also activate when the user says 'plan this project', 'I need a detailed plan', 'build plan', 'implementation plan', or attaches a mockup/wireframe and asks how to build it. Produces a zero-ambiguity, evidence-gated plan with self-contained per-phase prompts, exhaustive data binding tables, per-phase validation checklists, and a global quality gate. Evidence-gated: before writing phases, verify required artefacts (mockup, data sample, API contract, scaffold inventory); if any BLOCKER is missing, ask for it and wait before proceeding. Dual-mode: generic by default, junai-pipeline only when explicitly requested. Agent-agnostic - any agent with read/search/edit tools can use this skill. |
147
134
  | Intent Writer | `intent-writer/` | Structure freetext ideas, backlog items, or vague requirements into a formal Intent Document that preserves user intent across the entire agent pipeline chain. |
148
- | Onboard Project | `onboard-project/` | Bootstrap a new project's AI configuration by generating copilot-instructions.md and populating project-config.md. Idempotent — safe to re-run on existing projects. |
149
- | Pipeline State | `pipeline-state/` | Read and write `.github/pipeline-state.json` to track stage progress, artefacts, supervision gates, and handoff payloads in the agent pipeline. |
150
135
  | Receiving Code Review | `receiving-code-review/` | Use when receiving code review feedback, before implementing suggestions, especially if feedback seems unclear or technically questionable - requires technical rigor and verification, not performative agreement or blind implementation |
151
- | Relay | `relay/` | Create or update a root relay.md session-continuation document for any repository. Use this skill whenever the user asks to preserve project context, resume later, hand work to a future session, create a session relay, summarize current implementation state, or generate a reusable continuation prompt. The workflow is generic and must discover project structure at runtime. |
152
- | Requesting Code Review | `requesting-code-review/` | Use when completing tasks, implementing major features, or before merging to verify work meets requirements |
153
136
  | Setup Project Ai | `setup-project-ai/` | Install or refresh the agent-agnostic development harness in a project — an AGENTS.md-canonical rules hierarchy (root + per-folder) with a CLAUDE.md @import shim beside each, lean subagents, slash commands, settings.json, and the frontend/python test env. USE THIS SKILL when setting up AI resources on a new or existing project, bootstrapping the rules files (AGENTS.md/CLAUDE.md), adding subagents/commands, or when the user says 'set up the harness', 'setup-project-ai', 'generate CLAUDE.md', 'onboard this project to Claude Code / Codex / agy', or runs /setup-project-ai. Combines a deterministic generator (scripts/setup_project_ai.py) for the must-not-vary mechanics with an AI enrichment step that curates project-specific AGENTS.md content. |
154
- | State Tracking | `state-tracking/` | USE THIS SKILL when an agent needs to maintain a living record of task progress across multiple sessions or hand-offs. Covers append-only audit logs, CURRENT_STATE head-of-line pattern, relay hand-off protocol, and recovery from mid-session interruptions. Works in both generic and junai-pipeline modes. |
155
137
  | Verification Loop | `verification-loop/` | Systematic code change verification — lint, test, type-check, review |
@@ -13,7 +13,7 @@ either follows it blindly or argues with it. **The fix is not "add more detail"
13
13
 
14
14
  Proven in anger on a Genesys→ETL cutover spec handed to an external vendor team. The user's verdict:
15
15
  *"nailed it — the document was perfect, simple, this should be the standard for explainer documents."*
16
- Reference implementation to study: `serve-sight/docs/genesys-cutover/etl-implementation-spec.md` (full
16
+ Reference implementation to study: `a fleet app/docs/genesys-cutover/etl-implementation-spec.md` (full
17
17
  spec) and `pega-cticallid-change-request.md` (the same pattern compressed to one page for a single ask).
18
18
 
19
19
  ## When this is NOT the right skill
@@ -44,8 +44,8 @@ Start by understanding the current project context, then ask questions one at a
44
44
 
45
45
  **Implementation (if continuing):**
46
46
  - Ask: "Ready to set up for implementation?"
47
- - Use superpowers:using-git-worktrees to create isolated workspace
48
- - Use superpowers:writing-plans to create detailed implementation plan
47
+ - Use the `using-git-worktrees` skill (caddis, devops/) to create an isolated workspace
48
+ - Use `/caddis:feature-plan` for a phased plan, or the `writing-plans` skill (caddis, docs/)
49
49
 
50
50
  ## Key Principles
51
51
 
@@ -1,8 +1,8 @@
1
1
  {
2
- "poolVersion": "1.3.97",
2
+ "poolVersion": "1.3.101",
3
3
  "bundles": {
4
- "antigravity-plugin": "1.3.97",
5
- "antigravity-plugin-extras": "1.3.28",
4
+ "antigravity-plugin": "1.3.101",
5
+ "antigravity-plugin-extras": "1.3.29",
6
6
  "codex": "unknown"
7
7
  }
8
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caddis/cli",
3
- "version": "0.4.10",
3
+ "version": "0.4.12",
4
4
  "description": "Install, update and diagnose the caddis dev harness across every coding agent you use (Claude Code, agy/Antigravity, and more).",
5
5
  "keywords": [
6
6
  "caddis",
@@ -1,294 +0,0 @@
1
- ---
2
- name: competitive-ads-extractor
3
- context: fork
4
- description: Extracts and analyzes competitors' ads from ad libraries (Facebook, LinkedIn, etc.) to understand what messaging, problems, and creative approaches are working. Helps inspire and improve your own ad campaigns.
5
- ---
6
-
7
- # Competitive Ads Extractor
8
-
9
- This skill extracts your competitors' ads from ad libraries and analyzes what's working—the problems they're highlighting, use cases they're targeting, and copy/creative that's resonating.
10
-
11
- ## When to Use This Skill
12
-
13
- - Researching competitor ad strategies
14
- - Finding inspiration for your own ads
15
- - Understanding market positioning
16
- - Identifying successful ad patterns
17
- - Analyzing messaging that works
18
- - Discovering new use cases or pain points
19
- - Planning ad campaigns with proven concepts
20
-
21
- ## What This Skill Does
22
-
23
- 1. **Extracts Ads**: Scrapes ads from Facebook Ad Library, LinkedIn, etc.
24
- 2. **Captures Screenshots**: Saves visual copies of all ads
25
- 3. **Analyzes Messaging**: Identifies problems, use cases, and value props
26
- 4. **Categorizes Ads**: Groups by theme, audience, or format
27
- 5. **Identifies Patterns**: Finds common successful approaches
28
- 6. **Provides Insights**: Explains why certain ads likely perform well
29
-
30
- ## How to Use
31
-
32
- ### Basic Extraction
33
-
34
- ```
35
- Extract all current ads from [Competitor Name] on Facebook Ad Library
36
- ```
37
-
38
- ```
39
- Scrape ads from [Company] and analyze their messaging
40
- ```
41
-
42
- ### Specific Analysis
43
-
44
- ```
45
- Get all ads from [Competitor] focusing on their messaging
46
- about [specific problem]. What pain points are they highlighting?
47
- ```
48
-
49
- ### Competitive Set
50
-
51
- ```
52
- Extract ads from these 5 competitors: [list].
53
- Compare their approaches and tell me what's working.
54
- ```
55
-
56
- ### Specific Platform
57
-
58
- ```
59
- Get LinkedIn ads from [Competitor] and analyze their
60
- B2B positioning strategy
61
- ```
62
-
63
- ## Example
64
-
65
- **User**: "Extract ads from Notion on Facebook Ad Library and tell me what messaging is working for them."
66
-
67
- **Process**:
68
- ```
69
- Accessing Facebook Ad Library...
70
- Searching for: Notion
71
- Found: 23 active ads
72
-
73
- Extracting screenshots...
74
- [████████████████████] 100%
75
-
76
- Saved to: competitor-ads/notion/
77
- - ad-001-collaboration.png
78
- - ad-002-productivity.png
79
- - ad-003-templates.png
80
- ...
81
-
82
- Analyzing messaging...
83
- ```
84
-
85
- **Output**:
86
- ```
87
- # Notion Ad Analysis
88
-
89
- ## Overview
90
- - Total Ads: 23 active
91
- - Primary Themes: Productivity (35%), Collaboration (30%),
92
- Templates (20%), AI Features (15%)
93
- - Ad Formats: Static images (60%), Video (40%)
94
- - CTA Patterns: "Try for free", "Get started"
95
-
96
- ## Key Problems They're Highlighting
97
-
98
- 1. **Scattered Information** (8 ads)
99
- Copy: "Stop switching between 10 different tools"
100
- Why it works: Direct pain point many teams face
101
-
102
- 2. **Meeting Overload** (5 ads)
103
- Copy: "Replace unnecessary meetings with async updates"
104
- Why it works: Post-COVID remote work pain point
105
-
106
- 3. **Lost Documentation** (4 ads)
107
- Copy: "Never ask 'where is that doc?' again"
108
- Why it works: Universal workplace frustration
109
-
110
- ## Successful Creative Patterns
111
-
112
- ### Pattern 1: Before/After Split
113
- - Shows chaotic tool landscape → Clean Notion workspace
114
- - Used in 6 high-performing ads
115
- - Visual metaphor is immediately clear
116
-
117
- ### Pattern 2: Feature Showcase
118
- - GIF of actual product usage
119
- - Shows specific feature in 5 seconds
120
- - Used for new features (AI, templates)
121
-
122
- ### Pattern 3: Social Proof
123
- - "Join 20M users" messaging
124
- - Customer logos
125
- - Used in 4 ads targeting enterprise
126
-
127
- ## Copy That's Working
128
-
129
- Best Headlines:
130
- 1. "Your team's knowledge, finally in one place"
131
- → Benefit-focused, addresses pain directly
132
-
133
- 2. "The all-in-one workspace"
134
- → Clear positioning, broad appeal
135
-
136
- 3. "AI that actually helps you work"
137
- → Addresses AI skepticism, practical angle
138
-
139
- Best Body Copy Patterns:
140
- - Short sentences (under 10 words)
141
- - Focus on outcomes not features
142
- - Include specific numbers ("Cut meetings by 50%")
143
-
144
- ## Audience Targeting Insights
145
-
146
- Based on ad variations:
147
- - Startup founders: Solo productivity angle
148
- - Team leads: Collaboration and alignment
149
- - Enterprise: Security and compliance mentions
150
- - Students: Free plan, templates, organization
151
-
152
- ## Recommendations for Your Ads
153
-
154
- 1. **Test the "tool sprawl" pain point**
155
- → Strong resonance based on their ad frequency
156
-
157
- 2. **Use product screenshots over abstract visuals**
158
- → All their top ads show actual UI
159
-
160
- 3. **Lead with the problem, not the solution**
161
- → "Tired of X?" performs better than "Introducing Y"
162
-
163
- 4. **Keep copy under 100 characters**
164
- → Their shortest ads seem most frequent
165
-
166
- 5. **Test before/after visual formats**
167
- → Proven pattern in their creative
168
-
169
- ## Files Saved
170
- - All ads: ~/competitor-ads/notion/
171
- - Analysis: ~/competitor-ads/notion/analysis.md
172
- - Best performers: ~/competitor-ads/notion/top-10/
173
- ```
174
-
175
- **Inspired by:** Sumant Subrahmanya's use case from Lenny's Newsletter
176
-
177
- ## What You Can Learn
178
-
179
- ### Messaging Analysis
180
- - What problems they emphasize
181
- - How they position against competition
182
- - Value propositions that resonate
183
- - Target audience segments
184
-
185
- ### Creative Patterns
186
- - Visual styles that work
187
- - Video vs. static image performance
188
- - Color schemes and branding
189
- - Layout patterns
190
-
191
- ### Copy Formulas
192
- - Headline structures
193
- - Call-to-action patterns
194
- - Length and tone
195
- - Emotional triggers
196
-
197
- ### Campaign Strategy
198
- - Seasonal campaigns
199
- - Product launch approaches
200
- - Feature announcement tactics
201
- - Retargeting patterns
202
-
203
- ## Best Practices
204
-
205
- ### Legal & Ethical
206
- ✓ Only use for research and inspiration
207
- ✓ Don't copy ads directly
208
- ✓ Respect intellectual property
209
- ✓ Use insights to inform original creative
210
- ✗ Don't plagiarize copy or steal designs
211
-
212
- ### Analysis Tips
213
- 1. **Look for patterns**: What themes repeat?
214
- 2. **Track over time**: Save ads monthly to see evolution
215
- 3. **Test hypotheses**: Adapt successful patterns for your brand
216
- 4. **Segment by audience**: Different messages for different targets
217
- 5. **Compare platforms**: LinkedIn vs Facebook messaging differs
218
-
219
- ## Advanced Features
220
-
221
- ### Trend Tracking
222
- ```
223
- Compare [Competitor]'s ads from Q1 vs Q2.
224
- What messaging has changed?
225
- ```
226
-
227
- ### Multi-Competitor Analysis
228
- ```
229
- Extract ads from [Company A], [Company B], [Company C].
230
- What are the common patterns? Where do they differ?
231
- ```
232
-
233
- ### Industry Benchmarks
234
- ```
235
- Show me ad patterns across the top 10 project management
236
- tools. What problems do they all focus on?
237
- ```
238
-
239
- ### Format Analysis
240
- ```
241
- Analyze video ads vs static image ads from [Competitor].
242
- Which gets more engagement? (if data available)
243
- ```
244
-
245
- ## Common Workflows
246
-
247
- ### Ad Campaign Planning
248
- 1. Extract competitor ads
249
- 2. Identify successful patterns
250
- 3. Note gaps in their messaging
251
- 4. Brainstorm unique angles
252
- 5. Draft test ad variations
253
-
254
- ### Positioning Research
255
- 1. Get ads from 5 competitors
256
- 2. Map their positioning
257
- 3. Find underserved angles
258
- 4. Develop differentiated messaging
259
- 5. Test against their approaches
260
-
261
- ### Creative Inspiration
262
- 1. Extract ads by theme
263
- 2. Analyze visual patterns
264
- 3. Note color and layout trends
265
- 4. Adapt successful patterns
266
- 5. Create original variations
267
-
268
- ## Tips for Success
269
-
270
- 1. **Regular Monitoring**: Check monthly for changes
271
- 2. **Broad Research**: Look at adjacent competitors too
272
- 3. **Save Everything**: Build a reference library
273
- 4. **Test Insights**: Run your own experiments
274
- 5. **Track Performance**: A/B test inspired concepts
275
- 6. **Stay Original**: Use for inspiration, not copying
276
- 7. **Multiple Platforms**: Compare Facebook, LinkedIn, TikTok, etc.
277
-
278
- ## Output Formats
279
-
280
- - **Screenshots**: All ads saved as images
281
- - **Analysis Report**: Markdown summary of insights
282
- - **Spreadsheet**: CSV with ad copy, CTAs, themes
283
- - **Presentation**: Visual deck of top performers
284
- - **Pattern Library**: Categorized by approach
285
-
286
- ## Related Use Cases
287
-
288
- - Writing better ad copy for your campaigns
289
- - Understanding market positioning
290
- - Finding content gaps in your messaging
291
- - Discovering new use cases for your product
292
- - Planning product marketing strategy
293
- - Inspiring social media content
294
-