Skip to content
Merged
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
2 changes: 1 addition & 1 deletion .beads/sync-state.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
"backoff_until": "2026-02-18T13:24:56.681725408Z",
"needs_manual_sync": true,
"failure_reason": "failed to get current branch: exit status 128"
}
}
2 changes: 1 addition & 1 deletion .claude/commands/fix-github-issue.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ Follow these steps:
7. Create a descriptive commit message
8. Push and create a PR

Remember to use the GitHub CLI (`gh`) for all GitHub-related tasks.
Remember to use the GitHub CLI (`gh`) for all GitHub-related tasks.
2 changes: 1 addition & 1 deletion .claude/settings.local.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,4 @@
"mcp-graphql",
"context7"
]
}
}
2 changes: 1 addition & 1 deletion .github/renovate.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@
"schedule": ["every weekend after 4am"]
}
]
}
}
5 changes: 2 additions & 3 deletions .github/workflows/claude-code-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ jobs:
# github.event.pull_request.user.login == 'external-contributor' ||
# github.event.pull_request.user.login == 'new-developer' ||
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'

runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write

steps:
- name: Checkout repository
uses: actions/checkout@v4
Expand All @@ -40,4 +40,3 @@ jobs:
plugins: 'code-review@claude-code-plugins'
prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'
claude_args: '--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"'

4 changes: 2 additions & 2 deletions .github/workflows/claude-dispatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
pull-requests: write
issues: write
id-token: write
steps:
Expand All @@ -31,7 +31,7 @@ jobs:
uses: anthropics/claude-code-action@eap
with:
mode: 'remote-agent'

# Optional: Specify an API key, otherwise we'll use your Claude account automatically
# anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/claude.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}

# This is an optional setting that allows Claude to read CI results on PRs
additional_permissions: |
actions: read
Expand All @@ -47,4 +47,3 @@ jobs:
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://docs.claude.com/en/docs/claude-code/sdk#command-line for available options
# claude_args: '--model claude-opus-4-1-20250805 --allowed-tools Bash(gh pr:*)'

39 changes: 39 additions & 0 deletions .github/workflows/prek.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Prek

on:
push:
branches: [main]
pull_request:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
determine-runner:
runs-on: ubuntu-latest
outputs:
runner: ${{ steps.runner.outputs.use-runner }}
steps:
- name: Determine runner
id: runner
uses: mikehardy/runner-fallback-action@v1
with:
github-token: ${{ secrets.GH_RUNNER_TOKEN }}
primary-runner: self-hosted-16-cores
fallback-runner: ubuntu-latest
organization: fuww
fallback-on-error: true

prek:
runs-on: ${{ fromJson(needs.determine-runner.outputs.runner) }}
needs: [determine-runner]
steps:
- uses: actions/checkout@v4
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
- name: Run prek checks
run: nix develop --command prek run --all-files
2 changes: 1 addition & 1 deletion .idx/dev.nix
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,4 @@
};
};
};
}
}
2 changes: 1 addition & 1 deletion .idx/integrations.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"cloud_run_deploy": {}
}
}
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@
".cache": true,
"retool.config.json": true
}
}
}
8 changes: 4 additions & 4 deletions PROMPT_plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
- For each epic, verify child tasks cover all aspects of the specification
- Check for missing dependencies using `bd dep cycles` (should be empty)
- Identify any tasks that should block others but don't

2. Update the beads database to fix any issues found:
- Create missing tasks with `bd create "title" -t task -p <priority> -d "description"`
- Add missing dependencies with `bd dep add <child> <parent> --type blocks`
Expand All @@ -20,8 +20,8 @@
- `bd blocked` should show tasks waiting on dependencies
- `bd stats` should show accurate counts

IMPORTANT: Plan only. Do NOT implement anything. Do NOT assume functionality is missing;
IMPORTANT: Plan only. Do NOT implement anything. Do NOT assume functionality is missing;
use `bd list` and code search to verify first.

ULTIMATE GOAL: We want to achieve [project-specific goal]. Ensure all necessary tasks
exist as beads with proper dependencies so `bd ready` always shows the right next work.
ULTIMATE GOAL: We want to achieve [project-specific goal]. Ensure all necessary tasks
exist as beads with proper dependencies so `bd ready` always shows the right next work.
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,4 +102,3 @@ review_max_revisions = 3
- [The Ralph Wiggum Technique](https://ghuntley.com/ralph/) — Geoffrey Huntley's original post
- [how-to-ralph-wiggum](https://github.com/ghuntley/how-to-ralph-wiggum) — Reference implementation and methodology guide
- [Inventing the Ralph Wiggum Loop](https://devinterrupted.substack.com/p/inventing-the-ralph-wiggum-loop-creator) — Dev Interrupted podcast interview

2 changes: 1 addition & 1 deletion astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,4 @@ export default defineConfig({
adapter: node({
mode: "standalone"
})
});
});
2 changes: 1 addition & 1 deletion components.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@
"lib": "@/lib",
"hooks": "@/hooks"
}
}
}
102 changes: 81 additions & 21 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -1,44 +1,104 @@
{
description = "FashionUnited Developer Portal development environment";

# Flake inputs
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs?ref=nixos-unstable";
};

# Flake outputs
outputs = { self, nixpkgs }:
let
# Systems supported
allSystems = [
"x86_64-linux" # 64-bit Intel/AMD Linux
"aarch64-linux" # 64-bit ARM Linux
"x86_64-darwin" # 64-bit Intel macOS
"aarch64-darwin" # 64-bit ARM macOS
"x86_64-linux"
"aarch64-linux"
"x86_64-darwin"
"aarch64-darwin"
];

# Helper to provide system-specific attributes
forAllSystems = f: nixpkgs.lib.genAttrs allSystems (system: f {
inherit system;
pkgs = import nixpkgs { inherit system; };
});

beadsRustVersion = "0.1.19";
beadsRustHashes = {
"x86_64-linux" = "sha256-rL0PabvZxOLr+iOmZfmpB2tgoCxc/CQLVDFB8NRWHYY=";
"x86_64-darwin" = "sha256-98srAx9fRr7NDbzVjIs4za7KONicVgPkZEimSaZ85/w=";
"aarch64-darwin" = "sha256-p8cZ6+c4LUSMU1Cvz+lus6NfYYTWFilCD2Jt2G+PGSg=";
};
beadsRustTargets = {
"x86_64-linux" = "linux_amd64";
"x86_64-darwin" = "darwin_amd64";
"aarch64-darwin" = "darwin_arm64";
};

prekVersion = "0.3.3";
prekHashes = {
"x86_64-linux" = "sha256-RPYzZ6h/zqvoYrByNARmRc4SFAix7Y6nquANClQMonE=";
"x86_64-darwin" = "sha256-C2VVXSvSrdaySh8r5Rz+5tDIN4klYLrywhY72vr+0zg=";
"aarch64-linux" = "sha256-hckriLkcvhVIouYWMq8ASgnH8rtHXANzy7DFI6hI4gQ=";
"aarch64-darwin" = "sha256-EsHigdTUhOqm1QKATGqMd6sG8f3SLF/UbAL4euXzwa8=";
};
prekTargets = {
"x86_64-linux" = "x86_64-unknown-linux-gnu";
"x86_64-darwin" = "x86_64-apple-darwin";
"aarch64-linux" = "aarch64-unknown-linux-gnu";
"aarch64-darwin" = "aarch64-apple-darwin";
};
in
{
# Development environment output
devShells = forAllSystems ({ pkgs }: {
devShells = forAllSystems ({ pkgs, system }: let
beads-rust = pkgs.stdenv.mkDerivation {
pname = "beads-rust";
version = beadsRustVersion;
src = pkgs.fetchurl {
url = "https://github.com/Dicklesworthstone/beads_rust/releases/download/v${beadsRustVersion}/br-v${beadsRustVersion}-${beadsRustTargets.${system}}.tar.gz";
hash = beadsRustHashes.${system};
};
sourceRoot = ".";
installPhase = ''
mkdir -p $out/bin
cp br $out/bin/
chmod +x $out/bin/br
'';
meta = {
description = "AI-supervised issue tracker (Rust rewrite)";
homepage = "https://github.com/Dicklesworthstone/beads_rust";
license = pkgs.lib.licenses.mit;
};
};

prek = pkgs.stdenv.mkDerivation {
pname = "prek";
version = prekVersion;
src = pkgs.fetchurl {
url = "https://github.com/j178/prek/releases/download/v${prekVersion}/prek-${prekTargets.${system}}.tar.gz";
hash = prekHashes.${system};
};
sourceRoot = ".";
installPhase = ''
mkdir -p $out/bin
cp prek-${prekTargets.${system}}/prek $out/bin/
chmod +x $out/bin/prek
'';
meta = {
description = "Better pre-commit, re-engineered in Rust";
homepage = "https://github.com/j178/prek";
license = pkgs.lib.licenses.mit;
};
};
in {
default = pkgs.mkShell {
# The Nix packages provided in the environment
packages = with pkgs; [
bun
nixpkgs-fmt
go
];
packages = [
prek
] ++ pkgs.lib.optional (builtins.hasAttr system beadsRustHashes) beads-rust
++ (with pkgs; [
bun
nixpkgs-fmt
]);

shellHook = ''
if ! command -v bd &> /dev/null; then
echo "Installing beads (bd) for AI agent task tracking..."
go install github.com/steveyegge/beads/cmd/bd@latest
fi
echo " Beads: $(bd --version 2>/dev/null || echo 'run: go install github.com/steveyegge/beads/cmd/bd@latest')"
prek install
echo " Beads: $(br --version 2>/dev/null || echo 'not available on this platform')"
Comment on lines 99 to +101

Choose a reason for hiding this comment

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

P1 Badge Provide bd command in Nix shell

This shell setup no longer installs or exposes bd, and now only checks br, but repo automation still requires bd (for example loop.sh’s beads_check exits when command -v bd fails at lines 534-536). In a clean nix develop environment, core task-tracking workflows now fail immediately unless contributors manually install bd outside the declared dev shell.

Useful? React with 👍 / 👎.

'';
};
});
Expand Down
25 changes: 25 additions & 0 deletions prek.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Pre-commit file checks (builtin Rust hooks — zero network, instant startup)
[[repos]]
repo = "builtin"
hooks = [
{ id = "trailing-whitespace" },
{ id = "end-of-file-fixer" },
{ id = "check-yaml" },
{ id = "check-json", exclude = "devcontainer\\.json$" },
{ id = "check-merge-conflict" },
{ id = "detect-private-key" },
{ id = "check-added-large-files", args = ["--maxkb=500"] },
]

# Commit message validation (local shell hooks)
[[repos]]
repo = "local"
hooks = [
{ id = "capitalized-subject", name = "Capitalized subject", language = "system", entry = "sh -c 'head -1 \"$1\" | grep -q \"^[A-Z]\" || { echo \"Commit subject must start with a capital letter\"; exit 1; }' --", stages = ["commit-msg"] },
{ id = "subject-max-length", name = "Subject max 50 chars", language = "system", entry = "sh -c 'len=$(head -1 \"$1\" | wc -m); [ \"$len\" -le 51 ] || { echo \"Commit subject too long ($len chars, max 50)\"; exit 1; }' --", stages = ["commit-msg"] },
{ id = "body-max-length", name = "Body lines max 72 chars", language = "system", entry = "sh -c 'grep -v \"^#\" \"$1\" | tail -n +3 | awk \"length > 72 { print NR\\\": \\\"\\$0; found=1 } END { if (found) { print \\\"Body lines must be 72 chars or less\\\"; exit 1 } }\"' --", stages = ["commit-msg"] },
{ id = "no-trailing-period", name = "No trailing period", language = "system", entry = "sh -c 'head -1 \"$1\" | grep -q \"\\\\.$\" && { echo \"Commit subject must not end with a period\"; exit 1; } || true' --", stages = ["commit-msg"] },
{ id = "github-issue-ref", name = "GitHub issue reference", language = "system", entry = "sh -c 'head -1 \"$1\" | grep -q \"#[0-9]\" || { echo \"Commit subject must reference a GitHub issue (e.g. #123)\"; exit 1; }' --", stages = ["commit-msg"] },

Choose a reason for hiding this comment

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

P2 Badge Allow documented Beads IDs in commit subject rule

This check hard-requires #[0-9] in every commit subject, but the repository guidance requires Beads IDs in commit messages (for example Fix bug (bd-abc)). With hooks installed, commits that follow the documented Beads format are rejected during commit-msg, which creates a workflow-breaking mismatch between the enforced hook and the project’s stated commit convention.

Useful? React with 👍 / 👎.

{ id = "max-message-length", name = "Max 500 chars total", language = "system", entry = "sh -c 'chars=$(wc -c < \"$1\"); [ \"$chars\" -le 500 ] || { echo \"Commit message too long ($chars chars, max 500)\"; exit 1; }' --", stages = ["commit-msg"] },
{ id = "no-branch-push", name = "No push to main/master", language = "system", entry = "sh -c 'branch=$(git symbolic-ref --short HEAD 2>/dev/null); case \"$branch\" in main|master|development) echo \"Direct push to $branch is not allowed\"; exit 1;; esac' --", stages = ["pre-push"] },

Choose a reason for hiding this comment

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

P2 Badge Validate pre-push target branch, not current branch

The no-branch-push hook only inspects the local branch name via git symbolic-ref --short HEAD, so it blocks git push only when your current branch is main/master/development but still allows git push origin HEAD:main from any other branch. That means the rule labeled “No push to main/master” is bypassable and will not reliably prevent accidental pushes to those remote branches.

Useful? React with 👍 / 👎.

]
2 changes: 1 addition & 1 deletion src/components/starlight/Head.astro
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,4 @@ import { slide } from "astro:transitions";
::view-transition-group(title-heading) {
animation-duration: 0.3s;
}
</style>
</style>
8 changes: 4 additions & 4 deletions src/content/docs/docs/editorial-cheat-sheet/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,8 @@ operating margin of 14.7 percent in the prior year.

## Executive, Education

To publish to `.com/education` and `.com/executive` via [dashboard.fashionunited.com](https://dashboard.fashionunited.com), you need to add the tag corresponding to the category you want to publish to.
These tags will only change the category you are posting to on `fashionunited.com` and leave the other newsboards/platforms/domains you are posting to intact.
To publish to `.com/education` and `.com/executive` via [dashboard.fashionunited.com](https://dashboard.fashionunited.com), you need to add the tag corresponding to the category you want to publish to.
These tags will only change the category you are posting to on `fashionunited.com` and leave the other newsboards/platforms/domains you are posting to intact.
The tags to use are as follows:

- `Executive Management` => will post to `.com/executive/management` category
Expand All @@ -146,7 +146,7 @@ The tags to use are as follows:

### Example

Posting an article, you select the `news/fashion` category and post to multiple newsboards, including `US` and `UK`. To post the article to executive on .com, you would then add the **tag** `Education Schools`.
Posting an article, you select the `news/fashion` category and post to multiple newsboards, including `US` and `UK`. To post the article to executive on .com, you would then add the **tag** `Education Schools`.
Result: The article will be posted in **UK** `news/fashion` and **US** `education/schools`

## Embed Video
Expand Down Expand Up @@ -471,7 +471,7 @@ Example:
<details>
<summary aria-haspopup="menu" role="button">
Example of credit details.
<span class="asterisk-icon"></span>Notice how it uses an asterisk instead of
<span class="asterisk-icon"></span>Notice how it uses an asterisk instead of
a chevron icon
</summary>
<details-menu role="menu">
Expand Down
2 changes: 1 addition & 1 deletion src/content/docs/docs/marketplace/graphql-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ To help you getting started, here's some example queries for the Marketplace.
brand{
name
}
imageUrl
imageUrl
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "System requirements and browsers"
images:
images:
- "hero-create.jpg"
background_position: "50% 10%"
menu:
Expand Down
2 changes: 1 addition & 1 deletion src/content/docs/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ hero:
FashionUnited.
image:
file: ../../assets/1024x1024.jpg
# file: https://imagedelivery.net/7czaBv4WuiSsJFxi583jUw/0fefcace-ee0f-4e75-6b53-1816707d1900/1024x1024
# file: https://imagedelivery.net/7czaBv4WuiSsJFxi583jUw/0fefcace-ee0f-4e75-6b53-1816707d1900/1024x1024
# this file is hosted here: https://imagedelivery.net/7czaBv4WuiSsJFxi583jUw/0fefcace-ee0f-4e75-6b53-1816707d1900/1024x1024
# file: ../../assets/houston.webp
actions:
Expand Down
Loading
Loading