pondorasti 0.1.35 → 0.1.37

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.
package/Brewfile CHANGED
@@ -5,6 +5,7 @@ tap "anomalyco/tap" # Tap for opencode and related tools
5
5
  # Development Tools
6
6
  brew "lazygit" # Terminal UI for git commands - makes git operations visual and intuitive
7
7
  brew "docker" # Docker CLI - command-line interface for interacting with Docker
8
+ brew "colima" # Docker-compatible container runtime for macOS using Lima
8
9
  cask "orbstack" # Fast, lightweight Docker & Linux VM runtime for macOS
9
10
  brew "lazydocker" # Terminal UI for Docker - manage containers, images, and volumes easily
10
11
  brew "neovim" # Hyperextensible Vim-based text editor - modern fork with better plugin support
@@ -17,6 +18,8 @@ brew "fnm" # Fast Node Manager - simple, fast Nod
17
18
  brew "rbenv" # Ruby version manager - simple, lightweight Ruby environment manager
18
19
  brew "stripe/stripe-cli/stripe" # Stripe CLI for testing and managing Stripe resources
19
20
  brew "supabase" # Supabase CLI for local development and deployment
21
+ brew "flyctl" # Fly.io CLI for app deployment and infrastructure management
22
+ brew "cloudflare-wrangler" # Cloudflare Wrangler CLI for Workers development and deployment
20
23
  brew "mysql" # Open source relational database management system
21
24
  brew "anomalyco/tap/opencode" # Open source code editor/IDE
22
25
 
@@ -43,7 +46,6 @@ cask "cursor" # AI-powered code editor built to make
43
46
  cask "zed" # High-performance code editor designed for collaboration with humans and AI
44
47
  cask "claude" # Claude AI assistant desktop application
45
48
  cask "claude-code" # Claude AI coding assistant for the terminal
46
- cask "clawdbot" # Personal AI assistant with menu bar control and voice wake
47
49
  cask "codex" # OpenAI's Codex CLI - coding agent that runs in your terminal
48
50
  cask "opencode-desktop" # Desktop app for OpenCode AI coding assistant
49
51
  cask "android-studio" # Official IDE for Android app development
@@ -1,9 +1,13 @@
1
1
  {
2
+ "env": {
3
+ "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
4
+ },
2
5
  "permissions": {
3
6
  "defaultMode": "dontAsk"
4
7
  },
5
8
  "model": "opus",
6
9
  "enabledPlugins": {
7
10
  "swift-lsp@claude-plugins-official": true
8
- }
11
+ },
12
+ "skipDangerousModePermissionPrompt": true
9
13
  }
@@ -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
  }
@@ -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" },
@@ -12,5 +12,11 @@ return {
12
12
  opts.picker.sources = opts.picker.sources or {}
13
13
  opts.picker.sources.explorer = opts.picker.sources.explorer or {}
14
14
  opts.picker.sources.explorer.layout = "sidebar"
15
+ opts.picker.sources.explorer.hidden = true
16
+ opts.picker.sources.explorer.ignored = false
17
+
18
+ opts.picker.sources.files = opts.picker.sources.files or {}
19
+ opts.picker.sources.files.hidden = true
20
+ opts.picker.sources.files.ignored = false
15
21
  end,
16
22
  }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "permission": "allow"
4
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pondorasti",
3
- "version": "0.1.35",
3
+ "version": "0.1.37",
4
4
  "description": "CLI for pondorasti",
5
5
  "author": "Alexandru Ţurcanu",
6
6
  "license": "MIT",
@@ -31,14 +31,14 @@
31
31
  "build:sign": "codesign --deep --force --sign - --entitlements entitlements.plist dist/pd"
32
32
  },
33
33
  "dependencies": {
34
- "ink": "^6.6.0",
35
- "ink-gradient": "^3.0.0",
34
+ "ink": "^6.8.0",
35
+ "ink-gradient": "^4.0.0",
36
36
  "ink-spinner": "^5.0.0",
37
- "react": "^19.2.3",
37
+ "react": "^19.2.4",
38
38
  "yargs": "^18.0.0"
39
39
  },
40
40
  "devDependencies": {
41
- "@types/react": "^19.2.7",
41
+ "@types/react": "^19.2.14",
42
42
  "@types/yargs": "^17.0.35"
43
43
  }
44
44
  }
@@ -13,6 +13,7 @@ enum DotfilesPackage {
13
13
  Claude = "claude",
14
14
  Agents = "agents",
15
15
  Nvim = "nvim",
16
+ Opencode = "opencode",
16
17
  }
17
18
 
18
19
  const PACKAGE_TARGET_PATHS: Partial<Record<DotfilesPackage, string>> = {
@@ -20,6 +21,7 @@ const PACKAGE_TARGET_PATHS: Partial<Record<DotfilesPackage, string>> = {
20
21
  [DotfilesPackage.Claude]: "~/.claude",
21
22
  [DotfilesPackage.Agents]: "~/.claude", // OpenCode also reads from ~/.claude/skills/
22
23
  [DotfilesPackage.Nvim]: "~/.config/nvim",
24
+ [DotfilesPackage.Opencode]: "~/.config/opencode",
23
25
  }
24
26
 
25
27
  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,111 +0,0 @@
1
- ---
2
- name: rams
3
- description: Run accessibility and visual design review
4
- metadata:
5
- author: rams.ai
6
- ---
7
-
8
- # Rams Design Review
9
-
10
- You are Rams, an expert design engineer reviewing code for accessibility and visual design issues.
11
-
12
- ## Mode
13
-
14
- If `$ARGUMENTS` is provided, analyze that specific file.
15
- If `$ARGUMENTS` is empty, ask the user which file(s) to review, or offer to scan the project for component files.
16
-
17
- ---
18
-
19
- ## 1. Accessibility Review (WCAG 2.1)
20
-
21
- ### Critical (Must Fix)
22
-
23
- | Check | WCAG | What to look for |
24
- | --------------------------- | ----- | -------------------------------------------------------------------------------- |
25
- | Images without alt | 1.1.1 | `<img>` without `alt` attribute |
26
- | Icon-only buttons | 4.1.2 | `<button>` with only SVG/icon, no `aria-label` |
27
- | Form inputs without labels | 1.3.1 | `<input>`, `<select>`, `<textarea>` without associated `<label>` or `aria-label` |
28
- | Non-semantic click handlers | 2.1.1 | `<div onClick>` or `<span onClick>` without `role`, `tabIndex`, `onKeyDown` |
29
- | Missing link destination | 2.1.1 | `<a>` without `href` using only `onClick` |
30
-
31
- ### Serious (Should Fix)
32
-
33
- | Check | WCAG | What to look for |
34
- | ------------------------- | ----- | ------------------------------------------------------------------- |
35
- | Focus outline removed | 2.4.7 | `outline-none` or `outline: none` without visible focus replacement |
36
- | Missing keyboard handlers | 2.1.1 | Interactive elements with `onClick` but no `onKeyDown`/`onKeyUp` |
37
- | Color-only information | 1.4.1 | Status/error indicated only by color (no icon/text) |
38
- | Touch target too small | 2.5.5 | Clickable elements smaller than 44x44px |
39
-
40
- ### Moderate (Consider Fixing)
41
-
42
- | Check | WCAG | What to look for |
43
- | -------------------------------- | ----- | ------------------------------------------- |
44
- | Heading hierarchy | 1.3.1 | Skipped heading levels (h1 → h3) |
45
- | Positive tabIndex | 2.4.3 | `tabIndex` > 0 (disrupts natural tab order) |
46
- | Role without required attributes | 4.1.2 | `role="button"` without `tabIndex="0"` |
47
-
48
- ---
49
-
50
- ## 2. Visual Design Review
51
-
52
- ### Layout & Spacing
53
-
54
- - Inconsistent spacing values
55
- - Overflow issues, alignment problems
56
- - Z-index conflicts
57
-
58
- ### Typography
59
-
60
- - Mixed font families, weights, or sizes
61
- - Line height issues
62
- - Missing font fallbacks
63
-
64
- ### Color & Contrast
65
-
66
- - Contrast ratio below 4.5:1
67
- - Missing hover/focus states
68
- - Dark mode inconsistencies
69
-
70
- ### Components
71
-
72
- - Missing button states (disabled, loading, hover, active, focus)
73
- - Missing form field states (error, success, disabled)
74
- - Inconsistent borders, shadows, or icon sizing
75
-
76
- ---
77
-
78
- ## Output Format
79
-
80
- ```
81
- ═══════════════════════════════════════════════════
82
- RAMS DESIGN REVIEW: [filename]
83
- ═══════════════════════════════════════════════════
84
-
85
- CRITICAL (X issues)
86
- ───────────────────
87
- [A11Y] Line 24: Button missing accessible name
88
- <button><CloseIcon /></button>
89
- Fix: Add aria-label="Close"
90
- WCAG: 4.1.2
91
-
92
- SERIOUS (X issues)
93
- ──────────────────
94
- ...
95
-
96
- ═══════════════════════════════════════════════════
97
- SUMMARY: X critical, X serious, X moderate
98
- Score: XX/100
99
- ═══════════════════════════════════════════════════
100
- ```
101
-
102
- ---
103
-
104
- ## Guidelines
105
-
106
- 1. Read the file(s) first before making assessments
107
- 2. Be specific with line numbers and code snippets
108
- 3. Provide fixes, not just problems
109
- 4. Prioritize critical accessibility issues first
110
-
111
- If asked, offer to fix the issues directly.