Conversation
…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
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
|
Claude finished @maxritter's task in 2m 42s —— View job Code Review
This is a large, well-structured PR. The Teams→Share/Skillshare migration is consistent across all touchpoints, and the hook reorganization into Bugs1. Missing image asset — broken docs page [
// TeamsDashboardSection.tsx:58
src="/console/share.png" // ❌ file doesn't exist in docs/site/public/console/The directory contains: Stale Documentation2. The hook was renamed to Should be updated to 3. Blog post references deleted file path [ 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 Security / Robustness4. "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 5. Prompt bypass via _run_bash_with_retry("echo y | skillshare collect -g", timeout=30)
_run_bash_with_retry("echo y | skillshare collect -p", timeout=30)Piping 6. CSP // Before
{ "key": "X-Frame-Options", "value": "DENY" }
// After
{ "key": "Content-Security-Policy", "value": "frame-ancestors 'self' http://localhost:*" }Two concerns:
Minor / Code Quality7. def install_skillshare() -> bool:
"""Install Skillshare CLI..."""
import logging # ← should be at module top levelPython imports inside function bodies are valid but unconventional here — 8. If a user has What Looks Good
|
|
Important Review skippedToo many files! This PR contains 187 files, which is 37 over the limit of 150. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (36)
📒 Files selected for processing (187)
You can disable this status message by setting the Use the checkbox below for a quick retry:
WalkthroughThis 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
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
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 | 🟠 MajorCross-platform issue:
os.renamefails on Windows when destination exists.
os.rename()will raiseFileExistsErroron 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 | 🟡 MinorRename 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#sharewill 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 | 🟡 MinorMark reviewer phases as opt-in/default-off.
These rows still read as if
plan-reviewerandspec-reviewerrun 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 | 🟡 MinorClarify 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/learnoutput 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 | 🟡 MinorDon't list
Shareunder “Other Commands”.
/syncand/learnare invokable commands;Sharereads like a third command here even though the PR describes it as a sharing feature/UI. That will send readers looking forShareor/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 fromcollectandsynccommands.The
collectandsynccommands 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 viewsis 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
⛔ Files ignored due to path filters (92)
console/src/services/server/ErrorHandler.tsis excluded by!console/**console/src/services/server/Server.tsis excluded by!console/**console/src/services/server/middleware/auth.tsis excluded by!console/**console/src/services/worker-service.tsis excluded by!console/**console/src/services/worker/http/BaseRouteHandler.tsis excluded by!console/**console/src/services/worker/http/routes/AuthRoutes.tsis excluded by!console/**console/src/services/worker/http/routes/BackupRoutes.tsis excluded by!console/**console/src/services/worker/http/routes/SettingsRoutes.tsis excluded by!console/**console/src/services/worker/http/routes/ShareRoutes.tsis excluded by!console/**console/src/services/worker/http/routes/ShareTypes.tsis excluded by!console/**console/src/services/worker/http/routes/TeamsRoutes.tsis excluded by!console/**console/src/services/worker/http/routes/TeamsTypes.tsis excluded by!console/**console/src/ui/viewer/App.tsxis excluded by!console/**console/src/ui/viewer/components/CommandPalette.tsxis excluded by!console/**console/src/ui/viewer/constants/shortcuts.tsis excluded by!console/**console/src/ui/viewer/hooks/useSettings.tsis excluded by!console/**console/src/ui/viewer/hooks/useShare.tsis excluded by!console/**console/src/ui/viewer/hooks/useStats.tsis excluded by!console/**console/src/ui/viewer/hooks/useTeams.tsis excluded by!console/**console/src/ui/viewer/layouts/Sidebar/SidebarNav.tsxis excluded by!console/**console/src/ui/viewer/views/Dashboard/ShareStatus.tsxis excluded by!console/**console/src/ui/viewer/views/Dashboard/TeamsStatus.tsxis excluded by!console/**console/src/ui/viewer/views/Dashboard/index.tsxis excluded by!console/**console/src/ui/viewer/views/Help/index.tsxis excluded by!console/**console/src/ui/viewer/views/Settings/index.tsxis excluded by!console/**console/src/ui/viewer/views/Share/ShareOnboarding.tsxis excluded by!console/**console/src/ui/viewer/views/Share/ShareSkillDetail.tsxis excluded by!console/**console/src/ui/viewer/views/Share/ShareSkillsGrid.tsxis excluded by!console/**console/src/ui/viewer/views/Share/index.tsxis excluded by!console/**console/src/ui/viewer/views/Spec/SpecSection.tsxis excluded by!console/**console/src/ui/viewer/views/Spec/index.tsxis excluded by!console/**console/src/ui/viewer/views/Teams/TeamsAssetDetail.tsxis excluded by!console/**console/src/ui/viewer/views/Teams/TeamsAssetTable.tsxis excluded by!console/**console/src/ui/viewer/views/Teams/TeamsContentModal.tsxis excluded by!console/**console/src/ui/viewer/views/Teams/TeamsHelpModal.tsxis excluded by!console/**console/src/ui/viewer/views/Teams/TeamsOnboarding.tsxis excluded by!console/**console/src/ui/viewer/views/Teams/TeamsPushPanel.tsxis excluded by!console/**console/src/ui/viewer/views/Teams/TeamsSetupTab.tsxis excluded by!console/**console/src/ui/viewer/views/Teams/TeamsSummaryCards.tsxis excluded by!console/**console/src/ui/viewer/views/Teams/index.tsxis excluded by!console/**console/src/ui/viewer/views/index.tsis excluded by!console/**console/tests/hooks/use-teams.test.tsis excluded by!console/**console/tests/hooks/useSettings.test.tsis excluded by!console/**console/tests/server/error-handler.test.tsis excluded by!console/**console/tests/settings-routes.test.tsis excluded by!console/**console/tests/ui/search-removal.test.tsis excluded by!console/**console/tests/ui/teams-install.test.tsis excluded by!console/**console/tests/ui/teams-navigation.test.tsis excluded by!console/**console/tests/ui/teams-view.test.tsis excluded by!console/**console/tests/ui/views-index.test.tsis excluded by!console/**console/tests/unit/services/worker/ShareRoutes.test.tsis excluded by!console/**console/tests/worker/teams-routes.test.tsis excluded by!console/**launcher/model_config.pyis excluded by!launcher/**launcher/tests/unit/test_context_monitor.pyis excluded by!launcher/**launcher/tests/unit/test_model_config.pyis excluded by!launcher/**launcher/tests/unit/test_tool_redirect.pyis excluded by!launcher/**launcher/tests/unit/test_wrapper.pyis excluded by!launcher/**pilot/agents/plan-reviewer.mdis excluded by!pilot/**pilot/commands/learn.mdis excluded by!pilot/**pilot/commands/spec-bugfix-plan.mdis excluded by!pilot/**pilot/commands/spec-implement.mdis excluded by!pilot/**pilot/commands/spec-plan.mdis excluded by!pilot/**pilot/commands/spec-verify.mdis excluded by!pilot/**pilot/commands/sync.mdis excluded by!pilot/**pilot/hooks/_checkers/go.pyis excluded by!pilot/**pilot/hooks/_checkers/python.pyis excluded by!pilot/**pilot/hooks/_checkers/tdd.pyis excluded by!pilot/**pilot/hooks/_checkers/typescript.pyis excluded by!pilot/**pilot/hooks/_lib/__init__.pyis excluded by!pilot/**pilot/hooks/_lib/dashboard_notify.pyis excluded by!pilot/**pilot/hooks/_lib/util.pyis excluded by!pilot/**pilot/hooks/context_monitor.pyis excluded by!pilot/**pilot/hooks/file_checker.pyis excluded by!pilot/**pilot/hooks/post_compact_restore.pyis excluded by!pilot/**pilot/hooks/pre_compact.pyis excluded by!pilot/**pilot/hooks/spec_plan_validator.pyis excluded by!pilot/**pilot/hooks/spec_stop_guard.pyis excluded by!pilot/**pilot/hooks/spec_verify_validator.pyis excluded by!pilot/**pilot/hooks/tests/test__util.pyis excluded by!pilot/**pilot/hooks/tests/test_dashboard_notify.pyis excluded by!pilot/**pilot/hooks/tests/test_tdd_enforcer.pyis excluded by!pilot/**pilot/hooks/tests/test_tool_redirect.pyis excluded by!pilot/**pilot/hooks/tool_redirect.pyis excluded by!pilot/**pilot/rules/cli-tools.mdis excluded by!pilot/**pilot/rules/research-tools.mdis excluded by!pilot/**pilot/rules/skill-sharing.mdis excluded by!pilot/**pilot/rules/task-and-workflow.mdis excluded by!pilot/**pilot/rules/team-sharing.mdis excluded by!pilot/**pilot/scripts/worker-service.cjsis excluded by!pilot/**pilot/settings.jsonis excluded by!pilot/**pilot/ui/viewer-bundle.jsis excluded by!pilot/**pilot/ui/viewer.cssis excluded by!pilot/**
📒 Files selected for processing (25)
README.mddocs/site/src/components/ConsoleSection.tsxdocs/site/src/components/DeepDiveSection.tsxdocs/site/src/components/FAQSection.tsxdocs/site/src/components/PricingSection.tsxdocs/site/src/components/TeamsDashboardSection.tsxdocs/site/src/components/WhatsInside.tsxdocs/site/src/content/blog/claude-code-rules-guide.mddocs/site/src/content/blog/online-learning-teaching-claude.mddocs/site/src/content/blog/team-vault-sharing-ai-assets.mddocs/site/src/pages/DocsPage.tsxdocs/site/src/pages/Index.tsxdocs/site/src/pages/docs/ConsoleSection.tsxdocs/site/src/pages/docs/LearnSection.tsxdocs/site/src/pages/docs/ModelRoutingSection.tsxdocs/site/src/pages/docs/OpenSourceSection.tsxdocs/site/src/pages/docs/RulesSection.tsxdocs/site/src/pages/docs/TeamsSection.tsxdocs/site/vercel.jsoninstall.shinstaller/steps/config_migration.pyinstaller/steps/dependencies.pyinstaller/tests/unit/steps/test_config_migration.pyinstaller/tests/unit/steps/test_dependencies.pyuninstall.sh
💤 Files with no reviewable changes (1)
- docs/site/src/pages/Index.tsx
| interface Dependency { | ||
| name: string; | ||
| purpose: string; | ||
| license: string; | ||
| licenseUrl: string; | ||
| repository: string; | ||
| } |
There was a problem hiding this comment.
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
| | 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 | |
There was a problem hiding this comment.
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 finished @maxritter's task in 2m 49s —— View job Incremental Code Review
|

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)
--mode merge), collect, and sync during installationskill-sharing.mdrule — documents three-tier model (global, project, organization).skillshare/skills/when available, with auto-syncSpec Workflow
Hooks
_util.py→_lib/util.py,_dashboard_notify.py→_lib/dashboard_notify.py_checkers/tdd.py(reusable module, no longer standalone hook)tool_redirect.pynow blocks all Agent/sub-agent callsConsole
Docs Site
X-Frame-Options: DENY→Content-Security-Policy: frame-ancestorsTests
Summary by CodeRabbit
Release Notes
New Features
Documentation
Style