pondorasti 0.1.36 → 0.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/Brewfile +8 -2
  2. package/dotfiles/claude/settings.json +4 -5
  3. package/dotfiles/cursor/settings.json +2 -2
  4. package/dotfiles/git/.gitconfig +5 -0
  5. package/dotfiles/nvim/lazy-lock.json +10 -10
  6. package/dotfiles/opencode/opencode.json +4 -0
  7. package/dotfiles/zsh/.zshrc +3 -0
  8. package/package.json +2 -2
  9. package/src/tools/dotfiles.ts +2 -2
  10. package/src/utils/github.test.ts +28 -0
  11. package/src/utils/github.ts +44 -13
  12. package/dotfiles/agents/AGENTS.md +0 -59
  13. package/dotfiles/agents/skills/create-cli/SKILL.md +0 -95
  14. package/dotfiles/agents/skills/create-cli/references/cli-guidelines.md +0 -239
  15. package/dotfiles/agents/skills/learn/SKILL.md +0 -45
  16. package/dotfiles/agents/skills/ncu/SKILL.md +0 -14
  17. package/dotfiles/agents/skills/rams/SKILL.md +0 -111
  18. package/dotfiles/agents/skills/swift-concurrency-expert/SKILL.md +0 -39
  19. package/dotfiles/agents/skills/swift-concurrency-expert/references/approachable-concurrency.md +0 -63
  20. package/dotfiles/agents/skills/swift-concurrency-expert/references/swift-6-2-concurrency.md +0 -272
  21. package/dotfiles/agents/skills/swift-concurrency-expert/references/swiftui-concurrency-tour-wwdc.md +0 -33
  22. package/dotfiles/agents/skills/swiftui-liquid-glass/SKILL.md +0 -92
  23. package/dotfiles/agents/skills/swiftui-liquid-glass/references/liquid-glass.md +0 -280
  24. package/dotfiles/agents/skills/swiftui-performance-audit/SKILL.md +0 -189
  25. package/dotfiles/agents/skills/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +0 -46
  26. package/dotfiles/agents/skills/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +0 -29
  27. package/dotfiles/agents/skills/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +0 -33
  28. package/dotfiles/agents/skills/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +0 -52
  29. package/dotfiles/agents/skills/swiftui-ui-patterns/SKILL.md +0 -97
  30. package/dotfiles/agents/skills/swiftui-ui-patterns/references/app-wiring.md +0 -194
  31. package/dotfiles/agents/skills/swiftui-ui-patterns/references/components-index.md +0 -43
  32. package/dotfiles/agents/skills/swiftui-ui-patterns/references/controls.md +0 -57
  33. package/dotfiles/agents/skills/swiftui-ui-patterns/references/deeplinks.md +0 -66
  34. package/dotfiles/agents/skills/swiftui-ui-patterns/references/focus.md +0 -90
  35. package/dotfiles/agents/skills/swiftui-ui-patterns/references/form.md +0 -97
  36. package/dotfiles/agents/skills/swiftui-ui-patterns/references/grids.md +0 -71
  37. package/dotfiles/agents/skills/swiftui-ui-patterns/references/haptics.md +0 -71
  38. package/dotfiles/agents/skills/swiftui-ui-patterns/references/input-toolbar.md +0 -51
  39. package/dotfiles/agents/skills/swiftui-ui-patterns/references/lightweight-clients.md +0 -93
  40. package/dotfiles/agents/skills/swiftui-ui-patterns/references/list.md +0 -86
  41. package/dotfiles/agents/skills/swiftui-ui-patterns/references/loading-placeholders.md +0 -38
  42. package/dotfiles/agents/skills/swiftui-ui-patterns/references/macos-settings.md +0 -71
  43. package/dotfiles/agents/skills/swiftui-ui-patterns/references/matched-transitions.md +0 -59
  44. package/dotfiles/agents/skills/swiftui-ui-patterns/references/media.md +0 -73
  45. package/dotfiles/agents/skills/swiftui-ui-patterns/references/menu-bar.md +0 -101
  46. package/dotfiles/agents/skills/swiftui-ui-patterns/references/navigationstack.md +0 -159
  47. package/dotfiles/agents/skills/swiftui-ui-patterns/references/overlay.md +0 -45
  48. package/dotfiles/agents/skills/swiftui-ui-patterns/references/scrollview.md +0 -87
  49. package/dotfiles/agents/skills/swiftui-ui-patterns/references/searchable.md +0 -71
  50. package/dotfiles/agents/skills/swiftui-ui-patterns/references/sheets.md +0 -113
  51. package/dotfiles/agents/skills/swiftui-ui-patterns/references/split-views.md +0 -72
  52. package/dotfiles/agents/skills/swiftui-ui-patterns/references/tabview.md +0 -114
  53. package/dotfiles/agents/skills/swiftui-ui-patterns/references/theming.md +0 -71
  54. package/dotfiles/agents/skills/swiftui-ui-patterns/references/title-menus.md +0 -93
  55. package/dotfiles/agents/skills/swiftui-ui-patterns/references/top-bar.md +0 -49
  56. package/dotfiles/agents/skills/swiftui-view-refactor/SKILL.md +0 -138
  57. package/dotfiles/agents/skills/swiftui-view-refactor/references/mv-patterns.md +0 -314
package/Brewfile CHANGED
@@ -4,7 +4,9 @@ tap "anomalyco/tap" # Tap for opencode and related tools
4
4
 
5
5
  # Development Tools
6
6
  brew "lazygit" # Terminal UI for git commands - makes git operations visual and intuitive
7
+ brew "git-lfs" # Git Large File Storage - manage large files in Git repositories efficiently
7
8
  brew "docker" # Docker CLI - command-line interface for interacting with Docker
9
+ brew "colima" # Docker-compatible container runtime for macOS using Lima
8
10
  cask "orbstack" # Fast, lightweight Docker & Linux VM runtime for macOS
9
11
  brew "lazydocker" # Terminal UI for Docker - manage containers, images, and volumes easily
10
12
  brew "neovim" # Hyperextensible Vim-based text editor - modern fork with better plugin support
@@ -13,12 +15,16 @@ brew "tmux" # Terminal multiplexer - multiple term
13
15
  brew "pnpm" # Fast, disk space efficient package manager for Node.js
14
16
  brew "oven-sh/bun/bun" # Fast all-in-one JavaScript runtime, bundler, test runner, and package manager
15
17
  brew "node" # JavaScript runtime built on Chrome's V8 JavaScript engine
18
+ brew "vite-plus" # Unified web development toolchain - provides vp
16
19
  brew "fnm" # Fast Node Manager - simple, fast Node.js version manager built in Rust
20
+ brew "mise" # Polyglot runtime manager for Node.js, Ruby, and other development tools
17
21
  brew "rbenv" # Ruby version manager - simple, lightweight Ruby environment manager
18
22
  brew "stripe/stripe-cli/stripe" # Stripe CLI for testing and managing Stripe resources
19
23
  brew "supabase" # Supabase CLI for local development and deployment
20
24
  brew "flyctl" # Fly.io CLI for app deployment and infrastructure management
25
+ brew "cloudflare-wrangler" # Cloudflare Wrangler CLI for Workers development and deployment
21
26
  brew "mysql" # Open source relational database management system
27
+ brew "redis" # In-memory data store - caching, queues, pub/sub, and lightweight database use cases
22
28
  brew "anomalyco/tap/opencode" # Open source code editor/IDE
23
29
 
24
30
  # System Monitoring
@@ -44,8 +50,8 @@ cask "cursor" # AI-powered code editor built to make
44
50
  cask "zed" # High-performance code editor designed for collaboration with humans and AI
45
51
  cask "claude" # Claude AI assistant desktop application
46
52
  cask "claude-code" # Claude AI coding assistant for the terminal
47
- cask "clawdbot" # Personal AI assistant with menu bar control and voice wake
48
53
  cask "codex" # OpenAI's Codex CLI - coding agent that runs in your terminal
54
+ cask "codex-app" # OpenAI's Codex desktop app for managing coding agents
49
55
  cask "opencode-desktop" # Desktop app for OpenCode AI coding assistant
50
56
  cask "android-studio" # Official IDE for Android app development
51
57
  cask "tableplus" # Modern, native database management tool
@@ -58,7 +64,7 @@ cask "851-labs/tap/gardenbridge" # Drag and drop content between Mac an
58
64
  cask "1password" # Password manager and secure wallet
59
65
  cask "1password-cli" # 1Password CLI for scripting and automation
60
66
  cask "cleanshot" # Advanced screenshot and screen recording tool
61
- cask "linear-linear" # Modern project management and issue tracking for product teams
67
+ cask "linear" # Modern project management and issue tracking for product teams
62
68
  cask "notion" # All-in-one workspace for notes, docs, and collaboration
63
69
  cask "notion-calendar" # Calendar app integrated with Notion
64
70
 
@@ -1,12 +1,11 @@
1
1
  {
2
- "env": {
3
- "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
4
- },
5
2
  "permissions": {
6
3
  "defaultMode": "dontAsk"
7
4
  },
8
- "model": "opus",
9
5
  "enabledPlugins": {
10
6
  "swift-lsp@claude-plugins-official": true
11
- }
7
+ },
8
+ "effortLevel": "high",
9
+ "skipDangerousModePermissionPrompt": true,
10
+ "fastMode": true
12
11
  }
@@ -25,7 +25,6 @@
25
25
  "workbench.colorTheme": "Default Dark Modern",
26
26
  "workbench.preferredDarkColorTheme": "Default Dark Modern",
27
27
  "workbench.preferredLightColorTheme": "Default Light Modern",
28
- "workbench.sideBar.location": "right",
29
28
  "workbench.tree.enableStickyScroll": true,
30
29
 
31
30
  "terminal.integrated.fontFamily": "MesloLGS Nerd Font Mono",
@@ -51,5 +50,6 @@
51
50
  },
52
51
  "cursor.cpp.disabledLanguages": [
53
52
  "plaintext"
54
- ]
53
+ ],
54
+ "workbench.sideBar.location": "right"
55
55
  }
@@ -15,3 +15,8 @@
15
15
  [alias]
16
16
  autorebase = "!f() { git fetch origin $1 && git rebase origin/$1; }; f"
17
17
  bclean = "!f() { git branch --no-color | fzf -m | xargs -I {} git branch -D '{}'; }; f"
18
+ [filter "lfs"]
19
+ clean = git-lfs clean -- %f
20
+ smudge = git-lfs smudge -- %f
21
+ process = git-lfs filter-process
22
+ required = true
@@ -1,28 +1,28 @@
1
1
  {
2
2
  "LazyVim": { "branch": "main", "commit": "28db03f958d58dfff3c647ce28fdc1cb88ac158d" },
3
- "blink.cmp": { "branch": "main", "commit": "b19413d214068f316c78978b08264ed1c41830ec" },
3
+ "blink.cmp": { "branch": "main", "commit": "4b18c32adef2898f95cdef6192cbd5796c1a332d" },
4
4
  "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
5
- "catppuccin": { "branch": "main", "commit": "beaf41a30c26fd7d6c386d383155cbd65dd554cd" },
5
+ "catppuccin": { "branch": "main", "commit": "0a5de4da015a175f416d6ef1eda84661623e0500" },
6
6
  "conform.nvim": { "branch": "master", "commit": "c2526f1cde528a66e086ab1668e996d162c75f4f" },
7
7
  "flash.nvim": { "branch": "main", "commit": "fcea7ff883235d9024dc41e638f164a450c14ca2" },
8
8
  "friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
9
- "gitsigns.nvim": { "branch": "main", "commit": "abf82a65f185bd54adc0679f74b7d6e1ada690c9" },
9
+ "gitsigns.nvim": { "branch": "main", "commit": "9f3c6dd7868bcc116e9c1c1929ce063b978fa519" },
10
10
  "grug-far.nvim": { "branch": "main", "commit": "275dbedc96e61a6b8d1dfb28ba51586ddd233dcf" },
11
11
  "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" },
12
12
  "lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" },
13
13
  "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" },
14
- "mason-lspconfig.nvim": { "branch": "main", "commit": "c953789db7fd28eafe5eb5659846d34b5024b3cc" },
14
+ "mason-lspconfig.nvim": { "branch": "main", "commit": "21c2a84ce368e99b18f52ab348c4c02c32c02fcf" },
15
15
  "mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" },
16
- "mini.ai": { "branch": "main", "commit": "9eae720f2b20f6ad28cbfa0ddc524e10dc2c3201" },
17
- "mini.icons": { "branch": "main", "commit": "efc85e42262cd0c9e1fdbf806c25cb0be6de115c" },
16
+ "mini.ai": { "branch": "main", "commit": "b0247752cf629ce7c6bd0a1efd82fb58ff60f9d6" },
17
+ "mini.icons": { "branch": "main", "commit": "68c178e0958d95b3977a771f3445429b1bded985" },
18
18
  "mini.pairs": { "branch": "main", "commit": "4089aa6ea6423e02e1a8326a7a7a00159f6f5e04" },
19
19
  "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" },
20
20
  "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
21
- "nvim-lint": { "branch": "master", "commit": "bcd1a44edbea8cd473af7e7582d3f7ffc60d8e81" },
22
- "nvim-lspconfig": { "branch": "master", "commit": "3f58aeca0c6ece8a9fb8782ea3fcb6024f285be3" },
23
- "nvim-treesitter": { "branch": "main", "commit": "4967fa48b0fe7a7f92cee546c76bb4bb61bb14d5" },
21
+ "nvim-lint": { "branch": "master", "commit": "486474c2ace8d78d28995074dbdbe29011bc63d0" },
22
+ "nvim-lspconfig": { "branch": "master", "commit": "44acfe887d4056f704ccc4f17513ed41c9e2b2e6" },
23
+ "nvim-treesitter": { "branch": "main", "commit": "ecdae44baefeffceade8b0c752d80ececad28e76" },
24
24
  "nvim-treesitter-textobjects": { "branch": "main", "commit": "a0e182ae21fda68c59d1f36c9ed45600aef50311" },
25
- "nvim-ts-autotag": { "branch": "main", "commit": "db15f2e0df2f5db916e511e3fffb682ef2f6354f" },
25
+ "nvim-ts-autotag": { "branch": "main", "commit": "8e1c0a389f20bf7f5b0dd0e00306c1247bda2595" },
26
26
  "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" },
27
27
  "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
28
28
  "snacks.nvim": { "branch": "main", "commit": "fe7cfe9800a182274d0f868a74b7263b8c0c020b" },
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "permission": "allow"
4
+ }
@@ -141,3 +141,6 @@ alias oc='opencode'
141
141
  alias occ='opencode --continue'
142
142
  alias cc='claude --dangerously-skip-permissions'
143
143
  alias ccc='claude --dangerously-skip-permissions --continue'
144
+
145
+ # Vite+ bin (https://viteplus.dev)
146
+ . "$HOME/.vite-plus/env"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pondorasti",
3
- "version": "0.1.36",
3
+ "version": "0.1.38",
4
4
  "description": "CLI for pondorasti",
5
5
  "author": "Alexandru Ţurcanu",
6
6
  "license": "MIT",
@@ -31,7 +31,7 @@
31
31
  "build:sign": "codesign --deep --force --sign - --entitlements entitlements.plist dist/pd"
32
32
  },
33
33
  "dependencies": {
34
- "ink": "^6.7.0",
34
+ "ink": "^6.8.0",
35
35
  "ink-gradient": "^4.0.0",
36
36
  "ink-spinner": "^5.0.0",
37
37
  "react": "^19.2.4",
@@ -11,15 +11,15 @@ enum DotfilesPackage {
11
11
  Zsh = "zsh",
12
12
  Cursor = "cursor",
13
13
  Claude = "claude",
14
- Agents = "agents",
15
14
  Nvim = "nvim",
15
+ Opencode = "opencode",
16
16
  }
17
17
 
18
18
  const PACKAGE_TARGET_PATHS: Partial<Record<DotfilesPackage, string>> = {
19
19
  [DotfilesPackage.Cursor]: "~/Library/Application Support/Cursor/User",
20
20
  [DotfilesPackage.Claude]: "~/.claude",
21
- [DotfilesPackage.Agents]: "~/.claude", // OpenCode also reads from ~/.claude/skills/
22
21
  [DotfilesPackage.Nvim]: "~/.config/nvim",
22
+ [DotfilesPackage.Opencode]: "~/.config/opencode",
23
23
  }
24
24
 
25
25
  function isDotfilesPackage(value: string): value is DotfilesPackage {
@@ -51,6 +51,13 @@ describe("parseGitHubUrl", () => {
51
51
  })
52
52
  })
53
53
 
54
+ test("parses commits URLs", () => {
55
+ expect(parseGitHubUrl("https://github.com/owner/repo/commits/main/")).toEqual({
56
+ owner: "owner",
57
+ repo: "repo",
58
+ })
59
+ })
60
+
54
61
  test("parses blob URLs (file paths)", () => {
55
62
  expect(parseGitHubUrl("https://github.com/owner/repo/blob/main/file.ts")).toEqual({
56
63
  owner: "owner",
@@ -65,6 +72,13 @@ describe("parseGitHubUrl", () => {
65
72
  })
66
73
  })
67
74
 
75
+ test("parses other GitHub subpages", () => {
76
+ expect(parseGitHubUrl("https://github.com/owner/repo/pull/123/files")).toEqual({
77
+ owner: "owner",
78
+ repo: "repo",
79
+ })
80
+ })
81
+
68
82
  test("handles trailing slashes", () => {
69
83
  expect(parseGitHubUrl("https://github.com/owner/repo/")).toEqual({
70
84
  owner: "owner",
@@ -79,6 +93,20 @@ describe("parseGitHubUrl", () => {
79
93
  })
80
94
  })
81
95
 
96
+ test("handles query params and hash fragments", () => {
97
+ expect(parseGitHubUrl("https://github.com/owner/repo?tab=readme-ov-file#top")).toEqual({
98
+ owner: "owner",
99
+ repo: "repo",
100
+ })
101
+ })
102
+
103
+ test("parses github.com URLs without protocol", () => {
104
+ expect(parseGitHubUrl("github.com/owner/repo/issues/1")).toEqual({
105
+ owner: "owner",
106
+ repo: "repo",
107
+ })
108
+ })
109
+
82
110
  test("returns null for invalid URLs", () => {
83
111
  expect(parseGitHubUrl("not-a-valid-url")).toBeNull()
84
112
  })
@@ -1,20 +1,51 @@
1
1
  export const parseGitHubUrl = (url: string): { owner: string; repo: string } | null => {
2
- const normalized = url.trim().replace(/\/+$/, "")
3
-
4
- // Strip /tree/... or /blob/... suffixes (branch/file paths)
5
- const withoutTree = normalized.replace(/\/(tree|blob)\/.*$/, "")
2
+ const normalized = url.trim()
3
+ if (!normalized) {
4
+ return null
5
+ }
6
6
 
7
- const patterns = [
8
- /github\.com[:/]([^/]+)\/(.+?)(?:\.git)?$/, // Handles https and SSH formats
9
- /^([^/:]+)\/([^/]+?)(?:\.git)?$/, // Handles owner/repo format (no colons in owner, no slashes in repo)
10
- ]
7
+ const toResult = (owner: string | undefined, repo: string | undefined) => {
8
+ if (!owner || !repo) {
9
+ return null
10
+ }
11
11
 
12
- for (const pattern of patterns) {
13
- const match = withoutTree.match(pattern)
14
- if (match) {
15
- return { owner: match[1], repo: match[2] }
12
+ const cleanRepo = repo.replace(/\.git$/i, "")
13
+ if (!cleanRepo) {
14
+ return null
16
15
  }
16
+
17
+ return { owner, repo: cleanRepo }
18
+ }
19
+
20
+ // Handles owner/repo (with optional trailing slash)
21
+ const shortMatch = normalized.match(/^([^/:?#\s]+)\/([^/?#]+?)(?:\.git)?\/?$/)
22
+ if (shortMatch) {
23
+ return toResult(shortMatch[1], shortMatch[2])
24
+ }
25
+
26
+ // Handles git@github.com:owner/repo(.git)
27
+ const sshMatch = normalized.match(/^git@github\.com:([^/]+)\/([^/?#]+?)(?:\.git)?\/?$/i)
28
+ if (sshMatch) {
29
+ return toResult(sshMatch[1], sshMatch[2])
17
30
  }
18
31
 
19
- return null
32
+ // Allows github.com/owner/repo without protocol
33
+ const urlCandidate = normalized.match(/^github\.com\//i) ? `https://${normalized}` : normalized
34
+
35
+ try {
36
+ const parsed = new URL(urlCandidate)
37
+ const host = parsed.hostname.toLowerCase()
38
+ if (host !== "github.com" && host !== "www.github.com") {
39
+ return null
40
+ }
41
+
42
+ const segments = parsed.pathname.split("/").filter(Boolean)
43
+ if (segments.length < 2) {
44
+ return null
45
+ }
46
+
47
+ return toResult(segments[0], segments[1])
48
+ } catch {
49
+ return null
50
+ }
20
51
  }
@@ -1,59 +0,0 @@
1
- # AGENTS.md
2
-
3
- pondorasti owns this.
4
-
5
- ## Agent Protocol
6
-
7
- - Contact: Alexandru Turcanu, @pondorsti, [pondorasti@gmail.com](mailto:pondorasti@gmail.com)
8
- - Work style: telegraph; noun-phrases ok; drop grammar; min tokens.
9
- - Commits: Conventional Commits (`feat`, `fix`, `refactor`, `build`, `ci`, `chore`, `docs`, `style`, `perf`, `test`).
10
- - Use the system command `trash` for deletes
11
- - Remove human from the loop and prefer end-to-end verify; if blocked, say what’s missing.
12
- - Keep files <~500 LOC; split/refactor as needed.
13
-
14
- ## Git
15
-
16
- - Safe by default: `git status/diff/log`.
17
- - Push only when the user asks.
18
- - Branch changes require user consent.
19
- - Don’t delete/rename unexpected stuff; stop + ask.
20
- - Destructive ops forbidden unless explicit (`reset --hard`, `clean`, `restore`, `rm`, `amend` etc).
21
- - If user types a command (“pull and push”), that’s consent for that command.
22
-
23
- ## **macOS Permissions / Signing (TCC)**
24
-
25
- - Never re-sign / ad-hoc sign / change bundle ID as “debug” without explicit ok (can mess TCC).
26
-
27
- ## **Critical Thinking**
28
-
29
- - Fix root cause (not band-aid).
30
- - Unsure: read more code; if still stuck, ask w/ short options.
31
- - Conflicts: call out; pick safer path.
32
- - Unrecognized changes: assume other agent; keep going; focus your changes. If it causes issues, stop + ask user.
33
- - Leave breadcrumb notes in thread.
34
-
35
- ## Tools
36
-
37
- Leverage the help menu of each tool to learn how to use it.
38
-
39
- ### gh
40
-
41
- GitHub CLI for PRs, CI, Releases.
42
-
43
- When someone shares a GitHub URL, use `gh` to read it:
44
-
45
- ```jsx
46
- gh issue view <url> --comments
47
- gh pr view <url> --comments --files
48
- gh run list / gh run view <id>
49
- ```
50
-
51
- ### pd
52
-
53
- Personal CLI for pondorasti
54
-
55
- When you need to clone a repo, use `pd clone` to automatically clone the repo in the correct directory.
56
-
57
- ### trash
58
-
59
- Move files to trash using the system command.
@@ -1,95 +0,0 @@
1
- ---
2
- name: create-cli
3
- description: >
4
- Design command-line interface parameters and UX: arguments, flags, subcommands,
5
- help text, output formats, error messages, exit codes, prompts, config/env
6
- precedence, and safe/dry-run behavior. Use when you're designing a CLI spec
7
- (before implementation) or refactoring an existing CLI's surface area for
8
- consistency, composability, and discoverability.
9
- metadata:
10
- author: steipete
11
- ---
12
-
13
- # Create CLI
14
-
15
- Design CLI surface area (syntax + behavior), human-first, script-friendly.
16
-
17
- ## Do This First
18
-
19
- - Read `references/cli-guidelines.md` and apply it as the default rubric.
20
- - Upstream/full guidelines: https://clig.dev/ (propose changes: https://github.com/cli-guidelines/cli-guidelines)
21
- - Ask only the minimum clarifying questions needed to lock the interface.
22
-
23
- ## Clarify (fast)
24
-
25
- Ask, then proceed with best-guess defaults if user is unsure:
26
-
27
- - Command name + one-sentence purpose.
28
- - Primary user: humans, scripts, or both.
29
- - Input sources: args vs stdin; files vs URLs; secrets (never via flags).
30
- - Output contract: human text, `--json`, `--plain`, exit codes.
31
- - Interactivity: prompts allowed? need `--no-input`? confirmations for destructive ops?
32
- - Config model: flags/env/config-file; precedence; XDG vs repo-local.
33
- - Platform/runtime constraints: macOS/Linux/Windows; single binary vs runtime.
34
-
35
- ## Deliverables (what to output)
36
-
37
- When designing a CLI, produce a compact spec the user can implement:
38
-
39
- - Command tree + USAGE synopsis.
40
- - Args/flags table (types, defaults, required/optional, examples).
41
- - Subcommand semantics (what each does; idempotence; state changes).
42
- - Output rules: stdout vs stderr; TTY detection; `--json`/`--plain`; `--quiet`/`--verbose`.
43
- - Error + exit code map (top failure modes).
44
- - Safety rules: `--dry-run`, confirmations, `--force`, `--no-input`.
45
- - Config/env rules + precedence (flags > env > project config > user config > system).
46
- - Shell completion story (if relevant): install/discoverability; generation command or bundled scripts.
47
- - 5–10 example invocations (common flows; include piped/stdin examples).
48
-
49
- ## Default Conventions (unless user says otherwise)
50
-
51
- - `-h/--help` always shows help and ignores other args.
52
- - `--version` prints version to stdout.
53
- - Primary data to stdout; diagnostics/errors to stderr.
54
- - Add `--json` for machine output; consider `--plain` for stable line-based text.
55
- - Prompts only when stdin is a TTY; `--no-input` disables prompts.
56
- - Destructive operations: interactive confirmation + non-interactive requires `--force` or explicit `--confirm=...`.
57
- - Respect `NO_COLOR`, `TERM=dumb`; provide `--no-color`.
58
- - Handle Ctrl-C: exit fast; bounded cleanup; be crash-only when possible.
59
-
60
- ## Templates (copy into your answer)
61
-
62
- ### CLI spec skeleton
63
-
64
- Fill these sections, drop anything irrelevant:
65
-
66
- 1. **Name**: `mycmd`
67
- 2. **One-liner**: `...`
68
- 3. **USAGE**:
69
- - `mycmd [global flags] <subcommand> [args]`
70
- 4. **Subcommands**:
71
- - `mycmd init ...`
72
- - `mycmd run ...`
73
- 5. **Global flags**:
74
- - `-h, --help`
75
- - `--version`
76
- - `-q, --quiet` / `-v, --verbose` (define exactly)
77
- - `--json` / `--plain` (if applicable)
78
- 6. **I/O contract**:
79
- - stdout:
80
- - stderr:
81
- 7. **Exit codes**:
82
- - `0` success
83
- - `1` generic failure
84
- - `2` invalid usage (parse/validation)
85
- - (add command-specific codes only when actually useful)
86
- 8. **Env/config**:
87
- - env vars:
88
- - config file path + precedence:
89
- 9. **Examples**:
90
- - …
91
-
92
- ## Notes
93
-
94
- - Prefer recommending a parsing library (language-specific) only when asked; otherwise keep this skill language-agnostic.
95
- - If the request is “design parameters”, do not drift into implementation.