Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Changelog

## [1.17.0.1] - 2026-04-28

## **Codex installs can find the runtime tools again.**

Codex-host skill docs now treat `GSTACK_BROWSE`, `GSTACK_DESIGN`, and `GSTACK_MAKE_PDF` as absolute runtime roots instead of prefixing them with `$HOME`. The old generated fallback produced paths like `/Users/name/Users/name/gstack/...`, which made installed skills report false `NEEDS_SETUP`, `DESIGN_NOT_AVAILABLE`, or `MAKE_PDF_NOT_AVAILABLE` even when the binaries existed.

`./setup --host codex` also links `design/dist` and `make-pdf/dist` into both the repo-local sidecar and `~/.codex/skills/gstack`, matching what generated preambles already export. Office Hours, browse, design, and make-pdf now resolve from a fresh Codex setup without hand-fixing symlinks.

### Verification

- `./setup --host codex`
- `bun test test/host-config.test.ts test/gen-skill-docs.test.ts`
- `bun run test`

## [1.17.0.0] - 2026-04-26

## **Your gstack memory now actually lives in gbrain.**
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.17.0.0
1.17.0.1
4 changes: 2 additions & 2 deletions hosts/codex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,14 @@ const codex: HostConfig = {
],

runtimeRoot: {
globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'gstack-upgrade', 'ETHOS.md'],
globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'design/dist', 'make-pdf/dist', 'gstack-upgrade', 'ETHOS.md'],
globalFiles: {
'review': ['checklist.md', 'TODOS-format.md'],
},
},
sidecar: {
path: '.agents/skills/gstack',
symlinks: ['bin', 'browse', 'review', 'qa', 'ETHOS.md'],
symlinks: ['bin', 'browse', 'design', 'make-pdf', 'review', 'qa', 'ETHOS.md'],
},

install: {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "gstack",
"version": "1.17.0.0",
"version": "1.17.0.1",
"description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.",
"license": "MIT",
"type": "module",
Expand Down
4 changes: 3 additions & 1 deletion scripts/resolvers/browse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,15 @@ export function generateSnapshotFlags(_ctx: TemplateContext): string {
}

export function generateBrowseSetup(ctx: TemplateContext): string {
const browseFallback = `${ctx.paths.browseDir.replace(/^~/, '$HOME')}/browse`;

return `## SETUP (run this check BEFORE any browse command)

\`\`\`bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/${ctx.paths.localSkillRoot}/browse/dist/browse" ] && B="$_ROOT/${ctx.paths.localSkillRoot}/browse/dist/browse"
[ -z "$B" ] && B="$HOME${ctx.paths.browseDir.replace(/^~/, '')}/browse"
[ -z "$B" ] && B="${browseFallback}"
if [ -x "$B" ]; then
echo "READY: $B"
else
Expand Down
12 changes: 8 additions & 4 deletions scripts/resolvers/design.ts
Original file line number Diff line number Diff line change
Expand Up @@ -786,21 +786,24 @@ Source: [OpenAI "Designing Delightful Frontends with GPT-5.4"](https://developer
}

export function generateDesignSetup(ctx: TemplateContext): string {
const designFallback = `${ctx.paths.designDir.replace(/^~/, '$HOME')}/design`;
const browseFallback = `${ctx.paths.browseDir.replace(/^~/, '$HOME')}/browse`;

return `## DESIGN SETUP (run this check BEFORE any design mockup command)

\`\`\`bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
D=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/${ctx.paths.localSkillRoot}/design/dist/design" ] && D="$_ROOT/${ctx.paths.localSkillRoot}/design/dist/design"
[ -z "$D" ] && D="$HOME${ctx.paths.designDir.replace(/^~/, '')}/design"
[ -z "$D" ] && D="${designFallback}"
if [ -x "$D" ]; then
echo "DESIGN_READY: $D"
else
echo "DESIGN_NOT_AVAILABLE"
fi
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/${ctx.paths.localSkillRoot}/browse/dist/browse" ] && B="$_ROOT/${ctx.paths.localSkillRoot}/browse/dist/browse"
[ -z "$B" ] && B="$HOME${ctx.paths.browseDir.replace(/^~/, '')}/browse"
[ -z "$B" ] && B="${browseFallback}"
if [ -x "$B" ]; then
echo "BROWSE_READY: $B"
else
Expand Down Expand Up @@ -831,13 +834,15 @@ data, not project files. They persist across branches, conversations, and worksp
}

export function generateDesignMockup(ctx: TemplateContext): string {
const designFallback = `${ctx.paths.designDir.replace(/^~/, '$HOME')}/design`;

return `## Visual Design Exploration

\`\`\`bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
D=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/${ctx.paths.localSkillRoot}/design/dist/design" ] && D="$_ROOT/${ctx.paths.localSkillRoot}/design/dist/design"
[ -z "$D" ] && D="$HOME${ctx.paths.designDir.replace(/^~/, '')}/design"
[ -z "$D" ] && D="${designFallback}"
[ -x "$D" ] && echo "DESIGN_READY" || echo "DESIGN_NOT_AVAILABLE"
\`\`\`

Expand Down Expand Up @@ -1139,4 +1144,3 @@ Flat design can strip away useful visual information that signals interactivity.
Prioritize ruthlessly: things needed in a hurry go close at hand, everything
else a few taps away with an obvious path to get there.`;
}

4 changes: 3 additions & 1 deletion scripts/resolvers/make-pdf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@ import type { TemplateContext } from './types';
* 3. Env override (MAKE_PDF_BIN) — for contributor dev builds
*/
export function generateMakePdfSetup(ctx: TemplateContext): string {
const makePdfFallback = `${ctx.paths.makePdfDir.replace(/^~/, '$HOME')}/pdf`;

return `## MAKE-PDF SETUP (run this check BEFORE any make-pdf command)

\`\`\`bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
P=""
[ -n "$MAKE_PDF_BIN" ] && [ -x "$MAKE_PDF_BIN" ] && P="$MAKE_PDF_BIN"
[ -z "$P" ] && [ -n "$_ROOT" ] && [ -x "$_ROOT/${ctx.paths.localSkillRoot}/make-pdf/dist/pdf" ] && P="$_ROOT/${ctx.paths.localSkillRoot}/make-pdf/dist/pdf"
[ -z "$P" ] && P="$HOME${ctx.paths.makePdfDir.replace(/^~/, '')}/pdf"
[ -z "$P" ] && P="${makePdfFallback}"
if [ -x "$P" ]; then
echo "MAKE_PDF_READY: $P"
alias _p_="$P" # shellcheck alias helper (not exported)
Expand Down
1 change: 1 addition & 0 deletions scripts/resolvers/preamble/generate-preamble-bash.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ GSTACK_ROOT="$HOME/${hostConfig.globalRoot}"
GSTACK_BIN="$GSTACK_ROOT/bin"
GSTACK_BROWSE="$GSTACK_ROOT/browse/dist"
GSTACK_DESIGN="$GSTACK_ROOT/design/dist"
GSTACK_MAKE_PDF="$GSTACK_ROOT/make-pdf/dist"
`
: '';

Expand Down
10 changes: 8 additions & 2 deletions setup
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,7 @@ create_agents_sidecar() {
mkdir -p "$agents_gstack"

# Sidecar directories that skills reference at runtime
for asset in bin browse review qa; do
for asset in bin browse design make-pdf review qa; do
local src="$SOURCE_GSTACK_DIR/$asset"
local dst="$agents_gstack/$asset"
if [ -d "$src" ] || [ -f "$src" ]; then
Expand Down Expand Up @@ -579,7 +579,7 @@ create_codex_runtime_root() {
rm -rf "$codex_gstack"
fi

mkdir -p "$codex_gstack" "$codex_gstack/browse" "$codex_gstack/gstack-upgrade" "$codex_gstack/review"
mkdir -p "$codex_gstack" "$codex_gstack/browse" "$codex_gstack/design" "$codex_gstack/make-pdf" "$codex_gstack/gstack-upgrade" "$codex_gstack/review"

if [ -f "$agents_dir/gstack/SKILL.md" ]; then
ln -snf "$agents_dir/gstack/SKILL.md" "$codex_gstack/SKILL.md"
Expand All @@ -593,6 +593,12 @@ create_codex_runtime_root() {
if [ -d "$gstack_dir/browse/bin" ]; then
ln -snf "$gstack_dir/browse/bin" "$codex_gstack/browse/bin"
fi
if [ -d "$gstack_dir/design/dist" ]; then
ln -snf "$gstack_dir/design/dist" "$codex_gstack/design/dist"
fi
if [ -d "$gstack_dir/make-pdf/dist" ]; then
ln -snf "$gstack_dir/make-pdf/dist" "$codex_gstack/make-pdf/dist"
fi
if [ -f "$agents_dir/gstack-upgrade/SKILL.md" ]; then
ln -snf "$agents_dir/gstack-upgrade/SKILL.md" "$codex_gstack/gstack-upgrade/SKILL.md"
fi
Expand Down
1 change: 1 addition & 0 deletions test/fixtures/golden/codex-ship-SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ GSTACK_ROOT="$HOME/.codex/skills/gstack"
GSTACK_BIN="$GSTACK_ROOT/bin"
GSTACK_BROWSE="$GSTACK_ROOT/browse/dist"
GSTACK_DESIGN="$GSTACK_ROOT/design/dist"
GSTACK_MAKE_PDF="$GSTACK_ROOT/make-pdf/dist"
_UPD=$($GSTACK_BIN/gstack-update-check 2>/dev/null || .agents/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
mkdir -p ~/.gstack/sessions
Expand Down
1 change: 1 addition & 0 deletions test/fixtures/golden/factory-ship-SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ GSTACK_ROOT="$HOME/.factory/skills/gstack"
GSTACK_BIN="$GSTACK_ROOT/bin"
GSTACK_BROWSE="$GSTACK_ROOT/browse/dist"
GSTACK_DESIGN="$GSTACK_ROOT/design/dist"
GSTACK_MAKE_PDF="$GSTACK_ROOT/make-pdf/dist"
_UPD=$($GSTACK_BIN/gstack-update-check 2>/dev/null || .factory/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
mkdir -p ~/.gstack/sessions
Expand Down