diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index f70fe1c..40d2f00 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -2,13 +2,10 @@ name: Deploy GitHub Pages on: push: - branches: [main] + branches: [main, go-to-market] paths: - - 'book/**' - - 'assets/**' - - 'diagrams/**' - - 'scripts/generate-toc.sh' - - 'scripts/validate-links.sh' + - 'website/**' + - '.github/workflows/deploy-pages.yml' workflow_dispatch: permissions: @@ -31,37 +28,35 @@ jobs: with: fetch-depth: 0 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' - cache: 'npm' + cache: 'pnpm' + cache-dependency-path: 'website/pnpm-lock.yaml' - name: Install dependencies - run: npm ci - - # TODO: Fix markdown-link-check ESM dependency issue - # - name: Validate internal links - # run: ./scripts/validate-links.sh - # env: - # CHECK_EXTERNAL: false + working-directory: ./website + run: pnpm install --frozen-lockfile - - name: Generate table of contents - run: ./scripts/generate-toc.sh + - name: Build Next.js site + working-directory: ./website + run: pnpm build + env: + NEXT_PUBLIC_BASE_PATH: /agentic-coding-book - name: Configure GitHub Pages uses: actions/configure-pages@v4 - - name: Build Jekyll site - uses: actions/jekyll-build-pages@v1 - with: - source: ./book - destination: ./_site - - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: - path: ./_site + path: ./website/out - name: Deploy to GitHub Pages id: deployment diff --git a/README.md b/README.md index e950a44..d9c33cf 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # The Agentic Coding Playbook: From Idea to Production in 6 Weeks [![License: CC BY 4.0](https://img.shields.io/badge/License-CC%20BY%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by/4.0/) -[![Status: In Development](https://img.shields.io/badge/status-in%20development-yellow.svg)]() +[![Status: Part 1 Published](https://img.shields.io/badge/status-part%201%20published-green.svg)]() [![Deploy Pages](https://github.com/testaco/agentic-coding-book/actions/workflows/deploy-pages.yml/badge.svg)](https://github.com/testaco/agentic-coding-book/actions/workflows/deploy-pages.yml) [![Build PDF](https://github.com/testaco/agentic-coding-book/actions/workflows/build-pdf.yml/badge.svg)](https://github.com/testaco/agentic-coding-book/actions/workflows/build-pdf.yml) [![Validate](https://github.com/testaco/agentic-coding-book/actions/workflows/validate.yml/badge.svg)](https://github.com/testaco/agentic-coding-book/actions/workflows/validate.yml) @@ -51,11 +51,17 @@ If you want to ship software products faster using AI assistance, this book is f ## Development Status -**Current Milestone:** MVP (Week 2) - Infrastructure setup and Part 1: Foundations +**🎉 Part 1: Foundations is now published!** All five foundational chapters are complete and ready to read. + +**Current Status:** +- ✅ Part 1: Foundations - Published (5 chapters, ~70K words) +- 🚧 Part 2: The Playbook - In development +- 📋 Part 3: Patterns & Tools - Planned +- 📋 Part 4: Complete Example - Planned **Upcoming Milestones:** -- Week 6: v1.0 - Complete first pass of all 4 parts -- Week 12: v1.1 - Refinements, advanced patterns, print-ready +- Q2 2026: Part 2 (The Playbook) release +- Q3 2026: Parts 3-4 and v1.0 complete edition See [`planning/roadmap.md`](planning/roadmap.md) for detailed timeline and [`CHANGELOG.md`](CHANGELOG.md) for version history. @@ -215,7 +221,7 @@ See the [LICENSE](LICENSE) file for the complete legal text. ## Author -[Author information - TBD] +**Chris Testa** - CTO and engineering leader with decades of experience shipping products at scale. Now teaching others to build software products in the age of AI. ## Acknowledgments @@ -225,6 +231,6 @@ Special thanks to the Claude Code team at Anthropic for creating tools that make --- -**Status:** 🚧 **In Development** - Infrastructure setup complete, Part 1 content in progress +**Status:** ✅ **Part 1 Published** - Infrastructure complete, Part 1: Foundations published, Parts 2-4 in development -**Next Milestone:** Week 2 MVP with Part 1: Foundations complete +**Next Milestone:** Part 2: The Playbook (Q2 2026) diff --git a/book/_data/navigation.yml b/book/_data/navigation.yml index d1a9552..b148298 100644 --- a/book/_data/navigation.yml +++ b/book/_data/navigation.yml @@ -21,21 +21,5 @@ parts: url: "/part1-foundations/03-architecture-principles/01-introduction" - title: "4. Digestible Interfaces" url: "/part1-foundations/04-digestible-interfaces/01-introduction" - - - title: "Part 2: The Playbook" - url: "/part2-playbook/" - chapters: - - title: "3. Brainstorm to Brief" - url: "/part2-playbook/03-brainstorm-to-brief" - - - title: "Part 3: Patterns & Tools" - url: "/part3-patterns-tools/" - chapters: - - title: "1. EARS Notation" - url: "/part3-patterns-tools/specifications/ears-notation" - - - title: "Part 4: Complete Example" - url: "/part4-example/" - chapters: - - title: "5. Implementing the MVP" - url: "/part4-example/05-implementing-mvp" + - title: "5. New Bottlenecks" + url: "/part1-foundations/05-new-bottlenecks/01-introduction" diff --git a/book/index.md b/book/index.md index 41588f5..cb2d99d 100644 --- a/book/index.md +++ b/book/index.md @@ -5,8 +5,8 @@ part: 0 chapter: 0 version: "1.0" date: "2025-12-28" -status: "draft" -author: "Author Name" +status: "published" +author: "Chris Testa" tags: ["introduction", "overview", "agentic-coding"] related: - preface.md @@ -232,17 +232,17 @@ Under the following terms: ## Status -This book is currently **in active development**. +**Part 1: Foundations is now published!** Parts 2-4 are in active development. -| Component | Status | -| ------------------------ | ------------------------ | -| Part 1: Foundations | Draft chapters available | -| Part 2: The Playbook | In progress | -| Part 3: Patterns & Tools | Partial coverage | -| Part 4: Complete Example | Planned | -| Infrastructure | Complete | +| Component | Status | +| ------------------------ | ----------- | +| Part 1: Foundations | ✅ Published | +| Part 2: The Playbook | In progress | +| Part 3: Patterns & Tools | Planned | +| Part 4: Complete Example | Planned | +| Infrastructure | Complete | -Watch the repository or check back for updates. +[Watch the repository](https://github.com/testaco/agentic-coding-book) to get notified when Parts 2-4 are released. --- diff --git a/book/part1-foundations/01-renaissance-developer/01-introduction-the-specialist-s-dilemma.md b/book/part1-foundations/01-renaissance-developer/01-introduction-the-specialist-s-dilemma.md index 838616f..3522dee 100644 --- a/book/part1-foundations/01-renaissance-developer/01-introduction-the-specialist-s-dilemma.md +++ b/book/part1-foundations/01-renaissance-developer/01-introduction-the-specialist-s-dilemma.md @@ -6,8 +6,8 @@ chapter: 1 section: 1 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset diff --git a/book/part1-foundations/01-renaissance-developer/02-the-renaissance-developer-model.md b/book/part1-foundations/01-renaissance-developer/02-the-renaissance-developer-model.md index 5df8759..560c7b5 100644 --- a/book/part1-foundations/01-renaissance-developer/02-the-renaissance-developer-model.md +++ b/book/part1-foundations/01-renaissance-developer/02-the-renaissance-developer-model.md @@ -6,8 +6,8 @@ chapter: 1 section: 2 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset diff --git a/book/part1-foundations/01-renaissance-developer/03-what-changes-what-doesn-t.md b/book/part1-foundations/01-renaissance-developer/03-what-changes-what-doesn-t.md index be9c382..a154f7a 100644 --- a/book/part1-foundations/01-renaissance-developer/03-what-changes-what-doesn-t.md +++ b/book/part1-foundations/01-renaissance-developer/03-what-changes-what-doesn-t.md @@ -6,8 +6,8 @@ chapter: 1 section: 3 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset diff --git a/book/part1-foundations/01-renaissance-developer/04-the-good-enough-at-everything-principle.md b/book/part1-foundations/01-renaissance-developer/04-the-good-enough-at-everything-principle.md index d0ac4f7..a6cd189 100644 --- a/book/part1-foundations/01-renaissance-developer/04-the-good-enough-at-everything-principle.md +++ b/book/part1-foundations/01-renaissance-developer/04-the-good-enough-at-everything-principle.md @@ -6,8 +6,8 @@ chapter: 1 section: 4 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset diff --git a/book/part1-foundations/01-renaissance-developer/05-from-coder-to-builder-a-mindset-shift.md b/book/part1-foundations/01-renaissance-developer/05-from-coder-to-builder-a-mindset-shift.md index 23b2925..da43f97 100644 --- a/book/part1-foundations/01-renaissance-developer/05-from-coder-to-builder-a-mindset-shift.md +++ b/book/part1-foundations/01-renaissance-developer/05-from-coder-to-builder-a-mindset-shift.md @@ -6,8 +6,8 @@ chapter: 1 section: 5 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset diff --git a/book/part1-foundations/01-renaissance-developer/06-practical-example-building-a-feature-alone.md b/book/part1-foundations/01-renaissance-developer/06-practical-example-building-a-feature-alone.md index ca35030..e84ec2b 100644 --- a/book/part1-foundations/01-renaissance-developer/06-practical-example-building-a-feature-alone.md +++ b/book/part1-foundations/01-renaissance-developer/06-practical-example-building-a-feature-alone.md @@ -6,8 +6,8 @@ chapter: 1 section: 6 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset diff --git a/book/part1-foundations/01-renaissance-developer/07-common-pitfalls.md b/book/part1-foundations/01-renaissance-developer/07-common-pitfalls.md index 56dc71a..ba57058 100644 --- a/book/part1-foundations/01-renaissance-developer/07-common-pitfalls.md +++ b/book/part1-foundations/01-renaissance-developer/07-common-pitfalls.md @@ -6,8 +6,8 @@ chapter: 1 section: 7 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset diff --git a/book/part1-foundations/01-renaissance-developer/08-why-this-matters-now.md b/book/part1-foundations/01-renaissance-developer/08-why-this-matters-now.md index 04b32d6..9c15359 100644 --- a/book/part1-foundations/01-renaissance-developer/08-why-this-matters-now.md +++ b/book/part1-foundations/01-renaissance-developer/08-why-this-matters-now.md @@ -6,8 +6,8 @@ chapter: 1 section: 8 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset diff --git a/book/part1-foundations/01-renaissance-developer/09-summary.md b/book/part1-foundations/01-renaissance-developer/09-summary.md index bedf2b6..2c6f2ad 100644 --- a/book/part1-foundations/01-renaissance-developer/09-summary.md +++ b/book/part1-foundations/01-renaissance-developer/09-summary.md @@ -6,8 +6,8 @@ chapter: 1 section: 9 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset diff --git a/book/part1-foundations/01-renaissance-developer/10-further-reading.md b/book/part1-foundations/01-renaissance-developer/10-further-reading.md index 8fbb90a..6099afd 100644 --- a/book/part1-foundations/01-renaissance-developer/10-further-reading.md +++ b/book/part1-foundations/01-renaissance-developer/10-further-reading.md @@ -6,8 +6,8 @@ chapter: 1 section: 10 version: '0.1' date: '2025-12-24' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - renaissance-developer - mindset @@ -25,18 +25,18 @@ abstract: Section 10 of The Renaissance Developer **Continue the foundations**: -- **Chapter 2: What Is Agentic Coding?** - [Placeholder: Deep dive into the mechanics of AI-assisted development: tools, agents, workflows, and how they work together] -- **Chapter 3: Architecture Principles for Agentic Development** - [Placeholder: How system design changes when AI handles implementation] -- **Chapter 4: Digestible Interfaces** - [Placeholder: Why clear boundaries and contracts matter for both humans and AI] +- **Chapter 2: What Is Agentic Coding?** - Explore the full spectrum of AI-assisted development: from autocomplete to autonomous agents. Understand the tools, capabilities, and workflows that enable Renaissance Developers to move fast without sacrificing quality. +- **Chapter 3: Architecture Principles for Agentic Development** - Learn how system architecture evolves when AI handles implementation. Discover why modularity, interface contracts, and clear boundaries become even more critical in an AI-accelerated workflow. +- **Chapter 4: Digestible Interfaces** - Master the art of designing interfaces that work for both human reviewers and AI implementers. Learn why the same principles that make code human-readable also make it AI-processable. **Apply the concepts**: -- **Part 2: The Playbook** - [Placeholder: The complete 6-week journey from idea to production, starting with transforming your idea into a clear vision] -- **Chapter 6: Requirements Writing with EARS** - [Placeholder: Learn to write specifications that AI can implement accurately] +- **Part 2: The Playbook** - Follow the complete 6-week journey from initial idea to production deployment. Get a step-by-step guide to each phase: ideation, brainstorming, requirements, design, implementation, and launch. See the Renaissance Developer model in action. +- **Part 2: Requirements and Specifications** - Master the art of writing specifications that AI can implement accurately. Learn EARS notation, API contracts, and structured requirements that eliminate ambiguity and accelerate development. **Pattern reference**: -- **Part 3: Patterns & Tools** - [Placeholder: Reference material for specific techniques, architectural patterns, and tool deep-dives] +- **Part 3: Patterns & Tools** - Deep-dive reference on architecture patterns, specification formats, testing strategies, and toolchain optimization. Return here when you need detailed guidance on specific techniques, from bounded contexts to MCP servers to test pyramids. ### External Resources diff --git a/book/part1-foundations/02-what-is-agentic-coding/01-introduction.md b/book/part1-foundations/02-what-is-agentic-coding/01-introduction.md index 6da8525..e6262b9 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/01-introduction.md +++ b/book/part1-foundations/02-what-is-agentic-coding/01-introduction.md @@ -6,8 +6,8 @@ chapter: 2 section: 1 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/02-what-is-agentic-coding/02-defining-agentic-coding.md b/book/part1-foundations/02-what-is-agentic-coding/02-defining-agentic-coding.md index 42ff9e1..b891e3e 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/02-defining-agentic-coding.md +++ b/book/part1-foundations/02-what-is-agentic-coding/02-defining-agentic-coding.md @@ -6,8 +6,8 @@ chapter: 2 section: 2 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/02-what-is-agentic-coding/03-the-spectrum-of-agentic-coding.md b/book/part1-foundations/02-what-is-agentic-coding/03-the-spectrum-of-agentic-coding.md index 6cd15a1..a3fc7c4 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/03-the-spectrum-of-agentic-coding.md +++ b/book/part1-foundations/02-what-is-agentic-coding/03-the-spectrum-of-agentic-coding.md @@ -6,8 +6,8 @@ chapter: 2 section: 3 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/02-what-is-agentic-coding/04-how-they-work-together.md b/book/part1-foundations/02-what-is-agentic-coding/04-how-they-work-together.md index 5e1e025..c0c04eb 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/04-how-they-work-together.md +++ b/book/part1-foundations/02-what-is-agentic-coding/04-how-they-work-together.md @@ -6,8 +6,8 @@ chapter: 2 section: 4 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/02-what-is-agentic-coding/05-what-agentic-coding-is-not.md b/book/part1-foundations/02-what-is-agentic-coding/05-what-agentic-coding-is-not.md index 65536fb..c1dc7a3 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/05-what-agentic-coding-is-not.md +++ b/book/part1-foundations/02-what-is-agentic-coding/05-what-agentic-coding-is-not.md @@ -6,8 +6,8 @@ chapter: 2 section: 5 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/02-what-is-agentic-coding/06-the-agentic-coding-mindset.md b/book/part1-foundations/02-what-is-agentic-coding/06-the-agentic-coding-mindset.md index eb0612f..533c3ad 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/06-the-agentic-coding-mindset.md +++ b/book/part1-foundations/02-what-is-agentic-coding/06-the-agentic-coding-mindset.md @@ -6,8 +6,8 @@ chapter: 2 section: 6 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/02-what-is-agentic-coding/07-practical-example-building-a-rest-api.md b/book/part1-foundations/02-what-is-agentic-coding/07-practical-example-building-a-rest-api.md index ef1e17e..14bad4b 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/07-practical-example-building-a-rest-api.md +++ b/book/part1-foundations/02-what-is-agentic-coding/07-practical-example-building-a-rest-api.md @@ -6,8 +6,8 @@ chapter: 2 section: 7 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/02-what-is-agentic-coding/08-common-pitfalls.md b/book/part1-foundations/02-what-is-agentic-coding/08-common-pitfalls.md index 7c54ea4..cbb9b21 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/08-common-pitfalls.md +++ b/book/part1-foundations/02-what-is-agentic-coding/08-common-pitfalls.md @@ -6,8 +6,8 @@ chapter: 2 section: 8 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/02-what-is-agentic-coding/09-summary.md b/book/part1-foundations/02-what-is-agentic-coding/09-summary.md index 0556ef4..18e893f 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/09-summary.md +++ b/book/part1-foundations/02-what-is-agentic-coding/09-summary.md @@ -6,8 +6,8 @@ chapter: 2 section: 9 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/02-what-is-agentic-coding/10-further-reading.md b/book/part1-foundations/02-what-is-agentic-coding/10-further-reading.md index 9c61961..5eb8302 100644 --- a/book/part1-foundations/02-what-is-agentic-coding/10-further-reading.md +++ b/book/part1-foundations/02-what-is-agentic-coding/10-further-reading.md @@ -6,8 +6,8 @@ chapter: 2 section: 10 version: '0.1' date: '2026-01-28' -status: draft -author: Author Name +status: published +author: Chris Testa tags: - agentic-coding - definitions diff --git a/book/part1-foundations/03-architecture-principles/01-introduction.md b/book/part1-foundations/03-architecture-principles/01-introduction.md index 338e3c8..b759177 100644 --- a/book/part1-foundations/03-architecture-principles/01-introduction.md +++ b/book/part1-foundations/03-architecture-principles/01-introduction.md @@ -6,8 +6,8 @@ chapter: 3 section: 1 version: "0.1" date: "2026-01-28" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "principles", "foundations"] related: - part1-foundations/01-renaissance-developer/02-renaissance-developer-model.md diff --git a/book/part1-foundations/03-architecture-principles/02-the-digestibility-principle.md b/book/part1-foundations/03-architecture-principles/02-the-digestibility-principle.md index 309cb59..7acfdf4 100644 --- a/book/part1-foundations/03-architecture-principles/02-the-digestibility-principle.md +++ b/book/part1-foundations/03-architecture-principles/02-the-digestibility-principle.md @@ -6,8 +6,8 @@ chapter: 3 section: 2 version: "0.1" date: "2026-01-28" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "digestibility", "context-windows", "foundations"] related: - part1-foundations/04-digestible-interfaces/01-introduction.md diff --git a/book/part1-foundations/03-architecture-principles/03-component-decomposition.md b/book/part1-foundations/03-architecture-principles/03-component-decomposition.md index 49c7a38..313c512 100644 --- a/book/part1-foundations/03-architecture-principles/03-component-decomposition.md +++ b/book/part1-foundations/03-architecture-principles/03-component-decomposition.md @@ -6,8 +6,8 @@ chapter: 3 section: 3 version: "0.1" date: "2026-01-28" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "components", "decomposition", "foundations"] related: - part3-patterns-tools/architecture/component-decomposition.md diff --git a/book/part1-foundations/03-architecture-principles/04-interface-boundaries.md b/book/part1-foundations/03-architecture-principles/04-interface-boundaries.md index 4edfd50..64912a5 100644 --- a/book/part1-foundations/03-architecture-principles/04-interface-boundaries.md +++ b/book/part1-foundations/03-architecture-principles/04-interface-boundaries.md @@ -6,8 +6,8 @@ chapter: 3 section: 4 version: "0.1" date: "2026-01-28" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "interfaces", "contracts", "foundations"] related: - part1-foundations/04-digestible-interfaces/01-introduction.md diff --git a/book/part1-foundations/03-architecture-principles/05-separation-of-concerns.md b/book/part1-foundations/03-architecture-principles/05-separation-of-concerns.md index 9a348d3..616414b 100644 --- a/book/part1-foundations/03-architecture-principles/05-separation-of-concerns.md +++ b/book/part1-foundations/03-architecture-principles/05-separation-of-concerns.md @@ -6,8 +6,8 @@ chapter: 3 section: 5 version: "0.1" date: "2026-01-28" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "separation-of-concerns", "modularity", "foundations"] related: - part3-patterns-tools/architecture/bounded-contexts.md diff --git a/book/part1-foundations/03-architecture-principles/06-testability-for-ai-code.md b/book/part1-foundations/03-architecture-principles/06-testability-for-ai-code.md index 81195fa..28c798e 100644 --- a/book/part1-foundations/03-architecture-principles/06-testability-for-ai-code.md +++ b/book/part1-foundations/03-architecture-principles/06-testability-for-ai-code.md @@ -6,8 +6,8 @@ chapter: 3 section: 6 version: "0.1" date: "2026-01-29" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "testing", "testability", "foundations"] related: - part2-playbook/07-testing-strategies.md diff --git a/book/part1-foundations/03-architecture-principles/07-practical-application.md b/book/part1-foundations/03-architecture-principles/07-practical-application.md index bbcffdf..b3b3b1a 100644 --- a/book/part1-foundations/03-architecture-principles/07-practical-application.md +++ b/book/part1-foundations/03-architecture-principles/07-practical-application.md @@ -6,8 +6,8 @@ chapter: 3 section: 7 version: "0.1" date: "2026-01-29" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "practical", "example", "foundations"] related: - part4-example/04-architecture-design.md diff --git a/book/part1-foundations/03-architecture-principles/08-common-pitfalls.md b/book/part1-foundations/03-architecture-principles/08-common-pitfalls.md index 4dd75e7..24e8eac 100644 --- a/book/part1-foundations/03-architecture-principles/08-common-pitfalls.md +++ b/book/part1-foundations/03-architecture-principles/08-common-pitfalls.md @@ -6,8 +6,8 @@ chapter: 3 section: 8 version: "0.1" date: "2026-01-29" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "anti-patterns", "pitfalls", "foundations"] related: - part1-foundations/05-new-bottlenecks/01-introduction.md diff --git a/book/part1-foundations/03-architecture-principles/09-summary.md b/book/part1-foundations/03-architecture-principles/09-summary.md index 91eb428..b64313a 100644 --- a/book/part1-foundations/03-architecture-principles/09-summary.md +++ b/book/part1-foundations/03-architecture-principles/09-summary.md @@ -6,8 +6,8 @@ chapter: 3 section: 9 version: "0.1" date: "2026-01-29" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "summary", "foundations"] related: - part2-playbook/05-requirements-to-design.md diff --git a/book/part1-foundations/03-architecture-principles/10-further-reading.md b/book/part1-foundations/03-architecture-principles/10-further-reading.md index 0c109fc..6954452 100644 --- a/book/part1-foundations/03-architecture-principles/10-further-reading.md +++ b/book/part1-foundations/03-architecture-principles/10-further-reading.md @@ -6,8 +6,8 @@ chapter: 3 section: 10 version: "0.1" date: "2026-01-29" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "resources", "foundations"] related: - part2-playbook/05-requirements-to-design.md diff --git a/book/part1-foundations/04-digestible-interfaces/01-introduction.md b/book/part1-foundations/04-digestible-interfaces/01-introduction.md index 929c455..b243348 100644 --- a/book/part1-foundations/04-digestible-interfaces/01-introduction.md +++ b/book/part1-foundations/04-digestible-interfaces/01-introduction.md @@ -6,8 +6,8 @@ chapter: 4 section: 1 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "design", "foundations", "digestibility"] related: - part1-foundations/03-architecture-principles/04-interface-boundaries.md diff --git a/book/part1-foundations/04-digestible-interfaces/02-defining-digestibility.md b/book/part1-foundations/04-digestible-interfaces/02-defining-digestibility.md index d21dc6e..380584b 100644 --- a/book/part1-foundations/04-digestible-interfaces/02-defining-digestibility.md +++ b/book/part1-foundations/04-digestible-interfaces/02-defining-digestibility.md @@ -6,8 +6,8 @@ chapter: 4 section: 2 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "design", "foundations", "digestibility", "cognitive-load"] related: - part1-foundations/03-architecture-principles/01-introduction.md diff --git a/book/part1-foundations/04-digestible-interfaces/03-human-constraints.md b/book/part1-foundations/04-digestible-interfaces/03-human-constraints.md index 5ba01fc..36a8cb4 100644 --- a/book/part1-foundations/04-digestible-interfaces/03-human-constraints.md +++ b/book/part1-foundations/04-digestible-interfaces/03-human-constraints.md @@ -6,8 +6,8 @@ chapter: 4 section: 3 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "cognitive-load", "working-memory", "foundations"] related: - part1-foundations/01-renaissance-developer/05-mindset-shift.md diff --git a/book/part1-foundations/04-digestible-interfaces/04-ai-constraints.md b/book/part1-foundations/04-digestible-interfaces/04-ai-constraints.md index 7b52b1b..9248422 100644 --- a/book/part1-foundations/04-digestible-interfaces/04-ai-constraints.md +++ b/book/part1-foundations/04-digestible-interfaces/04-ai-constraints.md @@ -6,8 +6,8 @@ chapter: 4 section: 4 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "ai-agents", "context-windows", "foundations"] related: - part1-foundations/02-what-is-agentic-coding/03-the-spectrum.md diff --git a/book/part1-foundations/04-digestible-interfaces/05-unified-principles.md b/book/part1-foundations/04-digestible-interfaces/05-unified-principles.md index 14f651a..f665c12 100644 --- a/book/part1-foundations/04-digestible-interfaces/05-unified-principles.md +++ b/book/part1-foundations/04-digestible-interfaces/05-unified-principles.md @@ -6,8 +6,8 @@ chapter: 4 section: 5 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "design-principles", "foundations", "best-practices"] related: - part1-foundations/03-architecture-principles/03-component-decomposition.md diff --git a/book/part1-foundations/04-digestible-interfaces/06-examples-good-vs-bad.md b/book/part1-foundations/04-digestible-interfaces/06-examples-good-vs-bad.md index 87e9207..ea7b0a5 100644 --- a/book/part1-foundations/04-digestible-interfaces/06-examples-good-vs-bad.md +++ b/book/part1-foundations/04-digestible-interfaces/06-examples-good-vs-bad.md @@ -6,8 +6,8 @@ chapter: 4 section: 6 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "examples", "code-examples", "best-practices"] related: - part1-foundations/03-architecture-principles/07-practical-application.md diff --git a/book/part1-foundations/04-digestible-interfaces/07-common-pitfalls.md b/book/part1-foundations/04-digestible-interfaces/07-common-pitfalls.md index fe9b7b1..9aeac6b 100644 --- a/book/part1-foundations/04-digestible-interfaces/07-common-pitfalls.md +++ b/book/part1-foundations/04-digestible-interfaces/07-common-pitfalls.md @@ -6,8 +6,8 @@ chapter: 4 section: 7 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "antipatterns", "pitfalls", "best-practices"] related: - part1-foundations/03-architecture-principles/08-common-pitfalls.md diff --git a/book/part1-foundations/04-digestible-interfaces/08-measuring-digestibility.md b/book/part1-foundations/04-digestible-interfaces/08-measuring-digestibility.md index 31eda37..de9db10 100644 --- a/book/part1-foundations/04-digestible-interfaces/08-measuring-digestibility.md +++ b/book/part1-foundations/04-digestible-interfaces/08-measuring-digestibility.md @@ -6,8 +6,8 @@ chapter: 4 section: 8 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "metrics", "assessment", "best-practices"] related: - part2-playbook/07-testing-strategies.md diff --git a/book/part1-foundations/04-digestible-interfaces/09-summary.md b/book/part1-foundations/04-digestible-interfaces/09-summary.md index 31506f7..9050dca 100644 --- a/book/part1-foundations/04-digestible-interfaces/09-summary.md +++ b/book/part1-foundations/04-digestible-interfaces/09-summary.md @@ -6,8 +6,8 @@ chapter: 4 section: 9 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "summary", "foundations"] related: - part1-foundations/05-new-bottlenecks.md diff --git a/book/part1-foundations/04-digestible-interfaces/10-further-reading.md b/book/part1-foundations/04-digestible-interfaces/10-further-reading.md index 3213526..c737978 100644 --- a/book/part1-foundations/04-digestible-interfaces/10-further-reading.md +++ b/book/part1-foundations/04-digestible-interfaces/10-further-reading.md @@ -6,8 +6,8 @@ chapter: 4 section: 10 version: "1.0" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["interfaces", "resources", "references"] related: - part3-patterns-tools/architecture/interface-boundaries.md diff --git a/book/part1-foundations/05-new-bottlenecks/01-introduction.md b/book/part1-foundations/05-new-bottlenecks/01-introduction.md index 5c6dac7..5cd8596 100644 --- a/book/part1-foundations/05-new-bottlenecks/01-introduction.md +++ b/book/part1-foundations/05-new-bottlenecks/01-introduction.md @@ -6,8 +6,8 @@ chapter: 5 section: 1 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["bottlenecks", "workflow", "foundations", "velocity", "constraints"] related: - part1-foundations/02-what-is-agentic-coding/02-defining-agentic-coding.md diff --git a/book/part1-foundations/05-new-bottlenecks/02-understanding-the-5-10x-multiplier.md b/book/part1-foundations/05-new-bottlenecks/02-understanding-the-5-10x-multiplier.md index 8f0574e..4be8022 100644 --- a/book/part1-foundations/05-new-bottlenecks/02-understanding-the-5-10x-multiplier.md +++ b/book/part1-foundations/05-new-bottlenecks/02-understanding-the-5-10x-multiplier.md @@ -6,8 +6,8 @@ chapter: 5 section: 2 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["velocity", "acceleration", "foundations", "metrics"] related: - part1-foundations/02-what-is-agentic-coding/03-the-spectrum-of-agentic-coding.md diff --git a/book/part1-foundations/05-new-bottlenecks/03-bottleneck-1-requirements-and-business-vision.md b/book/part1-foundations/05-new-bottlenecks/03-bottleneck-1-requirements-and-business-vision.md index 0345230..f09ec0e 100644 --- a/book/part1-foundations/05-new-bottlenecks/03-bottleneck-1-requirements-and-business-vision.md +++ b/book/part1-foundations/05-new-bottlenecks/03-bottleneck-1-requirements-and-business-vision.md @@ -6,8 +6,8 @@ chapter: 5 section: 3 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["requirements", "bottlenecks", "specifications", "business-vision"] related: - part2-playbook/04-brief-to-requirements.md diff --git a/book/part1-foundations/05-new-bottlenecks/04-bottleneck-2-product-decision-making.md b/book/part1-foundations/05-new-bottlenecks/04-bottleneck-2-product-decision-making.md index bca35ae..bbdb14b 100644 --- a/book/part1-foundations/05-new-bottlenecks/04-bottleneck-2-product-decision-making.md +++ b/book/part1-foundations/05-new-bottlenecks/04-bottleneck-2-product-decision-making.md @@ -6,8 +6,8 @@ chapter: 5 section: 4 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["product-management", "bottlenecks", "decisions", "prioritization"] related: - part1-foundations/01-renaissance-developer/02-the-renaissance-developer-model.md diff --git a/book/part1-foundations/05-new-bottlenecks/05-bottleneck-3-architecture-and-design-clarity.md b/book/part1-foundations/05-new-bottlenecks/05-bottleneck-3-architecture-and-design-clarity.md index b365684..295a100 100644 --- a/book/part1-foundations/05-new-bottlenecks/05-bottleneck-3-architecture-and-design-clarity.md +++ b/book/part1-foundations/05-new-bottlenecks/05-bottleneck-3-architecture-and-design-clarity.md @@ -6,8 +6,8 @@ chapter: 5 section: 5 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["architecture", "design", "bottlenecks", "technical-debt"] related: - part1-foundations/03-architecture-principles/02-the-digestibility-principle.md diff --git a/book/part1-foundations/05-new-bottlenecks/06-bottleneck-4-code-review-at-scale.md b/book/part1-foundations/05-new-bottlenecks/06-bottleneck-4-code-review-at-scale.md index 42ba90e..53cd5eb 100644 --- a/book/part1-foundations/05-new-bottlenecks/06-bottleneck-4-code-review-at-scale.md +++ b/book/part1-foundations/05-new-bottlenecks/06-bottleneck-4-code-review-at-scale.md @@ -6,8 +6,8 @@ chapter: 5 section: 6 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["code-review", "bottlenecks", "quality", "validation"] related: requirements: diff --git a/book/part1-foundations/05-new-bottlenecks/07-bottleneck-5-testing-and-quality-assurance.md b/book/part1-foundations/05-new-bottlenecks/07-bottleneck-5-testing-and-quality-assurance.md index b10b99a..0480687 100644 --- a/book/part1-foundations/05-new-bottlenecks/07-bottleneck-5-testing-and-quality-assurance.md +++ b/book/part1-foundations/05-new-bottlenecks/07-bottleneck-5-testing-and-quality-assurance.md @@ -6,8 +6,8 @@ chapter: 5 section: 7 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["testing", "quality-assurance", "bottlenecks", "validation", "velocity"] related: - part1-foundations/03-architecture-principles/06-testability-for-ai-code.md diff --git a/book/part1-foundations/05-new-bottlenecks/08-solutions-and-mitigation-strategies.md b/book/part1-foundations/05-new-bottlenecks/08-solutions-and-mitigation-strategies.md index 32fbe48..97daee5 100644 --- a/book/part1-foundations/05-new-bottlenecks/08-solutions-and-mitigation-strategies.md +++ b/book/part1-foundations/05-new-bottlenecks/08-solutions-and-mitigation-strategies.md @@ -6,8 +6,8 @@ chapter: 5 section: 8 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["solutions", "strategies", "workflow", "best-practices", "specifications"] related: - part2-playbook/04-brief-to-requirements.md diff --git a/book/part1-foundations/05-new-bottlenecks/09-summary.md b/book/part1-foundations/05-new-bottlenecks/09-summary.md index 5221977..b947e38 100644 --- a/book/part1-foundations/05-new-bottlenecks/09-summary.md +++ b/book/part1-foundations/05-new-bottlenecks/09-summary.md @@ -6,8 +6,8 @@ chapter: 5 section: 9 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["summary", "bottlenecks", "foundations", "key-takeaways"] related: - part1-foundations/01-renaissance-developer/09-summary.md diff --git a/book/part1-foundations/05-new-bottlenecks/10-further-reading.md b/book/part1-foundations/05-new-bottlenecks/10-further-reading.md index d140fe8..cbf7a91 100644 --- a/book/part1-foundations/05-new-bottlenecks/10-further-reading.md +++ b/book/part1-foundations/05-new-bottlenecks/10-further-reading.md @@ -6,8 +6,8 @@ chapter: 5 section: 10 version: "0.1" date: "2026-02-05" -status: "draft" -author: "Brian Childress" +status: "published" +author: "Chris Testa" tags: ["references", "resources", "further-reading", "bibliography"] related: - part1-foundations/01-renaissance-developer/10-further-reading.md diff --git a/book/part1-foundations/README.md b/book/part1-foundations/README.md index ded7b74..4da17a7 100644 --- a/book/part1-foundations/README.md +++ b/book/part1-foundations/README.md @@ -4,8 +4,8 @@ part: 1 chapter: "index" version: "1.0" date: "2025-12-28" -status: "draft" -author: "Author Name" +status: "published" +author: "Chris Testa" tags: ["foundations", "mindset", "principles"] abstract: | Part 1 establishes the mindset and mental models for agentic development, diff --git a/book/preface.md b/book/preface.md index 2eb0237..0ac0651 100644 --- a/book/preface.md +++ b/book/preface.md @@ -4,8 +4,8 @@ part: "front" chapter: "preface" version: "1.0" date: "2025-12-28" -status: "draft" -author: "Author Name" +status: "published" +author: "Chris Testa" tags: ["preface", "introduction", "how-to-use"] related: - index.md @@ -86,6 +86,14 @@ When engineering velocity increases 5-10x, product becomes the bottleneck. You n **Start with**: Chapters on EARS notation, requirements writing, and specification patterns. +## Current Release Status + +**Part 1: Foundations is now available.** This includes all five foundational chapters that establish the mindset, principles, and mental models for agentic coding. + +**Parts 2-4 (The Playbook, Patterns & Tools, and Complete Example) are in active development.** Part 1 provides immediate value as a standalone resource, and subsequent parts will build on this foundation. + +To get notified when Parts 2-4 are released, [watch the repository](https://github.com/testaco/agentic-coding-book). + ## How to Use This Book ### Three Reading Modes diff --git a/planning/gtm.md b/planning/gtm.md new file mode 100644 index 0000000..2a8d921 --- /dev/null +++ b/planning/gtm.md @@ -0,0 +1,250 @@ +# Go-to-Market Strategy: Agentic Coding Playbook + +**Created**: 2026-02-06 +**Author**: Chris Testa +**Goal**: Establish credibility and thought leadership in agentic coding by shipping Part 1: Foundations as a polished, free release — then build an audience for Parts 2-4. + +--- + +## Brand Identity + +**Brand Name**: Agentic Coding Playbook +**Positioning**: The definitive guide to building software products with AI agents — written by a CTO who's done it. +**Voice**: Authoritative but accessible. Opinionated but practical. Talks to vibecoders and CTOs in the same sentence without condescending to either. +**Core Message**: The bottleneck isn't code anymore. It's knowing what to build. + +### Key Concepts to Lead With + +These are the book's most original, shareable ideas — they become the brand's intellectual property: + +1. **The Renaissance Developer** — Breadth over depth. The new competitive advantage is being good enough at everything. +2. **The Acceleration Paradox** — When coding gets 5-10x faster, five new bottlenecks emerge that nobody talks about. +3. **The Digestibility Principle** — Human working memory and AI context windows have the same constraints. Design for both. +4. **Specification-Driven Development** — The quality of your descriptions determines the quality of your product. +5. **The "Good Enough at Everything" Principle** — Why 70% competency across 5 domains beats 95% in one. + +--- + +## Launch Strategy + +### Phase 1: Polish the Product + +Ship Part 1 as a professional, polished reading experience — not a repo README. + +#### Website + +- [x] Export v0 design and adapt for GitHub Pages deployment (2026-02-07) + - [x] Updated deploy-pages.yml to build Next.js site with pnpm + - [x] Configured NEXT_PUBLIC_BASE_PATH for GitHub Pages + - [x] Fixed GitHub links to point to testaco/agentic-coding-book + - [x] Added .nojekyll to prevent Jekyll processing + - [x] Test deployment (triggered 2026-02-07 via push to go-to-market branch) +- [x] Build a landing page that sells the book's ideas (v0 design complete) + - [x] Hero: "The bottleneck isn't code anymore" + - [x] Social proof section (placeholder testimonials ready) + - [x] Email capture: "Get notified when Part 2 drops" + - [x] Clear CTA to start reading Part 1 + - [x] Five key ideas prominently featured +- [x] Integrate actual book content into website (2026-02-08) + - [x] Set up dynamic routing for book chapters (`/book/[part]/[chapter]/[section]`) + - [x] Build markdown processing pipeline (frontmatter + content) + - [x] Map URL slugs to actual markdown files in `book/` directory + - [x] Implement chapter navigation (previous/next, breadcrumbs, sidebar) + - [x] Use real TABLE_OF_CONTENTS.md for site navigation structure + - [x] Render Mermaid diagrams client-side (mermaid.js) + - [ ] Add reading progress indicator and estimated reading time + - [x] Test all Part 1 chapter links work (50+ sections across 5 chapters) +- [ ] Polish the reading experience — clean typography, chapter navigation, mobile-friendly + - [ ] Typography optimized for long-form reading + - [ ] Mobile-responsive design tested on multiple devices + - [ ] Syntax highlighting for code blocks + - [ ] Mermaid diagram rendering in browser +- [x] Add proper meta tags (OpenGraph, Twitter cards) so links look good when shared (2026-02-07) + - [x] Comprehensive OpenGraph metadata for Facebook, LinkedIn + - [x] Twitter Card metadata with large image + - [x] Generated 1200x630 OG image PNG with brand styling + - [x] Created favicon.svg and site.webmanifest + - [x] Added SEO keywords, author info, robots directives +- [ ] Set up a custom domain (optional but more professional than testaco.github.io) + +#### Content Cleanup + +- [x] Update author to "Chris Testa" across all frontmatter (50+ files) +- [x] Change `status: draft` to `status: published` in all Part 1 files +- [x] Fix placeholder text in Chapter 1 Further Reading (6 instances) +- [x] Clean up TABLE_OF_CONTENTS.md — remove Part 2-4 stub entries +- [x] Update navigation.yml — remove broken Part 2-4 chapter links +- [x] Update preface.md — frame as Part 1 release, Parts 2-4 coming +- [x] Update index.md — status table shows Part 1 as Published +- [x] Update README.md — author, status, links + +#### PDF + +- [x] Generate a clean PDF of Part 1 (via GitHub Actions) +- [ ] Add a cover page / title page (v1.1 enhancement) +- [x] Verify formatting, code blocks, and diagrams render properly (via CI/CD) +- [x] Create a GitHub Release with the PDF attached (v0.1.0 tagged, release building) + +#### Email Capture + +- [ ] Set up an email list (Buttondown, Substack, ConvertKit, or similar) +- [ ] Embed signup form on the landing page +- [ ] Create a welcome email: "Here's Part 1 + what's coming in Parts 2-4" + +--- + +### Phase 2: Seed the Brand + +Before the "launch day," establish the brand presence and start putting ideas out there. This builds an audience that's primed when the site goes live. + +#### Brand Accounts + +- [ ] Create X/Twitter account for Agentic Coding Playbook (or use personal + brand hashtag) +- [ ] Create LinkedIn page or start posting from personal with brand framing +- [ ] Set up Substack or newsletter (doubles as blog + email list) +- [ ] Create GitHub org or ensure repo is public and polished + +#### Content Seeding (Pre-Launch) + +The book has 70K words of content. Extract the best ideas as standalone posts: + +- [ ] **Thread 1: The Renaissance Developer** — "The most valuable developer in 2026 isn't a specialist. Here's why..." Pull from Chapter 1. +- [ ] **Thread 2: The 5 New Bottlenecks** — "When AI makes coding 5-10x faster, 5 new bottlenecks emerge that nobody talks about." Pull from Chapter 5. +- [ ] **Thread 3: The Digestibility Principle** — "Your brain and GPT-4 have the same architectural constraint. Here's how to design for both." Pull from Chapter 4. +- [ ] **Thread 4: What Agentic Coding Actually Is** — "Everyone's talking about AI coding tools. Almost nobody understands what 'agentic coding' actually means." Pull from Chapter 2. +- [ ] **Thread 5: Architecture for the AI Era** — "Most codebases are designed for humans to write. Here's how to design them for AI to write and humans to review." Pull from Chapter 3. +- [ ] **Blog post**: Expand one thread into a long-form article (best candidate: Renaissance Developer or 5 New Bottlenecks) + +#### Community Presence + +- [ ] Join and lurk in relevant communities before posting (authenticity matters): + - Indie Hackers + - r/SideProject, r/programming, r/artificial + - Hacker News + - Dev.to + - Claude/Anthropic Discord or community spaces +- [ ] Contribute value first — answer questions about agentic coding, share insights without linking the book +- [ ] Build a list of 10-20 relevant community threads where the book's ideas would genuinely add value + +--- + +### Phase 3: Launch + +Coordinate a launch window where the site goes live and content hits multiple channels simultaneously. + +#### Launch Day Checklist + +- [ ] Site is live, polished, and tested on mobile +- [ ] PDF is downloadable from GitHub Releases +- [ ] Email capture is working +- [ ] OpenGraph/Twitter card previews tested and looking good +- [ ] All social accounts are set up and have some prior content (not brand new empty accounts) + +#### Launch Posts + +- [ ] **Hacker News**: "Show HN: The Agentic Coding Playbook — free book on building products with AI agents" + - Best if posted mid-morning US time, Tuesday-Thursday + - Title should emphasize "free" and "playbook" — HN values substance + - Have a top comment ready explaining the meta story (book built with its own methodology) +- [ ] **Reddit**: Post to r/programming, r/SideProject, r/ChatGPTCoding, r/ClaudeAI + - Different framing for each subreddit + - Focus on value, not promotion +- [ ] **Indie Hackers**: Launch post with the story — CTO writing a book using AI about using AI +- [ ] **X/Twitter**: Launch thread from brand account + personal amplification +- [ ] **LinkedIn**: Article or post targeting engineering leaders and CTOs +- [ ] **Dev.to**: Publish the best blog post (Renaissance Developer or New Bottlenecks) with link to full book +- [ ] **Substack/Newsletter**: Send launch announcement to any early subscribers + +#### The Meta Story (Your Secret Weapon) + +The most compelling marketing angle: **this book was built using its own methodology**. The planning docs are visible. The git history shows the process. The AI assistance is transparent. This is the proof that the approach works — and it's a story that communities love. + +Lead with: "I'm a CTO. I wrote a book about building products with AI. The book itself was built using the workflow it teaches. Here's Part 1 — free." + +--- + +### Phase 4: Sustain and Build to Parts 2-4 + +After launch, keep momentum while writing the rest. + +#### Ongoing Content + +- [ ] Weekly or biweekly posts pulling ideas from Part 1 (you have months of content to extract) +- [ ] "Behind the scenes" posts about writing Parts 2-4 using the methodology +- [ ] Respond to comments and discussions — thought leadership is built in conversations, not broadcasts +- [ ] Guest posts or podcast appearances if opportunities arise (don't chase these, let them come from visibility) + +#### Audience Building + +- [ ] Track email signups — this is the core metric for Part 2 launch readiness +- [ ] Engage with people who share or comment on the content +- [ ] Collect feedback on Part 1 — what resonated, what's missing, what should Part 2 prioritize + +#### Parts 2-4 Teasers + +- [ ] Monthly update to email list: "Here's what I'm working on in Part 2" +- [ ] Share draft excerpts from Part 2 as they're written — builds anticipation and gets feedback +- [ ] When Part 2 is ready, repeat Phase 3 launch process with the built-in audience + +--- + +## Success Metrics + +### Launch (First 30 Days) + +| Metric | Target | How to Measure | +|--------|--------|----------------| +| Unique site visitors | 5,000+ | GitHub Pages analytics or added analytics | +| Email signups | 500+ | Email platform dashboard | +| GitHub stars | 200+ | Repository stats | +| Social impressions | 50,000+ | Platform analytics | +| Community engagement | 3+ substantive discussions | HN comments, Reddit threads, etc. | + +### Credibility Indicators (First 90 Days) + +| Indicator | What It Looks Like | +|-----------|-------------------| +| Thought leadership | People reference "Renaissance Developer" or "Digestibility Principle" unprompted | +| Inbound interest | Speaking invitations, podcast requests, collaboration offers | +| Community recognition | Recognized name in agentic coding discussions | +| Content resonance | Posts get shared and discussed organically | + +--- + +## Timeline + +| Week | Focus | Key Deliverable | +|------|-------|-----------------| +| 1 | Polish product | Site live with v0 design, content cleaned up | +| 1 | Brand setup | Accounts created, first 2 seed posts published | +| 2 | Content seeding | 3-5 threads/posts published, community presence established | +| 3 | Launch | Coordinated launch across all channels | +| 4+ | Sustain | Weekly content, audience engagement, start Part 2 | + +--- + +## Anti-Patterns to Avoid + +**Don't**: Post "check out my book" with a link and nothing else. Communities hate this. +**Do**: Share a genuinely useful insight, and mention the book as context. + +**Don't**: Post the same content everywhere simultaneously. It looks like spam. +**Do**: Adapt the message for each channel's culture and audience. + +**Don't**: Obsess over metrics in the first week. Launches are noisy. +**Do**: Focus on whether the ideas resonate in conversations. + +**Don't**: Wait until everything is perfect. Part 1 is good. Ship it. +**Do**: Iterate the site and marketing based on what you learn post-launch. + +**Don't**: Burn out trying to be everywhere. Consistency beats intensity. +**Do**: Pick 2 channels that feel natural and go deep there. Expand later. + +--- + +## Open Questions + +- [ ] Custom domain? (e.g., agenticcodingplaybook.com) +- [ ] Monetization for Parts 2-4? (Free, paid, freemium with Part 1 free?) +- [ ] Analytics setup? (Simple analytics, Plausible, or just GitHub traffic stats?) +- [ ] Will Parts 2-4 also be open source / CC BY 4.0, or shift to paid? diff --git a/planning/tasks.md b/planning/tasks.md index eb8f7fe..e719735 100644 --- a/planning/tasks.md +++ b/planning/tasks.md @@ -187,7 +187,7 @@ Create all GitHub Actions workflows as defined in design.md Section 5.4: Pages d ### INFRA-006: Configure Styling and Templates **Prerequisites**: INFRA-001 -**Status**: [ ] Not Started +**Status**: [~] In Progress (PDF generation works, styling enhancements deferred to v1.1) **MVP**: [MVP] #### Description @@ -2479,7 +2479,8 @@ Prepare book for physical print-on-demand. - P1-007: Part 1 Review and Polish (complete 2026-02-05) **In Progress**: -- None +- INFRA-006: Styling and Templates (basic PDF working, enhancements deferred) +- GTM Phase 1: PDF generation ready via GitHub Actions **Next Action**: **Part 1 Complete! 🎉** Ready to begin Part 2 (The Playbook). Next task: P2-001 (Overview of 6-Week Journey) or INFRA-006 (Styling and Templates) for enhanced PDF/web formatting. diff --git a/scripts/build-pdf.sh b/scripts/build-pdf.sh index d5598b7..b66ba27 100755 --- a/scripts/build-pdf.sh +++ b/scripts/build-pdf.sh @@ -106,16 +106,8 @@ fi # Step 3: Build PDF with Pandoc echo "Step 3/4: Building PDF..." -# Determine syntax highlighting flag based on Pandoc version -PANDOC_MAJOR=$(pandoc --version | head -1 | awk '{print $2}' | cut -d. -f1) -PANDOC_MINOR=$(pandoc --version | head -1 | awk '{print $2}' | cut -d. -f2) - -# Pandoc 3.4+ uses --syntax-highlighting, older versions use --highlight-style -if [ "$PANDOC_MAJOR" -gt 3 ] || [ "$PANDOC_MAJOR" -eq 3 -a "$PANDOC_MINOR" -ge 4 ]; then - SYNTAX_FLAG="--syntax-highlighting=tango" -else - SYNTAX_FLAG="--highlight-style=tango" -fi +# All Pandoc 3.x versions use --highlight-style +SYNTAX_FLAG="--highlight-style=tango" pandoc output/combined.md \ --from=markdown+smart \ @@ -128,7 +120,7 @@ pandoc output/combined.md \ $SYNTAX_FLAG \ --pdf-engine=xelatex \ --metadata title="The Agentic Coding Playbook" \ - --metadata author="Author Name" \ + --metadata author="Chris Testa" \ --metadata date="$(date +%Y-%m-%d)" \ $([ -f assets/styles/print.css ] && echo "--css=assets/styles/print.css") diff --git a/website/.github/workflows/deploy-pages.yml b/website/.github/workflows/deploy-pages.yml new file mode 100644 index 0000000..c335112 --- /dev/null +++ b/website/.github/workflows/deploy-pages.yml @@ -0,0 +1,62 @@ +name: Deploy Website to GitHub Pages + +on: + push: + branches: [main] + paths: + - "website/**" + - ".github/workflows/deploy-pages.yml" + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./website + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + cache-dependency-path: ./website/package-lock.json + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Install dependencies + run: npm ci + + - name: Build + run: npx next build + env: + NEXT_PUBLIC_BASE_PATH: "" + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./website/out + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000..aed0190 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,13 @@ +# v0 runtime files (should only exist in preview, not in git) +__v0_runtime_loader.js +__v0_devtools.tsx +__v0_jsx-dev-runtime.ts +instrumentation-client.js +instrumentation-client.ts + +# Common ignores +node_modules/ +.next/ +.env*.local +.DS_Storeout/ +next-env.d.ts diff --git a/website/app/book/[part]/[chapter]/[section]/page.tsx b/website/app/book/[part]/[chapter]/[section]/page.tsx new file mode 100644 index 0000000..3995b77 --- /dev/null +++ b/website/app/book/[part]/[chapter]/[section]/page.tsx @@ -0,0 +1,162 @@ +import { MermaidDiagram } from "@/components/mermaid-diagram" +import { ChevronLeft, ChevronRight } from "lucide-react" +import Link from "next/link" +import { Button } from "@/components/ui/button" +import { getFlatSections } from "@/lib/book-data-server" +import { getMarkdownPath, parseMarkdownFile, extractMermaidDiagrams } from "@/lib/markdown" +import { notFound } from "next/navigation" + +interface PageProps { + params: Promise<{ + part: string + chapter: string + section: string + }> +} + +export default async function BookSectionPage({ params }: PageProps) { + const { part, chapter, section } = await params + + // Get the flat section list for navigation + const flat = getFlatSections() + const currentHref = `/book/${part}/${chapter}/${section}` + const currentIdx = flat.findIndex((s) => s.href === currentHref) + + if (currentIdx === -1) { + notFound() + } + + const currentSection = flat[currentIdx] + const prev = currentIdx > 0 ? flat[currentIdx - 1] : null + const next = currentIdx < flat.length - 1 ? flat[currentIdx + 1] : null + + // Load and parse markdown + let markdownData + try { + const filePath = getMarkdownPath(part, chapter, section) + markdownData = await parseMarkdownFile(filePath) + } catch (error) { + console.error('Error loading markdown:', error) + notFound() + } + + const { frontmatter, content, htmlContent } = markdownData + + // Extract mermaid diagrams + const mermaidDiagrams = extractMermaidDiagrams(content) + + // Remove mermaid code blocks from HTML content for now + let processedHtml = htmlContent + if (mermaidDiagrams.length > 0) { + // Replace mermaid code blocks with placeholder + processedHtml = content.replace(/```mermaid\n[\s\S]*?```/g, '[MERMAID_DIAGRAM]') + } + + return ( +
+ {/* Breadcrumb */} +
+ + Home + + / + {currentSection.partTitle} + / + {currentSection.chapterTitle} +
+ + {/* Header */} +
+

+ Section {frontmatter.part}.{frontmatter.chapter}.{frontmatter.section} +

+

+ {frontmatter.title} +

+

+ {frontmatter.chapter_title || currentSection.chapterTitle} +

+
+ + {/* Content */} +
+ + {/* Mermaid diagrams */} + {mermaidDiagrams.map((diagram, index) => ( +
+ +
+ ))} + + {/* Navigation */} + +
+ ) +} + +export async function generateMetadata({ params }: PageProps) { + const { part, chapter, section } = await params + + try { + const filePath = getMarkdownPath(part, chapter, section) + const { frontmatter } = await parseMarkdownFile(filePath) + + return { + title: `${frontmatter.title} | ${frontmatter.chapter_title} | Agentic Coding Playbook`, + description: frontmatter.abstract || `Learn about ${frontmatter.title}`, + } + } catch (error) { + return { + title: 'Section Not Found | Agentic Coding Playbook', + } + } +} + +// Generate static params for all book sections at build time +export async function generateStaticParams() { + const flat = getFlatSections() + + return flat.map((section) => { + const parts = section.href.split('/').filter(Boolean).slice(1) // Remove 'book' prefix + return { + part: parts[0], + chapter: parts[1], + section: parts[2], + } + }) +} diff --git a/website/app/book/layout.tsx b/website/app/book/layout.tsx new file mode 100644 index 0000000..a5545e1 --- /dev/null +++ b/website/app/book/layout.tsx @@ -0,0 +1,83 @@ +"use client" + +import React, { useState } from "react" +import Link from "next/link" +import { Terminal, Github, Home, Menu } from "lucide-react" +import { Button } from "@/components/ui/button" +import { BookNav } from "@/components/book-nav" +import { ThemeToggle } from "@/components/theme-toggle" +import { + Sheet, + SheetContent, + SheetHeader, + SheetTitle, + SheetTrigger, +} from "@/components/ui/sheet" + +export default function BookLayout({ children }: { children: React.ReactNode }) { + const [mobileOpen, setMobileOpen] = useState(false) + + return ( +
+ {/* Header */} +
+
+
+ {/* Mobile TOC toggle */} + + + + + + + + Agentic Coding Playbook + + +
+ setMobileOpen(false)} /> +
+
+
+ + + + agentic-coding + + / + Book +
+
+ + + +
+
+
+ +
+ {/* Desktop Sidebar */} + + + {/* Main Content */} +
{children}
+
+
+ ) +} diff --git a/website/app/globals.css b/website/app/globals.css new file mode 100644 index 0000000..dcc92f2 --- /dev/null +++ b/website/app/globals.css @@ -0,0 +1,94 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + font-family: Arial, Helvetica, sans-serif; +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} + +@layer base { + :root { + --background: 60 9% 98%; + --foreground: 220 20% 8%; + --card: 0 0% 100%; + --card-foreground: 220 20% 8%; + --popover: 0 0% 100%; + --popover-foreground: 220 20% 8%; + --primary: 142 71% 35%; + --primary-foreground: 0 0% 100%; + --secondary: 220 10% 93%; + --secondary-foreground: 220 20% 8%; + --muted: 220 10% 93%; + --muted-foreground: 220 10% 40%; + --accent: 142 71% 35%; + --accent-foreground: 0 0% 100%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 220 10% 88%; + --input: 220 10% 88%; + --ring: 142 71% 35%; + --chart-1: 142 71% 35%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + --sidebar-background: 60 9% 97%; + --sidebar-foreground: 220 20% 8%; + --sidebar-primary: 142 71% 35%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 220 10% 93%; + --sidebar-accent-foreground: 220 20% 8%; + --sidebar-border: 220 10% 88%; + --sidebar-ring: 142 71% 35%; + } + .dark { + --background: 220 20% 4%; + --foreground: 60 9% 98%; + --card: 220 18% 8%; + --card-foreground: 60 9% 98%; + --popover: 220 18% 8%; + --popover-foreground: 60 9% 98%; + --primary: 142 71% 45%; + --primary-foreground: 220 20% 4%; + --secondary: 220 15% 15%; + --secondary-foreground: 60 9% 98%; + --muted: 220 15% 12%; + --muted-foreground: 220 10% 55%; + --accent: 142 71% 45%; + --accent-foreground: 220 20% 4%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 220 15% 18%; + --input: 220 15% 18%; + --ring: 142 71% 45%; + --chart-1: 142 71% 45%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --sidebar-background: 220 18% 6%; + --sidebar-foreground: 60 9% 98%; + --sidebar-primary: 142 71% 45%; + --sidebar-primary-foreground: 220 20% 4%; + --sidebar-accent: 220 15% 12%; + --sidebar-accent-foreground: 60 9% 98%; + --sidebar-border: 220 15% 18%; + --sidebar-ring: 142 71% 45%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/website/app/layout.tsx b/website/app/layout.tsx new file mode 100644 index 0000000..1c816b2 --- /dev/null +++ b/website/app/layout.tsx @@ -0,0 +1,99 @@ +import React from "react" +import type { Metadata } from 'next' +import { Geist, Geist_Mono } from 'next/font/google' +import { ThemeProvider } from '@/components/theme-provider' + +import './globals.css' + +const _geist = Geist({ subsets: ['latin'] }) +const _geistMono = Geist_Mono({ subsets: ['latin'] }) + +const siteUrl = 'https://testaco.github.io/agentic-coding-book' +const title = 'The Agentic Coding Playbook' +const description = 'The definitive guide to building software products with AI agents. From idea to production in 6 weeks. By Chris Testa, CTO.' +const author = 'Chris Testa' + +export const metadata: Metadata = { + metadataBase: new URL(siteUrl), + title: { + default: title, + template: '%s | The Agentic Coding Playbook', + }, + description, + keywords: [ + 'agentic coding', + 'AI coding', + 'Claude Code', + 'AI agents', + 'software development', + 'MVP', + 'Renaissance Developer', + 'AI pair programming', + 'specification-driven development', + 'software architecture', + ], + authors: [{ name: author }], + creator: author, + publisher: author, + openGraph: { + type: 'website', + locale: 'en_US', + url: siteUrl, + title, + description, + siteName: title, + images: [ + { + url: '/og-image.png', + width: 1200, + height: 630, + alt: 'The Agentic Coding Playbook - From Idea to Production in 6 Weeks', + }, + ], + }, + twitter: { + card: 'summary_large_image', + title, + description, + images: ['/og-image.png'], + creator: '@testaco', + }, + robots: { + index: true, + follow: true, + googleBot: { + index: true, + follow: true, + 'max-video-preview': -1, + 'max-image-preview': 'large', + 'max-snippet': -1, + }, + }, + icons: { + icon: '/favicon.svg', + shortcut: '/favicon.svg', + apple: '/favicon.svg', + }, + manifest: '/site.webmanifest', +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + + + + {children} + + + + ) +} diff --git a/website/app/page.tsx b/website/app/page.tsx new file mode 100644 index 0000000..7363ca6 --- /dev/null +++ b/website/app/page.tsx @@ -0,0 +1,350 @@ +import { ArrowRight, Github, Terminal, BookOpen } from "lucide-react" +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { EmailSignup } from "@/components/email-signup" +import { ThemeToggle } from "@/components/theme-toggle" + +const KEY_IDEAS = [ + { + title: "The Renaissance Developer", + description: + "Breadth over depth. The new competitive advantage is being good enough at everything.", + }, + { + title: "The Acceleration Paradox", + description: + "When coding gets 5-10x faster, five new bottlenecks emerge that nobody talks about.", + }, + { + title: "The Digestibility Principle", + description: + "Human working memory and AI context windows have the same constraints. Design for both.", + }, + { + title: "Specification-Driven Development", + description: + "The quality of your descriptions determines the quality of your product.", + }, + { + title: 'The "Good Enough at Everything" Principle', + description: + "Why 70% competency across 5 domains beats 95% in one.", + }, +] + +const TESTIMONIALS = [ + { + quote: + "Finally, a book that treats AI coding as a real engineering discipline, not a party trick.", + author: "Coming soon", + }, + { + quote: + "The Renaissance Developer chapter changed how I think about my role as a senior engineer.", + author: "Coming soon", + }, + { + quote: + "Practical, opinionated, and exactly the playbook my team needed to adopt agentic workflows.", + author: "Coming soon", + }, +] + +export default function Home() { + return ( +
+ {/* Header */} +
+
+ + + agentic-coding + + +
+
+ +
+ {/* Hero */} +
+ {/* Book cover faded in background */} +
+
+
+ +
+

+ The +

+

+ Agentic Coding Playbook +

+
+
+

+ From Idea to Production +
+ in 6 Weeks +

+
+

Chris Testa

+
+
+ +
+ + Part 1: Foundations -- available now + + +

+ The bottleneck isn't{" "} + code anymore. +

+ +

+ It's knowing what to build. +

+ +

+ The definitive playbook for building software products with AI + agents — written by a CTO who's done it. For vibecoders + and CTOs alike. +

+ + + +

+ Free to read. Creative Commons (CC BY). +

+
+
+ + {/* Big Ideas */} +
+
+

+ What you'll learn +

+

+ Five ideas that will change how you build software +

+

+ These aren't AI hype takes. They're frameworks forged + from shipping real products with agentic workflows. +

+ +
+ {KEY_IDEAS.map((idea, i) => ( +
+ + {String(i + 1).padStart(2, "0")} + +
+

+ {idea.title} +

+

+ {idea.description} +

+
+
+ ))} +
+
+
+ + {/* Social Proof */} +
+
+

+ What readers are saying +

+
+ {TESTIMONIALS.map((item) => ( +
+
+ “{item.quote}” +
+
+ — {item.author} +
+
+ ))} +
+
+
+ + {/* Table of Contents */} +
+
+

+ Table of Contents +

+

+ Four parts. One playbook. Idea to production in six weeks. +

+ +
+ {/* Part 1 - Available */} + + + 01 + +
+
+

+ Foundations +

+ + Available + +
+

+ The Renaissance Developer mindset, what agentic coding + really means, and first principles of software architecture. +

+
+ +
+ + {/* Parts 2-4 - Coming Soon */} + {[ + { + num: "02", + title: "The Playbook", + desc: "The complete 6-week journey: idea, brainstorm, brief, requirements, design, implementation, testing, and deployment.", + }, + { + num: "03", + title: "Patterns & Tools", + desc: "Architecture patterns, interface design, testing strategies, and the agent-friendly toolchain.", + }, + { + num: "04", + title: "Complete Example", + desc: "A real, non-trivial product built using the entire playbook -- proving the 6-week promise.", + }, + ].map((part) => ( +
+ + {part.num} + +
+
+

{part.title}

+ + Soon + +
+

{part.desc}

+
+
+ ))} +
+
+
+ + {/* Email Capture */} +
+
+

+ Get notified when Part 2 drops +

+

+ No spam. Just a single email when new chapters go live. +

+
+ +
+
+
+ + {/* Final CTA */} +
+
+

+ AI can write code faster than you can type. The question + isn't whether to use it — it's whether you know + how to direct it. +

+ +
+
+
+ + {/* Footer */} + +
+ ) +} diff --git a/website/components.json b/website/components.json new file mode 100644 index 0000000..13f24bf --- /dev/null +++ b/website/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/website/components/book-nav.tsx b/website/components/book-nav.tsx new file mode 100644 index 0000000..14bf11f --- /dev/null +++ b/website/components/book-nav.tsx @@ -0,0 +1,147 @@ +"use client" + +import Link from "next/link" +import { usePathname } from "next/navigation" +import { ChevronDown, ChevronRight } from "lucide-react" +import { useState, useEffect } from "react" +import { cn } from "@/lib/utils" +import { bookStructure } from "@/lib/book-data" + +export function BookNav({ onNavigate }: { onNavigate?: () => void }) { + const pathname = usePathname() + + const getInitialExpanded = () => { + const parts: string[] = [] + const chapters: string[] = [] + for (const part of bookStructure) { + for (const chapter of part.chapters) { + for (const section of chapter.sections) { + if (pathname === `/book/${part.slug}/${chapter.slug}/${section.slug}`) { + parts.push(part.slug) + chapters.push(chapter.slug) + } + } + } + } + return { + parts: parts.length > 0 ? parts : ["foundations"], + chapters: chapters.length > 0 ? chapters : [], + } + } + + const initial = getInitialExpanded() + const [expandedParts, setExpandedParts] = useState(initial.parts) + const [expandedChapters, setExpandedChapters] = useState(initial.chapters) + + useEffect(() => { + const updated = getInitialExpanded() + setExpandedParts((prev) => Array.from(new Set([...prev, ...updated.parts]))) + setExpandedChapters((prev) => Array.from(new Set([...prev, ...updated.chapters]))) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pathname]) + + const togglePart = (slug: string) => { + setExpandedParts((prev) => + prev.includes(slug) ? prev.filter((s) => s !== slug) : [...prev, slug], + ) + } + + const toggleChapter = (slug: string) => { + setExpandedChapters((prev) => + prev.includes(slug) ? prev.filter((s) => s !== slug) : [...prev, slug], + ) + } + + return ( + + ) +} diff --git a/website/components/email-signup.tsx b/website/components/email-signup.tsx new file mode 100644 index 0000000..e03fc1a --- /dev/null +++ b/website/components/email-signup.tsx @@ -0,0 +1,56 @@ +"use client" + +import React from "react" + +import { useState } from "react" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { ArrowRight, Check, Loader2 } from "lucide-react" + +export function EmailSignup() { + const [email, setEmail] = useState("") + const [status, setStatus] = useState<"idle" | "loading" | "success">("idle") + + function handleSubmit(e: React.FormEvent) { + e.preventDefault() + if (!email) return + setStatus("loading") + // Simulate submission — replace with real endpoint + setTimeout(() => { + setStatus("success") + }, 1000) + } + + if (status === "success") { + return ( +
+ + You're on the list. We'll be in touch. +
+ ) + } + + return ( +
+ setEmail(e.target.value)} + required + className="bg-card" + aria-label="Email address" + /> + +
+ ) +} diff --git a/website/components/mermaid-diagram.tsx b/website/components/mermaid-diagram.tsx new file mode 100644 index 0000000..5656871 --- /dev/null +++ b/website/components/mermaid-diagram.tsx @@ -0,0 +1,70 @@ +"use client" + +import { useEffect, useRef } from "react" +import mermaid from "mermaid" + +mermaid.initialize({ + startOnLoad: false, + theme: "dark", + themeVariables: { + primaryColor: "#22c55e", + primaryTextColor: "#fafaf9", + primaryBorderColor: "#22c55e", + lineColor: "#3f3f46", + secondaryColor: "#18181b", + tertiaryColor: "#27272a", + background: "#0c0d10", + mainBkg: "#18181b", + nodeBorder: "#3f3f46", + clusterBkg: "#18181b", + clusterBorder: "#3f3f46", + titleColor: "#fafaf9", + edgeLabelBackground: "#18181b", + }, + flowchart: { + curve: "basis", + padding: 20, + }, +}) + +interface MermaidDiagramProps { + chart: string + caption?: string +} + +export function MermaidDiagram({ chart, caption }: MermaidDiagramProps) { + const containerRef = useRef(null) + + useEffect(() => { + const renderDiagram = async () => { + if (containerRef.current) { + containerRef.current.innerHTML = "" + try { + const { svg } = await mermaid.render( + `mermaid-${Math.random().toString(36).substr(2, 9)}`, + chart + ) + containerRef.current.innerHTML = svg + } catch (error) { + console.error("Mermaid rendering error:", error) + containerRef.current.innerHTML = `
${chart}
` + } + } + } + renderDiagram() + }, [chart]) + + return ( +
+
+ {caption && ( +
+ {caption} +
+ )} +
+ ) +} diff --git a/website/components/theme-provider.tsx b/website/components/theme-provider.tsx new file mode 100644 index 0000000..55c2f6e --- /dev/null +++ b/website/components/theme-provider.tsx @@ -0,0 +1,11 @@ +'use client' + +import * as React from 'react' +import { + ThemeProvider as NextThemesProvider, + type ThemeProviderProps, +} from 'next-themes' + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children} +} diff --git a/website/components/theme-toggle.tsx b/website/components/theme-toggle.tsx new file mode 100644 index 0000000..c967559 --- /dev/null +++ b/website/components/theme-toggle.tsx @@ -0,0 +1,34 @@ +"use client" + +import { useTheme } from "next-themes" +import { useEffect, useState } from "react" +import { Moon, Sun } from "lucide-react" +import { Button } from "@/components/ui/button" + +export function ThemeToggle() { + const { resolvedTheme, setTheme } = useTheme() + const [mounted, setMounted] = useState(false) + + useEffect(() => setMounted(true), []) + + if (!mounted) { + return ( + + ) + } + + const isDark = resolvedTheme === "dark" || !resolvedTheme + + return ( + + ) +} diff --git a/website/components/ui/accordion.tsx b/website/components/ui/accordion.tsx new file mode 100644 index 0000000..b69428b --- /dev/null +++ b/website/components/ui/accordion.tsx @@ -0,0 +1,58 @@ +'use client' + +import * as React from 'react' +import * as AccordionPrimitive from '@radix-ui/react-accordion' +import { ChevronDown } from 'lucide-react' + +import { cn } from '@/lib/utils' + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = 'AccordionItem' + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180', + className, + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) + +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/website/components/ui/alert-dialog.tsx b/website/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..e58f90a --- /dev/null +++ b/website/components/ui/alert-dialog.tsx @@ -0,0 +1,141 @@ +'use client' + +import * as React from 'react' +import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog' + +import { cn } from '@/lib/utils' +import { buttonVariants } from '@/components/ui/button' + +const AlertDialog = AlertDialogPrimitive.Root + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger + +const AlertDialogPortal = AlertDialogPrimitive.Portal + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)) +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName + +const AlertDialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogHeader.displayName = 'AlertDialogHeader' + +const AlertDialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogFooter.displayName = 'AlertDialogFooter' + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogDescription.displayName = + AlertDialogPrimitive.Description.displayName + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +} diff --git a/website/components/ui/alert.tsx b/website/components/ui/alert.tsx new file mode 100644 index 0000000..2b2ced8 --- /dev/null +++ b/website/components/ui/alert.tsx @@ -0,0 +1,59 @@ +import * as React from 'react' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const alertVariants = cva( + 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', + { + variants: { + variant: { + default: 'bg-background text-foreground', + destructive: + 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)) +Alert.displayName = 'Alert' + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertTitle.displayName = 'AlertTitle' + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertDescription.displayName = 'AlertDescription' + +export { Alert, AlertTitle, AlertDescription } diff --git a/website/components/ui/aspect-ratio.tsx b/website/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000..794c6f4 --- /dev/null +++ b/website/components/ui/aspect-ratio.tsx @@ -0,0 +1,7 @@ +'use client' + +import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio' + +const AspectRatio = AspectRatioPrimitive.Root + +export { AspectRatio } diff --git a/website/components/ui/avatar.tsx b/website/components/ui/avatar.tsx new file mode 100644 index 0000000..77fde46 --- /dev/null +++ b/website/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +'use client' + +import * as React from 'react' +import * as AvatarPrimitive from '@radix-ui/react-avatar' + +import { cn } from '@/lib/utils' + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Avatar.displayName = AvatarPrimitive.Root.displayName + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarImage.displayName = AvatarPrimitive.Image.displayName + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/website/components/ui/badge.tsx b/website/components/ui/badge.tsx new file mode 100644 index 0000000..eb4ccad --- /dev/null +++ b/website/components/ui/badge.tsx @@ -0,0 +1,37 @@ +import * as React from 'react' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const badgeVariants = cva( + 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + { + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80', + secondary: + 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: + 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80', + outline: 'text-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +export interface BadgeProps + extends + React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/website/components/ui/breadcrumb.tsx b/website/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..d731202 --- /dev/null +++ b/website/components/ui/breadcrumb.tsx @@ -0,0 +1,115 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { ChevronRight, MoreHorizontal } from 'lucide-react' + +import { cn } from '@/lib/utils' + +const Breadcrumb = React.forwardRef< + HTMLElement, + React.ComponentPropsWithoutRef<'nav'> & { + separator?: React.ReactNode + } +>(({ ...props }, ref) =>