Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
54eff59
feat: agent skills module
KartikJha May 19, 2026
65568f3
fix: added test cases
KartikJha May 19, 2026
3a22cd6
fix: lint fixes
KartikJha May 19, 2026
83a2992
feat: download plugin module
KartikJha May 20, 2026
ba65f16
feat: add skills lock file support
KartikJha May 20, 2026
91dd7ae
feat: skills internal download and lock
KartikJha May 21, 2026
d5d006e
feat: skills directory meta parsing for interactive display while ins…
KartikJha May 22, 2026
e2ebdd3
fix: added review fixes for agent.go
KartikJha Jun 1, 2026
fcdfe2d
fix: added agents review fixes
KartikJha Jun 2, 2026
1062fc9
fix: download internal review fixes
KartikJha Jun 2, 2026
ad36e66
fix: targetDir clone and ref tags vs branches prefix
KartikJha Jun 3, 2026
e5995fb
fix: download module, error handling, symlink corruption in mergeDir,…
KartikJha Jun 4, 2026
59828a9
fix: setupLocalGit test fix
KartikJha Jun 4, 2026
74897c2
fix: naming, scope enum, concurrent lockfile access inter process
KartikJha Jun 4, 2026
37adeb3
fix: skills meta parsing fix, available skills nil fix, skills.md fil…
KartikJha Jun 4, 2026
d7d3eb5
fix: removed quickstart related file changes
KartikJha Jun 4, 2026
12f7415
fix: lint fixes
KartikJha Jun 4, 2026
d08b8f7
fix: removed quickstart comment and gitignore update
KartikJha Jun 4, 2026
4600e66
feat: symlink internal init
KartikJha Jun 4, 2026
185d7f4
fix: symlink review agent fixes
KartikJha Jun 7, 2026
95eb757
fix: use os.samefile for symlink check, remove tmo file in copy dir
KartikJha Jun 7, 2026
a102c8a
feat: validate skills installation
KartikJha Jun 7, 2026
c0227a8
fix: lint fixes
KartikJha Jun 7, 2026
3d65c05
fix: add code fix for failing local github setupLocalGitRepo
KartikJha Jun 11, 2026
b839679
feat: download fallbacks removed, concurrency handing removed, refact…
KartikJha Jun 17, 2026
4d9c678
fix: lint issues
KartikJha Jun 17, 2026
a8f9265
feat: add 'auth0 agent skills install' to set up Auth0 skills (#1539)
KartikJha Aug 12, 2026
5390013
update branch to the latest main
ramya18101 Aug 13, 2026
e82d0ca
chore: comment out quickstart test cases temporarily
ramya18101 Aug 13, 2026
c5ea5aa
resolve conflicts
ramya18101 Aug 13, 2026
d3fcb06
chore: comment out quickstart test cases for temporary exclusion
ramya18101 Aug 13, 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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,5 @@ out/
.github/copilot-instructions.md

# LLM files
.remember/
.remember/

4 changes: 2 additions & 2 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ brews:
(bash_completion/"auth0").write `#{bin}/auth0 completion bash`
(fish_completion/"auth0.fish").write `#{bin}/auth0 completion fish`
(zsh_completion/"_auth0").write `#{bin}/auth0 completion zsh`
caveats: "Thanks for installing the Auth0 CLI"
caveats: "Thanks for installing the Auth0 CLI\n\nTip: run 'auth0 agent skills install' to install the Auth0 skill for your AI coding assistants."

scoops:
- name: auth0
Expand All @@ -69,4 +69,4 @@ scoops:
description: Build, manage and test your Auth0 integrations from the command line
license: MIT
skip_upload: true
post_install: ["Write-Host 'Thanks for installing the Auth0 CLI'"]
post_install: ["Write-Host 'Thanks for installing the Auth0 CLI'", "Write-Host \"Tip: run 'auth0 agent skills install' to install the Auth0 skill for your AI coding assistants.\""]
12 changes: 12 additions & 0 deletions docs/auth0_agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
layout: default
has_toc: false
---
# auth0 agent

Manage Auth0 AI capabilities including skills for your AI coding assistants.

## Commands

- [auth0 agent skills](auth0_agent_skills.md) - Manage Auth0 AI skills for coding assistants

13 changes: 13 additions & 0 deletions docs/auth0_agent_skills.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
layout: default
has_toc: false
has_children: true
---
# auth0 agent skills

Manage Auth0 AI skills that provide Auth0-specific guidance to your AI coding assistants.

## Commands

- [auth0 agent skills install](auth0_agent_skills_install.md) - Install the Auth0 skill for your AI coding assistants

38 changes: 38 additions & 0 deletions docs/auth0_agent_skills_install.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
layout: default
parent: auth0 agent skills
has_toc: false
---
# auth0 agent skills install

Download the Auth0 skill and install it globally into every detected AI coding assistant on this machine.

## Usage
```
auth0 agent skills install [flags]
```

## Examples

```

```




## Inherited Flags

```
--debug Enable debug mode.
--no-color Disable colors.
--no-input Disable interactivity.
--tenant string Specific tenant to use.
```


## Related Commands

- [auth0 agent skills install](auth0_agent_skills_install.md) - Install the Auth0 skill for your AI coding assistants


1 change: 1 addition & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ Authenticating as a user is not supported for **private cloud** tenants. Instead

- [auth0 actions](auth0_actions.md) - Manage resources for actions
- [auth0 acul](auth0_acul.md) - Advanced Customization the Universal Login experience
- [auth0 agent](auth0_agent.md) - Manage Auth0 AI capabilities
- [auth0 api](auth0_api.md) - Makes an authenticated HTTP request to the Auth0 Management API
- [auth0 apis](auth0_apis.md) - Manage resources for APIs
- [auth0 apps](auth0_apps.md) - Manage resources for applications
Expand Down
1 change: 1 addition & 0 deletions install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ execute() {
log_info "installed ${BINDIR}/${binexe}"
done
rm -rf "${tmpdir}"
log_info "Tip: run 'auth0 agent skills install' to install the Auth0 skill for your AI coding assistants."
}
get_binaries() {
case "$PLATFORM" in
Expand Down
276 changes: 276 additions & 0 deletions internal/agent/skills/agent.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,276 @@
package skills

import (
"errors"
"os"
"os/exec"
"os/user"
"path/filepath"
"strconv"

"github.com/auth0/auth0-cli/internal/utils"
)

// copyTree recursively copies the contents of src into dst, creating directories as needed.
func copyTree(src, dst string) error {
entries, err := os.ReadDir(src)
if err != nil {
return err
}
for _, entry := range entries {
srcPath := filepath.Join(src, entry.Name())
dstPath := filepath.Join(dst, entry.Name())
if entry.IsDir() {
if err := os.MkdirAll(dstPath, 0o755); err != nil {
return err
}
if err := copyTree(srcPath, dstPath); err != nil {
return err
}
continue
}
if err := utils.CopyFile(srcPath, dstPath); err != nil {
return err
}
}
return nil
}

type AgentConfig struct {
ID string
DisplayName string
GlobalSkillsDir string
GlobalSkillsDirEnvVar string
DetectMarkers []string
DetectMarkerEnvVars []string
DetectBinaries []string
}

func (a AgentConfig) ResolvedGlobalSkillsDir() (string, error) {
if a.GlobalSkillsDirEnvVar != "" {
if v := os.Getenv(a.GlobalSkillsDirEnvVar); v != "" {
return filepath.Join(v, "skills"), nil
}
}
if a.GlobalSkillsDir == "" {
return "", errors.New("GlobalSkillsDirEnvVar must be set for: " + a.ID)
}
return a.GlobalSkillsDir, nil
}

func (a AgentConfig) IsInstalled() bool {
for _, marker := range a.DetectMarkers {
if marker == "" {
continue
}
if _, err := os.Stat(marker); err == nil {
return true
}
}
for _, envVar := range a.DetectMarkerEnvVars {
if envVar == "" {
continue
}
if v := os.Getenv(envVar); v != "" {
if _, err := os.Stat(v); err == nil {
return true
}
}
}
for _, binary := range a.DetectBinaries {
if binary == "" {
continue
}
if _, err := exec.LookPath(binary); err == nil {
return true
}
}
return false
}

var SupportedAgents []AgentConfig

func homeDir() string {
if u, err := user.LookupId(strconv.Itoa(os.Getuid())); err == nil && u.HomeDir != "" {
return u.HomeDir
}
if h, err := os.UserHomeDir(); err == nil && h != "" {
return h
}
return ""
}

func init() {
home := homeDir()
if home == "" {
SupportedAgents = []AgentConfig{
{ID: "universal", DisplayName: "Universal"},
}
return
}

SupportedAgents = []AgentConfig{
{
ID: "claude-code",
DisplayName: "Claude Code",
GlobalSkillsDir: filepath.Join(home, ".claude", "skills"),
DetectMarkers: []string{filepath.Join(home, ".claude")},
DetectBinaries: []string{"claude"},
},
{
ID: "cursor",
DisplayName: "Cursor",
GlobalSkillsDir: filepath.Join(home, ".cursor", "skills"),
DetectMarkers: []string{filepath.Join(home, ".cursor")},
DetectBinaries: []string{"cursor"},
},
{
ID: "github-copilot",
DisplayName: "GitHub Copilot",
GlobalSkillsDir: filepath.Join(home, ".copilot", "skills"),
DetectMarkers: []string{
filepath.Join(home, ".copilot"),
filepath.Join(home, ".config", "github-copilot"),
},
},
{
ID: "gemini-cli",
DisplayName: "Gemini CLI",
GlobalSkillsDir: filepath.Join(home, ".gemini", "skills"),
DetectMarkers: []string{filepath.Join(home, ".gemini")},
DetectBinaries: []string{"gemini"},
},
{
ID: "antigravity",
DisplayName: "Antigravity",
GlobalSkillsDir: filepath.Join(home, ".gemini", "antigravity", "skills"),
DetectMarkers: []string{filepath.Join(home, ".gemini", "antigravity")},
},
{
ID: "roo",
DisplayName: "Roo Code",
GlobalSkillsDir: filepath.Join(home, ".roo", "skills"),
DetectMarkers: []string{filepath.Join(home, ".roo")},
},
{
ID: "goose",
DisplayName: "Goose",
GlobalSkillsDir: filepath.Join(home, ".config", "goose", "skills"),
DetectMarkers: []string{filepath.Join(home, ".config", "goose")},
},
{
ID: "opencode",
DisplayName: "OpenCode",
GlobalSkillsDir: filepath.Join(home, ".config", "opencode", "skills"),
DetectMarkers: []string{filepath.Join(home, ".config", "opencode")},
},
{
ID: "codex",
DisplayName: "Codex (OpenAI)",
GlobalSkillsDir: filepath.Join(home, ".codex", "skills"),
GlobalSkillsDirEnvVar: "CODEX_HOME",
DetectMarkers: []string{"/etc/codex"},
DetectMarkerEnvVars: []string{"CODEX_HOME"},
},
{
ID: "windsurf",
DisplayName: "Windsurf",
GlobalSkillsDir: filepath.Join(home, ".windsurf", "skills"),
DetectMarkers: []string{filepath.Join(home, ".windsurf")},
},
{
ID: "continue",
DisplayName: "Continue",
GlobalSkillsDir: filepath.Join(home, ".continue", "skills"),
DetectMarkers: []string{filepath.Join(home, ".continue")},
},
{
ID: "amp",
DisplayName: "Amp",
GlobalSkillsDir: filepath.Join(home, ".config", "agents", "skills"),
DetectMarkers: []string{filepath.Join(home, ".config", "amp")},
},
{
ID: "junie",
DisplayName: "Junie",
GlobalSkillsDir: filepath.Join(home, ".junie", "skills"),
DetectMarkers: []string{filepath.Join(home, ".junie")},
},
{
ID: "kiro-cli",
DisplayName: "Kiro CLI",
GlobalSkillsDir: filepath.Join(home, ".kiro", "skills"),
DetectMarkers: []string{filepath.Join(home, ".kiro")},
},
{
ID: "cline",
DisplayName: "Cline",
GlobalSkillsDir: filepath.Join(home, ".agents", "skills"),
DetectMarkers: []string{filepath.Join(home, ".cline")},
},
{
ID: "augment",
DisplayName: "Augment",
GlobalSkillsDir: filepath.Join(home, ".augment", "skills"),
DetectMarkers: []string{filepath.Join(home, ".augment")},
},
{
ID: "aider-desk",
DisplayName: "AiderDesk",
GlobalSkillsDir: filepath.Join(home, ".aider-desk", "skills"),
DetectMarkers: []string{filepath.Join(home, ".aider-desk")},
},
{
ID: "warp",
DisplayName: "Warp",
GlobalSkillsDir: filepath.Join(home, ".config", "agents", "skills"),
DetectMarkers: []string{filepath.Join(home, ".warp")},
},
{
ID: "devin",
DisplayName: "Devin",
GlobalSkillsDir: filepath.Join(home, ".config", "devin", "skills"),
DetectMarkers: []string{filepath.Join(home, ".config", "devin")},
},
{
ID: "mistral-vibe",
DisplayName: "Mistral Vibe",
GlobalSkillsDirEnvVar: "VIBE_HOME",
DetectMarkerEnvVars: []string{"VIBE_HOME"},
},
{
ID: "openhands",
DisplayName: "OpenHands",
GlobalSkillsDir: filepath.Join(home, ".openhands", "skills"),
},
{
ID: "trae",
DisplayName: "Trae",
GlobalSkillsDir: filepath.Join(home, ".trae", "skills"),
},
{
ID: "mux",
DisplayName: "Mux",
GlobalSkillsDir: filepath.Join(home, ".mux", "skills"),
},
{
ID: "universal",
DisplayName: "Universal",
GlobalSkillsDir: filepath.Join(home, ".agents", "skills"),
},
}
}

var detectedAgentsCache []AgentConfig

func DetectedAgents() []AgentConfig {
if detectedAgentsCache != nil {
return detectedAgentsCache
}
for _, a := range SupportedAgents {
if a.ID == "universal" || a.IsInstalled() {
detectedAgentsCache = append(detectedAgentsCache, a)
}
}
return detectedAgentsCache
}
Loading
Loading