Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
1decd77
remove claude web
tommaso-moro Dec 24, 2025
43bea59
Change list workflow runs to allow empty resource id to list all runs…
mattdholloway Dec 29, 2025
73a8f98
build(deps): bump actions/github-script from 7 to 8
dependabot[bot] Dec 29, 2025
af5a6df
Update README.md to hyperlink Open AI Codex installation guide
s-sanjay Dec 28, 2025
587d829
docs: add Docker image name to Prerequisites section
majiayu000 Dec 30, 2025
953d26f
fix: use gh pr checkout to handle fork PRs in license-check workflow
Copilot Dec 31, 2025
2cc6911
refactor: use consistent snake_case for issue_number parameter
majiayu000 Dec 30, 2025
30712de
docs: regenerate README after parameter rename
majiayu000 Dec 31, 2025
762845a
Add API Error annotations to GitHub issue errors (#1566)
omgitsads Jan 2, 2026
92bdc28
add docs for Rovo Dev CLI installation
atinylittleshell Aug 13, 2025
116c574
fix: filterToolsByName returns all matching tools for feature flag fi…
majiayu000 Jan 1, 2026
cac11f2
exclude tools requiring ff from docs
mattdholloway Jan 2, 2026
6f7bf27
refactor docs toolset gen
mattdholloway Jan 2, 2026
67f3427
Update cmd/github-mcp-server/generate_docs.go
mattdholloway Jan 2, 2026
905a08f
Update cmd/github-mcp-server/generate_docs.go
mattdholloway Jan 2, 2026
2b352ab
Improvements to push_files tool (#1676)
almaleksia Jan 5, 2026
eb6db0f
Add scopes package and update ServerTool struct with scope fields
Copilot Dec 23, 2025
1e5931a
Update most tools with OAuth scope information
Copilot Dec 23, 2025
db9f4e8
Complete OAuth scope implementation for all tools
Copilot Dec 23, 2025
db179be
Simplify scope implementation per feedback
Copilot Dec 23, 2025
c765101
refresh readme after rebase
SamMorrowDrums Jan 5, 2026
7796c08
Add scope hierarchy and auto-derive accepted scopes
SamMorrowDrums Jan 5, 2026
3d1ae30
refres readme after update
SamMorrowDrums Jan 5, 2026
df9fc6a
Use repo scope for star/unstar tools instead of public_repo
SamMorrowDrums Jan 5, 2026
cec5a1a
Fix conflict and regenerate docs after rebase
SamMorrowDrums Jan 5, 2026
48744ca
Sort scope slices for deterministic output
SamMorrowDrums Jan 5, 2026
46b8cb6
Add PAT scope filtering for stdio server
SamMorrowDrums Jan 5, 2026
a19a159
Enable scope filtering by default
SamMorrowDrums Jan 5, 2026
f45b94a
Make scope filtering always enabled (remove flag)
SamMorrowDrums Jan 5, 2026
8afb4fb
Only check scopes for classic PATs (ghp_ prefix)
SamMorrowDrums Jan 5, 2026
39fed35
Remove manual scope-to-tools table from docs
SamMorrowDrums Jan 5, 2026
c2450ce
Update pkg/scopes/filter.go
SamMorrowDrums Jan 5, 2026
acd7929
Document that GitHub App and server-to-server tokens are not filtered
SamMorrowDrums Jan 5, 2026
f14f507
Add tip about editing PAT scopes in GitHub UI
SamMorrowDrums Jan 5, 2026
4deaa83
Remove empty filter.go and document OAuth scope challenges
SamMorrowDrums Jan 5, 2026
9aef435
Fix server-configuration.md scope filtering description
SamMorrowDrums Jan 5, 2026
c809766
Mention OAuth scope challenges in server-configuration.md
SamMorrowDrums Jan 5, 2026
c428f72
Don't filter read-only repo tools (work on public repos without scope)
SamMorrowDrums Jan 5, 2026
7d4a4a6
Document public repo access quirk for read-only tools
SamMorrowDrums Jan 5, 2026
80b0306
Replace go-github-mock with stretchr/testify for actions/issues/proje…
Copilot Jan 6, 2026
66a0164
initial projects consolidation
mattdholloway Dec 31, 2025
3cd0be2
update tool aliases
mattdholloway Dec 31, 2025
304f074
hold-bac feature flag
mattdholloway Jan 5, 2026
7b30c93
update docs
mattdholloway Jan 5, 2026
099f995
revert "hold-bac feature flag"
mattdholloway Jan 5, 2026
be5a449
fix project tools to add scope to newtool init
mattdholloway Jan 5, 2026
a57b472
add http resp code checking for getProjectItem
mattdholloway Jan 6, 2026
71862a9
update tests to use new mock pattern
mattdholloway Jan 6, 2026
ab23070
Update command instructions for terminal usage
floriangrousset Oct 25, 2025
cc9e864
Fix nil pointer dereference in completion handler
SamMorrowDrums Jan 7, 2026
f2ff9d2
updated (#1756)
tommaso-moro Jan 8, 2026
ee8f4e6
Add list-scopes command using inventory architecture
Copilot Jan 6, 2026
d2df189
Add list_scopes.go implementation file
Copilot Jan 6, 2026
cd75b9b
Refactor formatToolsetName to shared helper function
Copilot Jan 6, 2026
33014a6
Add helpers.go with shared formatToolsetName function
Copilot Jan 6, 2026
ff0e67e
Add formatScopeDisplay helper and improve empty scope handling
Copilot Jan 6, 2026
e335503
Update Claude Code installation command to use add-json format for v2…
Copilot Jan 8, 2026
c061804
Use default scope in examples and clarify --scope flag is optional
Copilot Jan 8, 2026
b1ab893
bug fix (#1775)
tommaso-moro Jan 9, 2026
44d9e13
Bringing back local mcp server registry config (#1767)
almaleksia Jan 9, 2026
8058d30
Update automation to use toolset IDs instead of display names
Copilot Jan 10, 2026
676956f
Fix resource handler to use deps from context
SamMorrowDrums Jan 9, 2026
53a6720
fix: keep all resources registered for resources/read requests
SamMorrowDrums Jan 12, 2026
c44ce2e
chore: remove unused filterResourcesByURI function
SamMorrowDrums Jan 12, 2026
88d117b
Add base_ref support to assign_copilot_to_issue tool
Copilot Jan 10, 2026
d18f26e
Add GraphQL-Features header support for agent assignment API
Copilot Jan 12, 2026
f62ff63
Regenerate documentation TOCs
SamMorrowDrums Jan 12, 2026
27950fe
README.md to Y3tik Khairha
haith17 Jan 12, 2026
dc55261
README.md to Y3tik Khairha
haith17 Jan 12, 2026
457a1cb
Create jons
haith17 Feb 4, 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
313 changes: 313 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
"use client"

import type React from "react"

import { useState } from "react"
import { useRouter, useSearchParams } from "next/navigation"
import { createClient } from "@/lib/supabase"
import Link from "next/link"

export default function OwnerInfoContent() {
const router = useRouter()
const searchParams = useSearchParams()

const [formData, setFormData] = useState({
full_name: "",
date_of_birth: "",
id_number: "",
phone: "",
email: "",
nationality: "",
gender: "male",
has_partners: false,
partners: [] as Array<{ name: string; id_number: string; ownership_percentage: string }>,
agree_terms: false,
agree_privacy: false,
})

const [isLoading, setIsLoading] = useState(false)
const [error, setError] = useState("")

const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {
const { name, value, type } = e.target
const val = type === "checkbox" ? (e.target as HTMLInputElement).checked : value

setFormData((prev) => ({
...prev,
[name]: val,
}))
}

const handleAddPartner = () => {
setFormData((prev) => ({
...prev,
partners: [
...prev.partners,
{
name: "",
id_number: "",
ownership_percentage: "",
},
],
}))
}

const handlePartnerChange = (index: number, field: string, value: string) => {
setFormData((prev) => {
const newPartners = [...prev.partners]
newPartners[index] = { ...newPartners[index], [field]: value }
return { ...prev, partners: newPartners }
})
}

const handleRemovePartner = (index: number) => {
setFormData((prev) => ({
...prev,
partners: prev.partners.filter((_, i) => i !== index),
}))
}

const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
setError("")

if (!formData.agree_terms || !formData.agree_privacy) {
setError("ظٹط¬ط¨ ط§ظ„ظ…ظˆط§ظپظ‚ط© ط¹ظ„ظ‰ ط§ظ„ط´ط±ظˆط· ظˆط§ظ„ط®طµظˆطµظٹط©")
return
}

setIsLoading(true)

try {
const supabase = createClient()
const {
data: { user },
} = await supabase.auth.getUser()

if (!user) {
throw new Error("User not authenticated")
}

router.push("/dashboard/owner/setup/payment")
} catch (err) {
setError("ط­ط¯ط« ط®ط·ط£. ظٹط±ط¬ظ‰ ط§ظ„ظ…ط­ط§ظˆظ„ط© ظ…ط±ط© ط£ط®ط±ظ‰.")
} finally {
setIsLoading(false)
}
}

return (
<div className="min-h-screen bg-background py-12 px-4">
<div className="max-w-2xl mx-auto">
<div className="mb-8">
<h1 className="text-3xl font-bold text-foreground mb-2">ظ…ط¹ظ„ظˆظ…ط§طھ ط§ظ„ظ…ط§ظ„ظƒ</h1>
<p className="text-foreground-secondary">ط§ظ„ط®ط·ظˆط© 4 ظ…ظ† 4</p>
</div>

<form onSubmit={handleSubmit} className="space-y-4">
{error && <div className="p-3 bg-error/10 border border-error rounded-lg text-error text-sm">{error}</div>}

{/* ط§ظ„ط¨ظٹط§ظ†ط§طھ ط§ظ„ط£ط³ط§ط³ظٹط© */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label className="block text-sm font-medium text-foreground mb-2">ط§ظ„ط§ط³ظ… ط§ظ„ظƒط§ظ…ظ„</label>
<input
type="text"
name="full_name"
value={formData.full_name}
onChange={handleInputChange}
required
className="w-full px-4 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
/>
</div>
<div>
<label className="block text-sm font-medium text-foreground mb-2">طھط§ط±ظٹط® ط§ظ„ظ…ظٹظ„ط§ط¯</label>
<input
type="date"
name="date_of_birth"
value={formData.date_of_birth}
onChange={handleInputChange}
required
className="w-full px-4 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
/>
</div>
</div>

{/* ط§ظ„ظ‡ظˆظٹط© ظˆط§ظ„ط§طھطµط§ظ„ */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<div>
<label className="block text-sm font-medium text-foreground mb-2">ط±ظ‚ظ… ط§ظ„ظ‡ظˆظٹط©</label>
<input
type="text"
name="id_number"
value={formData.id_number}
onChange={handleInputChange}
required
className="w-full px-4 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
/>
</div>
<div>
<label className="block text-sm font-medium text-foreground mb-2">ط±ظ‚ظ… ط§ظ„ط¬ظˆط§ظ„</label>
<input
type="tel"
name="phone"
value={formData.phone}
onChange={handleInputChange}
required
className="w-full px-4 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
/>
</div>
<div>
<label className="block text-sm font-medium text-foreground mb-2">ط§ظ„ط¨ط±ظٹط¯ ط§ظ„ط¥ظ„ظƒطھط±ظˆظ†ظٹ</label>
<input
type="email"
name="email"
value={formData.email}
onChange={handleInputChange}
required
className="w-full px-4 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
/>
</div>
</div>

{/* ط§ظ„ط¬ظ†ط³ظٹط© ظˆط§ظ„ظ†ظˆط¹ */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label className="block text-sm font-medium text-foreground mb-2">ط§ظ„ط¬ظ†ط³ظٹط©</label>
<input
type="text"
name="nationality"
value={formData.nationality}
onChange={handleInputChange}
className="w-full px-4 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
/>
</div>
<div>
<label className="block text-sm font-medium text-foreground mb-2">ط§ظ„ط¬ظ†ط³</label>
<select
name="gender"
value={formData.gender}
onChange={handleInputChange}
className="w-full px-4 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
>
<option value="male">ط°ظƒط±</option>
<option value="female">ط£ظ†ط«ظ‰</option>
</select>
</div>
</div>

{/* ظ‡ظ„ ظ„ط¯ظٹظƒ ط´ط±ظƒط§ط، */}
<div className="p-4 border border-border rounded-lg bg-background-secondary">
<label className="flex items-center gap-3 cursor-pointer">
<input
type="checkbox"
name="has_partners"
checked={formData.has_partners}
onChange={handleInputChange}
className="w-5 h-5 rounded border-border"
/>
<span className="font-medium text-foreground">ظ‡ظ„ ظ„ط¯ظٹظƒ ط´ط±ظƒط§ط، ظپظٹ ط§ظ„ظ…ظ†ط´ط£ط©طں</span>
</label>
</div>

{/* ط¨ظٹط§ظ†ط§طھ ط§ظ„ط´ط±ظƒط§ط، */}
{formData.has_partners && (
<div className="space-y-4 p-4 border border-primary/50 rounded-lg bg-primary/5">
{formData.partners.map((partner, index) => (
<div key={index} className="space-y-3 p-4 bg-background rounded-lg border border-border">
<div className="grid grid-cols-1 md:grid-cols-3 gap-3">
<input
type="text"
placeholder="ط§ط³ظ… ط§ظ„ط´ط±ظٹظƒ"
value={partner.name}
onChange={(e) => handlePartnerChange(index, "name", e.target.value)}
className="px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
/>
<input
type="text"
placeholder="ط±ظ‚ظ… ط§ظ„ظ‡ظˆظٹط©"
value={partner.id_number}
onChange={(e) => handlePartnerChange(index, "id_number", e.target.value)}
className="px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
/>
<input
type="number"
placeholder="ظ†ط³ط¨ط© ط§ظ„ظ…ظ„ظƒظٹط© %"
value={partner.ownership_percentage}
onChange={(e) => handlePartnerChange(index, "ownership_percentage", e.target.value)}
className="px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:outline-none focus:border-primary"
min="0"
max="100"
/>
</div>
<button
type="button"
onClick={() => handleRemovePartner(index)}
className="text-sm text-error hover:text-error/80"
>
ط­ط°ظپ ط§ظ„ط´ط±ظٹظƒ
</button>
</div>
))}
<button
type="button"
onClick={handleAddPartner}
className="w-full py-2 border-2 border-dashed border-primary text-primary rounded-lg font-semibold hover:bg-primary/5 transition-colors"
>
ط¥ط¶ط§ظپط© ط´ط±ظٹظƒ
</button>
</div>
)}

{/* ط§ظ„ظ…ظˆط§ظپظ‚ط§طھ */}
<div className="space-y-3 p-4 bg-background-secondary rounded-lg">
<label className="flex items-start gap-3 cursor-pointer">
<input
type="checkbox"
name="agree_terms"
checked={formData.agree_terms}
onChange={handleInputChange}
className="w-5 h-5 mt-1 rounded border-border"
/>
<span className="text-sm text-foreground">
ط£ظˆط§ظپظ‚ ط¹ظ„ظ‰ <span className="font-semibold">ط§ظ„ط´ط±ظˆط· ظˆط§ظ„ط£ط­ظƒط§ظ…</span>
</span>
</label>
<label className="flex items-start gap-3 cursor-pointer">
<input
type="checkbox"
name="agree_privacy"
checked={formData.agree_privacy}
onChange={handleInputChange}
className="w-5 h-5 mt-1 rounded border-border"
/>
<span className="text-sm text-foreground">
ط£ظˆط§ظپظ‚ ط¹ظ„ظ‰ <span className="font-semibold">ط³ظٹط§ط³ط© ط­ظ…ط§ظٹط© ط§ظ„ط®طµظˆطµظٹط©</span>
</span>
</label>
</div>

{/* ط£ط²ط±ط§ط± ط§ظ„طھظ†ظ‚ظ„ */}
<div className="flex gap-4 mt-8">
<Link
href={`/dashboard/owner/setup/step-3-business-info?${searchParams.toString()}`}
className="flex-1 py-2 border-2 border-border text-foreground rounded-lg font-semibold hover:border-primary transition-colors text-center"
>
ط§ظ„ط³ط§ط¨ظ‚
</Link>
<button
type="submit"
disabled={isLoading}
className="flex-1 py-2 bg-primary text-background rounded-lg font-semibold hover:bg-primary-hover transition-colors disabled:opacity-50"
>
{isLoading ? "ط¬ط§ط±ظٹ..." : "ط§ظ„طھط§ظ„ظٹ ط¥ظ„ظ‰ ط§ظ„ط¯ظپط¹"}
</button>
</div>
</form>
</div>
</div>
)
}{
"image": "mcr.microsoft.com/devcontainers/universal:2",
"features": {}
}
12 changes: 8 additions & 4 deletions .github/workflows/license-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,12 @@ jobs:
steps:
- name: Check out code
uses: actions/checkout@v6
with:
ref: ${{ github.head_ref }}

# Check out the actual PR branch so we can push changes back if needed
- name: Check out PR branch
env:
GH_TOKEN: ${{ github.token }}
run: gh pr checkout ${{ github.event.pull_request.number }}

- name: Set up Go
uses: actions/setup-go@v6
Expand Down Expand Up @@ -63,7 +67,7 @@ jobs:
- name: Check if already commented
if: steps.changes.outcome == 'failure' && steps.push.outcome == 'failure'
id: check_comment
uses: actions/github-script@v7
uses: actions/github-script@v8
with:
script: |
const { data: comments } = await github.rest.issues.listComments({
Expand All @@ -81,7 +85,7 @@ jobs:

- name: Comment with instructions if cannot push
if: steps.changes.outcome == 'failure' && steps.push.outcome == 'failure' && steps.check_comment.outputs.already_commented == 'false'
uses: actions/github-script@v7
uses: actions/github-script@v8
with:
script: |
await github.rest.issues.createComment({
Expand Down
Loading