@profoundlogic/coderflow-server 0.2.1
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/LICENSE.txt +322 -0
- package/README.md +158 -0
- package/dist/LICENSE.txt +322 -0
- package/dist/README.md +158 -0
- package/dist/base-image/Dockerfile +184 -0
- package/dist/base-image/agent-wrapper.sh +143 -0
- package/dist/base-image/apply-local-state.sh +357 -0
- package/dist/base-image/coder-git-credential-helper +307 -0
- package/dist/base-image/entrypoint.sh +942 -0
- package/dist/base-image/ssh_config_template +41 -0
- package/dist/base-image/start-code-server.sh +76 -0
- package/dist/base-image/sync-repos.sh +170 -0
- package/dist/base-image/vscode-extensions.txt +10 -0
- package/dist/base-image/vscode-settings.json +41 -0
- package/dist/coder-server.js +2 -0
- package/dist/config/cli-models.json +45 -0
- package/dist/config/imported-skills.schema.json +83 -0
- package/dist/config/skill-catalog.json +18 -0
- package/dist/config/skill-catalog.schema.json +140 -0
- package/dist/config.js +1 -0
- package/dist/examples/oidc.json.example +11 -0
- package/dist/lib/agent-keepalive.js +1 -0
- package/dist/lib/api-keys.js +1 -0
- package/dist/lib/apiKeys.js +1 -0
- package/dist/lib/auto-judge.js +1 -0
- package/dist/lib/basic-auth.js +1 -0
- package/dist/lib/build-history.js +1 -0
- package/dist/lib/build-output-service.js +1 -0
- package/dist/lib/build-scheduler.js +1 -0
- package/dist/lib/build-service.js +1 -0
- package/dist/lib/claude-oauth-refresh.js +1 -0
- package/dist/lib/cli/build.js +1 -0
- package/dist/lib/cli/config-command.js +1 -0
- package/dist/lib/cli/config.js +1 -0
- package/dist/lib/cli/create-user.js +1 -0
- package/dist/lib/cli/init.js +1 -0
- package/dist/lib/cli/jira.js +1 -0
- package/dist/lib/cli/license.js +1 -0
- package/dist/lib/cli/server-manager.js +1 -0
- package/dist/lib/container-tokens.js +1 -0
- package/dist/lib/data-dir.js +1 -0
- package/dist/lib/deployment-history.js +1 -0
- package/dist/lib/deployment-service.js +1 -0
- package/dist/lib/docker-utils.js +1 -0
- package/dist/lib/email.js +1 -0
- package/dist/lib/emailTemplates.js +1 -0
- package/dist/lib/entitlement.js +1 -0
- package/dist/lib/fetch-utils.js +1 -0
- package/dist/lib/git-provider-service.js +1 -0
- package/dist/lib/git-provider-setup/assets/coderflow_github_app.png +0 -0
- package/dist/lib/git-provider-setup/github-setup-handler.js +1 -0
- package/dist/lib/git-provider-setup/index.js +1 -0
- package/dist/lib/git-provider-setup/setup-factory.js +1 -0
- package/dist/lib/git-provider-setup/setup-interface.js +1 -0
- package/dist/lib/git-providers/azure-devops-provider.js +1 -0
- package/dist/lib/git-providers/github-app-provider.js +1 -0
- package/dist/lib/git-providers/index.js +1 -0
- package/dist/lib/git-providers/provider-factory.js +1 -0
- package/dist/lib/git-providers/provider-interface.js +1 -0
- package/dist/lib/jira-client.js +1 -0
- package/dist/lib/logger.js +1 -0
- package/dist/lib/model-fetcher.js +1 -0
- package/dist/lib/notifications.js +1 -0
- package/dist/lib/oidc-auth.js +1 -0
- package/dist/lib/oidc-device-flow.js +1 -0
- package/dist/lib/passwordTokens.js +1 -0
- package/dist/lib/pin-cascade.js +1 -0
- package/dist/lib/provider-accounts.js +1 -0
- package/dist/lib/provider-oauth.js +1 -0
- package/dist/lib/provider-profile.js +1 -0
- package/dist/lib/provider-token-refresh.js +1 -0
- package/dist/lib/roles.js +1 -0
- package/dist/lib/secrets.js +1 -0
- package/dist/lib/state-capture.js +1 -0
- package/dist/lib/static-files.js +1 -0
- package/dist/lib/task-name-generator.js +1 -0
- package/dist/lib/users.js +1 -0
- package/dist/middleware/requireAuth.js +1 -0
- package/dist/middleware/requireInit.js +1 -0
- package/dist/middleware/requirePermission.js +1 -0
- package/dist/package-lock.json +4151 -0
- package/dist/package.json +50 -0
- package/dist/routes/apiKeys.js +1 -0
- package/dist/routes/auth-oidc.js +1 -0
- package/dist/routes/auth.js +1 -0
- package/dist/routes/build.js +1 -0
- package/dist/routes/containers.js +1 -0
- package/dist/routes/deploy-task.js +1 -0
- package/dist/routes/environment-management.js +1 -0
- package/dist/routes/environments.js +1 -0
- package/dist/routes/external-skills.js +1 -0
- package/dist/routes/git-credentials.js +1 -0
- package/dist/routes/git-provider-setup.js +1 -0
- package/dist/routes/health.js +1 -0
- package/dist/routes/jira.js +1 -0
- package/dist/routes/objective-management.js +1 -0
- package/dist/routes/password.js +1 -0
- package/dist/routes/prompt.js +1 -0
- package/dist/routes/provider-auth.js +1 -0
- package/dist/routes/qa.js +1 -0
- package/dist/routes/settings.js +1 -0
- package/dist/routes/skill-management.js +1 -0
- package/dist/routes/skills.js +1 -0
- package/dist/routes/tasks.js +2 -0
- package/dist/routes/templates.js +1 -0
- package/dist/routes/test-task.js +1 -0
- package/dist/routes/test.js +1 -0
- package/dist/routes/users.js +1 -0
- package/dist/routes/visualizations.js +1 -0
- package/dist/schemas/template-metadata.schema.json +178 -0
- package/dist/scripts/create-user.js +2 -0
- package/dist/shipped-skills/environment-instructions/SKILL.md +154 -0
- package/dist/shipped-skills/environment-templates/SKILL.md +282 -0
- package/dist/shipped-skills/objective-management/SKILL.md +238 -0
- package/dist/shipped-skills/skill-editor/SKILL.md +326 -0
- package/dist/start.js +2 -0
- package/dist/web-ui/public/activity-detail-modal.js +1 -0
- package/dist/web-ui/public/activity-feed.js +1 -0
- package/dist/web-ui/public/activity-formatters.js +1 -0
- package/dist/web-ui/public/agent-event-parser.js +1 -0
- package/dist/web-ui/public/app.js +1 -0
- package/dist/web-ui/public/approve-dialog.js +1 -0
- package/dist/web-ui/public/coderflow-logo-reversed.svg +46 -0
- package/dist/web-ui/public/coderflow-logo.svg +46 -0
- package/dist/web-ui/public/comments-widget.js +1 -0
- package/dist/web-ui/public/docs/.nojekyll +0 -0
- package/dist/web-ui/public/docs/README.md +26 -0
- package/dist/web-ui/public/docs/_sidebar.md +47 -0
- package/dist/web-ui/public/docs/admin/ai-providers.md +132 -0
- package/dist/web-ui/public/docs/admin/email-notifications.md +69 -0
- package/dist/web-ui/public/docs/admin/environments.md +215 -0
- package/dist/web-ui/public/docs/admin/git-providers.md +147 -0
- package/dist/web-ui/public/docs/admin/installation.md +313 -0
- package/dist/web-ui/public/docs/admin/skills.md +35 -0
- package/dist/web-ui/public/docs/admin/sso.md +241 -0
- package/dist/web-ui/public/docs/admin/users-and-roles.md +57 -0
- package/dist/web-ui/public/docs/code/cli.md +102 -0
- package/dist/web-ui/public/docs/code/files-and-editing.md +86 -0
- package/dist/web-ui/public/docs/code/terminal-access.md +110 -0
- package/dist/web-ui/public/docs/code/vscode-extension.md +58 -0
- package/dist/web-ui/public/docs/getting-started/core-concepts.md +129 -0
- package/dist/web-ui/public/docs/getting-started/overview.md +46 -0
- package/dist/web-ui/public/docs/index.html +151 -0
- package/dist/web-ui/public/docs/integrations/custom.md +58 -0
- package/dist/web-ui/public/docs/integrations/ibmi/overview.md +58 -0
- package/dist/web-ui/public/docs/integrations/overview.md +48 -0
- package/dist/web-ui/public/docs/objectives/qa-mode.md +90 -0
- package/dist/web-ui/public/docs/objectives/staged-tasks.md +60 -0
- package/dist/web-ui/public/docs/objectives/working-with-objectives.md +102 -0
- package/dist/web-ui/public/docs/tasks/approval-and-deployment.md +83 -0
- package/dist/web-ui/public/docs/tasks/creating-tasks.md +111 -0
- package/dist/web-ui/public/docs/tasks/judging.md +114 -0
- package/dist/web-ui/public/docs/tasks/providing-feedback.md +41 -0
- package/dist/web-ui/public/docs/tasks/task-groups.md +73 -0
- package/dist/web-ui/public/docs/tasks/winner-selection.md +75 -0
- package/dist/web-ui/public/docs/templates/batch-processing.md +152 -0
- package/dist/web-ui/public/docs/templates/task-templates.md +44 -0
- package/dist/web-ui/public/docs/templates/template-examples.md +93 -0
- package/dist/web-ui/public/docs/testing/profound-automated-testing.md +77 -0
- package/dist/web-ui/public/docs/testing/task-visualizations.md +42 -0
- package/dist/web-ui/public/docs/testing/testing-menu.md +118 -0
- package/dist/web-ui/public/environments.css +3942 -0
- package/dist/web-ui/public/environments.html +1791 -0
- package/dist/web-ui/public/environments.js +1 -0
- package/dist/web-ui/public/favicon-16.png +0 -0
- package/dist/web-ui/public/favicon-32.png +0 -0
- package/dist/web-ui/public/favicon.ico +0 -0
- package/dist/web-ui/public/feedback-widget.css +3133 -0
- package/dist/web-ui/public/feedback-widget.js +1 -0
- package/dist/web-ui/public/git-history.css +2663 -0
- package/dist/web-ui/public/git-history.html +272 -0
- package/dist/web-ui/public/git-history.js +1 -0
- package/dist/web-ui/public/git-status.js +1 -0
- package/dist/web-ui/public/index.html +1459 -0
- package/dist/web-ui/public/index.js +1 -0
- package/dist/web-ui/public/login.html +346 -0
- package/dist/web-ui/public/login.js +1 -0
- package/dist/web-ui/public/markdown-editor.js +1 -0
- package/dist/web-ui/public/markdown-file-editor.js +1 -0
- package/dist/web-ui/public/modal-maximize.js +1 -0
- package/dist/web-ui/public/notifications.js +1 -0
- package/dist/web-ui/public/server-health.js +1 -0
- package/dist/web-ui/public/settings.css +761 -0
- package/dist/web-ui/public/settings.html +1044 -0
- package/dist/web-ui/public/settings.js +1 -0
- package/dist/web-ui/public/setup-password.html +355 -0
- package/dist/web-ui/public/setup-password.js +1 -0
- package/dist/web-ui/public/skills.css +1949 -0
- package/dist/web-ui/public/skills.html +820 -0
- package/dist/web-ui/public/skills.js +1 -0
- package/dist/web-ui/public/sse-client.js +1 -0
- package/dist/web-ui/public/sse-shared-worker.js +1 -0
- package/dist/web-ui/public/styles.css +18614 -0
- package/dist/web-ui/public/task.html +1779 -0
- package/dist/web-ui/public/task.js +1 -0
- package/dist/web-ui/public/terminal.html +45 -0
- package/dist/web-ui/public/terminal.js +1 -0
- package/dist/web-ui/public/theme.js +1 -0
- package/dist/web-ui/public/users.html +298 -0
- package/dist/web-ui/public/users.js +1 -0
- package/dist/web-ui/public/variant-grouping.js +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,820 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Skills Management - CoderFlow</title>
|
|
7
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
8
|
+
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
|
9
|
+
<link rel="icon" href="/favicon-16.png" type="image/png" sizes="16x16">
|
|
10
|
+
<link rel="icon" href="/favicon.ico">
|
|
11
|
+
<script>
|
|
12
|
+
(() => {
|
|
13
|
+
const key = 'profound-coder-theme';
|
|
14
|
+
try {
|
|
15
|
+
const stored = localStorage.getItem(key);
|
|
16
|
+
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
17
|
+
const theme = stored === 'dark' || stored === 'light' ? stored : (prefersDark ? 'dark' : 'light');
|
|
18
|
+
document.documentElement.dataset.theme = theme;
|
|
19
|
+
document.documentElement.style.colorScheme = theme === 'dark' ? 'dark' : 'light';
|
|
20
|
+
} catch (error) {
|
|
21
|
+
document.documentElement.dataset.theme = 'light';
|
|
22
|
+
}
|
|
23
|
+
})();
|
|
24
|
+
</script>
|
|
25
|
+
<link rel="stylesheet" href="styles.css?v=84">
|
|
26
|
+
<link rel="stylesheet" href="skills.css?v=4">
|
|
27
|
+
<!-- Markdown editor dependencies -->
|
|
28
|
+
<script src="https://cdn.jsdelivr.net/npm/marked@11.1.1/marked.min.js"></script>
|
|
29
|
+
<script src="https://cdn.jsdelivr.net/npm/turndown@7.1.2/dist/turndown.js"></script>
|
|
30
|
+
<script type="module" src="markdown-editor.js?v=1"></script>
|
|
31
|
+
<script src="markdown-file-editor.js?v=1"></script>
|
|
32
|
+
<script type="module" src="app.js?v=67"></script>
|
|
33
|
+
<script type="module" src="skills.js?v=3"></script>
|
|
34
|
+
<!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
|
|
35
|
+
</head>
|
|
36
|
+
<body>
|
|
37
|
+
<main class="task-detail">
|
|
38
|
+
<div class="task-hero">
|
|
39
|
+
<div class="hero-top">
|
|
40
|
+
<nav class="breadcrumb" aria-label="Breadcrumb">
|
|
41
|
+
<a class="breadcrumb-link" href="index.html">
|
|
42
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
43
|
+
<path d="M3 11.5L12 4l9 7.5"></path>
|
|
44
|
+
<path d="M5 10.5V20h5v-5h4v5h5v-9.5"></path>
|
|
45
|
+
</svg>
|
|
46
|
+
<span>Home</span>
|
|
47
|
+
</a>
|
|
48
|
+
<span class="breadcrumb-separator" aria-hidden="true">/</span>
|
|
49
|
+
<span class="breadcrumb-current">Skills</span>
|
|
50
|
+
</nav>
|
|
51
|
+
<span class="task-context">Administration</span>
|
|
52
|
+
<!-- Admin Menu (gear icon) -->
|
|
53
|
+
<div class="admin-menu-container" id="admin-menu-container" hidden>
|
|
54
|
+
<button class="btn-icon-admin" id="admin-menu-btn" title="Admin">
|
|
55
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
56
|
+
<circle cx="12" cy="12" r="3"></circle>
|
|
57
|
+
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
|
|
58
|
+
</svg>
|
|
59
|
+
</button>
|
|
60
|
+
<div class="dropdown-menu admin-dropdown" id="admin-menu" hidden>
|
|
61
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='users.html'">
|
|
62
|
+
<svg class="option-icon icon-users" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
63
|
+
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
|
|
64
|
+
<circle cx="9" cy="7" r="4"></circle>
|
|
65
|
+
<path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
|
|
66
|
+
<path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
|
|
67
|
+
</svg>
|
|
68
|
+
<span class="option-text">Users</span>
|
|
69
|
+
</button>
|
|
70
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='environments.html'">
|
|
71
|
+
<svg class="option-icon icon-environments" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
72
|
+
<circle cx="12" cy="12" r="10"></circle>
|
|
73
|
+
<line x1="2" y1="12" x2="22" y2="12"></line>
|
|
74
|
+
<path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path>
|
|
75
|
+
</svg>
|
|
76
|
+
<span class="option-text">Environments</span>
|
|
77
|
+
</button>
|
|
78
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='settings.html'">
|
|
79
|
+
<svg class="option-icon icon-server-settings" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
80
|
+
<line x1="4" y1="21" x2="4" y2="14"></line>
|
|
81
|
+
<line x1="4" y1="10" x2="4" y2="3"></line>
|
|
82
|
+
<line x1="12" y1="21" x2="12" y2="12"></line>
|
|
83
|
+
<line x1="12" y1="8" x2="12" y2="3"></line>
|
|
84
|
+
<line x1="20" y1="21" x2="20" y2="16"></line>
|
|
85
|
+
<line x1="20" y1="12" x2="20" y2="3"></line>
|
|
86
|
+
<line x1="1" y1="14" x2="7" y2="14"></line>
|
|
87
|
+
<line x1="9" y1="8" x2="15" y2="8"></line>
|
|
88
|
+
<line x1="17" y1="16" x2="23" y2="16"></line>
|
|
89
|
+
</svg>
|
|
90
|
+
<span class="option-text">Server Settings</span>
|
|
91
|
+
</button>
|
|
92
|
+
<button type="button" class="dropdown-item admin-menu-item" id="server-health-btn">
|
|
93
|
+
<svg class="option-icon icon-health" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
94
|
+
<path d="M22 12h-4l-3 9L9 3l-3 9H2"></path>
|
|
95
|
+
</svg>
|
|
96
|
+
<span class="option-text">Server Health</span>
|
|
97
|
+
</button>
|
|
98
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='git-history.html'">
|
|
99
|
+
<svg class="option-icon icon-git-history" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
100
|
+
<circle cx="6" cy="6" r="2"></circle>
|
|
101
|
+
<circle cx="6" cy="18" r="2"></circle>
|
|
102
|
+
<circle cx="18" cy="12" r="2"></circle>
|
|
103
|
+
<path d="M6 8v8"></path>
|
|
104
|
+
<path d="M6 12h10"></path>
|
|
105
|
+
</svg>
|
|
106
|
+
<span class="option-text">Git History</span>
|
|
107
|
+
</button>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
<div id="theme-toggle-container"></div>
|
|
111
|
+
</div>
|
|
112
|
+
<div class="status-hero">
|
|
113
|
+
<div class="status-copy">
|
|
114
|
+
<h1>Skills Management</h1>
|
|
115
|
+
<p class="task-subtitle">Manage reusable prompt-based agent actions</p>
|
|
116
|
+
</div>
|
|
117
|
+
<div class="status-actions">
|
|
118
|
+
<div id="repo-status" class="repo-status-indicator" title="Repository git status">
|
|
119
|
+
<span id="repo-status-icon">⏳</span>
|
|
120
|
+
<span id="repo-status-text">Loading...</span>
|
|
121
|
+
<span id="repo-branch-text" class="repo-branch"></span>
|
|
122
|
+
</div>
|
|
123
|
+
<button class="btn-secondary btn-small" id="save-btn" title="Save changes (Ctrl+S)" disabled>
|
|
124
|
+
<span>💾</span> Save
|
|
125
|
+
</button>
|
|
126
|
+
<div class="dropdown-container">
|
|
127
|
+
<button class="btn-ghost btn-small" id="actions-menu-btn" title="Additional actions">
|
|
128
|
+
Actions ▼
|
|
129
|
+
</button>
|
|
130
|
+
<div class="dropdown-menu" id="actions-menu" hidden>
|
|
131
|
+
<button class="dropdown-item" id="repo-pull-btn">
|
|
132
|
+
<span>🔄</span> Pull from Git
|
|
133
|
+
</button>
|
|
134
|
+
<button class="dropdown-item" id="repo-commit-btn" disabled>
|
|
135
|
+
<span>📤</span> Commit & Push...
|
|
136
|
+
</button>
|
|
137
|
+
<button class="dropdown-item" id="repo-discard-btn" disabled>
|
|
138
|
+
<span>⚠️</span> Discard Changes...
|
|
139
|
+
</button>
|
|
140
|
+
<div class="dropdown-divider"></div>
|
|
141
|
+
<button class="dropdown-item" id="import-skill-btn">
|
|
142
|
+
<span>📥</span> Import External Skill...
|
|
143
|
+
</button>
|
|
144
|
+
<button class="dropdown-item" id="new-skill-btn">
|
|
145
|
+
<span>+</span> New Skill...
|
|
146
|
+
</button>
|
|
147
|
+
<button class="dropdown-item" id="delete-skill-btn" disabled>
|
|
148
|
+
<span>🗑</span> Delete Skill
|
|
149
|
+
</button>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
|
|
156
|
+
<!-- Loading State -->
|
|
157
|
+
<div id="skills-loading" class="loading">
|
|
158
|
+
<svg class="loading-spinner" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
159
|
+
<path d="M21 12a9 9 0 1 1-6.219-8.56"></path>
|
|
160
|
+
</svg>
|
|
161
|
+
<span>Loading skills...</span>
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
<!-- Error State -->
|
|
165
|
+
<div id="skills-error" class="empty-state-card" hidden>
|
|
166
|
+
<div class="empty-state-icon">⚠️</div>
|
|
167
|
+
<h2>Failed to load skills</h2>
|
|
168
|
+
<p id="skills-error-message" class="text-muted"></p>
|
|
169
|
+
<button class="btn-primary" id="retry-skills-btn">Try Again</button>
|
|
170
|
+
</div>
|
|
171
|
+
|
|
172
|
+
<!-- Main Content -->
|
|
173
|
+
<div id="skills-content" class="skills-layout" hidden>
|
|
174
|
+
<!-- Skills List Panel -->
|
|
175
|
+
<aside class="skills-sidebar">
|
|
176
|
+
<div class="skills-list-header">
|
|
177
|
+
<div class="skills-header-title">
|
|
178
|
+
<h3>Skills</h3>
|
|
179
|
+
<span class="skills-count" id="skills-count" aria-live="polite">0</span>
|
|
180
|
+
</div>
|
|
181
|
+
<button class="btn-icon" id="new-skill-btn-sidebar" title="Create new skill (Ctrl+N)">
|
|
182
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
183
|
+
<line x1="12" y1="5" x2="12" y2="19"></line>
|
|
184
|
+
<line x1="5" y1="12" x2="19" y2="12"></line>
|
|
185
|
+
</svg>
|
|
186
|
+
</button>
|
|
187
|
+
</div>
|
|
188
|
+
<div class="skills-search">
|
|
189
|
+
<label class="sr-only" for="skills-search">Search skills</label>
|
|
190
|
+
<div class="skills-search-input">
|
|
191
|
+
<svg class="skills-search-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
192
|
+
<circle cx="11" cy="11" r="8"></circle>
|
|
193
|
+
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
|
|
194
|
+
</svg>
|
|
195
|
+
<input type="search" id="skills-search" placeholder="Search skills..." class="form-input" autocomplete="off">
|
|
196
|
+
<button class="skills-search-clear" id="skills-search-clear" type="button" aria-label="Clear search" hidden>×</button>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="skills-search-meta" id="skills-search-meta" aria-live="polite"></div>
|
|
199
|
+
</div>
|
|
200
|
+
<div class="skills-list" id="skills-list" role="listbox" aria-label="Skills">
|
|
201
|
+
<!-- Skills list will be populated here -->
|
|
202
|
+
</div>
|
|
203
|
+
</aside>
|
|
204
|
+
|
|
205
|
+
<!-- Skill Editor Panel -->
|
|
206
|
+
<section class="skill-editor">
|
|
207
|
+
<div id="skill-empty-state" class="empty-state-card">
|
|
208
|
+
<div class="empty-state-icon">
|
|
209
|
+
<svg width="72" height="72" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
|
210
|
+
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path>
|
|
211
|
+
</svg>
|
|
212
|
+
</div>
|
|
213
|
+
<h2>Select a Skill</h2>
|
|
214
|
+
<p>Choose a skill from the list to view and edit, or create a new skill.</p>
|
|
215
|
+
<div class="empty-state-actions">
|
|
216
|
+
<button class="btn-primary" id="new-skill-btn-empty">
|
|
217
|
+
<span>+</span> Create New Skill
|
|
218
|
+
</button>
|
|
219
|
+
<button class="btn-secondary" id="import-skill-btn-empty">
|
|
220
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
221
|
+
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
|
|
222
|
+
<polyline points="7 10 12 15 17 10"></polyline>
|
|
223
|
+
<line x1="12" y1="15" x2="12" y2="3"></line>
|
|
224
|
+
</svg>
|
|
225
|
+
Import External Skill
|
|
226
|
+
</button>
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
229
|
+
|
|
230
|
+
<div id="skill-details" class="skill-details" hidden>
|
|
231
|
+
<!-- Skill Header -->
|
|
232
|
+
<div class="skill-header-card">
|
|
233
|
+
<div class="skill-header-content">
|
|
234
|
+
<div class="skill-title-row">
|
|
235
|
+
<h2 class="skill-title" id="skill-name-display">-</h2>
|
|
236
|
+
<span id="skill-modified-badge" class="tag tag-warning" hidden>Modified</span>
|
|
237
|
+
</div>
|
|
238
|
+
<p class="skill-description-display" id="skill-description-display"></p>
|
|
239
|
+
<div class="skill-meta" aria-live="polite">
|
|
240
|
+
<span class="meta-chip" id="skill-id-chip"></span>
|
|
241
|
+
<span class="meta-chip" id="skill-model-chip"></span>
|
|
242
|
+
<span class="meta-chip" id="skill-tools-chip"></span>
|
|
243
|
+
<span class="meta-chip" id="skill-files-chip"></span>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
|
|
248
|
+
<!-- Navigation Tabs -->
|
|
249
|
+
<nav class="content-nav" role="tablist">
|
|
250
|
+
<button class="content-tab active" data-tab="metadata" role="tab">
|
|
251
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px; vertical-align: text-bottom;">
|
|
252
|
+
<circle cx="12" cy="12" r="10"></circle>
|
|
253
|
+
<line x1="12" y1="16" x2="12" y2="12"></line>
|
|
254
|
+
<line x1="12" y1="8" x2="12.01" y2="8"></line>
|
|
255
|
+
</svg>
|
|
256
|
+
Metadata
|
|
257
|
+
</button>
|
|
258
|
+
<button class="content-tab" data-tab="prompt" role="tab">
|
|
259
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px; vertical-align: text-bottom;">
|
|
260
|
+
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
|
|
261
|
+
</svg>
|
|
262
|
+
Prompt
|
|
263
|
+
</button>
|
|
264
|
+
<button class="content-tab" data-tab="files" role="tab">
|
|
265
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px; vertical-align: text-bottom;">
|
|
266
|
+
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
|
|
267
|
+
<polyline points="14 2 14 8 20 8"></polyline>
|
|
268
|
+
</svg>
|
|
269
|
+
Supporting Files
|
|
270
|
+
</button>
|
|
271
|
+
</nav>
|
|
272
|
+
|
|
273
|
+
<!-- Tab Content -->
|
|
274
|
+
<div class="tab-content-wrapper">
|
|
275
|
+
<!-- Metadata Tab -->
|
|
276
|
+
<div id="tab-metadata" class="tab-panel active" role="tabpanel">
|
|
277
|
+
<div class="content-card">
|
|
278
|
+
<div class="card-header">
|
|
279
|
+
<h3>Core Properties</h3>
|
|
280
|
+
</div>
|
|
281
|
+
<div class="card-body">
|
|
282
|
+
<div class="form-single-column">
|
|
283
|
+
<div class="form-row">
|
|
284
|
+
<label for="skill-name">Display Name</label>
|
|
285
|
+
<input type="text" id="skill-name" class="form-input" placeholder="e.g., Code Review">
|
|
286
|
+
</div>
|
|
287
|
+
<div class="form-row">
|
|
288
|
+
<label for="skill-id">Skill ID</label>
|
|
289
|
+
<input type="text" id="skill-id" class="form-input code-font" placeholder="e.g., code-review" readonly>
|
|
290
|
+
</div>
|
|
291
|
+
<div class="form-row">
|
|
292
|
+
<label for="skill-description">Description</label>
|
|
293
|
+
<textarea id="skill-description" class="form-input form-textarea-compact" rows="2" placeholder="Brief description of what this skill does"></textarea>
|
|
294
|
+
</div>
|
|
295
|
+
<div class="form-row">
|
|
296
|
+
<label for="skill-context">Context</label>
|
|
297
|
+
<div class="form-field-with-hint">
|
|
298
|
+
<select id="skill-context" class="form-input">
|
|
299
|
+
<option value="">Default (shared)</option>
|
|
300
|
+
<option value="fork">Fork (isolated sub-agent)</option>
|
|
301
|
+
</select>
|
|
302
|
+
<span class="form-hint">Fork runs the skill in an isolated context, separate from the main conversation</span>
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
|
|
309
|
+
<div class="content-card" id="additional-properties-card">
|
|
310
|
+
<div class="card-header">
|
|
311
|
+
<h3>Additional Properties</h3>
|
|
312
|
+
<span class="prompt-help-text">YAML format for optional metadata (model, allowed-tools, etc.)</span>
|
|
313
|
+
</div>
|
|
314
|
+
<div class="card-body">
|
|
315
|
+
<div id="skill-extra-metadata-editor" class="monaco-editor-container" style="height: 200px; border: 1px solid var(--color-border);"></div>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
</div>
|
|
319
|
+
|
|
320
|
+
<!-- Prompt Tab -->
|
|
321
|
+
<div id="tab-prompt" class="tab-panel" role="tabpanel" hidden>
|
|
322
|
+
<div class="content-card">
|
|
323
|
+
<div class="card-header">
|
|
324
|
+
<h3>Prompt Body</h3>
|
|
325
|
+
</div>
|
|
326
|
+
<div class="card-body">
|
|
327
|
+
<div id="skill-body-editor" class="monaco-editor-container" style="height: 500px; border: 1px solid var(--color-border);"></div>
|
|
328
|
+
<div class="editor-footer">
|
|
329
|
+
<span id="prompt-stats" class="text-muted"></span>
|
|
330
|
+
</div>
|
|
331
|
+
</div>
|
|
332
|
+
</div>
|
|
333
|
+
</div>
|
|
334
|
+
|
|
335
|
+
<!-- Files Tab -->
|
|
336
|
+
<div id="tab-files" class="tab-panel" role="tabpanel" hidden>
|
|
337
|
+
<div class="content-card files-card">
|
|
338
|
+
<div class="card-header">
|
|
339
|
+
<h3>Supporting Files</h3>
|
|
340
|
+
<button class="btn-secondary btn-small" id="add-file-btn">
|
|
341
|
+
+ Add File
|
|
342
|
+
</button>
|
|
343
|
+
</div>
|
|
344
|
+
<div class="card-body">
|
|
345
|
+
<p class="text-muted files-help-text">
|
|
346
|
+
Optional supporting files (templates, scripts, reference docs) that are included with this skill.
|
|
347
|
+
</p>
|
|
348
|
+
<div id="skill-files-list" class="skill-files-list">
|
|
349
|
+
<div class="files-empty" id="no-files-message">
|
|
350
|
+
<p>No supporting files yet.</p>
|
|
351
|
+
<p class="text-muted">Add templates, scripts, or reference documents to include with this skill.</p>
|
|
352
|
+
</div>
|
|
353
|
+
</div>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
|
|
357
|
+
<!-- File Editor Modal (inline) -->
|
|
358
|
+
<div id="file-editor-card" class="content-card file-editor-card" hidden>
|
|
359
|
+
<div class="card-header">
|
|
360
|
+
<h3>
|
|
361
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
362
|
+
<path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"></path>
|
|
363
|
+
<polyline points="14 2 14 8 20 8"></polyline>
|
|
364
|
+
</svg>
|
|
365
|
+
<span id="file-editor-title">Edit File</span>
|
|
366
|
+
</h3>
|
|
367
|
+
<div class="card-header-actions">
|
|
368
|
+
<button class="btn-ghost btn-small btn-danger-text" id="file-editor-delete-btn" title="Delete file">
|
|
369
|
+
<span>🗑</span> Delete
|
|
370
|
+
</button>
|
|
371
|
+
<button class="btn-ghost btn-small" id="file-editor-cancel-btn">
|
|
372
|
+
Cancel
|
|
373
|
+
</button>
|
|
374
|
+
<button class="btn-primary btn-small" id="file-editor-save-btn">
|
|
375
|
+
<span>✓</span> Save File
|
|
376
|
+
</button>
|
|
377
|
+
</div>
|
|
378
|
+
</div>
|
|
379
|
+
<div class="card-body">
|
|
380
|
+
<div class="form-single-column">
|
|
381
|
+
<div class="form-row">
|
|
382
|
+
<label for="file-editor-name">File Name</label>
|
|
383
|
+
<input type="text" id="file-editor-name" class="form-input code-font" placeholder="e.g., checklist.md">
|
|
384
|
+
</div>
|
|
385
|
+
</div>
|
|
386
|
+
<div class="file-editor-monaco-wrapper">
|
|
387
|
+
<div id="file-editor-content" class="monaco-editor-container" style="height: 400px; border: 1px solid var(--color-border);"></div>
|
|
388
|
+
</div>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
</div>
|
|
393
|
+
</div>
|
|
394
|
+
</section>
|
|
395
|
+
</div>
|
|
396
|
+
</main>
|
|
397
|
+
|
|
398
|
+
<!-- Create Skill Modal -->
|
|
399
|
+
<div id="create-skill-modal" class="modal" hidden>
|
|
400
|
+
<div class="modal-overlay"></div>
|
|
401
|
+
<div class="modal-content">
|
|
402
|
+
<div class="modal-header">
|
|
403
|
+
<h2>Create New Skill</h2>
|
|
404
|
+
<button type="button" class="modal-close" aria-label="Close" id="close-create-modal">×</button>
|
|
405
|
+
</div>
|
|
406
|
+
<div class="modal-body">
|
|
407
|
+
<div id="create-form-error" class="modal-error" hidden></div>
|
|
408
|
+
<form id="create-skill-form">
|
|
409
|
+
<div class="form-group">
|
|
410
|
+
<label for="new-skill-id">Skill ID <span class="required">*</span></label>
|
|
411
|
+
<input
|
|
412
|
+
type="text"
|
|
413
|
+
id="new-skill-id"
|
|
414
|
+
class="form-input code-font"
|
|
415
|
+
required
|
|
416
|
+
pattern="[a-z0-9-]+"
|
|
417
|
+
placeholder="e.g., code-review"
|
|
418
|
+
autocomplete="off"
|
|
419
|
+
>
|
|
420
|
+
<small class="form-hint">Lowercase letters, numbers, and hyphens only. This becomes the directory name.</small>
|
|
421
|
+
</div>
|
|
422
|
+
<div class="form-group">
|
|
423
|
+
<label for="new-skill-name">Display Name</label>
|
|
424
|
+
<input
|
|
425
|
+
type="text"
|
|
426
|
+
id="new-skill-name"
|
|
427
|
+
class="form-input"
|
|
428
|
+
placeholder="e.g., Code Review"
|
|
429
|
+
autocomplete="off"
|
|
430
|
+
>
|
|
431
|
+
<small class="form-hint">Human-readable name (auto-generated from ID if blank)</small>
|
|
432
|
+
</div>
|
|
433
|
+
<div class="form-group">
|
|
434
|
+
<label for="new-skill-description">Description</label>
|
|
435
|
+
<textarea
|
|
436
|
+
id="new-skill-description"
|
|
437
|
+
class="form-input form-textarea-compact"
|
|
438
|
+
rows="2"
|
|
439
|
+
placeholder="Brief description of what this skill does"
|
|
440
|
+
autocomplete="off"
|
|
441
|
+
></textarea>
|
|
442
|
+
</div>
|
|
443
|
+
</form>
|
|
444
|
+
</div>
|
|
445
|
+
<div class="modal-actions">
|
|
446
|
+
<button type="button" class="btn-secondary" id="cancel-create">Cancel</button>
|
|
447
|
+
<button type="button" class="btn-primary" id="confirm-create">Create Skill</button>
|
|
448
|
+
</div>
|
|
449
|
+
</div>
|
|
450
|
+
</div>
|
|
451
|
+
|
|
452
|
+
<!-- Delete Skill Modal -->
|
|
453
|
+
<div id="delete-skill-modal" class="modal" hidden>
|
|
454
|
+
<div class="modal-overlay"></div>
|
|
455
|
+
<div class="modal-content">
|
|
456
|
+
<div class="modal-header">
|
|
457
|
+
<h2>⚠️ Delete Skill</h2>
|
|
458
|
+
<button type="button" class="modal-close" aria-label="Close" id="close-delete-modal">×</button>
|
|
459
|
+
</div>
|
|
460
|
+
<div class="modal-body">
|
|
461
|
+
<div class="warning-message">
|
|
462
|
+
<p><strong>This will permanently delete the skill.</strong></p>
|
|
463
|
+
<p>Are you sure you want to delete <strong id="delete-skill-name"></strong>?</p>
|
|
464
|
+
</div>
|
|
465
|
+
<p class="text-muted" style="margin-top: 12px;">All files within the skill directory will be removed. This action cannot be undone.</p>
|
|
466
|
+
</div>
|
|
467
|
+
<div class="modal-actions">
|
|
468
|
+
<button type="button" class="btn-secondary" id="cancel-delete">Cancel</button>
|
|
469
|
+
<button type="button" class="btn-danger" id="confirm-delete">Delete Skill</button>
|
|
470
|
+
</div>
|
|
471
|
+
</div>
|
|
472
|
+
</div>
|
|
473
|
+
|
|
474
|
+
<!-- Commit Modal -->
|
|
475
|
+
<div id="commit-modal" class="modal" hidden>
|
|
476
|
+
<div class="modal-overlay"></div>
|
|
477
|
+
<div class="modal-content">
|
|
478
|
+
<div class="modal-header">
|
|
479
|
+
<h2>Commit Changes</h2>
|
|
480
|
+
<button type="button" class="modal-close" aria-label="Close" id="close-commit-modal">×</button>
|
|
481
|
+
</div>
|
|
482
|
+
<div class="modal-body">
|
|
483
|
+
<div id="commit-form-error" class="modal-error" hidden></div>
|
|
484
|
+
|
|
485
|
+
<div class="commit-author">
|
|
486
|
+
Committing as: <strong id="commit-user-name"></strong> <<span id="commit-user-email"></span>>
|
|
487
|
+
</div>
|
|
488
|
+
|
|
489
|
+
<div class="form-group">
|
|
490
|
+
<label>Modified files:</label>
|
|
491
|
+
<ul id="commit-files-list" class="modified-files-list"></ul>
|
|
492
|
+
</div>
|
|
493
|
+
|
|
494
|
+
<div class="form-group">
|
|
495
|
+
<label for="commit-message">Commit message</label>
|
|
496
|
+
<textarea id="commit-message" class="form-textarea" rows="3" placeholder="Describe your changes..." required></textarea>
|
|
497
|
+
</div>
|
|
498
|
+
|
|
499
|
+
<div class="checkbox-group">
|
|
500
|
+
<label class="checkbox-label">
|
|
501
|
+
<input type="checkbox" id="commit-pull-first" checked>
|
|
502
|
+
<span>Pull latest changes before committing (recommended)</span>
|
|
503
|
+
</label>
|
|
504
|
+
<label class="checkbox-label">
|
|
505
|
+
<input type="checkbox" id="commit-push" checked>
|
|
506
|
+
<span>Push to remote immediately</span>
|
|
507
|
+
</label>
|
|
508
|
+
</div>
|
|
509
|
+
</div>
|
|
510
|
+
<div class="modal-actions">
|
|
511
|
+
<button type="button" class="btn-secondary" id="cancel-commit">Cancel</button>
|
|
512
|
+
<button type="button" class="btn-primary" id="confirm-commit">Commit & Push</button>
|
|
513
|
+
</div>
|
|
514
|
+
</div>
|
|
515
|
+
</div>
|
|
516
|
+
|
|
517
|
+
<!-- Discard Modal -->
|
|
518
|
+
<div id="discard-modal" class="modal" hidden>
|
|
519
|
+
<div class="modal-overlay"></div>
|
|
520
|
+
<div class="modal-content">
|
|
521
|
+
<div class="modal-header">
|
|
522
|
+
<h2>⚠️ Discard Changes</h2>
|
|
523
|
+
<button type="button" class="modal-close" aria-label="Close" id="close-discard-modal">×</button>
|
|
524
|
+
</div>
|
|
525
|
+
<div class="modal-body">
|
|
526
|
+
<div class="warning-message">
|
|
527
|
+
<p><strong>This will permanently discard all uncommitted changes.</strong></p>
|
|
528
|
+
<p>This action cannot be undone.</p>
|
|
529
|
+
</div>
|
|
530
|
+
|
|
531
|
+
<div class="form-group">
|
|
532
|
+
<label>Files that will be affected:</label>
|
|
533
|
+
<ul id="discard-files-list" class="modified-files-list"></ul>
|
|
534
|
+
</div>
|
|
535
|
+
</div>
|
|
536
|
+
<div class="modal-actions">
|
|
537
|
+
<button type="button" class="btn-secondary" id="cancel-discard">Cancel</button>
|
|
538
|
+
<button type="button" class="btn-danger" id="confirm-discard">Discard Changes</button>
|
|
539
|
+
</div>
|
|
540
|
+
</div>
|
|
541
|
+
</div>
|
|
542
|
+
|
|
543
|
+
<!-- Add File Modal -->
|
|
544
|
+
<div id="add-file-modal" class="modal" hidden>
|
|
545
|
+
<div class="modal-overlay"></div>
|
|
546
|
+
<div class="modal-content">
|
|
547
|
+
<div class="modal-header">
|
|
548
|
+
<h2>Add Supporting File</h2>
|
|
549
|
+
<button type="button" class="modal-close" aria-label="Close" id="close-add-file-modal">×</button>
|
|
550
|
+
</div>
|
|
551
|
+
<div class="modal-body">
|
|
552
|
+
<div id="add-file-error" class="modal-error" hidden></div>
|
|
553
|
+
<form id="add-file-form">
|
|
554
|
+
<div class="form-group">
|
|
555
|
+
<label for="add-file-name">File Name <span class="required">*</span></label>
|
|
556
|
+
<input
|
|
557
|
+
type="text"
|
|
558
|
+
id="add-file-name"
|
|
559
|
+
class="form-input code-font"
|
|
560
|
+
required
|
|
561
|
+
placeholder="e.g., checklist.md or scripts/deploy.sh"
|
|
562
|
+
autocomplete="off"
|
|
563
|
+
>
|
|
564
|
+
<small class="form-hint">Use forward slashes for subdirectories</small>
|
|
565
|
+
</div>
|
|
566
|
+
</form>
|
|
567
|
+
</div>
|
|
568
|
+
<div class="modal-actions">
|
|
569
|
+
<button type="button" class="btn-secondary" id="cancel-add-file">Cancel</button>
|
|
570
|
+
<button type="button" class="btn-primary" id="confirm-add-file">Add File</button>
|
|
571
|
+
</div>
|
|
572
|
+
</div>
|
|
573
|
+
</div>
|
|
574
|
+
|
|
575
|
+
<!-- Uncommitted Changes Modal -->
|
|
576
|
+
<div id="uncommitted-changes-modal" class="modal" hidden>
|
|
577
|
+
<div class="modal-overlay"></div>
|
|
578
|
+
<div class="modal-content">
|
|
579
|
+
<div class="modal-header">
|
|
580
|
+
<h2>Uncommitted Changes</h2>
|
|
581
|
+
<button type="button" class="modal-close" aria-label="Close" id="close-uncommitted-modal">×</button>
|
|
582
|
+
</div>
|
|
583
|
+
<div class="modal-body">
|
|
584
|
+
<p class="text-muted" style="margin-bottom: 12px;">The following files have uncommitted changes:</p>
|
|
585
|
+
<ul id="uncommitted-files-list" class="modified-files-list"></ul>
|
|
586
|
+
</div>
|
|
587
|
+
<div class="modal-actions">
|
|
588
|
+
<button type="button" class="btn-secondary" id="uncommitted-changes-close-btn">Close</button>
|
|
589
|
+
</div>
|
|
590
|
+
</div>
|
|
591
|
+
</div>
|
|
592
|
+
|
|
593
|
+
<!-- Import External Skill Modal -->
|
|
594
|
+
<div id="import-skill-modal" class="modal" hidden>
|
|
595
|
+
<div class="modal-overlay"></div>
|
|
596
|
+
<div class="modal-content modal-large">
|
|
597
|
+
<div class="modal-header">
|
|
598
|
+
<h2>Import External Skill</h2>
|
|
599
|
+
<button type="button" class="modal-close" aria-label="Close" id="close-import-modal">×</button>
|
|
600
|
+
</div>
|
|
601
|
+
<div class="modal-body">
|
|
602
|
+
<div id="import-form-error" class="modal-error" hidden></div>
|
|
603
|
+
|
|
604
|
+
<!-- Import Source Tabs -->
|
|
605
|
+
<div class="import-tabs">
|
|
606
|
+
<button class="import-tab active" data-import-tab="catalog">Skill Catalog</button>
|
|
607
|
+
<button class="import-tab" data-import-tab="npm">NPM Package</button>
|
|
608
|
+
<button class="import-tab" data-import-tab="git">Git Repository</button>
|
|
609
|
+
<button class="import-tab" data-import-tab="folder">Server Folder</button>
|
|
610
|
+
</div>
|
|
611
|
+
|
|
612
|
+
<!-- Skill Catalog Tab -->
|
|
613
|
+
<div id="import-tab-catalog" class="import-tab-panel active">
|
|
614
|
+
<p class="text-muted" style="margin-bottom: 12px;">Select from the CoderFlow skill catalog:</p>
|
|
615
|
+
<div id="catalog-skills-loading" class="import-loading">
|
|
616
|
+
<svg class="loading-spinner" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
617
|
+
<path d="M21 12a9 9 0 1 1-6.219-8.56"></path>
|
|
618
|
+
</svg>
|
|
619
|
+
Loading skill catalog...
|
|
620
|
+
</div>
|
|
621
|
+
<div id="catalog-skills-list" class="catalog-skills-list" hidden>
|
|
622
|
+
<!-- Catalog skills will be populated here -->
|
|
623
|
+
</div>
|
|
624
|
+
<div id="catalog-skills-empty" class="import-empty" hidden>
|
|
625
|
+
<p>No skills available in the catalog.</p>
|
|
626
|
+
</div>
|
|
627
|
+
</div>
|
|
628
|
+
|
|
629
|
+
<!-- NPM Package Tab -->
|
|
630
|
+
<div id="import-tab-npm" class="import-tab-panel" hidden>
|
|
631
|
+
<p class="text-muted" style="margin-bottom: 12px;">Import a skill from an NPM package:</p>
|
|
632
|
+
<form id="import-npm-form">
|
|
633
|
+
<div class="form-group">
|
|
634
|
+
<label for="import-npm-package">Package Name <span class="required">*</span></label>
|
|
635
|
+
<input
|
|
636
|
+
type="text"
|
|
637
|
+
id="import-npm-package"
|
|
638
|
+
class="form-input"
|
|
639
|
+
required
|
|
640
|
+
placeholder="@org/skill-name or skill-name"
|
|
641
|
+
autocomplete="off"
|
|
642
|
+
>
|
|
643
|
+
<small class="form-hint">NPM package name (supports scoped packages like @org/skill)</small>
|
|
644
|
+
</div>
|
|
645
|
+
<div class="form-row-inline">
|
|
646
|
+
<div class="form-group">
|
|
647
|
+
<label for="import-npm-version">Version</label>
|
|
648
|
+
<input
|
|
649
|
+
type="text"
|
|
650
|
+
id="import-npm-version"
|
|
651
|
+
class="form-input"
|
|
652
|
+
placeholder="latest"
|
|
653
|
+
autocomplete="off"
|
|
654
|
+
>
|
|
655
|
+
<small class="form-hint">Version or range (e.g., latest, ^1.0.0)</small>
|
|
656
|
+
</div>
|
|
657
|
+
<div class="form-group">
|
|
658
|
+
<label for="import-npm-id">Skill ID (optional)</label>
|
|
659
|
+
<input
|
|
660
|
+
type="text"
|
|
661
|
+
id="import-npm-id"
|
|
662
|
+
class="form-input code-font"
|
|
663
|
+
placeholder="Auto-detect from package"
|
|
664
|
+
pattern="[a-z0-9-]+"
|
|
665
|
+
autocomplete="off"
|
|
666
|
+
>
|
|
667
|
+
<small class="form-hint">Override the skill ID (lowercase, hyphens)</small>
|
|
668
|
+
</div>
|
|
669
|
+
</div>
|
|
670
|
+
<div class="form-group">
|
|
671
|
+
<label for="import-npm-registry">Custom Registry (optional)</label>
|
|
672
|
+
<input
|
|
673
|
+
type="url"
|
|
674
|
+
id="import-npm-registry"
|
|
675
|
+
class="form-input"
|
|
676
|
+
placeholder="https://registry.npmjs.org"
|
|
677
|
+
autocomplete="off"
|
|
678
|
+
>
|
|
679
|
+
<small class="form-hint">Use a private NPM registry (leave blank for npmjs.org)</small>
|
|
680
|
+
</div>
|
|
681
|
+
</form>
|
|
682
|
+
<div class="import-npm-info">
|
|
683
|
+
<div class="import-npm-info-icon">
|
|
684
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
685
|
+
<circle cx="12" cy="12" r="10"></circle>
|
|
686
|
+
<line x1="12" y1="16" x2="12" y2="12"></line>
|
|
687
|
+
<line x1="12" y1="8" x2="12.01" y2="8"></line>
|
|
688
|
+
</svg>
|
|
689
|
+
</div>
|
|
690
|
+
<div class="import-npm-info-content">
|
|
691
|
+
<strong>NPM Skill Package Requirements</strong>
|
|
692
|
+
<p>The package must contain a <code>SKILL.md</code> file at the package root, in a <code>skills/</code> subdirectory, or specify skills via the <code>agentskills</code> field in package.json.</p>
|
|
693
|
+
</div>
|
|
694
|
+
</div>
|
|
695
|
+
</div>
|
|
696
|
+
|
|
697
|
+
<!-- Git Repository Tab -->
|
|
698
|
+
<div id="import-tab-git" class="import-tab-panel" hidden>
|
|
699
|
+
<p class="text-muted" style="margin-bottom: 12px;">Import skills from any Git repository:</p>
|
|
700
|
+
<form id="import-git-form">
|
|
701
|
+
<div class="form-group">
|
|
702
|
+
<label for="import-git-url">Repository URL <span class="required">*</span></label>
|
|
703
|
+
<div class="input-with-button">
|
|
704
|
+
<input
|
|
705
|
+
type="url"
|
|
706
|
+
id="import-git-url"
|
|
707
|
+
class="form-input"
|
|
708
|
+
required
|
|
709
|
+
placeholder="https://github.com/anthropics/skills"
|
|
710
|
+
autocomplete="off"
|
|
711
|
+
>
|
|
712
|
+
<button type="button" class="btn-secondary btn-small" id="probe-marketplace-btn">
|
|
713
|
+
Probe Repository
|
|
714
|
+
</button>
|
|
715
|
+
</div>
|
|
716
|
+
<small class="form-hint">Enter a repo URL and click "Probe Repository" to discover skill bundles, or manually specify the skill path below</small>
|
|
717
|
+
</div>
|
|
718
|
+
<div class="form-row-inline">
|
|
719
|
+
<div class="form-group">
|
|
720
|
+
<label for="import-git-branch">Branch</label>
|
|
721
|
+
<input
|
|
722
|
+
type="text"
|
|
723
|
+
id="import-git-branch"
|
|
724
|
+
class="form-input"
|
|
725
|
+
placeholder="main"
|
|
726
|
+
autocomplete="off"
|
|
727
|
+
>
|
|
728
|
+
</div>
|
|
729
|
+
</div>
|
|
730
|
+
</form>
|
|
731
|
+
|
|
732
|
+
<!-- Marketplace Bundles Section (shown when marketplace.json is detected) -->
|
|
733
|
+
<div id="marketplace-bundles-section" class="marketplace-bundles-section" hidden>
|
|
734
|
+
<div class="marketplace-bundles-header">
|
|
735
|
+
<h4>
|
|
736
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
737
|
+
<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path>
|
|
738
|
+
<polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline>
|
|
739
|
+
<line x1="12" y1="22.08" x2="12" y2="12"></line>
|
|
740
|
+
</svg>
|
|
741
|
+
<span id="marketplace-name">Marketplace</span>
|
|
742
|
+
</h4>
|
|
743
|
+
<span class="marketplace-version" id="marketplace-version"></span>
|
|
744
|
+
</div>
|
|
745
|
+
<p class="text-muted" style="margin-bottom: 12px;">Select a skill bundle to import:</p>
|
|
746
|
+
<div id="marketplace-bundles-list" class="marketplace-bundles-list">
|
|
747
|
+
<!-- Bundles will be populated here -->
|
|
748
|
+
</div>
|
|
749
|
+
</div>
|
|
750
|
+
|
|
751
|
+
<!-- Manual Import Section (shown when no marketplace.json or user wants manual) -->
|
|
752
|
+
<div id="manual-import-section" class="manual-import-section">
|
|
753
|
+
<div class="section-divider" id="manual-import-divider" hidden>
|
|
754
|
+
<span>Or import a single skill manually</span>
|
|
755
|
+
</div>
|
|
756
|
+
<div class="form-group">
|
|
757
|
+
<label for="import-git-path">Skill Path</label>
|
|
758
|
+
<input
|
|
759
|
+
type="text"
|
|
760
|
+
id="import-git-path"
|
|
761
|
+
class="form-input code-font"
|
|
762
|
+
placeholder="skills/my-skill"
|
|
763
|
+
autocomplete="off"
|
|
764
|
+
>
|
|
765
|
+
<small class="form-hint">Path within the repository to the skill directory (must contain SKILL.md)</small>
|
|
766
|
+
</div>
|
|
767
|
+
<div class="form-group">
|
|
768
|
+
<label for="import-git-id">Skill ID (optional)</label>
|
|
769
|
+
<input
|
|
770
|
+
type="text"
|
|
771
|
+
id="import-git-id"
|
|
772
|
+
class="form-input code-font"
|
|
773
|
+
placeholder="Auto-detect from path"
|
|
774
|
+
pattern="[a-z0-9-]+"
|
|
775
|
+
autocomplete="off"
|
|
776
|
+
>
|
|
777
|
+
<small class="form-hint">Override the skill ID (lowercase, hyphens)</small>
|
|
778
|
+
</div>
|
|
779
|
+
</div>
|
|
780
|
+
</div>
|
|
781
|
+
|
|
782
|
+
<!-- Server Folder Tab -->
|
|
783
|
+
<div id="import-tab-folder" class="import-tab-panel" hidden>
|
|
784
|
+
<p class="text-muted" style="margin-bottom: 12px;">Import a skill from a folder on the server:</p>
|
|
785
|
+
<form id="import-folder-form">
|
|
786
|
+
<div class="form-group">
|
|
787
|
+
<label for="import-folder-path">Folder Path <span class="required">*</span></label>
|
|
788
|
+
<input
|
|
789
|
+
type="text"
|
|
790
|
+
id="import-folder-path"
|
|
791
|
+
class="form-input code-font"
|
|
792
|
+
required
|
|
793
|
+
placeholder="/opt/skills/my-custom-skill"
|
|
794
|
+
autocomplete="off"
|
|
795
|
+
>
|
|
796
|
+
<small class="form-hint">Absolute path to a skill directory on the server (must contain SKILL.md)</small>
|
|
797
|
+
</div>
|
|
798
|
+
<div class="form-group">
|
|
799
|
+
<label for="import-folder-id">Skill ID (optional)</label>
|
|
800
|
+
<input
|
|
801
|
+
type="text"
|
|
802
|
+
id="import-folder-id"
|
|
803
|
+
class="form-input code-font"
|
|
804
|
+
placeholder="Auto-detect from folder name"
|
|
805
|
+
pattern="[a-z0-9-]+"
|
|
806
|
+
autocomplete="off"
|
|
807
|
+
>
|
|
808
|
+
<small class="form-hint">Override the skill ID (lowercase, hyphens)</small>
|
|
809
|
+
</div>
|
|
810
|
+
</form>
|
|
811
|
+
</div>
|
|
812
|
+
</div>
|
|
813
|
+
<div class="modal-actions">
|
|
814
|
+
<button type="button" class="btn-secondary" id="cancel-import">Cancel</button>
|
|
815
|
+
<button type="button" class="btn-primary" id="confirm-import">Import Skill</button>
|
|
816
|
+
</div>
|
|
817
|
+
</div>
|
|
818
|
+
</div>
|
|
819
|
+
</body>
|
|
820
|
+
</html>
|