Skip to content

Commit 337d60a

Browse files
talvakrunkids
authored andcommitted
fix hook and codex sync edge cases
1 parent da35c93 commit 337d60a

12 files changed

Lines changed: 583 additions & 117 deletions

File tree

cmd/skillshare/doctor.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,6 +1167,12 @@ func checkHooks(sourceRoot, projectRoot string, result *doctorResult) {
11671167
}
11681168
var details []string
11691169
for _, bundle := range bundles {
1170+
if len(bundle.Issues) > 0 {
1171+
for _, issue := range bundle.Issues {
1172+
details = append(details, fmt.Sprintf("%s: %s", bundle.Name, issue))
1173+
}
1174+
continue
1175+
}
11701176
for _, target := range hookpkg.SupportedTargets(bundle) {
11711177
if _, err := os.Stat(hookpkg.RenderRoot(projectRoot, bundle.Name, target)); err != nil {
11721178
details = append(details, fmt.Sprintf("%s: %s hooks not rendered", bundle.Name, target))

cmd/skillshare/hooks.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,14 @@ func cmdHooksList(args []string) error {
5555
}
5656
ui.Header(ui.WithModeLabel("Hooks"))
5757
for _, bundle := range bundles {
58-
ui.Info("%s claude=%d codex=%d", bundle.Name, bundle.Targets["claude"], bundle.Targets["codex"])
58+
summary := fmt.Sprintf("claude=%d codex=%d", bundle.Targets["claude"], bundle.Targets["codex"])
59+
if len(bundle.Issues) > 0 {
60+
summary += fmt.Sprintf(" issues=%d", len(bundle.Issues))
61+
}
62+
ui.Info("%s %s", bundle.Name, summary)
63+
for _, issue := range bundle.Issues {
64+
ui.Info(" %s", issue)
65+
}
5966
}
6067
return nil
6168
}

cmd/skillshare/hooks_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,33 @@ func TestCmdHooksSyncTextShowsWarningsForRenderedBundles(t *testing.T) {
117117
t.Fatalf("expected warning output, got %s", output)
118118
}
119119
}
120+
121+
func TestCmdHooksSyncTextShowsInvalidBundleWarnings(t *testing.T) {
122+
root := t.TempDir()
123+
oldWD, err := os.Getwd()
124+
if err != nil {
125+
t.Fatalf("getwd: %v", err)
126+
}
127+
if err := os.Chdir(root); err != nil {
128+
t.Fatalf("chdir: %v", err)
129+
}
130+
t.Cleanup(func() {
131+
_ = os.Chdir(oldWD)
132+
})
133+
134+
if err := os.MkdirAll(filepath.Join(root, ".skillshare", "hooks", "broken"), 0o755); err != nil {
135+
t.Fatalf("mkdir broken: %v", err)
136+
}
137+
if err := os.WriteFile(filepath.Join(root, ".skillshare", "hooks", "broken", "hook.yaml"), []byte("claude:\n events:\n SessionStart:\n - command: \"{OTHER_ROOT}/scripts/start.sh\"\n"), 0o644); err != nil {
138+
t.Fatalf("write broken hook: %v", err)
139+
}
140+
141+
output := stripANSIWarnings(captureStdout(t, func() {
142+
if err := cmdHooksSync([]string{"-p", "broken", "--target", "all"}); err != nil {
143+
t.Fatalf("cmdHooksSync: %v", err)
144+
}
145+
}))
146+
if !strings.Contains(output, "broken:") || !strings.Contains(output, "hook.yaml") {
147+
t.Fatalf("expected invalid bundle warning output, got %s", output)
148+
}
149+
}

cmd/skillshare/init_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func TestCommitSourceFiles_CommitFailureIsReturned(t *testing.T) {
3636
runGit(t, repo, "init")
3737
runGit(t, repo, "config", "user.email", "test@example.com")
3838
runGit(t, repo, "config", "user.name", "Test User")
39+
runGit(t, repo, "config", "core.hooksPath", filepath.Join(".git", "hooks"))
3940

4041
hookPath := filepath.Join(repo, ".git", "hooks", "pre-commit")
4142
if err := os.WriteFile(hookPath, []byte("#!/bin/sh\nexit 1\n"), 0o755); err != nil {

cmd/skillshare/status.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,14 @@ func cmdStatus(args []string) error {
147147
if bundles, bundleErr := hookpkg.Discover(cfg.EffectiveHooksSource()); bundleErr == nil && len(bundles) > 0 {
148148
ui.Header("Hooks")
149149
for _, bundle := range bundles {
150-
ui.Status(bundle.Name, "hook", fmt.Sprintf("claude=%d codex=%d", bundle.Targets["claude"], bundle.Targets["codex"]))
150+
summary := fmt.Sprintf("claude=%d codex=%d", bundle.Targets["claude"], bundle.Targets["codex"])
151+
if len(bundle.Issues) > 0 {
152+
summary += fmt.Sprintf(" issues=%d", len(bundle.Issues))
153+
}
154+
ui.Status(bundle.Name, "hook", summary)
155+
for _, issue := range bundle.Issues {
156+
ui.Info(" %s", issue)
157+
}
151158
}
152159
}
153160

cmd/skillshare/status_project.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,14 @@ func cmdStatusProject(root string) error {
5959
if bundles, bundleErr := hookpkg.Discover(config.HooksSourceDirProject(root)); bundleErr == nil && len(bundles) > 0 {
6060
ui.Header("Hooks")
6161
for _, bundle := range bundles {
62-
ui.Status(bundle.Name, "hook", fmt.Sprintf("claude=%d codex=%d", bundle.Targets["claude"], bundle.Targets["codex"]))
62+
summary := fmt.Sprintf("claude=%d codex=%d", bundle.Targets["claude"], bundle.Targets["codex"])
63+
if len(bundle.Issues) > 0 {
64+
summary += fmt.Sprintf(" issues=%d", len(bundle.Issues))
65+
}
66+
ui.Status(bundle.Name, "hook", summary)
67+
for _, issue := range bundle.Issues {
68+
ui.Info(" %s", issue)
69+
}
6370
}
6471
}
6572

0 commit comments

Comments
 (0)