From ca1b4a55662d40e12269246fa5eacfa929e853bd Mon Sep 17 00:00:00 2001 From: Arun Kumar Thiagarajan Date: Fri, 27 Mar 2026 10:49:44 +0530 Subject: [PATCH 1/2] fix: use $HOME instead of ~ in preamble bash for Windows compatibility The preamble bash block used bare ~ for all .gstack/ paths: [ -f ~/.gstack/.completeness-intro-seen ] touch ~/.gstack/.completeness-intro-seen mkdir -p ~/.gstack/sessions Tilde expansion is not guaranteed in all Windows shell contexts (Git Bash subshells, MSYS2, CI runners). When ~ doesn't expand, the marker file check always returns false and every skill invocation re-prompts the user to read the "Boil the Lake" essay. Fix: replace all bare ~/.gstack/ paths with "$HOME/.gstack/" in executable bash blocks. Prose/documentation references left as-is. Update the zsh-safe glob test to match the new $HOME path. Fixes #475. Co-Authored-By: Claude Opus 4.6 (1M context) --- scripts/resolvers/preamble.ts | 30 +++++++++++++++--------------- test/gen-skill-docs.test.ts | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/scripts/resolvers/preamble.ts b/scripts/resolvers/preamble.ts index 44126771d..074f36144 100644 --- a/scripts/resolvers/preamble.ts +++ b/scripts/resolvers/preamble.ts @@ -15,13 +15,13 @@ GSTACK_BROWSE="$GSTACK_ROOT/browse/dist" \`\`\`bash ${runtimeRoot}_UPD=$(${ctx.paths.binDir}/gstack-update-check 2>/dev/null || ${ctx.paths.localSkillRoot}/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(${ctx.paths.binDir}/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(${ctx.paths.binDir}/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -29,18 +29,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(${ctx.paths.binDir}/gstack-repo-mode 2>/dev/null) || true REPO_MODE=\${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(${ctx.paths.binDir}/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: \${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"${ctx.skillName}","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"${ctx.skillName}","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ${ctx.paths.binDir}/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ${ctx.paths.binDir}/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done \`\`\``; } @@ -62,7 +62,7 @@ Then offer to open the essay in their default browser: \`\`\`bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" \`\`\` Only run \`open\` if the user says yes. Always run \`touch\` to mark as seen. This only happens once.`; @@ -97,7 +97,7 @@ If B→B: run \`${ctx.paths.binDir}/gstack-config set telemetry off\` Always run: \`\`\`bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" \`\`\` This only happens once. If \`TEL_PROMPTED\` is \`yes\`, skip this entirely.`; @@ -120,7 +120,7 @@ If B: run \`${ctx.paths.binDir}/gstack-config set proactive false\` Always run: \`\`\`bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" \`\`\` This only happens once. If \`PROACTIVE_PROMPTED\` is \`yes\`, skip this entirely.`; @@ -281,7 +281,7 @@ Before building anything unfamiliar, **search first.** See \`${ctx.paths.skillRo **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: \`\`\`bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true \`\`\``; } @@ -348,7 +348,7 @@ Run this bash: \`\`\`bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \\ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \\ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/test/gen-skill-docs.test.ts b/test/gen-skill-docs.test.ts index cab124137..cc2aee863 100644 --- a/test/gen-skill-docs.test.ts +++ b/test/gen-skill-docs.test.ts @@ -258,7 +258,7 @@ describe('gen-skill-docs', () => { // Must NOT have a bare shell glob ".pending-*" outside of find's -name argument expect(content).not.toMatch(/for _PF in [^\n]*\/\.pending-\*/); // Must use find to avoid zsh NOMATCH error on glob expansion - expect(content).toContain("find ~/.gstack/analytics -maxdepth 1 -name '.pending-*'"); + expect(content).toContain("find \"$HOME/.gstack/analytics\" -maxdepth 1 -name '.pending-*'"); } }); From 6cf40e11a38abe9c75cc282798121e8fe3fd6d6c Mon Sep 17 00:00:00 2001 From: Arun Kumar Thiagarajan Date: Fri, 27 Mar 2026 10:50:04 +0530 Subject: [PATCH 2/2] chore: regenerate SKILL.md files with $HOME preamble paths Co-Authored-By: Claude Opus 4.6 (1M context) --- SKILL.md | 28 ++++++++++++++-------------- autoplan/SKILL.md | 30 +++++++++++++++--------------- benchmark/SKILL.md | 28 ++++++++++++++-------------- browse/SKILL.md | 28 ++++++++++++++-------------- canary/SKILL.md | 28 ++++++++++++++-------------- codex/SKILL.md | 30 +++++++++++++++--------------- connect-chrome/SKILL.md | 30 +++++++++++++++--------------- cso/SKILL.md | 28 ++++++++++++++-------------- design-consultation/SKILL.md | 30 +++++++++++++++--------------- design-review/SKILL.md | 30 +++++++++++++++--------------- document-release/SKILL.md | 28 ++++++++++++++-------------- investigate/SKILL.md | 28 ++++++++++++++-------------- land-and-deploy/SKILL.md | 30 +++++++++++++++--------------- office-hours/SKILL.md | 30 +++++++++++++++--------------- plan-ceo-review/SKILL.md | 30 +++++++++++++++--------------- plan-design-review/SKILL.md | 30 +++++++++++++++--------------- plan-eng-review/SKILL.md | 30 +++++++++++++++--------------- qa-only/SKILL.md | 30 +++++++++++++++--------------- qa/SKILL.md | 30 +++++++++++++++--------------- retro/SKILL.md | 28 ++++++++++++++-------------- review/SKILL.md | 30 +++++++++++++++--------------- setup-browser-cookies/SKILL.md | 28 ++++++++++++++-------------- setup-deploy/SKILL.md | 28 ++++++++++++++-------------- ship/SKILL.md | 30 +++++++++++++++--------------- 24 files changed, 350 insertions(+), 350 deletions(-) diff --git a/SKILL.md b/SKILL.md index b3f1ce3d3..570ada937 100644 --- a/SKILL.md +++ b/SKILL.md @@ -21,13 +21,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -35,18 +35,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"gstack","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"gstack","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -64,7 +64,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -97,7 +97,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -118,7 +118,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -183,7 +183,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/autoplan/SKILL.md b/autoplan/SKILL.md index aee5d372e..d3d4a26e8 100644 --- a/autoplan/SKILL.md +++ b/autoplan/SKILL.md @@ -30,13 +30,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -44,18 +44,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"autoplan","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"autoplan","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -73,7 +73,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -106,7 +106,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -127,7 +127,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -174,7 +174,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -237,7 +237,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/benchmark/SKILL.md b/benchmark/SKILL.md index d6d65ae24..2fe4c8f7b 100644 --- a/benchmark/SKILL.md +++ b/benchmark/SKILL.md @@ -23,13 +23,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -37,18 +37,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"benchmark","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"benchmark","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -66,7 +66,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -99,7 +99,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -120,7 +120,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -185,7 +185,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/browse/SKILL.md b/browse/SKILL.md index 399aec3a5..df375b106 100644 --- a/browse/SKILL.md +++ b/browse/SKILL.md @@ -23,13 +23,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -37,18 +37,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"browse","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"browse","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -66,7 +66,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -99,7 +99,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -120,7 +120,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -185,7 +185,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/canary/SKILL.md b/canary/SKILL.md index 08903c711..e2494951f 100644 --- a/canary/SKILL.md +++ b/canary/SKILL.md @@ -23,13 +23,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -37,18 +37,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"canary","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"canary","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -66,7 +66,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -99,7 +99,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -120,7 +120,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -212,7 +212,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/codex/SKILL.md b/codex/SKILL.md index ec9eea7c5..e89c3c216 100644 --- a/codex/SKILL.md +++ b/codex/SKILL.md @@ -24,13 +24,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -38,18 +38,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"codex","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"codex","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -67,7 +67,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -100,7 +100,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -121,7 +121,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -168,7 +168,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -231,7 +231,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/connect-chrome/SKILL.md b/connect-chrome/SKILL.md index c1879b610..6a216e6f0 100644 --- a/connect-chrome/SKILL.md +++ b/connect-chrome/SKILL.md @@ -21,13 +21,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -35,18 +35,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"connect-chrome","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"connect-chrome","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -64,7 +64,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -97,7 +97,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -118,7 +118,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -165,7 +165,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -228,7 +228,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/cso/SKILL.md b/cso/SKILL.md index 3f092fd64..8ce65a1e5 100644 --- a/cso/SKILL.md +++ b/cso/SKILL.md @@ -27,13 +27,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -41,18 +41,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"cso","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"cso","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -70,7 +70,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -103,7 +103,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -124,7 +124,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -216,7 +216,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/design-consultation/SKILL.md b/design-consultation/SKILL.md index 68cdd3467..f7fa90719 100644 --- a/design-consultation/SKILL.md +++ b/design-consultation/SKILL.md @@ -28,13 +28,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -42,18 +42,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"design-consultation","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"design-consultation","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -71,7 +71,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -104,7 +104,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -125,7 +125,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -172,7 +172,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -235,7 +235,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/design-review/SKILL.md b/design-review/SKILL.md index e539b337b..ac38b461e 100644 --- a/design-review/SKILL.md +++ b/design-review/SKILL.md @@ -28,13 +28,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -42,18 +42,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"design-review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"design-review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -71,7 +71,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -104,7 +104,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -125,7 +125,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -172,7 +172,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -235,7 +235,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/document-release/SKILL.md b/document-release/SKILL.md index ee08867a1..6899b875d 100644 --- a/document-release/SKILL.md +++ b/document-release/SKILL.md @@ -25,13 +25,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -39,18 +39,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"document-release","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"document-release","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -68,7 +68,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -101,7 +101,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -122,7 +122,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -214,7 +214,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/investigate/SKILL.md b/investigate/SKILL.md index 4d1cb933e..56c58d25f 100644 --- a/investigate/SKILL.md +++ b/investigate/SKILL.md @@ -39,13 +39,13 @@ hooks: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -53,18 +53,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"investigate","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"investigate","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -82,7 +82,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -115,7 +115,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -136,7 +136,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -228,7 +228,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/land-and-deploy/SKILL.md b/land-and-deploy/SKILL.md index d5f2c8d64..6c6151c2c 100644 --- a/land-and-deploy/SKILL.md +++ b/land-and-deploy/SKILL.md @@ -22,13 +22,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -36,18 +36,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"land-and-deploy","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"land-and-deploy","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -65,7 +65,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -98,7 +98,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -119,7 +119,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -166,7 +166,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -229,7 +229,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/office-hours/SKILL.md b/office-hours/SKILL.md index 9e2debd43..4040e114b 100644 --- a/office-hours/SKILL.md +++ b/office-hours/SKILL.md @@ -30,13 +30,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -44,18 +44,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"office-hours","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"office-hours","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -73,7 +73,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -106,7 +106,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -127,7 +127,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -174,7 +174,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -237,7 +237,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/plan-ceo-review/SKILL.md b/plan-ceo-review/SKILL.md index c092ebc15..9c1ea8c8d 100644 --- a/plan-ceo-review/SKILL.md +++ b/plan-ceo-review/SKILL.md @@ -28,13 +28,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -42,18 +42,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"plan-ceo-review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"plan-ceo-review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -71,7 +71,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -104,7 +104,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -125,7 +125,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -172,7 +172,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -235,7 +235,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/plan-design-review/SKILL.md b/plan-design-review/SKILL.md index 3ff7d9f87..82700f63b 100644 --- a/plan-design-review/SKILL.md +++ b/plan-design-review/SKILL.md @@ -26,13 +26,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -40,18 +40,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"plan-design-review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"plan-design-review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -69,7 +69,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -102,7 +102,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -123,7 +123,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -170,7 +170,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -233,7 +233,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/plan-eng-review/SKILL.md b/plan-eng-review/SKILL.md index 5b57c16f6..f9c731545 100644 --- a/plan-eng-review/SKILL.md +++ b/plan-eng-review/SKILL.md @@ -27,13 +27,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -41,18 +41,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"plan-eng-review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"plan-eng-review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -70,7 +70,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -103,7 +103,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -124,7 +124,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -171,7 +171,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -234,7 +234,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/qa-only/SKILL.md b/qa-only/SKILL.md index 1129d52af..4ca400cdb 100644 --- a/qa-only/SKILL.md +++ b/qa-only/SKILL.md @@ -23,13 +23,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -37,18 +37,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"qa-only","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"qa-only","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -66,7 +66,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -99,7 +99,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -120,7 +120,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -167,7 +167,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -230,7 +230,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/qa/SKILL.md b/qa/SKILL.md index a92412381..6b2627603 100644 --- a/qa/SKILL.md +++ b/qa/SKILL.md @@ -29,13 +29,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -43,18 +43,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"qa","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"qa","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -72,7 +72,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -105,7 +105,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -126,7 +126,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -173,7 +173,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -236,7 +236,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/retro/SKILL.md b/retro/SKILL.md index 8741fb30b..7b7d91d4f 100644 --- a/retro/SKILL.md +++ b/retro/SKILL.md @@ -23,13 +23,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -37,18 +37,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"retro","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"retro","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -66,7 +66,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -99,7 +99,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -120,7 +120,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -212,7 +212,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/review/SKILL.md b/review/SKILL.md index 8a074573d..4f577ec14 100644 --- a/review/SKILL.md +++ b/review/SKILL.md @@ -26,13 +26,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -40,18 +40,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -69,7 +69,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -102,7 +102,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -123,7 +123,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -170,7 +170,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -233,7 +233,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/setup-browser-cookies/SKILL.md b/setup-browser-cookies/SKILL.md index 523a533a4..f577c8e2f 100644 --- a/setup-browser-cookies/SKILL.md +++ b/setup-browser-cookies/SKILL.md @@ -20,13 +20,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -34,18 +34,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"setup-browser-cookies","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"setup-browser-cookies","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -63,7 +63,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -96,7 +96,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -117,7 +117,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -182,7 +182,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/setup-deploy/SKILL.md b/setup-deploy/SKILL.md index e5c942787..ef3506295 100644 --- a/setup-deploy/SKILL.md +++ b/setup-deploy/SKILL.md @@ -26,13 +26,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -40,18 +40,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"setup-deploy","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"setup-deploy","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -69,7 +69,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -102,7 +102,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -123,7 +123,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -215,7 +215,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & diff --git a/ship/SKILL.md b/ship/SKILL.md index a3e0b3256..dd6445487 100644 --- a/ship/SKILL.md +++ b/ship/SKILL.md @@ -24,13 +24,13 @@ allowed-tools: ```bash _UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) [ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p ~/.gstack/sessions -touch ~/.gstack/sessions/"$PPID" -_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +mkdir -p "$HOME/.gstack/sessions" +touch "$HOME/.gstack/sessions/$PPID" +_SESSIONS=$(find "$HOME/.gstack/sessions" -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find "$HOME/.gstack/sessions" -mmin +120 -type f -delete 2>/dev/null || true _CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) _PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_PROACTIVE_PROMPTED=$([ -f "$HOME/.gstack/.proactive-prompted" ] && echo "yes" || echo "no") _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "BRANCH: $_BRANCH" echo "PROACTIVE: $_PROACTIVE" @@ -38,18 +38,18 @@ echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true REPO_MODE=${REPO_MODE:-unknown} echo "REPO_MODE: $REPO_MODE" -_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +_LAKE_SEEN=$([ -f "$HOME/.gstack/.completeness-intro-seen" ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_PROMPTED=$([ -f "$HOME/.gstack/.telemetry-prompted" ] && echo "yes" || echo "no") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" echo "TELEMETRY: ${_TEL:-off}" echo "TEL_PROMPTED: $_TEL_PROMPTED" -mkdir -p ~/.gstack/analytics -echo '{"skill":"ship","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +mkdir -p "$HOME/.gstack/analytics" +echo '{"skill":"ship","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$HOME/.gstack/analytics/skill-usage.jsonl" 2>/dev/null || true # zsh-compatible: use find instead of glob to avoid NOMATCH error -for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done +for _PF in $(find "$HOME/.gstack/analytics" -maxdepth 1 -name '.pending-*' 2>/dev/null); do [ -f "$_PF" ] && ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true; break; done ``` If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not @@ -67,7 +67,7 @@ Then offer to open the essay in their default browser: ```bash open https://garryslist.org/posts/boil-the-ocean -touch ~/.gstack/.completeness-intro-seen +touch "$HOME/.gstack/.completeness-intro-seen" ``` Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once. @@ -100,7 +100,7 @@ If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` Always run: ```bash -touch ~/.gstack/.telemetry-prompted +touch "$HOME/.gstack/.telemetry-prompted" ``` This only happens once. If `TEL_PROMPTED` is `yes`, skip this entirely. @@ -121,7 +121,7 @@ If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` Always run: ```bash -touch ~/.gstack/.proactive-prompted +touch "$HOME/.gstack/.proactive-prompted" ``` This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely. @@ -168,7 +168,7 @@ Before building anything unfamiliar, **search first.** See `~/.claude/skills/gst **Eureka:** When first-principles reasoning contradicts conventional wisdom, name it and log: ```bash -jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> ~/.gstack/analytics/eureka.jsonl 2>/dev/null || true +jq -n --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg skill "SKILL_NAME" --arg branch "$(git branch --show-current 2>/dev/null)" --arg insight "ONE_LINE_SUMMARY" '{ts:$ts,skill:$skill,branch:$branch,insight:$insight}' >> "$HOME/.gstack/analytics/eureka.jsonl" 2>/dev/null || true ``` ## Contributor Mode @@ -231,7 +231,7 @@ Run this bash: ```bash _TEL_END=$(date +%s) _TEL_DUR=$(( _TEL_END - _TEL_START )) -rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true +rm -f "$HOME/.gstack/analytics/.pending-$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null &