Skip to content

Instantly share code, notes, and snippets.

@robertDouglass
Last active June 16, 2026 15:09
Show Gist options
  • Select an option

  • Save robertDouglass/0fe47ca6a6ca55afad95a0c8a7d933d0 to your computer and use it in GitHub Desktop.

Select an option

Save robertDouglass/0fe47ca6a6ca55afad95a0c8a7d933d0 to your computer and use it in GitHub Desktop.
Spec Kitty Monorepo Prep skill
param(
[Parameter(ValueFromRemainingArguments = $true)]
[string[]] $CliArgs
)
$ErrorActionPreference = "Stop"
$Org = if ($env:SPEC_KITTY_ORG) { $env:SPEC_KITTY_ORG } else { "Priivacy-ai" }
$Base = if ($env:SPEC_KITTY_DEV_DIR) { $env:SPEC_KITTY_DEV_DIR } else { Join-Path $HOME "spec-kitty-dev" }
$Repos = @(
"spec-kitty",
"spec-kitty-saas",
"spec-kitty-tracker",
"spec-kitty-events",
"spec-kitty-runtime",
"spec-kitty-orchestrator",
"spec-kitty-hub",
"spec-kitty-website",
"spec-kitty-design",
"spec-kitty-planning",
"spec-kitty-test",
"spec-kitty-end-to-end-testing",
"spec-kitty-plain-english-tests",
"spec-kitty-mobile",
"spec-kitty-mobile-contract-tests",
"spec-kitty-mobile-android",
"spec-kitty-mobile-ios",
".github"
)
function Show-Usage {
@"
Usage:
./make-sk-mono.ps1
./make-sk-mono.ps1 --repos <repo> [repo ...]
./make-sk-mono.ps1 --all
./make-sk-mono.ps1 --blank
./make-sk-mono.ps1 --list
./make-sk-mono.ps1 --help
Interactive selector for Spec Kitty monorepo workspaces.
Noninteractive modes create the workspace and print its path.
Interactive mode changes the current process location to the created workspace.
Keys:
Up/Down or k/j Move cursor
Space Toggle repo
Enter Create timestamped workspace and clone selected repos
a Select all
c Clear selection
q or Esc Quit
Environment:
SPEC_KITTY_DEV_DIR Workspace base dir. Default: `$HOME/spec-kitty-dev
SPEC_KITTY_ORG GitHub org. Default: Priivacy-ai
Output:
Prints the created workspace path after cloning or blank workspace creation.
"@
}
function New-WorkspaceDirectory {
param([string] $Prefix)
New-Item -ItemType Directory -Force -Path $Base | Out-Null
$Timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
$Suffix = [Guid]::NewGuid().ToString("N").Substring(0, 6)
$Workspace = Join-Path $Base "$Prefix-$Timestamp-$Suffix"
New-Item -ItemType Directory -Force -Path $Workspace | Out-Null
return (Resolve-Path $Workspace).Path
}
function Show-Repos {
for ($i = 0; $i -lt $Repos.Count; $i++) {
"{0,2}) {1}" -f ($i + 1), $Repos[$i]
}
}
function Get-RepoIndex {
param([string] $Value)
$Number = 0
if ([int]::TryParse($Value, [ref] $Number) -and $Number -ge 1 -and $Number -le $Repos.Count) {
return $Number - 1
}
for ($i = 0; $i -lt $Repos.Count; $i++) {
if ($Repos[$i] -eq $Value) {
return $i
}
}
throw "Unknown repo: $Value"
}
function Invoke-CloneRepo {
param(
[string] $Repo,
[string] $Destination
)
$Gh = Get-Command gh -ErrorAction SilentlyContinue
if ($Gh) {
& gh auth status *> $null
if ($LASTEXITCODE -eq 0) {
& gh repo clone "$Org/$Repo" "$Destination" 2>&1 | ForEach-Object { [Console]::Error.WriteLine($_) }
if ($LASTEXITCODE -ne 0) { throw "Failed to clone $Org/$Repo" }
return
}
}
& git clone "git@github.com:$Org/$Repo.git" "$Destination" 2>&1 | ForEach-Object { [Console]::Error.WriteLine($_) }
if ($LASTEXITCODE -ne 0) { throw "Failed to clone $Org/$Repo" }
}
function New-BlankWorkspace {
$Workspace = New-WorkspaceDirectory -Prefix "blank"
[Console]::Error.WriteLine("Created blank workspace: $Workspace")
$Workspace
}
function New-RepoWorkspace {
param([bool[]] $Checked)
$Selected = @()
for ($i = 0; $i -lt $Checked.Count; $i++) {
if ($Checked[$i]) { $Selected += $Repos[$i] }
}
if ($Selected.Count -eq 0) {
throw "Select at least one repo first."
}
$Workspace = New-WorkspaceDirectory -Prefix "spec-kitty"
[Console]::Error.WriteLine("Created workspace: $Workspace")
foreach ($Repo in $Selected) {
[Console]::Error.WriteLine("Cloning $Org/$Repo...")
Invoke-CloneRepo -Repo $Repo -Destination (Join-Path $Workspace $Repo)
}
$Workspace
}
function Select-Repos {
param([string[]] $Values)
$Checked = [bool[]]::new($Repos.Count)
foreach ($Raw in $Values) {
foreach ($Value in ($Raw -split "," | ForEach-Object { $_.Trim() } | Where-Object { $_ })) {
$Checked[(Get-RepoIndex $Value)] = $true
}
}
$Checked
}
function Invoke-Interactive {
$Checked = [bool[]]::new($Repos.Count)
$Cursor = 0
$Message = ""
while ($true) {
Clear-Host
"Spec Kitty monorepo workspace"
"Base: $Base"
""
"Use arrows, Space to toggle, Enter to clone. a=all c=clear q=quit"
""
for ($i = 0; $i -lt $Repos.Count; $i++) {
$Pointer = if ($i -eq $Cursor) { ">" } else { " " }
$Marker = if ($Checked[$i]) { "x" } else { " " }
"{0} [{1}] {2,2}. {3}" -f $Pointer, $Marker, ($i + 1), $Repos[$i]
}
if ($Message) {
""
$Message
}
$Key = [Console]::ReadKey($true)
$Message = ""
switch ($Key.Key) {
"UpArrow" { $Cursor = if ($Cursor -eq 0) { $Repos.Count - 1 } else { $Cursor - 1 } }
"DownArrow" { $Cursor = if ($Cursor -eq ($Repos.Count - 1)) { 0 } else { $Cursor + 1 } }
"Spacebar" { $Checked[$Cursor] = -not $Checked[$Cursor] }
"Enter" {
try {
$Workspace = New-RepoWorkspace -Checked $Checked
Set-Location $Workspace
$Workspace
return
} catch {
$Message = $_.Exception.Message
}
}
"Escape" { return }
default {
switch ($Key.KeyChar) {
"k" { $Cursor = if ($Cursor -eq 0) { $Repos.Count - 1 } else { $Cursor - 1 } }
"K" { $Cursor = if ($Cursor -eq 0) { $Repos.Count - 1 } else { $Cursor - 1 } }
"j" { $Cursor = if ($Cursor -eq ($Repos.Count - 1)) { 0 } else { $Cursor + 1 } }
"J" { $Cursor = if ($Cursor -eq ($Repos.Count - 1)) { 0 } else { $Cursor + 1 } }
"a" { for ($i = 0; $i -lt $Checked.Count; $i++) { $Checked[$i] = $true } }
"A" { for ($i = 0; $i -lt $Checked.Count; $i++) { $Checked[$i] = $true } }
"c" { $Checked = [bool[]]::new($Repos.Count) }
"C" { $Checked = [bool[]]::new($Repos.Count) }
"q" { return }
"Q" { return }
}
}
}
}
}
if ($CliArgs.Count -eq 0) {
Invoke-Interactive
exit 0
}
switch ($CliArgs[0]) {
{ $_ -in @("-h", "--help") } {
Show-Usage
exit 0
}
"--list" {
Show-Repos
exit 0
}
"--blank" {
New-BlankWorkspace
exit 0
}
"--all" {
$Checked = [bool[]]::new($Repos.Count)
for ($i = 0; $i -lt $Checked.Count; $i++) { $Checked[$i] = $true }
New-RepoWorkspace -Checked $Checked
exit 0
}
"--repos" {
if ($CliArgs.Count -lt 2) {
Write-Error "Missing repos after --repos."
exit 2
}
New-RepoWorkspace -Checked (Select-Repos -Values $CliArgs[1..($CliArgs.Count - 1)])
exit 0
}
default {
if ($CliArgs[0].StartsWith("--")) {
Write-Error "Unknown option: $($CliArgs[0])"
Show-Usage
exit 2
}
New-RepoWorkspace -Checked (Select-Repos -Values $CliArgs)
exit 0
}
}
#!/usr/bin/env bash
SK_MONO_RESTORE_OPTIONS="$(set +o)"
set -eo pipefail
ORG="${SPEC_KITTY_ORG:-Priivacy-ai}"
BASE="${SPEC_KITTY_DEV_DIR:-$HOME/spec-kitty-dev}"
REPOS=(
"spec-kitty"
"spec-kitty-saas"
"spec-kitty-tracker"
"spec-kitty-events"
"spec-kitty-runtime"
"spec-kitty-orchestrator"
"spec-kitty-hub"
"spec-kitty-website"
"spec-kitty-design"
"spec-kitty-planning"
"spec-kitty-test"
"spec-kitty-end-to-end-testing"
"spec-kitty-plain-english-tests"
"spec-kitty-mobile"
"spec-kitty-mobile-contract-tests"
"spec-kitty-mobile-android"
"spec-kitty-mobile-ios"
".github"
)
usage() {
cat <<'EOF'
Usage:
make-sk-mono.sh
make-sk-mono.sh --repos <repo> [repo ...]
make-sk-mono.sh --all
make-sk-mono.sh --blank
make-sk-mono.sh --list
make-sk-mono.sh --help
Interactive checkbox selector for Spec Kitty monorepo workspaces.
Noninteractive modes create the workspace, print its path, and do not cd or open a shell.
Interactive mode opens your shell in the created workspace after cloning.
Keys:
Up/Down or k/j Move cursor
Space Toggle repo
Enter Create timestamped workspace and clone selected repos
a Select all
c Clear selection
q or Esc Quit
Environment:
SPEC_KITTY_DEV_DIR Workspace base dir. Default: ~/spec-kitty-dev
SPEC_KITTY_ORG GitHub org. Default: Priivacy-ai
Output:
Prints the created workspace path after cloning or blank workspace creation.
EOF
}
is_sourced() {
[[ "${BASH_SOURCE[0]}" != "$0" ]]
}
restore_shell_options() {
if is_sourced; then
eval "$SK_MONO_RESTORE_OPTIONS"
fi
}
declare -a checked=()
cursor=0
message=""
CREATED_WORKSPACE=""
init_checked() {
local i
checked=()
for i in "${!REPOS[@]}"; do
checked[$i]=0
done
}
hide_cursor() {
[[ -t 1 ]] && tput civis 2>/dev/null || true
}
show_cursor() {
[[ -t 1 ]] && tput cnorm 2>/dev/null || true
}
clear_screen() {
if [[ "${SK_MONO_NO_CLEAR:-}" == "1" ]]; then
return
fi
if [[ ! -t 1 ]]; then
return
fi
printf '\033[H\033[2J'
}
print_repos() {
local i
for i in "${!REPOS[@]}"; do
printf '%2d) %s\n' "$((i + 1))" "${REPOS[$i]}"
done
}
render() {
local i marker pointer
clear_screen
printf 'Spec Kitty monorepo workspace\n'
printf 'Base: %s\n\n' "$BASE"
printf 'Use arrows, Space to toggle, Enter to clone. a=all c=clear q=quit\n\n'
for i in "${!REPOS[@]}"; do
pointer=" "
marker=" "
[[ "$i" -eq "$cursor" ]] && pointer=">"
[[ "${checked[$i]}" == "1" ]] && marker="x"
printf '%s [%s] %2d. %s\n' "$pointer" "$marker" "$((i + 1))" "${REPOS[$i]}"
done
if [[ -n "$message" ]]; then
printf '\n%s\n' "$message"
fi
}
selected_count() {
local count=0
local value
for value in "${checked[@]}"; do
[[ "$value" == "1" ]] && count=$((count + 1))
done
printf '%s\n' "$count"
}
clone_repo() {
local repo="$1"
local dest="$2"
if command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1; then
gh repo clone "${ORG}/${repo}" "$dest" >&2
else
git clone "git@github.com:${ORG}/${repo}.git" "$dest" >&2
fi
}
repo_index() {
local value="$1"
local i
if [[ "$value" =~ ^[0-9]+$ ]] && [[ "$value" -ge 1 ]] && [[ "$value" -le "${#REPOS[@]}" ]]; then
printf '%s\n' "$((value - 1))"
return 0
fi
for i in "${!REPOS[@]}"; do
if [[ "${REPOS[$i]}" == "$value" ]]; then
printf '%s\n' "$i"
return 0
fi
done
return 1
}
select_repo_value() {
local raw="$1"
local value index
raw="${raw//,/ }"
for value in $raw; do
index="$(repo_index "$value")" || {
printf 'Unknown repo: %s\n' "$value" >&2
return 1
}
checked[$index]=1
done
}
create_blank_workspace() {
local timestamp workspace
mkdir -p "$BASE"
timestamp="$(date +%Y%m%d-%H%M%S)"
workspace="$(mktemp -d "${BASE%/}/blank-${timestamp}-XXXXXX")"
CREATED_WORKSPACE="$workspace"
printf 'Created blank workspace: %s\n' "$workspace" >&2
printf '%s\n' "$workspace"
}
create_workspace() {
local count timestamp workspace i repo
count="$(selected_count)"
if [[ "$count" -eq 0 ]]; then
message="Select at least one repo first."
return 1
fi
mkdir -p "$BASE"
timestamp="$(date +%Y%m%d-%H%M%S)"
workspace="$(mktemp -d "${BASE%/}/spec-kitty-${timestamp}-XXXXXX")"
CREATED_WORKSPACE="$workspace"
clear_screen
printf 'Created workspace: %s\n' "$workspace" >&2
for i in "${!REPOS[@]}"; do
if [[ "${checked[$i]}" == "1" ]]; then
repo="${REPOS[$i]}"
printf 'Cloning %s/%s...\n' "$ORG" "$repo" >&2
clone_repo "$repo" "${workspace}/${repo}"
fi
done
printf '%s\n' "$workspace"
}
run_noninteractive() {
local mode="$1"
shift
local arg
init_checked
case "$mode" in
list)
print_repos
;;
blank)
create_blank_workspace
;;
all)
select_all
create_workspace
;;
repos)
if [[ $# -eq 0 ]]; then
printf 'Missing repos after --repos.\n' >&2
return 2
fi
for arg in "$@"; do
select_repo_value "$arg"
done
create_workspace
;;
esac
}
select_all() {
local i
for i in "${!checked[@]}"; do
checked[$i]=1
done
}
clear_all() {
local i
for i in "${!checked[@]}"; do
checked[$i]=0
done
}
toggle_current() {
if [[ "${checked[$cursor]}" == "1" ]]; then
checked[$cursor]=0
else
checked[$cursor]=1
fi
}
move_up() {
if [[ "$cursor" -eq 0 ]]; then
cursor=$((${#REPOS[@]} - 1))
else
cursor=$((cursor - 1))
fi
}
move_down() {
if [[ "$cursor" -eq $((${#REPOS[@]} - 1)) ]]; then
cursor=0
else
cursor=$((cursor + 1))
fi
}
read_key() {
local key rest
IFS= read -rsn1 key || return 1
case "$key" in
$'\x1b')
if IFS= read -rsn1 -t 1 rest1 && [[ "$rest1" == "[" ]]; then
if IFS= read -rsn1 -t 1 rest2; then
case "$rest2" in
"A") printf 'up\n' ;;
"B") printf 'down\n' ;;
*) printf 'esc\n' ;;
esac
else
printf 'esc\n'
fi
else
printf 'esc\n'
fi
;;
" ") printf 'space\n' ;;
"")
printf 'enter\n'
;;
"k"|"K") printf 'up\n' ;;
"j"|"J") printf 'down\n' ;;
"a"|"A") printf 'all\n' ;;
"c"|"C") printf 'clear\n' ;;
"q"|"Q") printf 'quit\n' ;;
*)
printf 'other\n'
;;
esac
}
main() {
local action
case "${1:-}" in
-h|--help)
usage
return 0
;;
--list)
run_noninteractive list
return
;;
--blank)
run_noninteractive blank
return
;;
--all)
run_noninteractive all
return
;;
--repos)
shift
run_noninteractive repos "$@"
return
;;
"")
;;
--*)
printf 'Unknown option: %s\n\n' "$1" >&2
usage >&2
return 2
;;
*)
run_noninteractive repos "$@"
return
;;
esac
init_checked
mkdir -p "$BASE"
hide_cursor
trap show_cursor EXIT
while true; do
render
action="$(read_key)" || break
message=""
case "$action" in
up) move_up ;;
down) move_down ;;
space) toggle_current ;;
all) select_all ;;
clear) clear_all ;;
enter)
if create_workspace; then
show_cursor
trap - EXIT
cd "$CREATED_WORKSPACE"
if [[ -t 0 && -t 1 ]] && ! is_sourced; then
printf '\nEntered workspace shell: %s\n' "$CREATED_WORKSPACE" >&2
printf 'Type exit to return to your previous shell.\n' >&2
exec "${SHELL:-/bin/zsh}"
fi
break
fi
;;
quit|esc)
clear_screen
break
;;
*)
;;
esac
done
show_cursor
trap - EXIT
restore_shell_options
}
main "$@"
status=$?
restore_shell_options
return "$status" 2>/dev/null || exit "$status"

Priivacy-ai Spec Kitty Repo Inventory

Verified on 2026-05-21 with:

gh repo list Priivacy-ai --limit 200 --json name,description,isPrivate,url,visibility

This reference intentionally includes the repos involved with Spec Kitty development and excludes unrelated Priivacy product repos such as priivacy, priivacy_ai_saas, priivacy_complier, and priivacy_benchmark.

Core Product Repos

  • spec-kitty: Main Spec Kitty CLI and open-source workflow repo.
  • spec-kitty-saas: Commercial Spec Kitty SaaS app and web product.
  • spec-kitty-tracker: Shared tracker abstraction and sync engine used by CLI and SaaS.
  • spec-kitty-events: Canonical event contracts, schemas, conformance fixtures, and replay support.
  • spec-kitty-runtime: Canonical mission runtime library for loading missions, planning next steps, and rendering prompts.
  • spec-kitty-orchestrator: External work-package orchestrator that drives Spec Kitty through the orchestrator-api contract.

Product Surface Repos

  • spec-kitty-hub: Linear-side hub/control-plane repo for projects, missions, builds, and tracker readiness.
  • spec-kitty-website: Marketing and website repo for Spec Kitty.
  • spec-kitty-design: Design system and branding assets for Spec Kitty projects and websites. Treat this as the source of truth for UI, UX, brand, visual design, and design-system decisions.
  • spec-kitty-planning: Planning dump for PRDs, research, contracts, roadmaps, and other pre-implementation material.

Test Repos

  • spec-kitty-test: Functional test suites for core Spec Kitty behavior.
  • spec-kitty-end-to-end-testing: Trusted-runner deployed-dev canary and connector acceptance suite.
  • spec-kitty-plain-english-tests: Gherkin and pytest-bdd natural-language test monorepo across CLI, SaaS, and mobile.

Mobile Repos

  • spec-kitty-mobile: Primary cross-platform mobile app (React Native + Expo).
  • spec-kitty-mobile-contract-tests: Shared contract tests for mobile payload parity across clients.
  • spec-kitty-mobile-android: Android wrapper and native-extension repo for mobile-specific concerns.
  • spec-kitty-mobile-ios: iOS wrapper and native-extension repo for mobile-specific concerns.

Org Meta Repo

  • .github: Org-wide GitHub defaults, issue templates, and shared metadata for Priivacy-ai.

Quick Task Mapping

  • CLI commands or slash-command flow: spec-kitty
  • Hosted auth, tracker, or sync behavior: spec-kitty, spec-kitty-saas, spec-kitty-tracker
  • Event contract or reducer work: spec-kitty-events and affected consumers
  • Mission runtime behavior: spec-kitty-runtime and affected consumers
  • Orchestrator execution loops: spec-kitty-orchestrator, spec-kitty, and usually spec-kitty-events
  • Linear hub work: spec-kitty-hub
  • Planning or PRD work: spec-kitty-planning
  • UI, UX, brand, visual design, or design-system work: spec-kitty-design plus the product repo being changed
  • Marketing site: spec-kitty-website, usually with spec-kitty-design
  • Mobile app work: spec-kitty-mobile plus contract tests and platform wrappers as needed
  • Core functional tests: spec-kitty-test
  • Deployed-dev canaries: spec-kitty-end-to-end-testing
  • Plain-English acceptance coverage: spec-kitty-plain-english-tests
name spec-kitty-monorepo-prep
description Prepare a fresh timestamped temporary workspace for Spec Kitty tasks by selecting relevant Priivacy-ai repos, cloning them into a new temp directory, and doing all work there instead of existing local checkouts. For non-Spec-Kitty work, create a fresh blank workspace instead of cloning Spec Kitty repos. Use whenever the user asks to work on Spec Kitty, Spec Kitty SaaS, tracker, hub, mobile, website, design system, planning, tests, runtime, events, or orchestrator repos.

Spec Kitty Monorepo Prep

Use this before substantive work on Spec Kitty. If the user is asking for work that is not actually part of Spec Kitty or its repos, do not clone Spec Kitty projects; create a fresh blank workspace under a dedicated temporary/dev workspace root and build there.

Core Rules

  1. Do not start implementation in an existing checkout unless the user explicitly tells you to stay there.
  2. Create a fresh timestamped temp workspace first. Clone only the repos needed for Spec Kitty work; for non-Spec-Kitty work, leave the workspace blank.
  3. Keep all edits, branches, and verification work inside that fresh workspace.
  4. If the task touches SaaS, tracker, sync, or hosted auth flows from the CLI in an environment that requires hosted sync, set SPEC_KITTY_ENABLE_SAAS_SYNC=1.
  5. Tell the user which temp workspace path you created before doing substantial work there.

Workflow

  1. Decide whether the task is genuinely Spec Kitty repo work.
  2. For non-Spec-Kitty work, create a blank workspace and continue there:
workspace="$("$SK_MONO_SCRIPT" --blank)"
cd "$workspace"
  1. For Spec Kitty work, read repos.md and choose the minimum repo set that covers the task.
  2. For agentic/noninteractive use, create and populate the workspace with:
workspace="$("$SK_MONO_SCRIPT" --repos spec-kitty spec-kitty-saas spec-kitty-tracker)"
cd "$workspace"
  1. For human/manual selection, run the checkbox selector:
"$SK_MONO_SCRIPT"

Interactive mode opens the user's shell in the created workspace after cloning.

  1. Work only inside that workspace. If repos were cloned, work only inside the cloned repos under that workspace.
  2. If Spec Kitty scope expands, rerun the script with the extra repos or clone the missing repos into the same workspace.

Workspace Script

Use the configured make-sk-mono.sh script as the canonical workspace creator on Unix-like shells. Set SK_MONO_SCRIPT to its location before using this workflow.

export SK_MONO_SCRIPT="${SK_MONO_SCRIPT:-$(command -v make-sk-mono.sh)}"
"$SK_MONO_SCRIPT" --help
"$SK_MONO_SCRIPT" --list
"$SK_MONO_SCRIPT" --blank
"$SK_MONO_SCRIPT" --repos spec-kitty spec-kitty-saas
"$SK_MONO_SCRIPT" --all

On Windows, use the PowerShell equivalent included in this gist:

$env:SK_MONO_SCRIPT = ".\make-sk-mono.ps1"
& $env:SK_MONO_SCRIPT --help
& $env:SK_MONO_SCRIPT --list
& $env:SK_MONO_SCRIPT --blank
& $env:SK_MONO_SCRIPT --repos spec-kitty spec-kitty-saas
& $env:SK_MONO_SCRIPT --all

Noninteractive modes print only the created workspace path on stdout; clone progress goes to stderr. This makes agent capture safe:

workspace="$("$SK_MONO_SCRIPT" --repos spec-kitty)"
cd "$workspace"

PowerShell capture:

$workspace = & $env:SK_MONO_SCRIPT --repos spec-kitty
Set-Location $workspace

Repo Selection Defaults

  • CLI or slash-command work: spec-kitty
  • SaaS-backed auth, tracker, or sync flows: spec-kitty, spec-kitty-saas, spec-kitty-tracker
  • Event/state contract work: spec-kitty-events, spec-kitty-runtime, plus the consumer repo being changed
  • Orchestration work: spec-kitty-orchestrator, spec-kitty, and often spec-kitty-events or spec-kitty-runtime
  • Hub work: spec-kitty-hub, plus whichever backend or tracker repo the task touches
  • Planning or PRD work: spec-kitty-planning
  • UI, UX, brand, visual design, or design-system work: spec-kitty-design, plus the product repo being changed
  • Website or marketing work: spec-kitty-website, and usually spec-kitty-design
  • Mobile work: spec-kitty-mobile, plus spec-kitty-mobile-contract-tests and platform wrappers when needed
  • Test work: the product repo plus the relevant test repo (spec-kitty-test, spec-kitty-end-to-end-testing, or spec-kitty-plain-english-tests)

SaaS Sync Rule

When running Spec Kitty CLI commands that exercise hosted auth, tracker, or sync behavior in an environment that requires hosted sync, use:

SPEC_KITTY_ENABLE_SAAS_SYNC=1 <command>

Example:

SPEC_KITTY_ENABLE_SAAS_SYNC=1 uv run spec-kitty tracker sync pull

Inventory Refresh

The repo inventory in repos.md is a checked-in snapshot. If you suspect the org has changed, refresh it before cloning:

gh repo list Priivacy-ai --limit 200 --json name,description,isPrivate,url,visibility
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment