pondorasti 0.1.36 → 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
@@ -18,6 +19,7 @@ brew "rbenv" # Ruby version manager - simple, light
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
20
21
  brew "flyctl" # Fly.io CLI for app deployment and infrastructure management
22
+ brew "cloudflare-wrangler" # Cloudflare Wrangler CLI for Workers development and deployment
21
23
  brew "mysql" # Open source relational database management system
22
24
  brew "anomalyco/tap/opencode" # Open source code editor/IDE
23
25
 
@@ -44,7 +46,6 @@ cask "cursor" # AI-powered code editor built to make
44
46
  cask "zed" # High-performance code editor designed for collaboration with humans and AI
45
47
  cask "claude" # Claude AI assistant desktop application
46
48
  cask "claude-code" # Claude AI coding assistant for the terminal
47
- cask "clawdbot" # Personal AI assistant with menu bar control and voice wake
48
49
  cask "codex" # OpenAI's Codex CLI - coding agent that runs in your terminal
49
50
  cask "opencode-desktop" # Desktop app for OpenCode AI coding assistant
50
51
  cask "android-studio" # Official IDE for Android app development
@@ -8,5 +8,6 @@
8
8
  "model": "opus",
9
9
  "enabledPlugins": {
10
10
  "swift-lsp@claude-plugins-official": true
11
- }
11
+ },
12
+ "skipDangerousModePermissionPrompt": true
12
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" },
@@ -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.36",
3
+ "version": "0.1.37",
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",
@@ -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.