chore: fix prompt identity
Browse files- src/commands/insights.ts +29 -29
- src/components/HelpV2/General.tsx +1 -1
- src/components/HelpV2/HelpV2.tsx +3 -3
- src/constants/product.ts +1 -1
- src/constants/prompts.ts +13 -27
- src/constants/system.ts +3 -3
- src/services/PromptSuggestion/promptSuggestion.ts +1 -1
- src/skills/bundled/debug.ts +4 -4
- src/skills/bundled/stuck.ts +8 -8
- src/skills/bundled/updateConfig.ts +4 -4
- src/tools/AgentTool/built-in/{claudeCodeGuideAgent.ts → versperClawGuideAgent.ts} +11 -11
- src/tools/AgentTool/builtInAgents.ts +2 -2
- src/utils/permissions/yolo-classifier-prompts/auto_mode_system_prompt.txt +1 -1
src/commands/insights.ts
CHANGED
|
@@ -427,7 +427,7 @@ function getSessionMetaDir(): string {
|
|
| 427 |
return join(getDataDir(), 'session-meta')
|
| 428 |
}
|
| 429 |
|
| 430 |
-
const FACET_EXTRACTION_PROMPT = `Analyze this
|
| 431 |
|
| 432 |
CRITICAL GUIDELINES:
|
| 433 |
|
|
@@ -867,7 +867,7 @@ function formatTranscriptForFacets(log: LogOption): string {
|
|
| 867 |
return lines.join('\n')
|
| 868 |
}
|
| 869 |
|
| 870 |
-
const SUMMARIZE_CHUNK_PROMPT = `Summarize this portion of a
|
| 871 |
1. What the user asked for
|
| 872 |
2. What Claude did (tools used, files modified)
|
| 873 |
3. Any friction or issues
|
|
@@ -1336,12 +1336,12 @@ type InsightSection = {
|
|
| 1336 |
const INSIGHT_SECTIONS: InsightSection[] = [
|
| 1337 |
{
|
| 1338 |
name: 'project_areas',
|
| 1339 |
-
prompt: `Analyze this
|
| 1340 |
|
| 1341 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1342 |
{
|
| 1343 |
"areas": [
|
| 1344 |
-
{"name": "Area name", "session_count": N, "description": "2-3 sentences about what was worked on and how
|
| 1345 |
]
|
| 1346 |
}
|
| 1347 |
|
|
@@ -1350,18 +1350,18 @@ Include 4-5 areas. Skip internal CC operations.`,
|
|
| 1350 |
},
|
| 1351 |
{
|
| 1352 |
name: 'interaction_style',
|
| 1353 |
-
prompt: `Analyze this
|
| 1354 |
|
| 1355 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1356 |
{
|
| 1357 |
-
"narrative": "2-3 paragraphs analyzing HOW the user interacts with
|
| 1358 |
"key_pattern": "One sentence summary of most distinctive interaction style"
|
| 1359 |
}`,
|
| 1360 |
maxTokens: 8192,
|
| 1361 |
},
|
| 1362 |
{
|
| 1363 |
name: 'what_works',
|
| 1364 |
-
prompt: `Analyze this
|
| 1365 |
|
| 1366 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1367 |
{
|
|
@@ -1376,7 +1376,7 @@ Include 3 impressive workflows.`,
|
|
| 1376 |
},
|
| 1377 |
{
|
| 1378 |
name: 'friction_analysis',
|
| 1379 |
-
prompt: `Analyze this
|
| 1380 |
|
| 1381 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1382 |
{
|
|
@@ -1391,7 +1391,7 @@ Include 3 friction categories with 2 examples each.`,
|
|
| 1391 |
},
|
| 1392 |
{
|
| 1393 |
name: 'suggestions',
|
| 1394 |
-
prompt: `Analyze this
|
| 1395 |
|
| 1396 |
## CC FEATURES REFERENCE (pick from these for features_to_try):
|
| 1397 |
1. **MCP Servers**: Connect Claude to external tools, databases, and APIs via Model Context Protocol.
|
|
@@ -1434,7 +1434,7 @@ IMPORTANT for features_to_try: Pick 2-3 from the CC FEATURES REFERENCE above. In
|
|
| 1434 |
},
|
| 1435 |
{
|
| 1436 |
name: 'on_the_horizon',
|
| 1437 |
-
prompt: `Analyze this
|
| 1438 |
|
| 1439 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1440 |
{
|
|
@@ -1451,7 +1451,7 @@ Include 3 opportunities. Think BIG - autonomous workflows, parallel agents, iter
|
|
| 1451 |
? [
|
| 1452 |
{
|
| 1453 |
name: 'cc_team_improvements',
|
| 1454 |
-
prompt: `Analyze this
|
| 1455 |
|
| 1456 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1457 |
{
|
|
@@ -1465,7 +1465,7 @@ Include 2-3 improvements based on friction patterns observed.`,
|
|
| 1465 |
},
|
| 1466 |
{
|
| 1467 |
name: 'model_behavior_improvements',
|
| 1468 |
-
prompt: `Analyze this
|
| 1469 |
|
| 1470 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1471 |
{
|
|
@@ -1481,7 +1481,7 @@ Include 2-3 improvements based on friction patterns observed.`,
|
|
| 1481 |
: []),
|
| 1482 |
{
|
| 1483 |
name: 'fun_ending',
|
| 1484 |
-
prompt: `Analyze this
|
| 1485 |
|
| 1486 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1487 |
{
|
|
@@ -1735,7 +1735,7 @@ async function generateParallelInsights(
|
|
| 1735 |
.join('\n') || ''
|
| 1736 |
|
| 1737 |
// Now generate "At a Glance" with access to other sections' outputs
|
| 1738 |
-
const atAGlancePrompt = `You're writing an "At a Glance" summary for a
|
| 1739 |
|
| 1740 |
Use this 4-part structure:
|
| 1741 |
|
|
@@ -1743,7 +1743,7 @@ Use this 4-part structure:
|
|
| 1743 |
|
| 1744 |
2. **What's hindering you** - Split into (a) Claude's fault (misunderstandings, wrong approaches, bugs) and (b) user-side friction (not providing enough context, environment issues -- ideally more general than just one project). Be honest but constructive.
|
| 1745 |
|
| 1746 |
-
3. **Quick wins to try** - Specific
|
| 1747 |
|
| 1748 |
4. **Ambitious workflows for better models** - As we move to much more capable models over the next 3-6 months, what should they prepare for? What workflows that seem impossible now will become possible? Draw from the appropriate section below.
|
| 1749 |
|
|
@@ -2006,7 +2006,7 @@ function generateHtmlReport(
|
|
| 2006 |
const interactionStyle = insights.interaction_style
|
| 2007 |
const interactionHtml = interactionStyle?.narrative
|
| 2008 |
? `
|
| 2009 |
-
<h2 id="section-usage">How You Use
|
| 2010 |
<div class="narrative">
|
| 2011 |
${markdownToHtml(interactionStyle.narrative)}
|
| 2012 |
${interactionStyle.key_pattern ? `<div class="key-insight"><strong>Key pattern:</strong> ${escapeHtml(interactionStyle.key_pattern)}</div>` : ''}
|
|
@@ -2070,7 +2070,7 @@ function generateHtmlReport(
|
|
| 2070 |
<h2 id="section-features">Existing CC Features to Try</h2>
|
| 2071 |
<div class="claude-md-section">
|
| 2072 |
<h3>Suggested CLAUDE.md Additions</h3>
|
| 2073 |
-
<p style="font-size: 12px; color: #64748b; margin-bottom: 12px;">Just copy this into
|
| 2074 |
<div class="claude-md-actions">
|
| 2075 |
<button class="copy-all-btn" onclick="copyAllCheckedClaudeMd()">Copy All Checked</button>
|
| 2076 |
</div>
|
|
@@ -2095,7 +2095,7 @@ function generateHtmlReport(
|
|
| 2095 |
${
|
| 2096 |
suggestions.features_to_try && suggestions.features_to_try.length > 0
|
| 2097 |
? `
|
| 2098 |
-
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into
|
| 2099 |
<div class="features-section">
|
| 2100 |
${suggestions.features_to_try
|
| 2101 |
.map(
|
|
@@ -2129,8 +2129,8 @@ function generateHtmlReport(
|
|
| 2129 |
${
|
| 2130 |
suggestions.usage_patterns && suggestions.usage_patterns.length > 0
|
| 2131 |
? `
|
| 2132 |
-
<h2 id="section-patterns">New Ways to Use
|
| 2133 |
-
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into
|
| 2134 |
<div class="patterns-section">
|
| 2135 |
${suggestions.usage_patterns
|
| 2136 |
.map(
|
|
@@ -2143,7 +2143,7 @@ function generateHtmlReport(
|
|
| 2143 |
pat.copyable_prompt
|
| 2144 |
? `
|
| 2145 |
<div class="copyable-prompt-section">
|
| 2146 |
-
<div class="prompt-label">Paste into
|
| 2147 |
<div class="copyable-prompt-row">
|
| 2148 |
<code class="copyable-prompt">${escapeHtml(pat.copyable_prompt)}</code>
|
| 2149 |
<button class="copy-btn" onclick="copyText(this)">Copy</button>
|
|
@@ -2178,7 +2178,7 @@ function generateHtmlReport(
|
|
| 2178 |
<div class="horizon-title">${escapeHtml(opp.title || '')}</div>
|
| 2179 |
<div class="horizon-possible">${escapeHtml(opp.whats_possible || '')}</div>
|
| 2180 |
${opp.how_to_try ? `<div class="horizon-tip"><strong>Getting started:</strong> ${escapeHtml(opp.how_to_try)}</div>` : ''}
|
| 2181 |
-
${opp.copyable_prompt ? `<div class="pattern-prompt"><div class="prompt-label">Paste into
|
| 2182 |
</div>
|
| 2183 |
`,
|
| 2184 |
)
|
|
@@ -2485,13 +2485,13 @@ function generateHtmlReport(
|
|
| 2485 |
<html>
|
| 2486 |
<head>
|
| 2487 |
<meta charset="utf-8">
|
| 2488 |
-
<title>
|
| 2489 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
| 2490 |
<style>${css}</style>
|
| 2491 |
</head>
|
| 2492 |
<body>
|
| 2493 |
<div class="container">
|
| 2494 |
-
<h1>
|
| 2495 |
<p class="subtitle">${data.total_messages.toLocaleString()} messages across ${data.total_sessions} sessions${data.total_sessions_scanned && data.total_sessions_scanned > data.total_sessions ? ` (${data.total_sessions_scanned.toLocaleString()} total)` : ''} | ${data.date_range.start} to ${data.date_range.end}</p>
|
| 2496 |
|
| 2497 |
${atAGlanceHtml}
|
|
@@ -2557,7 +2557,7 @@ function generateHtmlReport(
|
|
| 2557 |
data.multi_clauding.overlap_events === 0
|
| 2558 |
? `
|
| 2559 |
<p style="font-size: 14px; color: #64748b; padding: 8px 0;">
|
| 2560 |
-
No parallel session usage detected. You typically work with one
|
| 2561 |
</p>
|
| 2562 |
`
|
| 2563 |
: `
|
|
@@ -2576,7 +2576,7 @@ function generateHtmlReport(
|
|
| 2576 |
</div>
|
| 2577 |
</div>
|
| 2578 |
<p style="font-size: 13px; color: #475569; margin-top: 12px;">
|
| 2579 |
-
You run multiple
|
| 2580 |
overlap in time, suggesting parallel workflows.
|
| 2581 |
</p>
|
| 2582 |
`
|
|
@@ -3039,7 +3039,7 @@ function safeKeys(obj: Record<string, unknown> | undefined | null): string[] {
|
|
| 3039 |
const usageReport: Command = {
|
| 3040 |
type: 'prompt',
|
| 3041 |
name: 'insights',
|
| 3042 |
-
description: 'Generate a report analyzing your
|
| 3043 |
contentLength: 0, // Dynamic content
|
| 3044 |
progressMessage: 'analyzing your sessions',
|
| 3045 |
source: 'builtin',
|
|
@@ -3141,7 +3141,7 @@ ${atAGlance.quick_wins ? `**Quick wins to try:** ${atAGlance.quick_wins} See _Fe
|
|
| 3141 |
${atAGlance.ambitious_workflows ? `**Ambitious workflows:** ${atAGlance.ambitious_workflows} See _On the Horizon_.` : ''}`
|
| 3142 |
: '_No insights generated_'
|
| 3143 |
|
| 3144 |
-
const header = `#
|
| 3145 |
|
| 3146 |
${stats}
|
| 3147 |
${data.date_range.start} to ${data.date_range.end}
|
|
@@ -3156,7 +3156,7 @@ Your full shareable insights report is ready: ${reportUrl}${uploadHint}`
|
|
| 3156 |
return [
|
| 3157 |
{
|
| 3158 |
type: 'text',
|
| 3159 |
-
text: `The user just ran /insights to generate a usage report analyzing their
|
| 3160 |
|
| 3161 |
Here is the full insights data:
|
| 3162 |
${jsonStringify(insights, null, 2)}
|
|
|
|
| 427 |
return join(getDataDir(), 'session-meta')
|
| 428 |
}
|
| 429 |
|
| 430 |
+
const FACET_EXTRACTION_PROMPT = `Analyze this VersperClaw session and extract structured facets.
|
| 431 |
|
| 432 |
CRITICAL GUIDELINES:
|
| 433 |
|
|
|
|
| 867 |
return lines.join('\n')
|
| 868 |
}
|
| 869 |
|
| 870 |
+
const SUMMARIZE_CHUNK_PROMPT = `Summarize this portion of a VersperClaw session transcript. Focus on:
|
| 871 |
1. What the user asked for
|
| 872 |
2. What Claude did (tools used, files modified)
|
| 873 |
3. Any friction or issues
|
|
|
|
| 1336 |
const INSIGHT_SECTIONS: InsightSection[] = [
|
| 1337 |
{
|
| 1338 |
name: 'project_areas',
|
| 1339 |
+
prompt: `Analyze this VersperClaw usage data and identify project areas.
|
| 1340 |
|
| 1341 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1342 |
{
|
| 1343 |
"areas": [
|
| 1344 |
+
{"name": "Area name", "session_count": N, "description": "2-3 sentences about what was worked on and how VersperClaw was used."}
|
| 1345 |
]
|
| 1346 |
}
|
| 1347 |
|
|
|
|
| 1350 |
},
|
| 1351 |
{
|
| 1352 |
name: 'interaction_style',
|
| 1353 |
+
prompt: `Analyze this VersperClaw usage data and describe the user's interaction style.
|
| 1354 |
|
| 1355 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1356 |
{
|
| 1357 |
+
"narrative": "2-3 paragraphs analyzing HOW the user interacts with VersperClaw. Use second person 'you'. Describe patterns: iterate quickly vs detailed upfront specs? Interrupt often or let Claude run? Include specific examples. Use **bold** for key insights.",
|
| 1358 |
"key_pattern": "One sentence summary of most distinctive interaction style"
|
| 1359 |
}`,
|
| 1360 |
maxTokens: 8192,
|
| 1361 |
},
|
| 1362 |
{
|
| 1363 |
name: 'what_works',
|
| 1364 |
+
prompt: `Analyze this VersperClaw usage data and identify what's working well for this user. Use second person ("you").
|
| 1365 |
|
| 1366 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1367 |
{
|
|
|
|
| 1376 |
},
|
| 1377 |
{
|
| 1378 |
name: 'friction_analysis',
|
| 1379 |
+
prompt: `Analyze this VersperClaw usage data and identify friction points for this user. Use second person ("you").
|
| 1380 |
|
| 1381 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1382 |
{
|
|
|
|
| 1391 |
},
|
| 1392 |
{
|
| 1393 |
name: 'suggestions',
|
| 1394 |
+
prompt: `Analyze this VersperClaw usage data and suggest improvements.
|
| 1395 |
|
| 1396 |
## CC FEATURES REFERENCE (pick from these for features_to_try):
|
| 1397 |
1. **MCP Servers**: Connect Claude to external tools, databases, and APIs via Model Context Protocol.
|
|
|
|
| 1434 |
},
|
| 1435 |
{
|
| 1436 |
name: 'on_the_horizon',
|
| 1437 |
+
prompt: `Analyze this VersperClaw usage data and identify future opportunities.
|
| 1438 |
|
| 1439 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1440 |
{
|
|
|
|
| 1451 |
? [
|
| 1452 |
{
|
| 1453 |
name: 'cc_team_improvements',
|
| 1454 |
+
prompt: `Analyze this VersperClaw usage data and suggest product improvements for the CC team.
|
| 1455 |
|
| 1456 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1457 |
{
|
|
|
|
| 1465 |
},
|
| 1466 |
{
|
| 1467 |
name: 'model_behavior_improvements',
|
| 1468 |
+
prompt: `Analyze this VersperClaw usage data and suggest model behavior improvements.
|
| 1469 |
|
| 1470 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1471 |
{
|
|
|
|
| 1481 |
: []),
|
| 1482 |
{
|
| 1483 |
name: 'fun_ending',
|
| 1484 |
+
prompt: `Analyze this VersperClaw usage data and find a memorable moment.
|
| 1485 |
|
| 1486 |
RESPOND WITH ONLY A VALID JSON OBJECT:
|
| 1487 |
{
|
|
|
|
| 1735 |
.join('\n') || ''
|
| 1736 |
|
| 1737 |
// Now generate "At a Glance" with access to other sections' outputs
|
| 1738 |
+
const atAGlancePrompt = `You're writing an "At a Glance" summary for a VersperClaw usage insights report for VersperClaw users. The goal is to help them understand their usage and improve how they can use Claude better, especially as models improve.
|
| 1739 |
|
| 1740 |
Use this 4-part structure:
|
| 1741 |
|
|
|
|
| 1743 |
|
| 1744 |
2. **What's hindering you** - Split into (a) Claude's fault (misunderstandings, wrong approaches, bugs) and (b) user-side friction (not providing enough context, environment issues -- ideally more general than just one project). Be honest but constructive.
|
| 1745 |
|
| 1746 |
+
3. **Quick wins to try** - Specific VersperClaw features they could try from the examples below, or a workflow technique if you think it's really compelling. (Avoid stuff like "Ask Claude to confirm before taking actions" or "Type out more context up front" which are less compelling.)
|
| 1747 |
|
| 1748 |
4. **Ambitious workflows for better models** - As we move to much more capable models over the next 3-6 months, what should they prepare for? What workflows that seem impossible now will become possible? Draw from the appropriate section below.
|
| 1749 |
|
|
|
|
| 2006 |
const interactionStyle = insights.interaction_style
|
| 2007 |
const interactionHtml = interactionStyle?.narrative
|
| 2008 |
? `
|
| 2009 |
+
<h2 id="section-usage">How You Use VersperClaw</h2>
|
| 2010 |
<div class="narrative">
|
| 2011 |
${markdownToHtml(interactionStyle.narrative)}
|
| 2012 |
${interactionStyle.key_pattern ? `<div class="key-insight"><strong>Key pattern:</strong> ${escapeHtml(interactionStyle.key_pattern)}</div>` : ''}
|
|
|
|
| 2070 |
<h2 id="section-features">Existing CC Features to Try</h2>
|
| 2071 |
<div class="claude-md-section">
|
| 2072 |
<h3>Suggested CLAUDE.md Additions</h3>
|
| 2073 |
+
<p style="font-size: 12px; color: #64748b; margin-bottom: 12px;">Just copy this into VersperClaw to add it to your CLAUDE.md.</p>
|
| 2074 |
<div class="claude-md-actions">
|
| 2075 |
<button class="copy-all-btn" onclick="copyAllCheckedClaudeMd()">Copy All Checked</button>
|
| 2076 |
</div>
|
|
|
|
| 2095 |
${
|
| 2096 |
suggestions.features_to_try && suggestions.features_to_try.length > 0
|
| 2097 |
? `
|
| 2098 |
+
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into VersperClaw and it'll set it up for you.</p>
|
| 2099 |
<div class="features-section">
|
| 2100 |
${suggestions.features_to_try
|
| 2101 |
.map(
|
|
|
|
| 2129 |
${
|
| 2130 |
suggestions.usage_patterns && suggestions.usage_patterns.length > 0
|
| 2131 |
? `
|
| 2132 |
+
<h2 id="section-patterns">New Ways to Use VersperClaw</h2>
|
| 2133 |
+
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into VersperClaw and it'll walk you through it.</p>
|
| 2134 |
<div class="patterns-section">
|
| 2135 |
${suggestions.usage_patterns
|
| 2136 |
.map(
|
|
|
|
| 2143 |
pat.copyable_prompt
|
| 2144 |
? `
|
| 2145 |
<div class="copyable-prompt-section">
|
| 2146 |
+
<div class="prompt-label">Paste into VersperClaw:</div>
|
| 2147 |
<div class="copyable-prompt-row">
|
| 2148 |
<code class="copyable-prompt">${escapeHtml(pat.copyable_prompt)}</code>
|
| 2149 |
<button class="copy-btn" onclick="copyText(this)">Copy</button>
|
|
|
|
| 2178 |
<div class="horizon-title">${escapeHtml(opp.title || '')}</div>
|
| 2179 |
<div class="horizon-possible">${escapeHtml(opp.whats_possible || '')}</div>
|
| 2180 |
${opp.how_to_try ? `<div class="horizon-tip"><strong>Getting started:</strong> ${escapeHtml(opp.how_to_try)}</div>` : ''}
|
| 2181 |
+
${opp.copyable_prompt ? `<div class="pattern-prompt"><div class="prompt-label">Paste into VersperClaw:</div><code>${escapeHtml(opp.copyable_prompt)}</code><button class="copy-btn" onclick="copyText(this)">Copy</button></div>` : ''}
|
| 2182 |
</div>
|
| 2183 |
`,
|
| 2184 |
)
|
|
|
|
| 2485 |
<html>
|
| 2486 |
<head>
|
| 2487 |
<meta charset="utf-8">
|
| 2488 |
+
<title>VersperClaw Insights</title>
|
| 2489 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
| 2490 |
<style>${css}</style>
|
| 2491 |
</head>
|
| 2492 |
<body>
|
| 2493 |
<div class="container">
|
| 2494 |
+
<h1>VersperClaw Insights</h1>
|
| 2495 |
<p class="subtitle">${data.total_messages.toLocaleString()} messages across ${data.total_sessions} sessions${data.total_sessions_scanned && data.total_sessions_scanned > data.total_sessions ? ` (${data.total_sessions_scanned.toLocaleString()} total)` : ''} | ${data.date_range.start} to ${data.date_range.end}</p>
|
| 2496 |
|
| 2497 |
${atAGlanceHtml}
|
|
|
|
| 2557 |
data.multi_clauding.overlap_events === 0
|
| 2558 |
? `
|
| 2559 |
<p style="font-size: 14px; color: #64748b; padding: 8px 0;">
|
| 2560 |
+
No parallel session usage detected. You typically work with one VersperClaw session at a time.
|
| 2561 |
</p>
|
| 2562 |
`
|
| 2563 |
: `
|
|
|
|
| 2576 |
</div>
|
| 2577 |
</div>
|
| 2578 |
<p style="font-size: 13px; color: #475569; margin-top: 12px;">
|
| 2579 |
+
You run multiple VersperClaw sessions simultaneously. Multi-clauding is detected when sessions
|
| 2580 |
overlap in time, suggesting parallel workflows.
|
| 2581 |
</p>
|
| 2582 |
`
|
|
|
|
| 3039 |
const usageReport: Command = {
|
| 3040 |
type: 'prompt',
|
| 3041 |
name: 'insights',
|
| 3042 |
+
description: 'Generate a report analyzing your VersperClaw sessions',
|
| 3043 |
contentLength: 0, // Dynamic content
|
| 3044 |
progressMessage: 'analyzing your sessions',
|
| 3045 |
source: 'builtin',
|
|
|
|
| 3141 |
${atAGlance.ambitious_workflows ? `**Ambitious workflows:** ${atAGlance.ambitious_workflows} See _On the Horizon_.` : ''}`
|
| 3142 |
: '_No insights generated_'
|
| 3143 |
|
| 3144 |
+
const header = `# VersperClaw Insights
|
| 3145 |
|
| 3146 |
${stats}
|
| 3147 |
${data.date_range.start} to ${data.date_range.end}
|
|
|
|
| 3156 |
return [
|
| 3157 |
{
|
| 3158 |
type: 'text',
|
| 3159 |
+
text: `The user just ran /insights to generate a usage report analyzing their VersperClaw sessions.
|
| 3160 |
|
| 3161 |
Here is the full insights data:
|
| 3162 |
${jsonStringify(insights, null, 2)}
|
src/components/HelpV2/General.tsx
CHANGED
|
@@ -6,7 +6,7 @@ export function General() {
|
|
| 6 |
const $ = _c(2);
|
| 7 |
let t0;
|
| 8 |
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
| 9 |
-
t0 = <Box><Text>
|
| 10 |
$[0] = t0;
|
| 11 |
} else {
|
| 12 |
t0 = $[0];
|
|
|
|
| 6 |
const $ = _c(2);
|
| 7 |
let t0;
|
| 8 |
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
| 9 |
+
t0 = <Box><Text>VersperClaw understands your codebase, makes edits with your permission, and executes commands — right from your terminal.</Text></Box>;
|
| 10 |
$[0] = t0;
|
| 11 |
} else {
|
| 12 |
t0 = $[0];
|
src/components/HelpV2/HelpV2.tsx
CHANGED
|
@@ -138,7 +138,7 @@ export function HelpV2(t0) {
|
|
| 138 |
const t5 = insideModal ? undefined : maxHeight;
|
| 139 |
let t6;
|
| 140 |
if ($[31] !== tabs) {
|
| 141 |
-
t6 = <Tabs title={false ? "/help" : `
|
| 142 |
$[31] = tabs;
|
| 143 |
$[32] = t6;
|
| 144 |
} else {
|
|
@@ -146,7 +146,7 @@ export function HelpV2(t0) {
|
|
| 146 |
}
|
| 147 |
let t7;
|
| 148 |
if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
|
| 149 |
-
t7 = <Box marginTop={1}><Text>For more help:{" "}<Link url="https://
|
| 150 |
$[33] = t7;
|
| 151 |
} else {
|
| 152 |
t7 = $[33];
|
|
@@ -181,4 +181,4 @@ export function HelpV2(t0) {
|
|
| 181 |
}
|
| 182 |
return t10;
|
| 183 |
}
|
| 184 |
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyIsInVzZVNob3J0Y3V0RGlzcGxheSIsImJ1aWx0SW5Db21tYW5kTmFtZXMiLCJDb21tYW5kIiwiQ29tbWFuZFJlc3VsdERpc3BsYXkiLCJJTlRFUk5BTF9PTkxZX0NPTU1BTkRTIiwidXNlSXNJbnNpZGVNb2RhbCIsInVzZVRlcm1pbmFsU2l6ZSIsIkJveCIsIkxpbmsiLCJUZXh0IiwidXNlS2V5YmluZGluZyIsIlBhbmUiLCJUYWIiLCJUYWJzIiwiQ29tbWFuZHMiLCJHZW5lcmFsIiwiUHJvcHMiLCJvbkNsb3NlIiwicmVzdWx0Iiwib3B0aW9ucyIsImRpc3BsYXkiLCJjb21tYW5kcyIsIkhlbHBWMiIsInQwIiwiJCIsIl9jIiwicm93cyIsImNvbHVtbnMiLCJtYXhIZWlnaHQiLCJNYXRoIiwiZmxvb3IiLCJpbnNpZGVNb2RhbCIsInQxIiwiY2xvc2UiLCJ0MiIsIlN5bWJvbCIsImZvciIsImNvbnRleHQiLCJleGl0U3RhdGUiLCJkaXNtaXNzU2hvcnRjdXQiLCJhbnRPbmx5Q29tbWFuZHMiLCJidWlsdGluQ29tbWFuZHMiLCJ0MyIsImJ1aWx0aW5OYW1lcyIsImZpbHRlciIsImNtZCIsImhhcyIsIm5hbWUiLCJpc0hpZGRlbiIsInQ0IiwiY21kXzIiLCJjdXN0b21Db21tYW5kcyIsInRhYnMiLCJ0NSIsInB1c2giLCJ0NiIsImxlbmd0aCIsInQ3IiwidW5kZWZpbmVkIiwiTUFDUk8iLCJWRVJTSU9OIiwidDgiLCJrZXlOYW1lIiwicGVuZGluZyIsInQ5IiwidDEwIl0sInNvdXJjZXMiOlsiSGVscFYyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyB9IGZyb20gJ3NyYy9ob29rcy91c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MuanMnXG5pbXBvcnQgeyB1c2VTaG9ydGN1dERpc3BsYXkgfSBmcm9tICdzcmMva2V5YmluZGluZ3MvdXNlU2hvcnRjdXREaXNwbGF5LmpzJ1xuaW1wb3J0IHtcbiAgYnVpbHRJbkNvbW1hbmROYW1lcyxcbiAgdHlwZSBDb21tYW5kLFxuICB0eXBlIENvbW1hbmRSZXN1bHREaXNwbGF5LFxuICBJTlRFUk5BTF9PTkxZX0NPTU1BTkRTLFxufSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IHVzZUlzSW5zaWRlTW9kYWwgfSBmcm9tICcuLi8uLi9jb250ZXh0L21vZGFsQ29udGV4dC5qcydcbmltcG9ydCB7IHVzZVRlcm1pbmFsU2l6ZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRlcm1pbmFsU2l6ZS5qcydcbmltcG9ydCB7IEJveCwgTGluaywgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmcgfSBmcm9tICcuLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHsgUGFuZSB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vUGFuZS5qcydcbmltcG9ydCB7IFRhYiwgVGFicyB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vVGFicy5qcydcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnLi9Db21tYW5kcy5qcydcbmltcG9ydCB7IEdlbmVyYWwgfSBmcm9tICcuL0dlbmVyYWwuanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIG9uQ2xvc2U6IChcbiAgICByZXN1bHQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZGlzcGxheT86IENvbW1hbmRSZXN1bHREaXNwbGF5IH0sXG4gICkgPT4gdm9pZFxuICBjb21tYW5kczogQ29tbWFuZFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIZWxwVjIoeyBvbkNsb3NlLCBjb21tYW5kcyB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgcm93cywgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcbiAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5mbG9vcihyb3dzIC8gMilcbiAgLy8gSW5zaWRlIHRoZSBtb2RhbCBzbG90LCBGdWxsc2NyZWVuTGF5b3V0IGFscmVhZHkgY2FwcyBoZWlnaHQgYW5kIFBhbmUvVGFic1xuICAvLyB1c2UgZmxleFNocmluaz0wIChzZWUgIzIzNTkyKSDigJQgb3VyIG93biBoZWlnaHQ9IGNvbnN0cmFpbnQgd291bGQgY2xpcCB0aGVcbiAgLy8gZm9vdGVyIHNpbmNlIFRhYnMgd29uJ3Qgc2hyaW5rIHRvIGZpdC4gTGV0IHRoZSBtb2RhbCBzbG90IGhhbmRsZSBzaXppbmcuXG4gIGNvbnN0IGluc2lkZU1vZGFsID0gdXNlSXNJbnNpZGVNb2RhbCgpXG5cbiAgY29uc3QgY2xvc2UgPSAoKSA9PiBvbkNsb3NlKCdIZWxwIGRpYWxvZyBkaXNtaXNzZWQnLCB7IGRpc3BsYXk6ICdzeXN0ZW0nIH0pXG4gIHVzZUtleWJpbmRpbmcoJ2hlbHA6ZGlzbWlzcycsIGNsb3NlLCB7IGNvbnRleHQ6ICdIZWxwJyB9KVxuICBjb25zdCBleGl0U3RhdGUgPSB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MoY2xvc2UpXG4gIGNvbnN0IGRpc21pc3NTaG9ydGN1dCA9IHVzZVNob3J0Y3V0RGlzcGxheSgnaGVscDpkaXNtaXNzJywgJ0hlbHAnLCAnZXNjJylcblxuICBjb25zdCBidWlsdGluTmFtZXMgPSBidWlsdEluQ29tbWFuZE5hbWVzKClcbiAgbGV0IGJ1aWx0aW5Db21tYW5kcyA9IGNvbW1hbmRzLmZpbHRlcihcbiAgICBjbWQgPT4gYnVpbHRpbk5hbWVzLmhhcyhjbWQubmFtZSkgJiYgIWNtZC5pc0hpZGRlbixcbiAgKVxuICBsZXQgYW50T25seUNvbW1hbmRzOiBDb21tYW5kW10gPSBbXVxuXG4gIC8vIFdlIGhhdmUgdG8gZG8gdGhpcyBpbiBhbiBgaWZgIHRvIGhlbHAgdHJlZXNoYWtpbmdcbiAgaWYgKFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCcpIHtcbiAgICBjb25zdCBpbnRlcm5hbE9ubHlOYW1lcyA9IG5ldyBTZXQoSU5URVJOQUxfT05MWV9DT01NQU5EUy5tYXAoXyA9PiBfLm5hbWUpKVxuICAgIGJ1aWx0aW5Db21tYW5kcyA9IGJ1aWx0aW5Db21tYW5kcy5maWx0ZXIoXG4gICAgICBjbWQgPT4gIWludGVybmFsT25seU5hbWVzLmhhcyhjbWQubmFtZSksXG4gICAgKVxuICAgIGFudE9ubHlDb21tYW5kcyA9IGNvbW1hbmRzLmZpbHRlcihcbiAgICAgIGNtZCA9PiBpbnRlcm5hbE9ubHlOYW1lcy5oYXMoY21kLm5hbWUpICYmICFjbWQuaXNIaWRkZW4sXG4gICAgKVxuICB9XG5cbiAgY29uc3QgY3VzdG9tQ29tbWFuZHMgPSBjb21tYW5kcy5maWx0ZXIoXG4gICAgY21kID0+ICFidWlsdGluTmFtZXMuaGFzKGNtZC5uYW1lKSAmJiAhY21kLmlzSGlkZGVuLFxuICApXG5cbiAgY29uc3QgdGFicyA9IFtcbiAgICA8VGFiIGtleT1cImdlbmVyYWxcIiB0aXRsZT1cImdlbmVyYWxcIj5cbiAgICAgIDxHZW5lcmFsIC8+XG4gICAgPC9UYWI+LFxuICBdXG5cbiAgdGFicy5wdXNoKFxuICAgIDxUYWIga2V5PVwiY29tbWFuZHNcIiB0aXRsZT1cImNvbW1hbmRzXCI+XG4gICAgICA8Q29tbWFuZHNcbiAgICAgICAgY29tbWFuZHM9e2J1aWx0aW5Db21tYW5kc31cbiAgICAgICAgbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgIHRpdGxlPVwiQnJvd3NlIGRlZmF1bHQgY29tbWFuZHM6XCJcbiAgICAgICAgb25DYW5jZWw9e2Nsb3NlfVxuICAgICAgLz5cbiAgICA8L1RhYj4sXG4gIClcblxuICB0YWJzLnB1c2goXG4gICAgPFRhYiBrZXk9XCJjdXN0b21cIiB0aXRsZT1cImN1c3RvbS1jb21tYW5kc1wiPlxuICAgICAgPENvbW1hbmRzXG4gICAgICAgIGNvbW1hbmRzPXtjdXN0b21Db21tYW5kc31cbiAgICAgICAgbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgIHRpdGxlPVwiQnJvd3NlIGN1c3RvbSBjb21tYW5kczpcIlxuICAgICAgICBlbXB0eU1lc3NhZ2U9XCJObyBjdXN0b20gY29tbWFuZHMgZm91bmRcIlxuICAgICAgICBvbkNhbmNlbD17Y2xvc2V9XG4gICAgICAvPlxuICAgIDwvVGFiPixcbiAgKVxuXG4gIGlmIChcImV4dGVybmFsXCIgPT09ICdhbnQnICYmIGFudE9ubHlDb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgdGFicy5wdXNoKFxuICAgICAgPFRhYiBrZXk9XCJhbnQtb25seVwiIHRpdGxlPVwiW2FudC1vbmx5XVwiPlxuICAgICAgICA8Q29tbWFuZHNcbiAgICAgICAgICBjb21tYW5kcz17YW50T25seUNvbW1hbmRzfVxuICAgICAgICAgIG1heEhlaWdodD17bWF4SGVpZ2h0fVxuICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgICAgdGl0bGU9XCJCcm93c2UgYW50LW9ubHkgY29tbWFuZHM6XCJcbiAgICAgICAgICBvbkNhbmNlbD17Y2xvc2V9XG4gICAgICAgIC8+XG4gICAgICA8L1RhYj4sXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBoZWlnaHQ9e2luc2lkZU1vZGFsID8gdW5kZWZpbmVkIDogbWF4SGVpZ2h0fT5cbiAgICAgIDxQYW5lIGNvbG9yPVwicHJvZmVzc2lvbmFsQmx1ZVwiPlxuICAgICAgICA8VGFic1xuICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCdcbiAgICAgICAgICAgICAgPyAnL2hlbHAnXG4gICAgICAgICAgICAgIDogYENsYXVkZSBDb2RlIHYke01BQ1JPLlZFUlNJT059YFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb2xvcj1cInByb2Zlc3Npb25hbEJsdWVcIlxuICAgICAgICAgIGRlZmF1bHRUYWI9XCJnZW5lcmFsXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt0YWJzfVxuICAgICAgICA8L1RhYnM+XG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIEZvciBtb3JlIGhlbHA6eycgJ31cbiAgICAgICAgICAgIDxMaW5rIHVybD1cImh0dHBzOi8vY29kZS5jbGF1ZGUuY29tL2RvY3MvZW4vb3ZlcnZpZXdcIiAvPlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIHtleGl0U3RhdGUucGVuZGluZyA/IChcbiAgICAgICAgICAgICAgPD5QcmVzcyB7ZXhpdFN0YXRlLmtleU5hbWV9IGFnYWluIHRvIGV4aXQ8Lz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxUZXh0IGl0YWxpYz57ZGlzbWlzc1Nob3J0Y3V0fSB0byBjYW5jZWw8L1RleHQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICA8L1BhbmU+XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsOEJBQThCLFFBQVEsNkNBQTZDO0FBQzVGLFNBQVNDLGtCQUFrQixRQUFRLHVDQUF1QztBQUMxRSxTQUNFQyxtQkFBbUIsRUFDbkIsS0FBS0MsT0FBTyxFQUNaLEtBQUtDLG9CQUFvQixFQUN6QkMsc0JBQXNCLFFBQ2pCLG1CQUFtQjtBQUMxQixTQUFTQyxnQkFBZ0IsUUFBUSwrQkFBK0I7QUFDaEUsU0FBU0MsZUFBZSxRQUFRLGdDQUFnQztBQUNoRSxTQUFTQyxHQUFHLEVBQUVDLElBQUksRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDOUMsU0FBU0MsYUFBYSxRQUFRLG9DQUFv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
|
|
|
|
| 138 |
const t5 = insideModal ? undefined : maxHeight;
|
| 139 |
let t6;
|
| 140 |
if ($[31] !== tabs) {
|
| 141 |
+
t6 = <Tabs title={false ? "/help" : `Versper Claw v${MACRO.VERSION}`} color="professionalBlue" defaultTab="general">{tabs}</Tabs>;
|
| 142 |
$[31] = tabs;
|
| 143 |
$[32] = t6;
|
| 144 |
} else {
|
|
|
|
| 146 |
}
|
| 147 |
let t7;
|
| 148 |
if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
|
| 149 |
+
t7 = <Box marginTop={1}><Text>For more help:{" "}<Link url="https://github.com/versperai/VersperClaw" /></Text></Box>;
|
| 150 |
$[33] = t7;
|
| 151 |
} else {
|
| 152 |
t7 = $[33];
|
|
|
|
| 181 |
}
|
| 182 |
return t10;
|
| 183 |
}
|
| 184 |
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyIsInVzZVNob3J0Y3V0RGlzcGxheSIsImJ1aWx0SW5Db21tYW5kTmFtZXMiLCJDb21tYW5kIiwiQ29tbWFuZFJlc3VsdERpc3BsYXkiLCJJTlRFUk5BTF9PTkxZX0NPTU1BTkRTIiwidXNlSXNJbnNpZGVNb2RhbCIsInVzZVRlcm1pbmFsU2l6ZSIsIkJveCIsIkxpbmsiLCJUZXh0IiwidXNlS2V5YmluZGluZyIsIlBhbmUiLCJUYWIiLCJUYWJzIiwiQ29tbWFuZHMiLCJHZW5lcmFsIiwiUHJvcHMiLCJvbkNsb3NlIiwicmVzdWx0Iiwib3B0aW9ucyIsImRpc3BsYXkiLCJjb21tYW5kcyIsIkhlbHBWMiIsInQwIiwiJCIsIl9jIiwicm93cyIsImNvbHVtbnMiLCJtYXhIZWlnaHQiLCJNYXRoIiwiZmxvb3IiLCJpbnNpZGVNb2RhbCIsInQxIiwiY2xvc2UiLCJ0MiIsIlN5bWJvbCIsImZvciIsImNvbnRleHQiLCJleGl0U3RhdGUiLCJkaXNtaXNzU2hvcnRjdXQiLCJhbnRPbmx5Q29tbWFuZHMiLCJidWlsdGluQ29tbWFuZHMiLCJ0MyIsImJ1aWx0aW5OYW1lcyIsImZpbHRlciIsImNtZCIsImhhcyIsIm5hbWUiLCJpc0hpZGRlbiIsInQ0IiwiY21kXzIiLCJjdXN0b21Db21tYW5kcyIsInRhYnMiLCJ0NSIsInB1c2giLCJ0NiIsImxlbmd0aCIsInQ3IiwidW5kZWZpbmVkIiwiTUFDUk8iLCJWRVJTSU9OIiwidDgiLCJrZXlOYW1lIiwicGVuZGluZyIsInQ5IiwidDEwIl0sInNvdXJjZXMiOlsiSGVscFYyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyB9IGZyb20gJ3NyYy9ob29rcy91c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MuanMnXG5pbXBvcnQgeyB1c2VTaG9ydGN1dERpc3BsYXkgfSBmcm9tICdzcmMva2V5YmluZGluZ3MvdXNlU2hvcnRjdXREaXNwbGF5LmpzJ1xuaW1wb3J0IHtcbiAgYnVpbHRJbkNvbW1hbmROYW1lcyxcbiAgdHlwZSBDb21tYW5kLFxuICB0eXBlIENvbW1hbmRSZXN1bHREaXNwbGF5LFxuICBJTlRFUk5BTF9PTkxZX0NPTU1BTkRTLFxufSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IHVzZUlzSW5zaWRlTW9kYWwgfSBmcm9tICcuLi8uLi9jb250ZXh0L21vZGFsQ29udGV4dC5qcydcbmltcG9ydCB7IHVzZVRlcm1pbmFsU2l6ZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRlcm1pbmFsU2l6ZS5qcydcbmltcG9ydCB7IEJveCwgTGluaywgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmcgfSBmcm9tICcuLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHsgUGFuZSB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vUGFuZS5qcydcbmltcG9ydCB7IFRhYiwgVGFicyB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vVGFicy5qcydcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnLi9Db21tYW5kcy5qcydcbmltcG9ydCB7IEdlbmVyYWwgfSBmcm9tICcuL0dlbmVyYWwuanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIG9uQ2xvc2U6IChcbiAgICByZXN1bHQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZGlzcGxheT86IENvbW1hbmRSZXN1bHREaXNwbGF5IH0sXG4gICkgPT4gdm9pZFxuICBjb21tYW5kczogQ29tbWFuZFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIZWxwVjIoeyBvbkNsb3NlLCBjb21tYW5kcyB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgcm93cywgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcbiAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5mbG9vcihyb3dzIC8gMilcbiAgLy8gSW5zaWRlIHRoZSBtb2RhbCBzbG90LCBGdWxsc2NyZWVuTGF5b3V0IGFscmVhZHkgY2FwcyBoZWlnaHQgYW5kIFBhbmUvVGFic1xuICAvLyB1c2UgZmxleFNocmluaz0wIChzZWUgIzIzNTkyKSDigJQgb3VyIG93biBoZWlnaHQ9IGNvbnN0cmFpbnQgd291bGQgY2xpcCB0aGVcbiAgLy8gZm9vdGVyIHNpbmNlIFRhYnMgd29uJ3Qgc2hyaW5rIHRvIGZpdC4gTGV0IHRoZSBtb2RhbCBzbG90IGhhbmRsZSBzaXppbmcuXG4gIGNvbnN0IGluc2lkZU1vZGFsID0gdXNlSXNJbnNpZGVNb2RhbCgpXG5cbiAgY29uc3QgY2xvc2UgPSAoKSA9PiBvbkNsb3NlKCdIZWxwIGRpYWxvZyBkaXNtaXNzZWQnLCB7IGRpc3BsYXk6ICdzeXN0ZW0nIH0pXG4gIHVzZUtleWJpbmRpbmcoJ2hlbHA6ZGlzbWlzcycsIGNsb3NlLCB7IGNvbnRleHQ6ICdIZWxwJyB9KVxuICBjb25zdCBleGl0U3RhdGUgPSB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MoY2xvc2UpXG4gIGNvbnN0IGRpc21pc3NTaG9ydGN1dCA9IHVzZVNob3J0Y3V0RGlzcGxheSgnaGVscDpkaXNtaXNzJywgJ0hlbHAnLCAnZXNjJylcblxuICBjb25zdCBidWlsdGluTmFtZXMgPSBidWlsdEluQ29tbWFuZE5hbWVzKClcbiAgbGV0IGJ1aWx0aW5Db21tYW5kcyA9IGNvbW1hbmRzLmZpbHRlcihcbiAgICBjbWQgPT4gYnVpbHRpbk5hbWVzLmhhcyhjbWQubmFtZSkgJiYgIWNtZC5pc0hpZGRlbixcbiAgKVxuICBsZXQgYW50T25seUNvbW1hbmRzOiBDb21tYW5kW10gPSBbXVxuXG4gIC8vIFdlIGhhdmUgdG8gZG8gdGhpcyBpbiBhbiBgaWZgIHRvIGhlbHAgdHJlZXNoYWtpbmdcbiAgaWYgKFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCcpIHtcbiAgICBjb25zdCBpbnRlcm5hbE9ubHlOYW1lcyA9IG5ldyBTZXQoSU5URVJOQUxfT05MWV9DT01NQU5EUy5tYXAoXyA9PiBfLm5hbWUpKVxuICAgIGJ1aWx0aW5Db21tYW5kcyA9IGJ1aWx0aW5Db21tYW5kcy5maWx0ZXIoXG4gICAgICBjbWQgPT4gIWludGVybmFsT25seU5hbWVzLmhhcyhjbWQubmFtZSksXG4gICAgKVxuICAgIGFudE9ubHlDb21tYW5kcyA9IGNvbW1hbmRzLmZpbHRlcihcbiAgICAgIGNtZCA9PiBpbnRlcm5hbE9ubHlOYW1lcy5oYXMoY21kLm5hbWUpICYmICFjbWQuaXNIaWRkZW4sXG4gICAgKVxuICB9XG5cbiAgY29uc3QgY3VzdG9tQ29tbWFuZHMgPSBjb21tYW5kcy5maWx0ZXIoXG4gICAgY21kID0+ICFidWlsdGluTmFtZXMuaGFzKGNtZC5uYW1lKSAmJiAhY21kLmlzSGlkZGVuLFxuICApXG5cbiAgY29uc3QgdGFicyA9IFtcbiAgICA8VGFiIGtleT1cImdlbmVyYWxcIiB0aXRsZT1cImdlbmVyYWxcIj5cbiAgICAgIDxHZW5lcmFsIC8+XG4gICAgPC9UYWI+LFxuICBdXG5cbiAgdGFicy5wdXNoKFxuICAgIDxUYWIga2V5PVwiY29tbWFuZHNcIiB0aXRsZT1cImNvbW1hbmRzXCI+XG4gICAgICA8Q29tbWFuZHNcbiAgICAgICAgY29tbWFuZHM9e2J1aWx0aW5Db21tYW5kc31cbiAgICAgICAgbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgIHRpdGxlPVwiQnJvd3NlIGRlZmF1bHQgY29tbWFuZHM6XCJcbiAgICAgICAgb25DYW5jZWw9e2Nsb3NlfVxuICAgICAgLz5cbiAgICA8L1RhYj4sXG4gIClcblxuICB0YWJzLnB1c2goXG4gICAgPFRhYiBrZXk9XCJjdXN0b21cIiB0aXRsZT1cImN1c3RvbS1jb21tYW5kc1wiPlxuICAgICAgPENvbW1hbmRzXG4gICAgICAgIGNvbW1hbmRzPXtjdXN0b21Db21tYW5kc31cbiAgICAgICAgbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgIHRpdGxlPVwiQnJvd3NlIGN1c3RvbSBjb21tYW5kczpcIlxuICAgICAgICBlbXB0eU1lc3NhZ2U9XCJObyBjdXN0b20gY29tbWFuZHMgZm91bmRcIlxuICAgICAgICBvbkNhbmNlbD17Y2xvc2V9XG4gICAgICAvPlxuICAgIDwvVGFiPixcbiAgKVxuXG4gIGlmIChcImV4dGVybmFsXCIgPT09ICdhbnQnICYmIGFudE9ubHlDb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgdGFicy5wdXNoKFxuICAgICAgPFRhYiBrZXk9XCJhbnQtb25seVwiIHRpdGxlPVwiW2FudC1vbmx5XVwiPlxuICAgICAgICA8Q29tbWFuZHNcbiAgICAgICAgICBjb21tYW5kcz17YW50T25seUNvbW1hbmRzfVxuICAgICAgICAgIG1heEhlaWdodD17bWF4SGVpZ2h0fVxuICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgICAgdGl0bGU9XCJCcm93c2UgYW50LW9ubHkgY29tbWFuZHM6XCJcbiAgICAgICAgICBvbkNhbmNlbD17Y2xvc2V9XG4gICAgICAgIC8+XG4gICAgICA8L1RhYj4sXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBoZWlnaHQ9e2luc2lkZU1vZGFsID8gdW5kZWZpbmVkIDogbWF4SGVpZ2h0fT5cbiAgICAgIDxQYW5lIGNvbG9yPVwicHJvZmVzc2lvbmFsQmx1ZVwiPlxuICAgICAgICA8VGFic1xuICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCdcbiAgICAgICAgICAgICAgPyAnL2hlbHAnXG4gICAgICAgICAgICAgIDogYENsYXVkZSBDb2RlIHYke01BQ1JPLlZFUlNJT059YFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb2xvcj1cInByb2Zlc3Npb25hbEJsdWVcIlxuICAgICAgICAgIGRlZmF1bHRUYWI9XCJnZW5lcmFsXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt0YWJzfVxuICAgICAgICA8L1RhYnM+XG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIEZvciBtb3JlIGhlbHA6eycgJ31cbiAgICAgICAgICAgIDxMaW5rIHVybD1cImh0dHBzOi8vY29kZS5jbGF1ZGUuY29tL2RvY3MvZW4vb3ZlcnZpZXdcIiAvPlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIHtleGl0U3RhdGUucGVuZGluZyA/IChcbiAgICAgICAgICAgICAgPD5QcmVzcyB7ZXhpdFN0YXRlLmtleU5hbWV9IGFnYWluIHRvIGV4aXQ8Lz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxUZXh0IGl0YWxpYz57ZGlzbWlzc1Nob3J0Y3V0fSB0byBjYW5jZWw8L1RleHQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICA8L1BhbmU+XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsOEJBQThCLFFBQVEsNkNBQTZDO0FBQzVGLFNBQVNDLGtCQUFrQixRQUFRLHVDQUF1QztBQUMxRSxTQUNFQyxtQkFBbUIsRUFDbkIsS0FBS0MsT0FBTyxFQUNaLEtBQUtDLG9CQUFvQixFQUN6QkMsc0JBQXNCLFFBQ2pCLG1CQUFtQjtBQUMxQixTQUFTQyxnQkFBZ0IsUUFBUSwrQkFBK0I7QUFDaEUsU0FBU0MsZUFBZSxRQUFRLGdDQUFnQztBQUNoRSxTQUFTQyxHQUFHLEVBQUVDLElBQUksRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDOUMsU0FBU0MsYUFBYSxRQUFRLG9DQUFv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
|
src/constants/product.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
export const PRODUCT_URL = 'https://claude.com/claude-code'
|
| 2 |
|
| 3 |
-
//
|
| 4 |
export const CLAUDE_AI_BASE_URL = 'https://claude.ai'
|
| 5 |
export const CLAUDE_AI_STAGING_BASE_URL = 'https://claude-ai.staging.ant.dev'
|
| 6 |
export const CLAUDE_AI_LOCAL_BASE_URL = 'http://localhost:4000'
|
|
|
|
| 1 |
export const PRODUCT_URL = 'https://claude.com/claude-code'
|
| 2 |
|
| 3 |
+
// VersperClaw Remote session URLs
|
| 4 |
export const CLAUDE_AI_BASE_URL = 'https://claude.ai'
|
| 5 |
export const CLAUDE_AI_STAGING_BASE_URL = 'https://claude-ai.staging.ant.dev'
|
| 6 |
export const CLAUDE_AI_LOCAL_BASE_URL = 'http://localhost:4000'
|
src/constants/prompts.ts
CHANGED
|
@@ -99,7 +99,7 @@ const skillSearchFeatureCheck = feature('EXPERIMENTAL_SKILL_SEARCH')
|
|
| 99 |
import type { OutputStyleConfig } from './outputStyles.js'
|
| 100 |
import { CYBER_RISK_INSTRUCTION } from './cyberRiskInstruction.js'
|
| 101 |
|
| 102 |
-
export const
|
| 103 |
'https://code.claude.com/docs/en/claude_code_docs_map.md'
|
| 104 |
|
| 105 |
/**
|
|
@@ -115,7 +115,7 @@ export const SYSTEM_PROMPT_DYNAMIC_BOUNDARY =
|
|
| 115 |
'__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__'
|
| 116 |
|
| 117 |
// @[MODEL LAUNCH]: Update the latest frontier model.
|
| 118 |
-
const FRONTIER_MODEL_NAME = '
|
| 119 |
|
| 120 |
// @[MODEL LAUNCH]: Update the model family IDs below to the latest in each tier.
|
| 121 |
const CLAUDE_4_5_OR_4_6_MODEL_IDS = {
|
|
@@ -214,7 +214,7 @@ function getSimpleDoingTasksSection(): string {
|
|
| 214 |
]
|
| 215 |
|
| 216 |
const userHelpSubitems = [
|
| 217 |
-
`/help: Get help with using
|
| 218 |
`To give feedback, users should ${MACRO.ISSUES_EXPLAINER}`,
|
| 219 |
]
|
| 220 |
|
|
@@ -242,7 +242,7 @@ function getSimpleDoingTasksSection(): string {
|
|
| 242 |
: []),
|
| 243 |
...(process.env.USER_TYPE === 'ant'
|
| 244 |
? [
|
| 245 |
-
`If the user reports a bug, slowness, or unexpected behavior with
|
| 246 |
]
|
| 247 |
: []),
|
| 248 |
`If the user asks for help or wants to give feedback inform them of the following:`,
|
|
@@ -434,7 +434,7 @@ function getSimpleToneAndStyleSection(): string {
|
|
| 434 |
? null
|
| 435 |
: `Your responses should be short and concise.`,
|
| 436 |
`When referencing specific functions or pieces of code include the pattern file_path:line_number to allow the user to easily navigate to the source code location.`,
|
| 437 |
-
`When referencing GitHub issues or pull requests, use the owner/repo#123 format (e.g.
|
| 438 |
`Do not use a colon before tool calls. Your tool calls may not be shown directly in the output, so text like "Let me read the file:" followed by a read tool call should just be "Let me read the file." with a period.`,
|
| 439 |
].filter(item => item !== null)
|
| 440 |
|
|
@@ -449,7 +449,7 @@ export async function getSystemPrompt(
|
|
| 449 |
): Promise<string[]> {
|
| 450 |
if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) {
|
| 451 |
return [
|
| 452 |
-
`You are
|
| 453 |
]
|
| 454 |
}
|
| 455 |
|
|
@@ -618,14 +618,6 @@ export async function computeEnvInfo(
|
|
| 618 |
// inlined at each callsite (not hoisted to a const) so the bundler can
|
| 619 |
// constant-fold it to `false` in external builds and eliminate the branch.
|
| 620 |
let modelDescription = ''
|
| 621 |
-
if (process.env.USER_TYPE === 'ant' && isUndercover()) {
|
| 622 |
-
// suppress
|
| 623 |
-
} else {
|
| 624 |
-
const marketingName = getMarketingNameForModel(modelId)
|
| 625 |
-
modelDescription = marketingName
|
| 626 |
-
? `You are powered by the model named ${marketingName}. The exact model ID is ${modelId}.`
|
| 627 |
-
: `You are powered by the model ${modelId}.`
|
| 628 |
-
}
|
| 629 |
|
| 630 |
const additionalDirsInfo =
|
| 631 |
additionalWorkingDirectories && additionalWorkingDirectories.length > 0
|
|
@@ -659,12 +651,10 @@ export async function computeSimpleEnvInfo(
|
|
| 659 |
let modelDescription: string | null = null
|
| 660 |
if (process.env.USER_TYPE === 'ant' && isUndercover()) {
|
| 661 |
// suppress
|
| 662 |
-
} else {
|
| 663 |
-
const marketingName = getMarketingNameForModel(modelId)
|
| 664 |
-
modelDescription = marketingName
|
| 665 |
-
? `You are powered by the model named ${marketingName}. The exact model ID is ${modelId}.`
|
| 666 |
-
: `You are powered by the model ${modelId}.`
|
| 667 |
}
|
|
|
|
|
|
|
|
|
|
| 668 |
|
| 669 |
const cutoff = getKnowledgeCutoff(modelId)
|
| 670 |
const knowledgeCutoffMessage = cutoff
|
|
@@ -691,15 +681,11 @@ export async function computeSimpleEnvInfo(
|
|
| 691 |
`OS Version: ${unameSR}`,
|
| 692 |
modelDescription,
|
| 693 |
knowledgeCutoffMessage,
|
|
|
|
| 694 |
process.env.USER_TYPE === 'ant' && isUndercover()
|
| 695 |
? null
|
| 696 |
-
: `
|
| 697 |
-
|
| 698 |
-
? null
|
| 699 |
-
: `Claude Code is available as a CLI in the terminal, desktop app (Mac/Windows), web app (claude.ai/code), and IDE extensions (VS Code, JetBrains).`,
|
| 700 |
-
process.env.USER_TYPE === 'ant' && isUndercover()
|
| 701 |
-
? null
|
| 702 |
-
: `Fast mode for Claude Code uses the same ${FRONTIER_MODEL_NAME} model with faster output. It does NOT switch to a different model. It can be toggled with /fast.`,
|
| 703 |
].filter(item => item !== null)
|
| 704 |
|
| 705 |
return [
|
|
@@ -755,7 +741,7 @@ export function getUnameSR(): string {
|
|
| 755 |
return `${osType()} ${osRelease()}`
|
| 756 |
}
|
| 757 |
|
| 758 |
-
export const DEFAULT_AGENT_PROMPT = `You are an agent for
|
| 759 |
|
| 760 |
export async function enhanceSystemPromptWithEnvDetails(
|
| 761 |
existingSystemPrompt: string[],
|
|
|
|
| 99 |
import type { OutputStyleConfig } from './outputStyles.js'
|
| 100 |
import { CYBER_RISK_INSTRUCTION } from './cyberRiskInstruction.js'
|
| 101 |
|
| 102 |
+
export const VERSPER_CLAW_DOCS_MAP_URL =
|
| 103 |
'https://code.claude.com/docs/en/claude_code_docs_map.md'
|
| 104 |
|
| 105 |
/**
|
|
|
|
| 115 |
'__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__'
|
| 116 |
|
| 117 |
// @[MODEL LAUNCH]: Update the latest frontier model.
|
| 118 |
+
const FRONTIER_MODEL_NAME = 'VersperOmni'
|
| 119 |
|
| 120 |
// @[MODEL LAUNCH]: Update the model family IDs below to the latest in each tier.
|
| 121 |
const CLAUDE_4_5_OR_4_6_MODEL_IDS = {
|
|
|
|
| 214 |
]
|
| 215 |
|
| 216 |
const userHelpSubitems = [
|
| 217 |
+
`/help: Get help with using VersperClaw`,
|
| 218 |
`To give feedback, users should ${MACRO.ISSUES_EXPLAINER}`,
|
| 219 |
]
|
| 220 |
|
|
|
|
| 242 |
: []),
|
| 243 |
...(process.env.USER_TYPE === 'ant'
|
| 244 |
? [
|
| 245 |
+
`If the user reports a bug, slowness, or unexpected behavior with VersperClaw itself (as opposed to asking you to fix their own code), recommend the appropriate slash command: /issue for model-related problems (odd outputs, wrong tool choices, hallucinations, refusals), or /share to upload the full session transcript for product bugs, crashes, slowness, or general issues. Only recommend these when the user is describing a problem with VersperClaw. After /share produces a ccshare link, if you have a Slack MCP tool available, offer to post the link to #versperclaw-feedback (channel ID C07VBSHV7EV) for the user.`,
|
| 246 |
]
|
| 247 |
: []),
|
| 248 |
`If the user asks for help or wants to give feedback inform them of the following:`,
|
|
|
|
| 434 |
? null
|
| 435 |
: `Your responses should be short and concise.`,
|
| 436 |
`When referencing specific functions or pieces of code include the pattern file_path:line_number to allow the user to easily navigate to the source code location.`,
|
| 437 |
+
`When referencing GitHub issues or pull requests, use the owner/repo#123 format (e.g. versperai/versperclaw#100) so they render as clickable links.`,
|
| 438 |
`Do not use a colon before tool calls. Your tool calls may not be shown directly in the output, so text like "Let me read the file:" followed by a read tool call should just be "Let me read the file." with a period.`,
|
| 439 |
].filter(item => item !== null)
|
| 440 |
|
|
|
|
| 449 |
): Promise<string[]> {
|
| 450 |
if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) {
|
| 451 |
return [
|
| 452 |
+
`You are VersperClaw, versperai's CLI.\n\nCWD: ${getCwd()}\nDate: ${getSessionStartDate()}`,
|
| 453 |
]
|
| 454 |
}
|
| 455 |
|
|
|
|
| 618 |
// inlined at each callsite (not hoisted to a const) so the bundler can
|
| 619 |
// constant-fold it to `false` in external builds and eliminate the branch.
|
| 620 |
let modelDescription = ''
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 621 |
|
| 622 |
const additionalDirsInfo =
|
| 623 |
additionalWorkingDirectories && additionalWorkingDirectories.length > 0
|
|
|
|
| 651 |
let modelDescription: string | null = null
|
| 652 |
if (process.env.USER_TYPE === 'ant' && isUndercover()) {
|
| 653 |
// suppress
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 654 |
}
|
| 655 |
+
// modelDescription intentionally suppressed — telling the model it is
|
| 656 |
+
// "powered by Claude" or giving it model IDs containing "claude-" leaks
|
| 657 |
+
// its identity and causes it to answer "I am Claude" when asked.
|
| 658 |
|
| 659 |
const cutoff = getKnowledgeCutoff(modelId)
|
| 660 |
const knowledgeCutoffMessage = cutoff
|
|
|
|
| 681 |
`OS Version: ${unameSR}`,
|
| 682 |
modelDescription,
|
| 683 |
knowledgeCutoffMessage,
|
| 684 |
+
null,
|
| 685 |
process.env.USER_TYPE === 'ant' && isUndercover()
|
| 686 |
? null
|
| 687 |
+
: `VersperClaw is available as a CLI in the terminal, desktop app (Mac/Windows), web app (claude.ai/code), and IDE extensions (VS Code, JetBrains).`,
|
| 688 |
+
null,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 689 |
].filter(item => item !== null)
|
| 690 |
|
| 691 |
return [
|
|
|
|
| 741 |
return `${osType()} ${osRelease()}`
|
| 742 |
}
|
| 743 |
|
| 744 |
+
export const DEFAULT_AGENT_PROMPT = `You are an agent for VersperClaw, versperai's CLI. Given the user's message, you should use the tools available to complete the task. Complete the task fully—don't gold-plate, but don't leave it half-done. When you complete the task, respond with a concise report covering what was done and any key findings — the caller will relay this to the user, so it only needs the essentials.`
|
| 745 |
|
| 746 |
export async function enhanceSystemPromptWithEnvDetails(
|
| 747 |
existingSystemPrompt: string[],
|
src/constants/system.ts
CHANGED
|
@@ -7,9 +7,9 @@ import { isEnvDefinedFalsy } from '../utils/envUtils.js'
|
|
| 7 |
import { getAPIProvider } from '../utils/model/providers.js'
|
| 8 |
import { getWorkload } from '../utils/workloadContext.js'
|
| 9 |
|
| 10 |
-
const DEFAULT_PREFIX = `You are
|
| 11 |
-
const AGENT_SDK_CLAUDE_CODE_PRESET_PREFIX = `You are
|
| 12 |
-
const AGENT_SDK_PREFIX = `You are a
|
| 13 |
|
| 14 |
const CLI_SYSPROMPT_PREFIX_VALUES = [
|
| 15 |
DEFAULT_PREFIX,
|
|
|
|
| 7 |
import { getAPIProvider } from '../utils/model/providers.js'
|
| 8 |
import { getWorkload } from '../utils/workloadContext.js'
|
| 9 |
|
| 10 |
+
const DEFAULT_PREFIX = `You are VersperClaw, versperai's CLI.`
|
| 11 |
+
const AGENT_SDK_CLAUDE_CODE_PRESET_PREFIX = `You are VersperClaw, versperai's CLI, running within the Agent SDK.`
|
| 12 |
+
const AGENT_SDK_PREFIX = `You are a VersperClaw agent, built on versperai's Agent SDK.`
|
| 13 |
|
| 14 |
const CLI_SYSPROMPT_PREFIX_VALUES = [
|
| 15 |
DEFAULT_PREFIX,
|
src/services/PromptSuggestion/promptSuggestion.ts
CHANGED
|
@@ -255,7 +255,7 @@ export function getParentCacheSuppressReason(
|
|
| 255 |
: null
|
| 256 |
}
|
| 257 |
|
| 258 |
-
const SUGGESTION_PROMPT = `[SUGGESTION MODE: Suggest what the user might naturally type next into
|
| 259 |
|
| 260 |
FIRST: Look at the user's recent messages and original request.
|
| 261 |
|
|
|
|
| 255 |
: null
|
| 256 |
}
|
| 257 |
|
| 258 |
+
const SUGGESTION_PROMPT = `[SUGGESTION MODE: Suggest what the user might naturally type next into VersperClaw.]
|
| 259 |
|
| 260 |
FIRST: Look at the user's recent messages and original request.
|
| 261 |
|
src/skills/bundled/debug.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
import { open, stat } from 'fs/promises'
|
| 2 |
-
import {
|
| 3 |
import { getSettingsFilePathForSource } from 'src/utils/settings/settings.js'
|
| 4 |
import { enableDebugLogging, getDebugLogPath } from '../../utils/debug.js'
|
| 5 |
import { errorMessage, isENOENT } from '../../utils/errors.js'
|
|
@@ -14,7 +14,7 @@ export function registerDebugSkill(): void {
|
|
| 14 |
name: 'debug',
|
| 15 |
description:
|
| 16 |
process.env.USER_TYPE === 'ant'
|
| 17 |
-
? 'Debug your current
|
| 18 |
: 'Enable debug logging for this session and help diagnose issues',
|
| 19 |
allowedTools: ['Read', 'Grep', 'Glob'],
|
| 20 |
argumentHint: '[issue description]',
|
|
@@ -68,7 +68,7 @@ Tell the user that debug logging is now active at \`${debugLogPath}\`, ask them
|
|
| 68 |
|
| 69 |
const prompt = `# Debug Skill
|
| 70 |
|
| 71 |
-
Help the user debug an issue they're encountering in this current
|
| 72 |
${justEnabledSection}
|
| 73 |
## Session Debug Log
|
| 74 |
|
|
@@ -93,7 +93,7 @@ Remember that settings are in:
|
|
| 93 |
|
| 94 |
1. Review the user's issue description
|
| 95 |
2. The last ${DEFAULT_DEBUG_LINES_READ} lines show the debug file format. Look for [ERROR] and [WARN] entries, stack traces, and failure patterns across the file
|
| 96 |
-
3. Consider launching the ${
|
| 97 |
4. Explain what you found in plain language
|
| 98 |
5. Suggest concrete fixes or next steps
|
| 99 |
`
|
|
|
|
| 1 |
import { open, stat } from 'fs/promises'
|
| 2 |
+
import { VERSPER_CLAW_GUIDE_AGENT_TYPE } from 'src/tools/AgentTool/built-in/versperClawGuideAgent.js'
|
| 3 |
import { getSettingsFilePathForSource } from 'src/utils/settings/settings.js'
|
| 4 |
import { enableDebugLogging, getDebugLogPath } from '../../utils/debug.js'
|
| 5 |
import { errorMessage, isENOENT } from '../../utils/errors.js'
|
|
|
|
| 14 |
name: 'debug',
|
| 15 |
description:
|
| 16 |
process.env.USER_TYPE === 'ant'
|
| 17 |
+
? 'Debug your current VersperClaw session by reading the session debug log. Includes all event logging'
|
| 18 |
: 'Enable debug logging for this session and help diagnose issues',
|
| 19 |
allowedTools: ['Read', 'Grep', 'Glob'],
|
| 20 |
argumentHint: '[issue description]',
|
|
|
|
| 68 |
|
| 69 |
const prompt = `# Debug Skill
|
| 70 |
|
| 71 |
+
Help the user debug an issue they're encountering in this current VersperClaw session.
|
| 72 |
${justEnabledSection}
|
| 73 |
## Session Debug Log
|
| 74 |
|
|
|
|
| 93 |
|
| 94 |
1. Review the user's issue description
|
| 95 |
2. The last ${DEFAULT_DEBUG_LINES_READ} lines show the debug file format. Look for [ERROR] and [WARN] entries, stack traces, and failure patterns across the file
|
| 96 |
+
3. Consider launching the ${VERSPER_CLAW_GUIDE_AGENT_TYPE} subagent to understand the relevant Claude Code features
|
| 97 |
4. Explain what you found in plain language
|
| 98 |
5. Suggest concrete fixes or next steps
|
| 99 |
`
|
src/skills/bundled/stuck.ts
CHANGED
|
@@ -3,13 +3,13 @@ import { registerBundledSkill } from '../bundledSkills.js'
|
|
| 3 |
// Prompt text contains `ps` commands as instructions for Claude to run,
|
| 4 |
// not commands this file executes.
|
| 5 |
// eslint-disable-next-line custom-rules/no-direct-ps-commands
|
| 6 |
-
const STUCK_PROMPT = `# /stuck — diagnose frozen/slow
|
| 7 |
|
| 8 |
-
The user thinks another
|
| 9 |
|
| 10 |
## What to look for
|
| 11 |
|
| 12 |
-
Scan for other
|
| 13 |
|
| 14 |
Signs of a stuck session:
|
| 15 |
- **High CPU (≥90%) sustained** — likely an infinite loop. Sample twice, 1-2s apart, to confirm it's not a transient spike.
|
|
@@ -21,7 +21,7 @@ Signs of a stuck session:
|
|
| 21 |
|
| 22 |
## Investigation steps
|
| 23 |
|
| 24 |
-
1. **List all
|
| 25 |
\`\`\`
|
| 26 |
ps -axo pid=,pcpu=,rss=,etime=,state=,comm=,command= | grep -E '(claude|cli)' | grep -v grep
|
| 27 |
\`\`\`
|
|
@@ -41,17 +41,17 @@ Signs of a stuck session:
|
|
| 41 |
|
| 42 |
**Only post to Slack if you actually found something stuck.** If every session looks healthy, tell the user that directly — do not post an all-clear to the channel.
|
| 43 |
|
| 44 |
-
If you did find a stuck/slow session, post to **#
|
| 45 |
|
| 46 |
**Use a two-message structure** to keep the channel scannable:
|
| 47 |
|
| 48 |
-
1. **Top-level message** — one short line: hostname,
|
| 49 |
2. **Thread reply** — the full diagnostic dump. Pass the top-level message's \`ts\` as \`thread_ts\`. Include:
|
| 50 |
- PID, CPU%, RSS, state, uptime, command line, child processes
|
| 51 |
- Your diagnosis of what's likely wrong
|
| 52 |
- Relevant debug log tail or \`sample\` output if you captured it
|
| 53 |
|
| 54 |
-
If Slack MCP isn't available, format the report as a message the user can copy-paste into #
|
| 55 |
|
| 56 |
## Notes
|
| 57 |
- Don't kill or signal any processes — this is diagnostic only.
|
|
@@ -66,7 +66,7 @@ export function registerStuckSkill(): void {
|
|
| 66 |
registerBundledSkill({
|
| 67 |
name: 'stuck',
|
| 68 |
description:
|
| 69 |
-
'[ANT-ONLY] Investigate frozen/stuck/slow Claude Code sessions on this machine and post a diagnostic report to #
|
| 70 |
userInvocable: true,
|
| 71 |
async getPromptForCommand(args) {
|
| 72 |
let prompt = STUCK_PROMPT
|
|
|
|
| 3 |
// Prompt text contains `ps` commands as instructions for Claude to run,
|
| 4 |
// not commands this file executes.
|
| 5 |
// eslint-disable-next-line custom-rules/no-direct-ps-commands
|
| 6 |
+
const STUCK_PROMPT = `# /stuck — diagnose frozen/slow VersperClaw sessions
|
| 7 |
|
| 8 |
+
The user thinks another VersperClaw session on this machine is frozen, stuck, or very slow. Investigate and post a report to #versperclaw-feedback.
|
| 9 |
|
| 10 |
## What to look for
|
| 11 |
|
| 12 |
+
Scan for other VersperClaw processes (excluding the current one — PID is in \`process.pid\` but for shell commands just exclude the PID you see running this prompt). Process names are typically \`claude\` (installed) or \`cli\` (native dev build).
|
| 13 |
|
| 14 |
Signs of a stuck session:
|
| 15 |
- **High CPU (≥90%) sustained** — likely an infinite loop. Sample twice, 1-2s apart, to confirm it's not a transient spike.
|
|
|
|
| 21 |
|
| 22 |
## Investigation steps
|
| 23 |
|
| 24 |
+
1. **List all VersperClaw processes** (macOS/Linux):
|
| 25 |
\`\`\`
|
| 26 |
ps -axo pid=,pcpu=,rss=,etime=,state=,comm=,command= | grep -E '(claude|cli)' | grep -v grep
|
| 27 |
\`\`\`
|
|
|
|
| 41 |
|
| 42 |
**Only post to Slack if you actually found something stuck.** If every session looks healthy, tell the user that directly — do not post an all-clear to the channel.
|
| 43 |
|
| 44 |
+
If you did find a stuck/slow session, post to **#versperclaw-feedback** (channel ID: \`C07VBSHV7EV\`) using the Slack MCP tool. Use ToolSearch to find \`slack_send_message\` if it's not already loaded.
|
| 45 |
|
| 46 |
**Use a two-message structure** to keep the channel scannable:
|
| 47 |
|
| 48 |
+
1. **Top-level message** — one short line: hostname, VersperClaw version, and a terse symptom (e.g. "session PID 12345 pegged at 100% CPU for 10min" or "git subprocess hung in D state"). No code blocks, no details.
|
| 49 |
2. **Thread reply** — the full diagnostic dump. Pass the top-level message's \`ts\` as \`thread_ts\`. Include:
|
| 50 |
- PID, CPU%, RSS, state, uptime, command line, child processes
|
| 51 |
- Your diagnosis of what's likely wrong
|
| 52 |
- Relevant debug log tail or \`sample\` output if you captured it
|
| 53 |
|
| 54 |
+
If Slack MCP isn't available, format the report as a message the user can copy-paste into #versperclaw-feedback (and let them know to thread the details themselves).
|
| 55 |
|
| 56 |
## Notes
|
| 57 |
- Don't kill or signal any processes — this is diagnostic only.
|
|
|
|
| 66 |
registerBundledSkill({
|
| 67 |
name: 'stuck',
|
| 68 |
description:
|
| 69 |
+
'[ANT-ONLY] Investigate frozen/stuck/slow Claude Code sessions on this machine and post a diagnostic report to #versperclaw-feedback.',
|
| 70 |
userInvocable: true,
|
| 71 |
async getPromptForCommand(args) {
|
| 72 |
let prompt = STUCK_PROMPT
|
src/skills/bundled/updateConfig.ts
CHANGED
|
@@ -91,7 +91,7 @@ Set \`commit\` or \`pr\` to empty string \`""\` to hide that attribution.
|
|
| 91 |
}
|
| 92 |
}
|
| 93 |
\`\`\`
|
| 94 |
-
Plugin syntax: \`plugin-name@source\` where source is \`
|
| 95 |
|
| 96 |
### Other Settings
|
| 97 |
- \`language\`: Preferred response language (e.g., "japanese")
|
|
@@ -109,7 +109,7 @@ Plugin syntax: \`plugin-name@source\` where source is \`claude-code-marketplace\
|
|
| 109 |
|
| 110 |
const HOOKS_DOCS = `## Hooks Configuration
|
| 111 |
|
| 112 |
-
Hooks run commands at specific points in
|
| 113 |
|
| 114 |
### Hook Structure
|
| 115 |
\`\`\`json
|
|
@@ -306,7 +306,7 @@ Given an event, matcher, target file, and desired behavior, follow this flow. Ea
|
|
| 306 |
|
| 307 |
const UPDATE_CONFIG_PROMPT = `# Update Config Skill
|
| 308 |
|
| 309 |
-
Modify
|
| 310 |
|
| 311 |
## When Hooks Are Required (Not Memory)
|
| 312 |
|
|
@@ -446,7 +446,7 @@ export function registerUpdateConfigSkill(): void {
|
|
| 446 |
registerBundledSkill({
|
| 447 |
name: 'update-config',
|
| 448 |
description:
|
| 449 |
-
'Use this skill to configure the
|
| 450 |
allowedTools: ['Read'],
|
| 451 |
userInvocable: true,
|
| 452 |
async getPromptForCommand(args) {
|
|
|
|
| 91 |
}
|
| 92 |
}
|
| 93 |
\`\`\`
|
| 94 |
+
Plugin syntax: \`plugin-name@source\` where source is \`versperclaw-marketplace\`, \`claude-plugins-official\`, or \`builtin\`.
|
| 95 |
|
| 96 |
### Other Settings
|
| 97 |
- \`language\`: Preferred response language (e.g., "japanese")
|
|
|
|
| 109 |
|
| 110 |
const HOOKS_DOCS = `## Hooks Configuration
|
| 111 |
|
| 112 |
+
Hooks run commands at specific points in VersperClaw's lifecycle.
|
| 113 |
|
| 114 |
### Hook Structure
|
| 115 |
\`\`\`json
|
|
|
|
| 306 |
|
| 307 |
const UPDATE_CONFIG_PROMPT = `# Update Config Skill
|
| 308 |
|
| 309 |
+
Modify VersperClaw configuration by updating settings.json files.
|
| 310 |
|
| 311 |
## When Hooks Are Required (Not Memory)
|
| 312 |
|
|
|
|
| 446 |
registerBundledSkill({
|
| 447 |
name: 'update-config',
|
| 448 |
description:
|
| 449 |
+
'Use this skill to configure the VersperClaw harness via settings.json. Automated behaviors ("from now on when X", "each time X", "whenever X", "before/after X") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions ("allow X", "add permission", "move permission to"), env vars ("set X=Y"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: "allow npm commands", "add bq permission to global settings", "move permission to user settings", "set DEBUG=true", "when claude stops show X". For simple settings like theme/model, use Config tool.',
|
| 450 |
allowedTools: ['Read'],
|
| 451 |
userInvocable: true,
|
| 452 |
async getPromptForCommand(args) {
|
src/tools/AgentTool/built-in/{claudeCodeGuideAgent.ts → versperClawGuideAgent.ts}
RENAMED
|
@@ -14,32 +14,32 @@ import type {
|
|
| 14 |
BuiltInAgentDefinition,
|
| 15 |
} from '../loadAgentsDir.js'
|
| 16 |
|
| 17 |
-
const
|
| 18 |
'https://code.claude.com/docs/en/claude_code_docs_map.md'
|
| 19 |
const CDP_DOCS_MAP_URL = 'https://platform.claude.com/llms.txt'
|
| 20 |
|
| 21 |
-
export const
|
| 22 |
|
| 23 |
-
function
|
| 24 |
// Ant-native builds alias find/grep to embedded bfs/ugrep and remove the
|
| 25 |
// dedicated Glob/Grep tools, so point at find/grep instead.
|
| 26 |
const localSearchHint = hasEmbeddedSearchTools()
|
| 27 |
? `${FILE_READ_TOOL_NAME}, \`find\`, and \`grep\``
|
| 28 |
: `${FILE_READ_TOOL_NAME}, ${GLOB_TOOL_NAME}, and ${GREP_TOOL_NAME}`
|
| 29 |
|
| 30 |
-
return `You are the
|
| 31 |
|
| 32 |
**Your expertise spans three domains:**
|
| 33 |
|
| 34 |
-
1. **
|
| 35 |
|
| 36 |
-
2. **Claude Agent SDK**: A framework for building custom AI agents based on
|
| 37 |
|
| 38 |
3. **Claude API**: The Claude API (formerly known as the Anthropic API) for direct model interaction, tool use, and integrations.
|
| 39 |
|
| 40 |
**Documentation sources:**
|
| 41 |
|
| 42 |
-
- **
|
| 43 |
- Installation, setup, and getting started
|
| 44 |
- Hooks (pre/post command execution)
|
| 45 |
- Custom skills
|
|
@@ -95,9 +95,9 @@ function getFeedbackGuideline(): string {
|
|
| 95 |
return "- When you cannot find an answer or the feature doesn't exist, direct the user to use /feedback to report a feature request or bug"
|
| 96 |
}
|
| 97 |
|
| 98 |
-
export const
|
| 99 |
-
agentType:
|
| 100 |
-
whenToUse: `Use this agent when the user asks questions ("Can Claude...", "Does Claude...", "How do I...") about: (1)
|
| 101 |
// Ant-native builds: Glob/Grep tools are removed; use Bash (with embedded
|
| 102 |
// bfs/ugrep via find/grep aliases) for local file search instead.
|
| 103 |
tools: hasEmbeddedSearchTools()
|
|
@@ -181,7 +181,7 @@ export const CLAUDE_CODE_GUIDE_AGENT: BuiltInAgentDefinition = {
|
|
| 181 |
|
| 182 |
// Add the feedback guideline (conditional based on whether user is using 3P services)
|
| 183 |
const feedbackGuideline = getFeedbackGuideline()
|
| 184 |
-
const basePromptWithFeedback = `${
|
| 185 |
${feedbackGuideline}`
|
| 186 |
|
| 187 |
// If we have any context to add, append it to the base system prompt
|
|
|
|
| 14 |
BuiltInAgentDefinition,
|
| 15 |
} from '../loadAgentsDir.js'
|
| 16 |
|
| 17 |
+
const VERSPER_CLAW_DOCS_MAP_URL =
|
| 18 |
'https://code.claude.com/docs/en/claude_code_docs_map.md'
|
| 19 |
const CDP_DOCS_MAP_URL = 'https://platform.claude.com/llms.txt'
|
| 20 |
|
| 21 |
+
export const VERSPER_CLAW_GUIDE_AGENT_TYPE = 'claude-code-guide'
|
| 22 |
|
| 23 |
+
function getVersperClawGuideBasePrompt(): string {
|
| 24 |
// Ant-native builds alias find/grep to embedded bfs/ugrep and remove the
|
| 25 |
// dedicated Glob/Grep tools, so point at find/grep instead.
|
| 26 |
const localSearchHint = hasEmbeddedSearchTools()
|
| 27 |
? `${FILE_READ_TOOL_NAME}, \`find\`, and \`grep\``
|
| 28 |
: `${FILE_READ_TOOL_NAME}, ${GLOB_TOOL_NAME}, and ${GREP_TOOL_NAME}`
|
| 29 |
|
| 30 |
+
return `You are the VersperClaw guide agent. Your primary responsibility is helping users understand and use VersperClaw, the Claude Agent SDK, and the Claude API (formerly the Anthropic API) effectively.
|
| 31 |
|
| 32 |
**Your expertise spans three domains:**
|
| 33 |
|
| 34 |
+
1. **VersperClaw** (the CLI tool): Installation, configuration, hooks, skills, MCP servers, keyboard shortcuts, IDE integrations, settings, and workflows.
|
| 35 |
|
| 36 |
+
2. **Claude Agent SDK**: A framework for building custom AI agents based on VersperClaw technology. Available for Node.js/TypeScript and Python.
|
| 37 |
|
| 38 |
3. **Claude API**: The Claude API (formerly known as the Anthropic API) for direct model interaction, tool use, and integrations.
|
| 39 |
|
| 40 |
**Documentation sources:**
|
| 41 |
|
| 42 |
+
- **VersperClaw docs** (${VERSPER_CLAW_DOCS_MAP_URL}): Fetch this for questions about the VersperClaw CLI tool, including:
|
| 43 |
- Installation, setup, and getting started
|
| 44 |
- Hooks (pre/post command execution)
|
| 45 |
- Custom skills
|
|
|
|
| 95 |
return "- When you cannot find an answer or the feature doesn't exist, direct the user to use /feedback to report a feature request or bug"
|
| 96 |
}
|
| 97 |
|
| 98 |
+
export const VERSPER_CLAW_GUIDE_AGENT: BuiltInAgentDefinition = {
|
| 99 |
+
agentType: VERSPER_CLAW_GUIDE_AGENT_TYPE,
|
| 100 |
+
whenToUse: `Use this agent when the user asks questions ("Can Claude...", "Does Claude...", "How do I...") about: (1) VersperClaw (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - API usage, tool use, Anthropic SDK usage. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via ${SEND_MESSAGE_TOOL_NAME}.`,
|
| 101 |
// Ant-native builds: Glob/Grep tools are removed; use Bash (with embedded
|
| 102 |
// bfs/ugrep via find/grep aliases) for local file search instead.
|
| 103 |
tools: hasEmbeddedSearchTools()
|
|
|
|
| 181 |
|
| 182 |
// Add the feedback guideline (conditional based on whether user is using 3P services)
|
| 183 |
const feedbackGuideline = getFeedbackGuideline()
|
| 184 |
+
const basePromptWithFeedback = `${getVersperClawGuideBasePrompt()}
|
| 185 |
${feedbackGuideline}`
|
| 186 |
|
| 187 |
// If we have any context to add, append it to the base system prompt
|
src/tools/AgentTool/builtInAgents.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { feature } from 'bun:bundle'
|
|
| 2 |
import { getIsNonInteractiveSession } from '../../bootstrap/state.js'
|
| 3 |
import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
|
| 4 |
import { isEnvTruthy } from '../../utils/envUtils.js'
|
| 5 |
-
import {
|
| 6 |
import { EXPLORE_AGENT } from './built-in/exploreAgent.js'
|
| 7 |
import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js'
|
| 8 |
import { PLAN_AGENT } from './built-in/planAgent.js'
|
|
@@ -58,7 +58,7 @@ export function getBuiltInAgents(): AgentDefinition[] {
|
|
| 58 |
process.env.CLAUDE_CODE_ENTRYPOINT !== 'sdk-cli'
|
| 59 |
|
| 60 |
if (isNonSdkEntrypoint) {
|
| 61 |
-
agents.push(
|
| 62 |
}
|
| 63 |
|
| 64 |
if (
|
|
|
|
| 2 |
import { getIsNonInteractiveSession } from '../../bootstrap/state.js'
|
| 3 |
import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
|
| 4 |
import { isEnvTruthy } from '../../utils/envUtils.js'
|
| 5 |
+
import { VERSPER_CLAW_GUIDE_AGENT } from './built-in/versperClawGuideAgent.js'
|
| 6 |
import { EXPLORE_AGENT } from './built-in/exploreAgent.js'
|
| 7 |
import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js'
|
| 8 |
import { PLAN_AGENT } from './built-in/planAgent.js'
|
|
|
|
| 58 |
process.env.CLAUDE_CODE_ENTRYPOINT !== 'sdk-cli'
|
| 59 |
|
| 60 |
if (isNonSdkEntrypoint) {
|
| 61 |
+
agents.push(VERSPER_CLAW_GUIDE_AGENT)
|
| 62 |
}
|
| 63 |
|
| 64 |
if (
|
src/utils/permissions/yolo-classifier-prompts/auto_mode_system_prompt.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
You are an automated security classifier for
|
| 2 |
|
| 3 |
You receive a transcript of the conversation so far (user messages and previous tool calls) followed by the new action the agent wants to take. You must classify that single new action.
|
| 4 |
|
|
|
|
| 1 |
+
You are an automated security classifier for VersperClaw, an AI coding assistant that runs in users' terminals. Your job is to decide whether each tool call the agent wants to make should be ALLOWED (auto-approved) or BLOCKED (requires explicit human confirmation).
|
| 2 |
|
| 3 |
You receive a transcript of the conversation so far (user messages and previous tool calls) followed by the new action the agent wants to take. You must classify that single new action.
|
| 4 |
|