Skip to content

feat: replace Teams with Skillshare-based Share system, streamline spec workflow and hooks#95

Open
maxritter wants to merge 2 commits intomainfrom
dev
Open

feat: replace Teams with Skillshare-based Share system, streamline spec workflow and hooks#95
maxritter wants to merge 2 commits intomainfrom
dev

Conversation

@maxritter
Copy link
Owner

@maxritter maxritter commented Mar 11, 2026

Summary

Replace the Teams/sx-based asset sharing system with Skillshare-powered Share functionality, streamline the spec workflow, and refactor hook internals.

Share System (replaces Teams)

  • Skillshare CLI integration — install, global + project init (--mode merge), collect, and sync during installation
  • Console Share view — skill grid, source/sync cards, team remote management, install from URL
  • ShareRoutes backend — full Skillshare CLI wrapper (status, sync, collect, push, pull, install, audit)
  • New skill-sharing.md rule — documents three-tier model (global, project, organization)
  • /learn and /sync — create skills in .skillshare/skills/ when available, with auto-sync
  • README + docs site — updated from Teams to Share terminology throughout

Spec Workflow

  • Config migration v3 — disable plan-reviewer, spec-reviewer, and worktree by default (saves ~150k tokens)
  • Streamlined spec-plan — remove assumptions/pre-mortem sections from plan template
  • Streamlined spec-implement — remove pre-mortem check from task loop
  • spec-verify — constrain plan-reviewer to skip verification phase

Hooks

  • Reorganized internal modules_util.py_lib/util.py, _dashboard_notify.py_lib/dashboard_notify.py
  • TDD enforcer — moved to _checkers/tdd.py (reusable module, no longer standalone hook)
  • Agent tool blockedtool_redirect.py now blocks all Agent/sub-agent calls

Console

  • Help view — iframe-embedded documentation with CSP frame-ancestors fix
  • Error handler — no longer leaks internal error messages for non-AppError exceptions
  • Auth middleware and backup route hardening

Docs Site

  • Open Source compliance section — lists all installed dependencies with licenses
  • Updated pricing, FAQ, features for Share terminology
  • Vercel configX-Frame-Options: DENYContent-Security-Policy: frame-ancestors

Tests

  • 850 Python tests passing (launcher + hooks)
  • 316 installer tests passing (including new Skillshare + migration v3 tests)
  • 1113 console tests passing (including new ShareRoutes tests)
  • TypeScript typecheck clean

Summary by CodeRabbit

Release Notes

  • New Features

    • Added Skill Sharing with three modes: Global, Project, and Organization scope
    • Introduced Open Source Compliance documentation section with dependency information
  • Documentation

    • Updated guides and blog posts to reflect new Skillshare terminology and workflows
    • Enhanced installation process with improved local installer support
  • Style

    • Rebranded sharing capabilities from Teams to broader Share concept across documentation and UI
    • Updated pricing plans to highlight organization-wide skill hub capabilities

…ec workflow and hooks

Share system (replaces Teams):
- Replace sx/Teams with Skillshare CLI for skill sharing across machines and orgs
- New Console Share view with skill grid, source/sync cards, team remote management
- New ShareRoutes backend with full Skillshare CLI integration (status, sync, collect, push, pull, install)
- Installer: install_skillshare with global + project init (--mode merge), collect, and sync
- New skill-sharing.md rule documenting three-tier model (global, project, org)
- /learn and /sync commands now create skills in .skillshare/skills/ when available
- README, docs site, and blog posts updated from Teams to Share terminology

Console improvements:
- Add Help view with iframe-embedded documentation
- Fix error handler to not leak internal error messages
- Add auth middleware improvements and backup route hardening
- Update viewer bundle and CSS

Spec workflow:
- Config migration v3: disable plan-reviewer, spec-reviewer, and worktree by default
- Remove pre-mortem check from spec-implement task loop
- Streamline spec-plan (remove assumptions/pre-mortem sections)
- Spec-verify: constrain plan-reviewer to skip verification phase

Hooks refactoring:
- Move _util.py → _lib/util.py, _dashboard_notify.py → _lib/dashboard_notify.py
- Move tdd_enforcer.py → _checkers/tdd.py (no longer standalone hook)
- Block Agent tool in tool_redirect hook (prevents sub-agent token waste)
- Update all hook imports to use new _lib/ and _checkers/ paths

Docs site:
- Add Open Source compliance section listing all installed dependencies
- Update pricing, FAQ, and feature sections for Share terminology
- Fix iframe embedding: replace X-Frame-Options with CSP frame-ancestors
@vercel
Copy link

vercel bot commented Mar 11, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
pilot-shell Ignored Ignored Preview Mar 11, 2026 2:52pm

Request Review

@claude
Copy link

claude bot commented Mar 11, 2026

Claude finished @maxritter's task in 2m 42s —— View job


Code Review

  • Gather context and understand PR scope
  • Review non-encrypted files (installer, pilot hooks/commands, docs, README)
  • Analyze installer changes (dependencies.py, config_migration.py)
  • Analyze pilot commands and hooks changes
  • Analyze docs site changes
  • Compile and post review findings

This is a large, well-structured PR. The Teams→Share/Skillshare migration is consistent across all touchpoints, and the hook reorganization into _lib/ and _checkers/ packages is a clean improvement. Below are the issues I found, ordered by severity.


Bugs

1. Missing image asset — broken docs page [docs/site/src/components/TeamsDashboardSection.tsx:58]

TeamsDashboardSection.tsx now references /console/share.png, but only teams.png exists in docs/site/public/console/. This will render a broken image on the live docs site.

// TeamsDashboardSection.tsx:58
src="/console/share.png"  // ❌ file doesn't exist in docs/site/public/console/

The directory contains: dashboard.png, memories.png, sessions.png, settings.png, specification.png, teams.png, usage.png. Either add share.png or keep teams.png until the screenshot is ready. Fix this →


Stale Documentation

2. README.md still documents tdd_enforcer.py [README.md:261]

The hook was renamed to _checkers/tdd.py and is no longer a standalone entrypoint, but the README hooks table still says:

| `tdd_enforcer.py` | Non-blocking | ...

Should be updated to _checkers/tdd.py or removed from the user-facing hooks table (since it's now an internal module, not a directly-invocable hook). Fix this →

3. Blog post references deleted file path [docs/site/src/content/blog/tdd-with-claude-code.md:65,68]

The blog post shows example hook config pointing to the old path:

{ "shell": "python ${CLAUDE_PLUGIN_ROOT}/hooks/tdd_enforcer.py" }

This path no longer exists. Users copying this example will get a FileNotFoundError. Fix this →


Security / Robustness

4. curl | sh without integrity check [installer/steps/dependencies.py:162]

"curl -fsSL https://raw.githubusercontent.com/runkids/skillshare/main/install.sh | sh"

This is a supply chain risk — if the GitHub repo or CDN is compromised, malicious code runs in the user's shell with no verification. The previous sx installer used the same pattern, so this isn't a regression, but worth noting. Consider pinning to a specific commit hash or verifying a SHA-256 checksum of the install script.

5. Prompt bypass via echo y | pipe [installer/steps/dependencies.py:190-191]

_run_bash_with_retry("echo y | skillshare collect -g", timeout=30)
_run_bash_with_retry("echo y | skillshare collect -p", timeout=30)

Piping echo y is fragile — it breaks if the CLI changes its confirmation dialog, uses readline, or runs non-interactively. Prefer a --yes/--non-interactive flag from the Skillshare CLI if available.

6. CSP frame-ancestors drops HTTPS localhost and removes X-Frame-Options [docs/site/vercel.json]

// Before
{ "key": "X-Frame-Options", "value": "DENY" }

// After
{ "key": "Content-Security-Policy", "value": "frame-ancestors 'self' http://localhost:*" }

Two concerns:

  • Only http://localhost:* is allowed — https://localhost:* should also be included if the console runs on HTTPS in development.
  • X-Frame-Options: DENY is removed entirely. CSP frame-ancestors supersedes it in modern browsers, but older browsers (IE 11, some Safari versions) only honor X-Frame-Options. For a docs/marketing site the risk is low, but keeping both is safer. Fix this →

Minor / Code Quality

7. import logging inside function body [installer/steps/dependencies.py:156]

def install_skillshare() -> bool:
    """Install Skillshare CLI..."""
    import logging  # ← should be at module top level

Python imports inside function bodies are valid but unconventional here — logging is a stdlib module with negligible overhead. Move it to the top-level imports. Fix this →

8. _migration_v3 doesn't set missing sub-keys when reviewerAgents dict exists [installer/steps/config_migration.py:128-137]

If a user has "reviewerAgents": {"planReviewer": True} (missing specReviewer), the migration disables planReviewer but doesn't add specReviewer: false. This is only an issue if the application doesn't treat missing keys as False. Worth an explicit guard or a test case covering this edge case.


What Looks Good

  • Config migration v3 is well-implemented with proper idempotency checks, atomic writes, and thorough test coverage (6 new test cases covering all edge cases).
  • Hook module reorganization (_lib/util.py, _lib/dashboard_notify.py, _checkers/tdd.py) is clean — all import paths are updated consistently across all hook files and tests.
  • install_skillshare() error handling — init failures are warnings (not errors), correctly treating "binary installed but not initialized" as a recoverable state.
  • update_skillshare() dry-run optimization avoids slow network calls on every install run.
  • Spec workflow simplification — removing Pre-Mortem/Testing Strategy/Key Links sections is a good reduction in template bloat.
  • spec-verify.md correctly blocks plan-reviewer during verification (token waste prevention).
  • learn.md / sync.md skillshare conditional logic is consistent and well-documented.
  • OpenSourceSection.tsx is a comprehensive license compliance listing.
  • Test coverage for the new Skillshare install/update functions is thorough.

@coderabbitai
Copy link

coderabbitai bot commented Mar 11, 2026

Important

Review skipped

Too many files!

This PR contains 187 files, which is 37 over the limit of 150.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ea9c2e2e-b797-4e30-9b33-64c7a9463d8a

📥 Commits

Reviewing files that changed from the base of the PR and between eaa08d4 and 73e85c0.

⛔ Files ignored due to path filters (36)
  • console/src/services/worker/http/routes/ShareRoutes.ts is excluded by !console/**
  • console/src/services/worker/http/routes/ShareTypes.ts is excluded by !console/**
  • console/src/services/worker/http/routes/utils/gitInfo.ts is excluded by !console/**
  • console/src/ui/viewer/App.tsx is excluded by !console/**
  • console/src/ui/viewer/constants/timing.ts is excluded by !console/**
  • console/src/ui/viewer/hooks/useShare.ts is excluded by !console/**
  • console/src/ui/viewer/hooks/useStats.ts is excluded by !console/**
  • console/src/ui/viewer/layouts/DashboardLayout.tsx is excluded by !console/**
  • console/src/ui/viewer/layouts/Sidebar/SidebarFooter.tsx is excluded by !console/**
  • console/src/ui/viewer/layouts/Sidebar/index.tsx is excluded by !console/**
  • console/src/ui/viewer/layouts/Topbar/index.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Changes/index.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Dashboard/GitStatus.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Dashboard/PlanStatus.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Dashboard/ShareStatus.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Dashboard/UsageSummary.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Dashboard/WorkerStatus.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Dashboard/index.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/ShareAuditSection.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/ShareHelpSections.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/ShareSearchModal.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/ShareSkillDetail.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/ShareSkillsGrid.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/index.tsx is excluded by !console/**
  • console/tests/ui/ChangesView.test.ts is excluded by !console/**
  • console/tests/ui/project-selector.test.ts is excluded by !console/**
  • console/tests/ui/search-removal.test.ts is excluded by !console/**
  • console/tests/ui/teams-view.test.ts is excluded by !console/**
  • console/tests/unit/services/worker/ShareRoutes.test.ts is excluded by !console/**
  • docs/docusaurus/package-lock.json is excluded by !**/package-lock.json
  • docs/docusaurus/static/img/favicon.png is excluded by !**/*.png
  • pilot/claude.json is excluded by !pilot/**
  • pilot/commands/learn.md is excluded by !pilot/**
  • pilot/commands/sync.md is excluded by !pilot/**
  • pilot/rules/skill-sharing.md is excluded by !pilot/**
  • pilot/scripts/worker-service.cjs is excluded by !pilot/**
📒 Files selected for processing (187)
  • .github/workflows/deploy-website.yml
  • .github/workflows/release.yml
  • README.md
  • docs/docusaurus/.gitignore
  • docs/docusaurus/blog/2024-03-04-claude-3.md
  • docs/docusaurus/blog/2024-06-20-claude-3-5-sonnet.md
  • docs/docusaurus/blog/2024-10-22-claude-3-5-sonnet-v2.md
  • docs/docusaurus/blog/2025-02-25-claude-3-7-sonnet.md
  • docs/docusaurus/blog/2025-05-22-claude-4.md
  • docs/docusaurus/blog/2025-08-05-claude-opus-4-1.md
  • docs/docusaurus/blog/2025-08-14-faq.md
  • docs/docusaurus/blog/2025-08-16-troubleshooting.md
  • docs/docusaurus/blog/2025-08-23-agent-fundamentals.md
  • docs/docusaurus/blog/2025-08-23-agent-patterns.md
  • docs/docusaurus/blog/2025-08-23-auto-planning-strategies.md
  • docs/docusaurus/blog/2025-08-23-best-addons.md
  • docs/docusaurus/blog/2025-08-23-browser-automation.md
  • docs/docusaurus/blog/2025-08-23-configuration-basics.md
  • docs/docusaurus/blog/2025-08-23-context-management.md
  • docs/docusaurus/blog/2025-08-23-context-preservation.md
  • docs/docusaurus/blog/2025-08-23-custom-agents.md
  • docs/docusaurus/blog/2025-08-23-custom-integrations.md
  • docs/docusaurus/blog/2025-08-23-deep-thinking-techniques.md
  • docs/docusaurus/blog/2025-08-23-efficiency-patterns.md
  • docs/docusaurus/blog/2025-08-23-examples-templates.md
  • docs/docusaurus/blog/2025-08-23-experimentation-mindset.md
  • docs/docusaurus/blog/2025-08-23-feedback-loops.md
  • docs/docusaurus/blog/2025-08-23-first-project.md
  • docs/docusaurus/blog/2025-08-23-git-integration.md
  • docs/docusaurus/blog/2025-08-23-human-like-agents.md
  • docs/docusaurus/blog/2025-08-23-installation-guide.md
  • docs/docusaurus/blog/2025-08-23-mcp-basics.md
  • docs/docusaurus/blog/2025-08-23-memory-optimization.md
  • docs/docusaurus/blog/2025-08-23-model-selection.md
  • docs/docusaurus/blog/2025-08-23-output-formatting.md
  • docs/docusaurus/blog/2025-08-23-permission-management.md
  • docs/docusaurus/blog/2025-08-23-planning-modes.md
  • docs/docusaurus/blog/2025-08-23-project-templates.md
  • docs/docusaurus/blog/2025-08-23-search-tools.md
  • docs/docusaurus/blog/2025-08-23-social-media-mcps.md
  • docs/docusaurus/blog/2025-08-23-speed-optimization.md
  • docs/docusaurus/blog/2025-08-23-sub-agent-design.md
  • docs/docusaurus/blog/2025-08-23-task-distribution.md
  • docs/docusaurus/blog/2025-08-23-terminal-main-thread.md
  • docs/docusaurus/blog/2025-08-23-todo-workflows.md
  • docs/docusaurus/blog/2025-08-23-usage-optimization.md
  • docs/docusaurus/blog/2025-08-23-what-is-claude-code.md
  • docs/docusaurus/blog/2025-09-08-backlink-strategy-guide.md
  • docs/docusaurus/blog/2025-09-29-claude-sonnet-4-5.md
  • docs/docusaurus/blog/2025-10-15-claude-haiku-4-5.md
  • docs/docusaurus/blog/2025-11-13-ai-seo-geo-optimization.md
  • docs/docusaurus/blog/2025-11-13-claude-code-vs-cursor.md
  • docs/docusaurus/blog/2025-11-13-claude-code-vscode.md
  • docs/docusaurus/blog/2025-11-24-claude-opus-4-5.md
  • docs/docusaurus/blog/2025-12-07-claude-md-mastery.md
  • docs/docusaurus/blog/2025-12-07-claude-opus-4-5-guide.md
  • docs/docusaurus/blog/2025-12-07-claude-skills-guide.md
  • docs/docusaurus/blog/2025-12-07-permission-hook-guide.md
  • docs/docusaurus/blog/2025-12-07-skill-activation-hook.md
  • docs/docusaurus/blog/2025-12-10-context-engineering.md
  • docs/docusaurus/blog/2025-12-10-rules-directory.md
  • docs/docusaurus/blog/2025-12-11-async-workflows.md
  • docs/docusaurus/blog/2025-12-13-hooks-guide.md
  • docs/docusaurus/blog/2026-01-08-agentic-engineering-best-practices.md
  • docs/docusaurus/blog/2026-01-08-sub-agent-best-practices.md
  • docs/docusaurus/blog/2026-01-14-autonomous-agent-loops.md
  • docs/docusaurus/blog/2026-01-14-ralph-wiggum-technique.md
  • docs/docusaurus/blog/2026-01-14-robots-first-engineering.md
  • docs/docusaurus/blog/2026-01-14-thread-based-engineering.md
  • docs/docusaurus/blog/2026-01-15-context7-library-docs.md
  • docs/docusaurus/blog/2026-01-15-mcp-tool-search.md
  • docs/docusaurus/blog/2026-01-17-choosing-the-right-claude-model.md
  • docs/docusaurus/blog/2026-01-17-cursor-mcp-setup.md
  • docs/docusaurus/blog/2026-01-17-native-installer.md
  • docs/docusaurus/blog/2026-01-20-team-vault-sharing-ai-assets.md
  • docs/docusaurus/blog/2026-01-24-online-learning-teaching-claude.md
  • docs/docusaurus/blog/2026-01-24-session-lifecycle-hooks.md
  • docs/docusaurus/blog/2026-01-24-stop-hook-task-enforcement.md
  • docs/docusaurus/blog/2026-01-26-context-buffer-management.md
  • docs/docusaurus/blog/2026-01-26-context-recovery-hook.md
  • docs/docusaurus/blog/2026-01-27-claude-code-session-context.md
  • docs/docusaurus/blog/2026-01-27-claude-code-setup-hooks.md
  • docs/docusaurus/blog/2026-01-27-worktree-isolation-for-features.md
  • docs/docusaurus/blog/2026-01-30-slash-commands-and-init.md
  • docs/docusaurus/blog/2026-02-03-keybindings-guide.md
  • docs/docusaurus/blog/2026-02-03-self-validating-agents.md
  • docs/docusaurus/blog/2026-02-03-self-validating-ai-agents.md
  • docs/docusaurus/blog/2026-02-03-settings-reference.md
  • docs/docusaurus/blog/2026-02-03-statusline-guide.md
  • docs/docusaurus/blog/2026-02-03-team-orchestration.md
  • docs/docusaurus/blog/2026-02-03-terminal-setup-guide.md
  • docs/docusaurus/blog/2026-02-04-session-memory.md
  • docs/docusaurus/blog/2026-02-05-agent-teams.md
  • docs/docusaurus/blog/2026-02-05-claude-opus-4-6.md
  • docs/docusaurus/blog/2026-02-05-task-management.md
  • docs/docusaurus/blog/2026-02-05-terminal-setup-for-claude-code.md
  • docs/docusaurus/blog/2026-02-06-claude-code-task-management.md
  • docs/docusaurus/blog/2026-02-07-claude-code-settings-reference.md
  • docs/docusaurus/blog/2026-02-08-claude-code-rules-guide.md
  • docs/docusaurus/blog/2026-02-08-persistent-memory-across-sessions.md
  • docs/docusaurus/blog/2026-02-10-managing-context-long-sessions.md
  • docs/docusaurus/blog/2026-02-10-spec-driven-development.md
  • docs/docusaurus/blog/2026-02-11-mcp-servers-claude-code.md
  • docs/docusaurus/blog/2026-02-12-agent-teams-best-practices.md
  • docs/docusaurus/blog/2026-02-12-agent-teams-controls.md
  • docs/docusaurus/blog/2026-02-12-agent-teams-use-cases.md
  • docs/docusaurus/blog/2026-02-12-claude-code-hooks-guide.md
  • docs/docusaurus/blog/2026-02-12-tdd-with-claude-code.md
  • docs/docusaurus/blog/2026-02-14-cross-platform-hooks.md
  • docs/docusaurus/blog/2026-02-17-claude-sonnet-4-6.md
  • docs/docusaurus/blog/2026-02-17-fast-mode.md
  • docs/docusaurus/blog/2026-02-18-openclaw-vs-claude-code.md
  • docs/docusaurus/blog/authors.yml
  • docs/docusaurus/docs/features/context-preservation.md
  • docs/docusaurus/docs/features/hooks.md
  • docs/docusaurus/docs/features/model-routing.md
  • docs/docusaurus/docs/features/rules.md
  • docs/docusaurus/docs/features/share.md
  • docs/docusaurus/docs/getting-started/installation.md
  • docs/docusaurus/docs/getting-started/prerequisites.md
  • docs/docusaurus/docs/intro.md
  • docs/docusaurus/docs/reference/open-source.md
  • docs/docusaurus/docs/tools/cli.md
  • docs/docusaurus/docs/tools/console.md
  • docs/docusaurus/docs/tools/language-servers.md
  • docs/docusaurus/docs/tools/mcp-servers.md
  • docs/docusaurus/docs/workflows/learn.md
  • docs/docusaurus/docs/workflows/quick-mode.md
  • docs/docusaurus/docs/workflows/spec.md
  • docs/docusaurus/docs/workflows/sync.md
  • docs/docusaurus/docusaurus.config.ts
  • docs/docusaurus/package.json
  • docs/docusaurus/sidebars.ts
  • docs/docusaurus/src/css/custom.css
  • docs/docusaurus/tsconfig.json
  • docs/site/build-all.sh
  • docs/site/dev.mjs
  • docs/site/index.html
  • docs/site/netlify.toml
  • docs/site/package.json
  • docs/site/src/App.tsx
  • docs/site/src/components/ConsoleSection.tsx
  • docs/site/src/components/DeploymentFlow.tsx
  • docs/site/src/components/FAQSection.tsx
  • docs/site/src/components/Footer.tsx
  • docs/site/src/components/HeroSection.tsx
  • docs/site/src/components/NavBar.tsx
  • docs/site/src/components/PricingSection.tsx
  • docs/site/src/components/SEO.tsx
  • docs/site/src/components/TeamsDashboardSection.tsx
  • docs/site/src/content/blog/index.ts
  • docs/site/src/content/blog/sandboxing-claude-code.md
  • docs/site/src/content/blog/types.ts
  • docs/site/src/hooks/use-active-section.ts
  • docs/site/src/pages/BlogArticlePage.tsx
  • docs/site/src/pages/BlogPage.tsx
  • docs/site/src/pages/DocsPage.tsx
  • docs/site/src/pages/docs/CliSection.tsx
  • docs/site/src/pages/docs/ConsoleSection.tsx
  • docs/site/src/pages/docs/ContextSection.tsx
  • docs/site/src/pages/docs/HooksSection.tsx
  • docs/site/src/pages/docs/InstallationSection.tsx
  • docs/site/src/pages/docs/LanguageServersSection.tsx
  • docs/site/src/pages/docs/LearnSection.tsx
  • docs/site/src/pages/docs/McpServersSection.tsx
  • docs/site/src/pages/docs/ModelRoutingSection.tsx
  • docs/site/src/pages/docs/PrerequisitesSection.tsx
  • docs/site/src/pages/docs/QuickModeSection.tsx
  • docs/site/src/pages/docs/RulesSection.tsx
  • docs/site/src/pages/docs/SpecSection.tsx
  • docs/site/src/pages/docs/SyncSection.tsx
  • docs/site/src/pages/docs/TeamsSection.tsx
  • docs/site/vercel-build-check.sh
  • docs/site/vercel.json
  • docs/site/vite-plugin-sitemap.ts
  • docs/site/vite.config.ts
  • install.sh
  • installer/cli.py
  • installer/platform_utils.py
  • installer/steps/config_migration.py
  • installer/steps/dependencies.py
  • installer/steps/finalize.py
  • installer/steps/prerequisites.py
  • installer/tests/unit/steps/test_dependencies.py
  • installer/tests/unit/steps/test_prerequisites.py
  • installer/tests/unit/test_install_sh.py
  • installer/tests/unit/test_platform_utils.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

This PR rebrands the team asset sharing feature from "Sx" and "Teams" terminology to "Skillshare" and "Share" across documentation, website components, and installer scripts. Updates include renaming React components, rewriting content descriptions, adding config migrations, and refactoring installer dependency paths.

Changes

Cohort / File(s) Summary
Documentation Content
README.md, docs/site/src/content/blog/*
Rebranded "Teams asset sharing" to "Skill sharing" with expanded scope descriptions (Global, Project, Organization modes). Updated terminology from vault/sx to Skillshare, including example commands and setup instructions.
Website UI Components - Branding Updates
docs/site/src/components/ConsoleSection.tsx, docs/site/src/components/DeepDiveSection.tsx, docs/site/src/components/FAQSection.tsx, docs/site/src/components/WhatsInside.tsx
Updated slide entries, rule categories, FAQ answers, and feature descriptions to replace "Teams" and "asset sharing" references with "Skill sharing" and cross-machine/org capabilities.
Website UI Components - Section Restructuring
docs/site/src/components/PricingSection.tsx, docs/site/src/components/TeamsDashboardSection.tsx
Added new pricing tier features, imported Calendar/Mail icons, updated dashboard section titles and imagery from /console/teams.png to /console/share.png, and added "Rolling Out for Your Team?" CTA section.
Documentation Pages - Navigation & Layout
docs/site/src/pages/DocsPage.tsx
Updated navigation labels (Commands→Workflows, System→Features, Teams→Share), replaced BookOpen icon with ArrowLeft, added OpenSourceSection component, and restructured hero/header layout.
Documentation Pages - Content & Features
docs/site/src/pages/docs/ConsoleSection.tsx, docs/site/src/pages/docs/LearnSection.tsx, docs/site/src/pages/docs/ModelRoutingSection.tsx, docs/site/src/pages/docs/RulesSection.tsx
Renamed "Teams" view to "Share" with updated descriptions, added Help view, added auto-trigger examples, changed "Smart Model Routing" to "Model Routing", and updated collaboration rule references to skill-sharing.md.
Teamwork/Share Features Component
docs/site/src/pages/docs/TeamsSection.tsx, docs/site/src/pages/docs/OpenSourceSection.tsx
Replaced TeamsSection with ShareSection component, restructured to three-tier grid layout (Global, Project, Organization) with new docLinks array, added OpenSourceSection with dependency categorization and license badges.
Configuration & Installer Logic
installer/steps/config_migration.py, install.sh, uninstall.sh
Bumped migration version to 3 with new \_migration\_v3 step disabling planReviewer/specReviewer/worktreeSupport toggles, restructured Dev Container/local installer branch conditions, and updated installer text from "sx" to "skillshare".
Dependency Management
installer/steps/dependencies.py
Replaced install\_sx/update\_sx with install\_skillshare/update\_skillshare functions, added \_is\_skillshare\_initialized helper, integrated skillshare init/collect/sync commands, and updated UI labels from "sx (team assets)" to "Skillshare (skill sharing)".
Test Coverage
installer/tests/unit/steps/test_config_migration.py, installer/tests/unit/steps/test_dependencies.py
Updated tests to use CURRENT\_CONFIG\_VERSION constant instead of hard-coded value, added TestMigrationV3 class validating v2→v3 migrations, and refactored dependency tests to cover install\_skillshare/update\_skillshare with initialization and failure scenarios.
Index Page & Security
docs/site/src/pages/Index.tsx, docs/site/vercel.json
Removed TechStack and TeamsDashboardSection imports from Index, replaced X-Frame-Options DENY header with Content-Security-Policy frame-ancestors restriction.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • maxritter/pilot-shell#85: Modifies the same installer/steps/dependencies.py file, introducing changes that may conflict or interact with the Skillshare dependency installation refactor.

Suggested labels

released

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: replacing the Teams/sx system with Skillshare-based Share system and streamlining spec workflow and hooks, which aligns with the primary objectives.
Docstring Coverage ✅ Passed Docstring coverage is 94.29% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
installer/steps/config_migration.py (1)

160-165: ⚠️ Potential issue | 🟠 Major

Cross-platform issue: os.rename fails on Windows when destination exists.

os.rename() will raise FileExistsError on Windows if the destination file already exists. Since this migration typically updates an existing config file, this will fail on Windows systems.

Use os.replace() instead, which atomically replaces the destination on all platforms.

🔧 Proposed fix
 def _write_atomic(path: Path, data: dict[str, Any]) -> None:
     """Write JSON atomically using temp file + os.rename."""
     path.parent.mkdir(parents=True, exist_ok=True)
     tmp_path = path.with_suffix(".json.tmp")
     tmp_path.write_text(json.dumps(data, indent=2))
-    os.rename(tmp_path, path)
+    os.replace(tmp_path, path)

As per coding guidelines, installer code should ensure "Cross-platform compatibility".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@installer/steps/config_migration.py` around lines 160 - 165, The
_write_atomic function uses os.rename which fails on Windows if the destination
exists; update _write_atomic to atomically overwrite the target by replacing
os.rename(tmp_path, path) with os.replace(tmp_path, path) so existing config
files are replaced cross-platform (keep same tmp_path creation, JSON write, and
parent mkdir behavior).
docs/site/src/components/TeamsDashboardSection.tsx (1)

33-35: ⚠️ Potential issue | 🟡 Minor

Rename the section anchor to match the new Share terminology.

The content has been rebranded to “Skill Sharing”, but the section still exposes id="teams". Any in-page link or deep link using #share will miss this block.

Suggested fix
-      id="teams"
+      id="share"

Also applies to: 45-50

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/site/src/components/TeamsDashboardSection.tsx` around lines 33 - 35,
Rename the section anchor in the TeamsDashboardSection component from id="teams"
to the new branding id="share" (or "skill-sharing" if the site uses hyphenated
anchors) so in-page links like `#share` target it; update every occurrence in
TeamsDashboardSection.tsx where the section element uses id="teams" (also the
second occurrence referenced around lines 45-50) to the new id and ensure any
internal links elsewhere reference the new anchor.
docs/site/src/pages/docs/ModelRoutingSection.tsx (1)

13-18: ⚠️ Potential issue | 🟡 Minor

Mark reviewer phases as opt-in/default-off.

These rows still read as if plan-reviewer and spec-reviewer run on every spec, but this PR’s v3 migration disables both by default. A fresh install will see different routing than this page currently documents unless these phases are labeled as optional or default-disabled.

Also applies to: 27-31

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/site/src/pages/docs/ModelRoutingSection.tsx` around lines 13 - 18, The
displayed rows for the reviewer phases ("Plan Verification" with model "Sonnet"
and the other reviewer row around lines 27-31, e.g. phase "Spec Review") should
be marked as opt-in/default-off; update those objects in ModelRoutingSection
(the entries with phase: "Plan Verification" and phase: "Spec Review"/model:
"Sonnet") to either add a flag like enabledByDefault: false or optional: true
and change the why text to indicate they are disabled by default (e.g., prepend
"Optional — disabled by default: ..."), so the docs reflect that plan-reviewer
and spec-reviewer are opt-in in v3.
docs/site/src/pages/docs/LearnSection.tsx (1)

106-115: ⚠️ Potential issue | 🟡 Minor

Clarify the skill storage path for Share-enabled projects.

This callout still says skills live in .claude/skills/, but the Share flow in this PR moves /learn output to .skillshare/skills/ when project sharing is available. That conflicts with the new Share docs and will send users to the wrong directory.

[suggested fix]

Proposed wording
-            stored in <code className="text-primary">.claude/skills/</code>.
+            stored in <code className="text-primary">.claude/skills/</code> by default,
+            or in <code className="text-primary">.skillshare/skills/</code> when the
+            project has Share enabled.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/site/src/pages/docs/LearnSection.tsx` around lines 106 - 115, The
callout copy in LearnSection.tsx currently points users to ".claude/skills/" but
must reflect the Share flow; update the JSX text (the paragraph inside the
rounded-xl callout) so the path explains that skills are stored in
".claude/skills/" normally but for Share-enabled projects /learn output is
written to ".skillshare/skills/" (or show both paths inline, e.g.
".claude/skills/ (or .skillshare/skills/ for shared projects)"). Ensure you
update the code snippets/text nodes that render <code
className="text-primary">.claude/skills/</code> to the new wording so docs align
with the Share flow.
README.md (1)

156-163: ⚠️ Potential issue | 🟡 Minor

Don't list Share under “Other Commands”.

/sync and /learn are invokable commands; Share reads like a third command here even though the PR describes it as a sharing feature/UI. That will send readers looking for Share or /share.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 156 - 163, The README lists "Share" as if it were a
command in the "Other Commands" table; remove or relocate the "Share" row so the
table only contains invokable commands (/sync and /learn). Update the table to
drop the "Share" entry (or move its description to a separate "Features" or
"Sharing" section) and ensure only `/sync` and `/learn` remain as commands to
avoid implying a `/share` command.
🧹 Nitpick comments (3)
installer/steps/dependencies.py (1)

189-195: Consider logging failures from collect and sync commands.

The collect and sync commands on lines 190-193 silently ignore failures. While this may be intentional best-effort behavior, adding debug/warning logs would help users diagnose issues when skill synchronization doesn't work as expected.

💡 Optional: Add logging for collect/sync failures
     # Collect existing skills from target dirs into source, then sync all
-    _run_bash_with_retry("echo y | skillshare collect -g", timeout=30)
-    _run_bash_with_retry("echo y | skillshare collect -p", timeout=30)
-    _run_bash_with_retry("skillshare sync -g", timeout=30)
-    _run_bash_with_retry("skillshare sync -p", timeout=30)
+    if not _run_bash_with_retry("echo y | skillshare collect -g", timeout=30):
+        logger.debug("skillshare collect -g failed (non-fatal)")
+    if not _run_bash_with_retry("echo y | skillshare collect -p", timeout=30):
+        logger.debug("skillshare collect -p failed (non-fatal)")
+    if not _run_bash_with_retry("skillshare sync -g", timeout=30):
+        logger.debug("skillshare sync -g failed (non-fatal)")
+    if not _run_bash_with_retry("skillshare sync -p", timeout=30):
+        logger.debug("skillshare sync -p failed (non-fatal)")
 
     return True
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@installer/steps/dependencies.py` around lines 189 - 195, The collect/sync
subprocess calls using _run_bash_with_retry currently swallow failures; update
the four calls ("echo y | skillshare collect -g", "echo y | skillshare collect
-p", "skillshare sync -g", "skillshare sync -p") to detect errors and log them
(using existing logger) rather than remaining silent: call _run_bash_with_retry
inside a try/except or check its return value, and on failure emit a
debug/warning message that includes the command string and error/exception
details so users can diagnose why skillshare collect/sync failed (refer to
_run_bash_with_retry and the exact command strings to locate the spots to
change).
docs/site/src/pages/docs/ConsoleSection.tsx (1)

89-90: Derive the view count from the array.

8 views is duplicated state. The stale /* 7 views */ comment right above it shows how easy this is to desync on the next view addition/removal.

Suggested fix
-        <h3 className="font-semibold text-foreground text-sm mb-3">8 views</h3>
+        <h3 className="font-semibold text-foreground text-sm mb-3">
+          {consoleViews.length} views
+        </h3>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/site/src/pages/docs/ConsoleSection.tsx` around lines 89 - 90, In
ConsoleSection.tsx the header currently hardcodes "8 views" (and has a stale
comment "7 views"); replace that duplicated state by deriving the count from the
array used to render the views in the ConsoleSection component (e.g., use the
length of the views/consoleViews/demoViews prop or local variable) so the header
displays "<count> views" dynamically; locate the render for the views in
ConsoleSection and change the hardcoded string to use the array's .length to
keep the UI in sync.
docs/site/src/pages/docs/OpenSourceSection.tsx (1)

12-238: Consider generating this inventory from a shared manifest.

This component duplicates tool names, versions, repositories, and licenses in source. Since the installer/CLI own the real dependency set, a shared manifest would reduce drift between install behavior and the compliance page.

Also applies to: 249-286

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/site/src/pages/docs/OpenSourceSection.tsx` around lines 12 - 238, The
page currently hardcodes multiple dependency arrays (prerequisites, devTools,
searchAndAnalysis, pluginDeps, testingTools, mcpServers); replace these static
lists with a single import from a shared manifest used by the installer/CLI
(e.g., export a central dependencies manifest and import it here) so the UI
reads the canonical data instead of duplicated literals; update the component to
map/filter the imported manifest into the same Dependency[] shape and remove the
local arrays to prevent drift.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/site/src/components/ConsoleSection.tsx`:
- Around line 42-47: The component entries referencing the missing image at src
"/console/share.png" (in ConsoleSection.tsx and TeamsDashboardSection.tsx, label
"Share") must be fixed: either add the missing asset
docs/site/public/console/share.png to the repo, or update those components to
point to an existing image (e.g., reuse an existing console image like
"dashboard.png" or "settings.png") or remove the "Share" entry entirely; update
the src string in the component(s) (ConsoleSection.tsx and
TeamsDashboardSection.tsx) to match the chosen action so the image reference is
valid.

In `@docs/site/src/components/FAQSection.tsx`:
- Line 65: Update the FAQ string in FAQSection.tsx that currently says "share
skills across machines and teams" to use the new Share scope terminology:
replace that phrase in the quoted FAQ text (inside the component's FAQ string)
with something like "share skills across Global, Project, or Organization
scopes" or "share skills at Global, Project, or Organization scope via the
Console Share page" so the wording aligns with the new Share scope model.

In `@docs/site/src/content/blog/team-vault-sharing-ai-assets.md`:
- Around line 57-68: Replace the invalid git clone invocation "git clone
github.com/team/my-project" with a proper URL scheme; update the example to use
either "git clone https://github.com/team/my-project.git" or the SSH form "git
clone git@github.com:team/my-project.git" so the command works in standard git
clients, and leave the supported shorthand "skillshare install
github.com/org/skills" unchanged.

In `@docs/site/src/pages/docs/OpenSourceSection.tsx`:
- Around line 4-10: The Dependency type currently models a single license and
licenseUrl, which cannot represent dual-licensed entries like uv and ripgrep;
update the interface (Dependency) to allow multiple licenses (e.g., change
license: string and licenseUrl: string to license: string[] and licenseUrl:
string[] or a licenses: {name:string,url:string}[] field), then update all
consumers in OpenSourceSection.tsx (table row rendering and any helpers around
lines referenced) to iterate the array and render each license name linked to
its corresponding URL (comma/separated or multiple links) so both license terms
are displayed and linked.

In `@README.md`:
- Around line 210-214: The Tier/License table row labeled "**All paid users**"
conflicts with the License column that still lists "Trial"; update the table so
the tier and license are consistent—either change the tier text (e.g., "**Paid
users (excluding Trial)**" or "**Paid subscribers**") or remove "Trial" from the
License cell for that row so it only lists paid plans (e.g., "Solo, Team"); edit
the markdown row containing "**All paid users**" to ensure the tier and license
columns do not contradict each other.

---

Outside diff comments:
In `@docs/site/src/components/TeamsDashboardSection.tsx`:
- Around line 33-35: Rename the section anchor in the TeamsDashboardSection
component from id="teams" to the new branding id="share" (or "skill-sharing" if
the site uses hyphenated anchors) so in-page links like `#share` target it; update
every occurrence in TeamsDashboardSection.tsx where the section element uses
id="teams" (also the second occurrence referenced around lines 45-50) to the new
id and ensure any internal links elsewhere reference the new anchor.

In `@docs/site/src/pages/docs/LearnSection.tsx`:
- Around line 106-115: The callout copy in LearnSection.tsx currently points
users to ".claude/skills/" but must reflect the Share flow; update the JSX text
(the paragraph inside the rounded-xl callout) so the path explains that skills
are stored in ".claude/skills/" normally but for Share-enabled projects /learn
output is written to ".skillshare/skills/" (or show both paths inline, e.g.
".claude/skills/ (or .skillshare/skills/ for shared projects)"). Ensure you
update the code snippets/text nodes that render <code
className="text-primary">.claude/skills/</code> to the new wording so docs align
with the Share flow.

In `@docs/site/src/pages/docs/ModelRoutingSection.tsx`:
- Around line 13-18: The displayed rows for the reviewer phases ("Plan
Verification" with model "Sonnet" and the other reviewer row around lines 27-31,
e.g. phase "Spec Review") should be marked as opt-in/default-off; update those
objects in ModelRoutingSection (the entries with phase: "Plan Verification" and
phase: "Spec Review"/model: "Sonnet") to either add a flag like
enabledByDefault: false or optional: true and change the why text to indicate
they are disabled by default (e.g., prepend "Optional — disabled by default:
..."), so the docs reflect that plan-reviewer and spec-reviewer are opt-in in
v3.

In `@installer/steps/config_migration.py`:
- Around line 160-165: The _write_atomic function uses os.rename which fails on
Windows if the destination exists; update _write_atomic to atomically overwrite
the target by replacing os.rename(tmp_path, path) with os.replace(tmp_path,
path) so existing config files are replaced cross-platform (keep same tmp_path
creation, JSON write, and parent mkdir behavior).

In `@README.md`:
- Around line 156-163: The README lists "Share" as if it were a command in the
"Other Commands" table; remove or relocate the "Share" row so the table only
contains invokable commands (/sync and /learn). Update the table to drop the
"Share" entry (or move its description to a separate "Features" or "Sharing"
section) and ensure only `/sync` and `/learn` remain as commands to avoid
implying a `/share` command.

---

Nitpick comments:
In `@docs/site/src/pages/docs/ConsoleSection.tsx`:
- Around line 89-90: In ConsoleSection.tsx the header currently hardcodes "8
views" (and has a stale comment "7 views"); replace that duplicated state by
deriving the count from the array used to render the views in the ConsoleSection
component (e.g., use the length of the views/consoleViews/demoViews prop or
local variable) so the header displays "<count> views" dynamically; locate the
render for the views in ConsoleSection and change the hardcoded string to use
the array's .length to keep the UI in sync.

In `@docs/site/src/pages/docs/OpenSourceSection.tsx`:
- Around line 12-238: The page currently hardcodes multiple dependency arrays
(prerequisites, devTools, searchAndAnalysis, pluginDeps, testingTools,
mcpServers); replace these static lists with a single import from a shared
manifest used by the installer/CLI (e.g., export a central dependencies manifest
and import it here) so the UI reads the canonical data instead of duplicated
literals; update the component to map/filter the imported manifest into the same
Dependency[] shape and remove the local arrays to prevent drift.

In `@installer/steps/dependencies.py`:
- Around line 189-195: The collect/sync subprocess calls using
_run_bash_with_retry currently swallow failures; update the four calls ("echo y
| skillshare collect -g", "echo y | skillshare collect -p", "skillshare sync
-g", "skillshare sync -p") to detect errors and log them (using existing logger)
rather than remaining silent: call _run_bash_with_retry inside a try/except or
check its return value, and on failure emit a debug/warning message that
includes the command string and error/exception details so users can diagnose
why skillshare collect/sync failed (refer to _run_bash_with_retry and the exact
command strings to locate the spots to change).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 8b18805d-56ed-4829-84b0-c0054115b2cc

📥 Commits

Reviewing files that changed from the base of the PR and between f5a94d1 and eaa08d4.

⛔ Files ignored due to path filters (92)
  • console/src/services/server/ErrorHandler.ts is excluded by !console/**
  • console/src/services/server/Server.ts is excluded by !console/**
  • console/src/services/server/middleware/auth.ts is excluded by !console/**
  • console/src/services/worker-service.ts is excluded by !console/**
  • console/src/services/worker/http/BaseRouteHandler.ts is excluded by !console/**
  • console/src/services/worker/http/routes/AuthRoutes.ts is excluded by !console/**
  • console/src/services/worker/http/routes/BackupRoutes.ts is excluded by !console/**
  • console/src/services/worker/http/routes/SettingsRoutes.ts is excluded by !console/**
  • console/src/services/worker/http/routes/ShareRoutes.ts is excluded by !console/**
  • console/src/services/worker/http/routes/ShareTypes.ts is excluded by !console/**
  • console/src/services/worker/http/routes/TeamsRoutes.ts is excluded by !console/**
  • console/src/services/worker/http/routes/TeamsTypes.ts is excluded by !console/**
  • console/src/ui/viewer/App.tsx is excluded by !console/**
  • console/src/ui/viewer/components/CommandPalette.tsx is excluded by !console/**
  • console/src/ui/viewer/constants/shortcuts.ts is excluded by !console/**
  • console/src/ui/viewer/hooks/useSettings.ts is excluded by !console/**
  • console/src/ui/viewer/hooks/useShare.ts is excluded by !console/**
  • console/src/ui/viewer/hooks/useStats.ts is excluded by !console/**
  • console/src/ui/viewer/hooks/useTeams.ts is excluded by !console/**
  • console/src/ui/viewer/layouts/Sidebar/SidebarNav.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Dashboard/ShareStatus.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Dashboard/TeamsStatus.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Dashboard/index.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Help/index.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Settings/index.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/ShareOnboarding.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/ShareSkillDetail.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/ShareSkillsGrid.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Share/index.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Spec/SpecSection.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Spec/index.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Teams/TeamsAssetDetail.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Teams/TeamsAssetTable.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Teams/TeamsContentModal.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Teams/TeamsHelpModal.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Teams/TeamsOnboarding.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Teams/TeamsPushPanel.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Teams/TeamsSetupTab.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Teams/TeamsSummaryCards.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Teams/index.tsx is excluded by !console/**
  • console/src/ui/viewer/views/index.ts is excluded by !console/**
  • console/tests/hooks/use-teams.test.ts is excluded by !console/**
  • console/tests/hooks/useSettings.test.ts is excluded by !console/**
  • console/tests/server/error-handler.test.ts is excluded by !console/**
  • console/tests/settings-routes.test.ts is excluded by !console/**
  • console/tests/ui/search-removal.test.ts is excluded by !console/**
  • console/tests/ui/teams-install.test.ts is excluded by !console/**
  • console/tests/ui/teams-navigation.test.ts is excluded by !console/**
  • console/tests/ui/teams-view.test.ts is excluded by !console/**
  • console/tests/ui/views-index.test.ts is excluded by !console/**
  • console/tests/unit/services/worker/ShareRoutes.test.ts is excluded by !console/**
  • console/tests/worker/teams-routes.test.ts is excluded by !console/**
  • launcher/model_config.py is excluded by !launcher/**
  • launcher/tests/unit/test_context_monitor.py is excluded by !launcher/**
  • launcher/tests/unit/test_model_config.py is excluded by !launcher/**
  • launcher/tests/unit/test_tool_redirect.py is excluded by !launcher/**
  • launcher/tests/unit/test_wrapper.py is excluded by !launcher/**
  • pilot/agents/plan-reviewer.md is excluded by !pilot/**
  • pilot/commands/learn.md is excluded by !pilot/**
  • pilot/commands/spec-bugfix-plan.md is excluded by !pilot/**
  • pilot/commands/spec-implement.md is excluded by !pilot/**
  • pilot/commands/spec-plan.md is excluded by !pilot/**
  • pilot/commands/spec-verify.md is excluded by !pilot/**
  • pilot/commands/sync.md is excluded by !pilot/**
  • pilot/hooks/_checkers/go.py is excluded by !pilot/**
  • pilot/hooks/_checkers/python.py is excluded by !pilot/**
  • pilot/hooks/_checkers/tdd.py is excluded by !pilot/**
  • pilot/hooks/_checkers/typescript.py is excluded by !pilot/**
  • pilot/hooks/_lib/__init__.py is excluded by !pilot/**
  • pilot/hooks/_lib/dashboard_notify.py is excluded by !pilot/**
  • pilot/hooks/_lib/util.py is excluded by !pilot/**
  • pilot/hooks/context_monitor.py is excluded by !pilot/**
  • pilot/hooks/file_checker.py is excluded by !pilot/**
  • pilot/hooks/post_compact_restore.py is excluded by !pilot/**
  • pilot/hooks/pre_compact.py is excluded by !pilot/**
  • pilot/hooks/spec_plan_validator.py is excluded by !pilot/**
  • pilot/hooks/spec_stop_guard.py is excluded by !pilot/**
  • pilot/hooks/spec_verify_validator.py is excluded by !pilot/**
  • pilot/hooks/tests/test__util.py is excluded by !pilot/**
  • pilot/hooks/tests/test_dashboard_notify.py is excluded by !pilot/**
  • pilot/hooks/tests/test_tdd_enforcer.py is excluded by !pilot/**
  • pilot/hooks/tests/test_tool_redirect.py is excluded by !pilot/**
  • pilot/hooks/tool_redirect.py is excluded by !pilot/**
  • pilot/rules/cli-tools.md is excluded by !pilot/**
  • pilot/rules/research-tools.md is excluded by !pilot/**
  • pilot/rules/skill-sharing.md is excluded by !pilot/**
  • pilot/rules/task-and-workflow.md is excluded by !pilot/**
  • pilot/rules/team-sharing.md is excluded by !pilot/**
  • pilot/scripts/worker-service.cjs is excluded by !pilot/**
  • pilot/settings.json is excluded by !pilot/**
  • pilot/ui/viewer-bundle.js is excluded by !pilot/**
  • pilot/ui/viewer.css is excluded by !pilot/**
📒 Files selected for processing (25)
  • README.md
  • docs/site/src/components/ConsoleSection.tsx
  • docs/site/src/components/DeepDiveSection.tsx
  • docs/site/src/components/FAQSection.tsx
  • docs/site/src/components/PricingSection.tsx
  • docs/site/src/components/TeamsDashboardSection.tsx
  • docs/site/src/components/WhatsInside.tsx
  • docs/site/src/content/blog/claude-code-rules-guide.md
  • docs/site/src/content/blog/online-learning-teaching-claude.md
  • docs/site/src/content/blog/team-vault-sharing-ai-assets.md
  • docs/site/src/pages/DocsPage.tsx
  • docs/site/src/pages/Index.tsx
  • docs/site/src/pages/docs/ConsoleSection.tsx
  • docs/site/src/pages/docs/LearnSection.tsx
  • docs/site/src/pages/docs/ModelRoutingSection.tsx
  • docs/site/src/pages/docs/OpenSourceSection.tsx
  • docs/site/src/pages/docs/RulesSection.tsx
  • docs/site/src/pages/docs/TeamsSection.tsx
  • docs/site/vercel.json
  • install.sh
  • installer/steps/config_migration.py
  • installer/steps/dependencies.py
  • installer/tests/unit/steps/test_config_migration.py
  • installer/tests/unit/steps/test_dependencies.py
  • uninstall.sh
💤 Files with no reviewable changes (1)
  • docs/site/src/pages/Index.tsx

Comment on lines +4 to +10
interface Dependency {
name: string;
purpose: string;
license: string;
licenseUrl: string;
repository: string;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Model dual-licensed entries explicitly.

Dependency.licenseUrl only supports one document, but uv and ripgrep are presented as dual-licensed. Right now the compliance table links readers to only one half of the applicable terms, which makes this section incomplete.

Also applies to: 70-75, 91-96

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/site/src/pages/docs/OpenSourceSection.tsx` around lines 4 - 10, The
Dependency type currently models a single license and licenseUrl, which cannot
represent dual-licensed entries like uv and ripgrep; update the interface
(Dependency) to allow multiple licenses (e.g., change license: string and
licenseUrl: string to license: string[] and licenseUrl: string[] or a licenses:
{name:string,url:string}[] field), then update all consumers in
OpenSourceSection.tsx (table row rendering and any helpers around lines
referenced) to iterate the array and render each license name linked to its
corresponding URL (comma/separated or multiple links) so both license terms are
displayed and linked.

README.md Outdated
Comment on lines +210 to +214
| Tier | Feature | License |
|------|---------|---------|
| **All users** | Install skills from URL, sync to Claude, project mode | Solo, Team, Trial |
| **All paid users** | Cross-machine sync via git push/pull | Solo, Team, Trial |
| **Team/Trial** | Organization hub, tracked repos, hub search | Team, Trial only |
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

The tier label conflicts with the license column.

"All paid users" still includes Trial, so this row currently says both "paid" and "trial". That pricing copy is easy to misread.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 210 - 214, The Tier/License table row labeled "**All
paid users**" conflicts with the License column that still lists "Trial"; update
the table so the tier and license are consistent—either change the tier text
(e.g., "**Paid users (excluding Trial)**" or "**Paid subscribers**") or remove
"Trial" from the License cell for that row so it only lists paid plans (e.g.,
"Solo, Team"); edit the markdown row containing "**All paid users**" to ensure
the tier and license columns do not contradict each other.

…gration, installer cleanup

Dashboard:
- Redesign Git Status card: use lightweight /api/git endpoint with summary stats
  instead of heavy /api/changes/files, add worktree awareness, icons for add/remove
- Add descriptive icons to all dashboard card titles (Git Status, Usage Tracking,
  Specification Status, Worker Status)
- Remove green Online badge from Worker Status (already shown in sidebar)
- Remove Workspace badge from Worker Status for consistency
- Simplify Specification Status empty state: inline quick mode text with /spec
  recommendation, link to Specification and Changes tabs
- Move branding, version, and license info from Topbar to Sidebar footer
- Simplify Topbar to actions-only (theme toggle, notifications, repo link)

Git lock prevention:
- Add GIT_OPTIONAL_LOCKS=0 to gitInfo.ts to prevent lock contention
- Use execFileSync instead of execSync for safety
- Add dedicated GIT_REFRESH_INTERVAL_MS (10s) for Changes view polling,
  separate from SPEC_REFRESH_INTERVAL_MS (5s)

Share system:
- Add ShareAuditSection, ShareHelpSections, ShareSearchModal components
- Expand ShareSkillDetail and ShareSkillsGrid with richer UI
- Update ShareRoutes and ShareTypes with new endpoints
- Update useShare hook with expanded functionality
- Update ShareStatus dashboard card

Documentation:
- Migrate blog from custom React pages to Docusaurus
- Add Docusaurus docs structure (getting-started, features, tools, workflows, reference)
- Remove old React-based blog and docs pages
- Update site build scripts, Vite config, and routing for Docusaurus integration
- Update deploy workflow and Netlify/Vercel config

Installer:
- Remove devcontainer setup flow (simplify install.sh)
- Remove container detection utility
- Update dependencies step and related tests
- Update prerequisites and finalize steps

Other:
- Update learn and sync commands
- Update skill-sharing rules for Skillshare system
- Update pilot settings and claude.json
- Update README
@claude
Copy link

claude bot commented Mar 11, 2026

Claude finished @maxritter's task in 2m 49s —— View job


Incremental Code Review

  • Gather context and understand PR scope
  • Review non-encrypted files changed in latest push
  • Check for new issues vs resolved issues from prior review
  • Post incremental review findings

This review covers the delta introduced by commit 73e85c0. Console, launcher, and docs/site/api paths are encrypted and skipped. No new bugs were introduced in the reviewable files.

✅ Resolved by this push

1. Missing share.png asset [docs/site/src/components/TeamsDashboardSection.tsx:58]

TeamsDashboardSection.tsx now references /console/teams.png (reverted from share.png). The broken image on the docs site is fixed.

2. README.md still documented tdd_enforcer.py [README.md hooks table]

The PostToolUse hook row now reads file_checker.py (TDD) instead of the deleted tdd_enforcer.py. Accurate.

3. Blog post TDD path reference [docs/docusaurus/blog/2026-02-12-tdd-with-claude-code.md]

The Docusaurus migration of the TDD blog post correctly uses file_checker.py throughout. The old React-based blog in docs/site/src/content/blog/ that held the stale tdd_enforcer.py path is gone.


New Issues

No new bugs or regressions found in the non-encrypted files changed by this push (.github/workflows/, README.md, docs/docusaurus/blog/, docs/docusaurus/.gitignore).

Minor observation: README.md:295–305 — the Model Routing table still documents Plan Verification and Spec Review phases as if they run unconditionally ("validates completeness and challenges assumptions on every feature spec"), but config migration v3 (introduced in the first commit) disables both by default. The table could add a "(disabled by default)" note to avoid user confusion when they observe that these phases don't run out of the box. Fix this →


Still Open (from prior review — no details repeated)

  • README.md:207 — "All paid users" tier but License column lists Solo, Team, Trial (Trial is not "paid")
  • README.md:157Share listed as a command in "Other Commands" table; implies a non-existent /share command
  • docs/site/vercel.json — CSP frame-ancestors missing https://localhost:*; X-Frame-Options removed entirely
  • installer/steps/dependencies.pycurl | sh without integrity check; echo y | pipe fragility; silent collect/sync failures; import logging inside function body
  • installer/steps/config_migration.pyos.renameos.replace for cross-platform atomicity; _migration_v3 leaves specReviewer unset when dict exists with only planReviewer
  • docs/site/src/components/TeamsDashboardSection.tsx — section id="teams" not updated to id="share"
  • docs/site/src/pages/docs/ModelRoutingSection.tsx — plan-reviewer/spec-reviewer not marked default-off
  • docs/site/src/pages/docs/LearnSection.tsx.claude/skills/ path omits Share-enabled project path (.skillshare/skills/)
  • docs/site/src/pages/docs/OpenSourceSection.tsxDependency type can't model dual-licensed entries (uv, ripgrep)
  • docs/site/src/content/blog/team-vault-sharing-ai-assets.mdgit clone github.com/team/my-project missing URL scheme

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant