Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
daa1b05
Bootstrap Context Panel repo
cbusillo May 5, 2026
1724124
Capture Context Panel product direction
cbusillo May 5, 2026
9f6ffad
Research provider usage access
cbusillo May 5, 2026
5cfe4fc
Capture design direction
cbusillo May 5, 2026
9655f99
Add native preview shell
cbusillo May 5, 2026
4a8e83d
Add fast mode forecast model
cbusillo May 5, 2026
11fd150
Design local subscription limit probe
cbusillo May 5, 2026
c36ea9e
Add OpenAI limit probe prototype
cbusillo May 5, 2026
5dc9c1c
Make limit probe keyboard accessible
cbusillo May 5, 2026
f5f52b8
Capture sanitized network probe shapes
cbusillo May 5, 2026
e921749
Redact identifiers from network probe fields
cbusillo May 5, 2026
ed09def
Include network candidates in probe reports
cbusillo May 5, 2026
56b2f4b
Clarify Every Code rate limit source
cbusillo May 5, 2026
ff4beda
Focus Codex connector on Every Code cache
cbusillo May 5, 2026
f19f303
Prioritize live Codex rate limit API
cbusillo May 6, 2026
696dab2
Add direct Codex rate limit probe
cbusillo May 6, 2026
577773b
Model OpenAI usage as percent pressure
cbusillo May 6, 2026
d1580bd
Add Gemini and Claude provider probes
cbusillo May 6, 2026
d25f22f
Document Gemini probe credential inputs
cbusillo May 6, 2026
fa349eb
Extract provider connector runtime
cbusillo May 6, 2026
ecc6ab5
Add local snapshot store
cbusillo May 6, 2026
b15860e
Wire preview app to snapshot cache
cbusillo May 6, 2026
b95d524
Use cached OpenAI limits for fast mode forecast
cbusillo May 6, 2026
cc40192
Add local account configuration store
cbusillo May 6, 2026
0e81b79
Add WidgetKit snapshot glance
cbusillo May 6, 2026
3e216f5
Refine widget rate-limit decision UX
cbusillo May 6, 2026
b6722a9
Load local Gemini client metadata
cbusillo May 6, 2026
6743338
Clarify Claude allowance status
cbusillo May 6, 2026
12243da
Add Claude subscription statusline cache
cbusillo May 6, 2026
0e0b32d
Mark stale Claude subscription snapshots
cbusillo May 6, 2026
5a4d139
Add Every Code Claude usage estimate
cbusillo May 6, 2026
90ac709
Add Claude web usage parser
cbusillo May 6, 2026
854c2eb
Add Claude web usage probe
cbusillo May 6, 2026
c04f7e2
Merge provider snapshots by account
cbusillo May 6, 2026
48cb431
Add in-app Claude web capture
cbusillo May 6, 2026
5dda537
Add signed app packaging script
cbusillo May 7, 2026
1c39c95
Ignore packaged app artifacts
cbusillo May 7, 2026
40e8ec0
Add native app widget packaging
cbusillo May 7, 2026
9a668f7
Merge pull request #14 from cbusillo/feature/openai-limit-probe
cbusillo May 7, 2026
59e73e3
Merge pull request #13 from cbusillo/design/local-limit-probe
cbusillo May 7, 2026
0bb0972
Merge pull request #11 from cbusillo/feature/fast-mode-forecast
cbusillo May 7, 2026
068d0b8
Merge pull request #10 from cbusillo/feature/native-preview-shell
cbusillo May 7, 2026
c5cc476
Merge pull request #8 from cbusillo/research/provider-usage-access
cbusillo May 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
version: 2

updates:
- package-ecosystem: swift
directory: "/"
open-pull-requests-limit: 2
schedule:
interval: weekly
labels:
- dependencies
- swift
groups:
all-version-updates:
patterns:
- "*"
all-security-updates:
applies-to: security-updates
patterns:
- "*"

- package-ecosystem: github-actions
directory: "/"
open-pull-requests-limit: 2
schedule:
interval: weekly
labels:
- dependencies
- github-actions
groups:
all-version-updates:
patterns:
- "*"
all-security-updates:
applies-to: security-updates
patterns:
- "*"
68 changes: 68 additions & 0 deletions .github/github-repo-workflow.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
{
"defaultBranch": "main",
"projectType": "native-macos-app",
"docs": {
"agentNotes": "AGENTS.md",
"index": "docs/README.md",
"productGoals": "docs/product-goals.md",
"architecture": "docs/architecture.md",
"designDirection": "docs/design-direction.md",
"localLimitProbe": "docs/local-limit-probe.md",
"providerUsageAccess": "docs/provider-usage-access.md",
"repoSettings": "docs/repo-settings.md"
},
"qualityGate": {
"build": {
"default": "swift build"
},
"test": {
"default": "swift test"
},
"validate": {
"default": "scripts/commit-gate.sh"
},
"docsRequiredWhen": [
"provider behavior changes",
"provider account model changes",
"credential storage changes",
"user-visible UI changes",
"widget layout changes",
"release or signing changes"
]
},
"importantWorkflows": ["CI", "CodeQL"],
"qaLabels": [],
"deployLabels": [],
"healthUrls": [],
"validatedThrough": [],
"githubSignals": {
"postMerge": {
"waitForActions": true,
"checkSecurityAndQuality": true
},
"capabilities": {
"codeScanning": "available",
"secretScanning": "available",
"dependabotAlerts": "available",
"securityAdvisories": "available"
},
"refreshWhen": [
"repo visibility changes",
"GitHub plan changes",
"security settings change",
"token permissions change"
]
},
"cleanup": {
"deleteMergedLocalBranches": true,
"removeMergedCleanWorktrees": true
},
"metadataFreshness": {
"updateWhen": [
"validation gates change",
"important workflows change",
"repo relationship changes",
"ownership boundaries change"
]
}
}
29 changes: 29 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
name: CI

"on":
pull_request:
push:
branches:
- main
workflow_dispatch:

permissions:
contents: read

jobs:
swift:
runs-on: macos-latest

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Select Xcode
run: sudo xcode-select -s /Applications/Xcode.app

- name: Build
run: swift build

- name: Test
run: swift test
37 changes: 37 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
name: CodeQL

"on":
pull_request:
push:
branches:
- main
schedule:
- cron: "31 9 * * 1"
workflow_dispatch:

permissions:
actions: read
contents: read
security-events: write

jobs:
analyze:
name: Analyze Swift
runs-on: macos-latest
timeout-minutes: 360

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: swift

- name: Autobuild
uses: github/codeql-action/autobuild@v4

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.DS_Store
.build/
DerivedData/
*.xcuserdata/
*.xcuserstate
*.xcodeproj/project.xcworkspace/xcuserdata/
*.xcodeproj/xcuserdata/
*.xcworkspace/xcuserdata/
.swiftpm/
.idea/
dist/
59 changes: 59 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Context Panel Agent Notes

## Product Shape

Context Panel is a native macOS app plus WidgetKit extension for tracking AI
usage limits across providers. Treat multi-account support as a core product
requirement, not a later enhancement. The initial provider set is OpenAI,
Anthropic, and Google.

The widget is for glanceable state: remaining capacity, limit pressure, reset
time, and whether refreshes are healthy. The app is for setup and detail:
multiple logins, credential management, provider diagnostics, detailed charts,
history, and settings.

## Engineering Defaults

- Keep the repo native-first. Do not add web or Docker surfaces unless Chris
explicitly asks for them.
- Prefer Swift, SwiftUI, WidgetKit, and Swift Package Manager.
- Keep provider-specific behavior behind adapters. Shared UI and storage should
consume normalized provider/account/limit snapshots.
- Keep credentials local. Favor Keychain-backed storage for secrets and avoid
logging tokens, account identifiers, or raw provider responses that may expose
sensitive data.
- Model unknown and degraded states explicitly. Provider APIs and unofficial
usage surfaces can change; the UI should make stale or partial data obvious.
- Design for multiple accounts per provider from the data model up through the
widget layout.

## UX Direction

- The widget should be beautiful, dense, and calm: compact charts, rings, bars,
sparklines, reset countdowns, and provider/account grouping where useful.
- For weekly or rolling account limits, include forecast language that helps the
user decide whether higher-burn modes are safe before reset.
- Avoid making the widget a dashboard crammed into a rectangle. Put setup,
troubleshooting, raw details, and long histories in the app.
- Clicking the widget should open the app to the most relevant provider/account
detail.
- Prefer plain status language: available, close to limit, limited, unknown,
stale, refreshing.

## Validation

Run the commit gate before publishing changes:

```sh
scripts/commit-gate.sh
```

For UI work, also run the native app/widget locally and inspect the actual macOS
presentation before calling the work ready.

## Repo Workflow

- Default branch: `main`.
- Work on focused branches and open pull requests.
- Keep `.github/github-repo-workflow.json` current when docs, validation gates,
important workflows, or repo ownership assumptions change.
12 changes: 12 additions & 0 deletions Config/ContextPanel.entitlements
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<false/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.shinycomputers.contextpanel</string>
</array>
</dict>
</plist>
27 changes: 27 additions & 0 deletions Config/ContextPanelWidget-Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widgetkit-extension</string>
</dict>
</dict>
</plist>
12 changes: 12 additions & 0 deletions Config/ContextPanelWidget.entitlements
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.shinycomputers.contextpanel</string>
</array>
</dict>
</plist>
Loading