compact-agent 1.1.0
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/README.md +394 -0
- package/bin/anycode.js +2 -0
- package/bin/crowcoder.js +19 -0
- package/bin/ecc-hooks.cjs +138 -0
- package/dist/agents.d.ts +17 -0
- package/dist/agents.js +1603 -0
- package/dist/agents.js.map +1 -0
- package/dist/api.d.ts +16 -0
- package/dist/api.js +115 -0
- package/dist/api.js.map +1 -0
- package/dist/autonomous-loops.d.ts +108 -0
- package/dist/autonomous-loops.js +526 -0
- package/dist/autonomous-loops.js.map +1 -0
- package/dist/codemaps.d.ts +53 -0
- package/dist/codemaps.js +325 -0
- package/dist/codemaps.js.map +1 -0
- package/dist/compaction.d.ts +30 -0
- package/dist/compaction.js +125 -0
- package/dist/compaction.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/content-engine.d.ts +97 -0
- package/dist/content-engine.js +721 -0
- package/dist/content-engine.js.map +1 -0
- package/dist/cost-tracker.d.ts +49 -0
- package/dist/cost-tracker.js +150 -0
- package/dist/cost-tracker.js.map +1 -0
- package/dist/counter-button.d.ts +35 -0
- package/dist/counter-button.js +48 -0
- package/dist/counter-button.js.map +1 -0
- package/dist/counter.d.ts +21 -0
- package/dist/counter.js +31 -0
- package/dist/counter.js.map +1 -0
- package/dist/coverage.d.ts +23 -0
- package/dist/coverage.js +215 -0
- package/dist/coverage.js.map +1 -0
- package/dist/docs-sync.d.ts +23 -0
- package/dist/docs-sync.js +266 -0
- package/dist/docs-sync.js.map +1 -0
- package/dist/ecc.d.ts +41 -0
- package/dist/ecc.js +644 -0
- package/dist/ecc.js.map +1 -0
- package/dist/evaluation.d.ts +24 -0
- package/dist/evaluation.js +412 -0
- package/dist/evaluation.js.map +1 -0
- package/dist/export.d.ts +22 -0
- package/dist/export.js +109 -0
- package/dist/export.js.map +1 -0
- package/dist/git-workflow.d.ts +22 -0
- package/dist/git-workflow.js +197 -0
- package/dist/git-workflow.js.map +1 -0
- package/dist/hook-controls.d.ts +34 -0
- package/dist/hook-controls.js +90 -0
- package/dist/hook-controls.js.map +1 -0
- package/dist/hooks.d.ts +30 -0
- package/dist/hooks.js +130 -0
- package/dist/hooks.js.map +1 -0
- package/dist/html-parser.d.ts +18 -0
- package/dist/html-parser.js +101 -0
- package/dist/html-parser.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +1230 -0
- package/dist/index.js.map +1 -0
- package/dist/learning.d.ts +35 -0
- package/dist/learning.js +238 -0
- package/dist/learning.js.map +1 -0
- package/dist/login.d.ts +37 -0
- package/dist/login.js +191 -0
- package/dist/login.js.map +1 -0
- package/dist/memory.d.ts +39 -0
- package/dist/memory.js +183 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-router.d.ts +23 -0
- package/dist/model-router.js +145 -0
- package/dist/model-router.js.map +1 -0
- package/dist/modes.d.ts +17 -0
- package/dist/modes.js +217 -0
- package/dist/modes.js.map +1 -0
- package/dist/orchestration.d.ts +37 -0
- package/dist/orchestration.js +139 -0
- package/dist/orchestration.js.map +1 -0
- package/dist/package-detect.d.ts +36 -0
- package/dist/package-detect.js +529 -0
- package/dist/package-detect.js.map +1 -0
- package/dist/permissions.d.ts +25 -0
- package/dist/permissions.js +50 -0
- package/dist/permissions.js.map +1 -0
- package/dist/pm2-manager.d.ts +40 -0
- package/dist/pm2-manager.js +127 -0
- package/dist/pm2-manager.js.map +1 -0
- package/dist/query.d.ts +15 -0
- package/dist/query.js +278 -0
- package/dist/query.js.map +1 -0
- package/dist/refactor.d.ts +22 -0
- package/dist/refactor.js +226 -0
- package/dist/refactor.js.map +1 -0
- package/dist/retry.d.ts +20 -0
- package/dist/retry.js +88 -0
- package/dist/retry.js.map +1 -0
- package/dist/rules.d.ts +34 -0
- package/dist/rules.js +942 -0
- package/dist/rules.js.map +1 -0
- package/dist/schema.d.ts +23 -0
- package/dist/schema.js +12 -0
- package/dist/schema.js.map +1 -0
- package/dist/search-first.d.ts +17 -0
- package/dist/search-first.js +301 -0
- package/dist/search-first.js.map +1 -0
- package/dist/security.d.ts +10 -0
- package/dist/security.js +145 -0
- package/dist/security.js.map +1 -0
- package/dist/sessions.d.ts +21 -0
- package/dist/sessions.js +112 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skill-create.d.ts +38 -0
- package/dist/skill-create.js +389 -0
- package/dist/skill-create.js.map +1 -0
- package/dist/skills.d.ts +34 -0
- package/dist/skills.js +161 -0
- package/dist/skills.js.map +1 -0
- package/dist/strategic-compaction.d.ts +24 -0
- package/dist/strategic-compaction.js +144 -0
- package/dist/strategic-compaction.js.map +1 -0
- package/dist/system-prompt.d.ts +3 -0
- package/dist/system-prompt.js +101 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/theme.d.ts +60 -0
- package/dist/theme.js +220 -0
- package/dist/theme.js.map +1 -0
- package/dist/tools/bash.d.ts +2 -0
- package/dist/tools/bash.js +49 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +76 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +2 -0
- package/dist/tools/glob.js +54 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +2 -0
- package/dist/tools/grep.js +64 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-dir.d.ts +2 -0
- package/dist/tools/list-dir.js +51 -0
- package/dist/tools/list-dir.js.map +1 -0
- package/dist/tools/read.d.ts +2 -0
- package/dist/tools/read.js +56 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/types.d.ts +45 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +2 -0
- package/dist/tools/web-fetch.js +41 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +27 -0
- package/dist/tools/web-search.js +139 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +2 -0
- package/dist/tools/write.js +36 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.js +57 -0
- package/dist/types.js.map +1 -0
- package/dist/users.d.ts +51 -0
- package/dist/users.js +193 -0
- package/dist/users.js.map +1 -0
- package/dist/verification.d.ts +73 -0
- package/dist/verification.js +269 -0
- package/dist/verification.js.map +1 -0
- package/dist/walkthrough.d.ts +10 -0
- package/dist/walkthrough.js +121 -0
- package/dist/walkthrough.js.map +1 -0
- package/package.json +58 -0
- package/resources/ecc/agents/architect.json +16 -0
- package/resources/ecc/agents/architect.md +212 -0
- package/resources/ecc/agents/build-error-resolver.json +17 -0
- package/resources/ecc/agents/build-error-resolver.md +116 -0
- package/resources/ecc/agents/chief-of-staff.json +17 -0
- package/resources/ecc/agents/chief-of-staff.md +153 -0
- package/resources/ecc/agents/code-reviewer.json +16 -0
- package/resources/ecc/agents/code-reviewer.md +238 -0
- package/resources/ecc/agents/database-reviewer.json +16 -0
- package/resources/ecc/agents/database-reviewer.md +92 -0
- package/resources/ecc/agents/doc-updater.json +16 -0
- package/resources/ecc/agents/doc-updater.md +108 -0
- package/resources/ecc/agents/e2e-runner.json +17 -0
- package/resources/ecc/agents/e2e-runner.md +109 -0
- package/resources/ecc/agents/go-build-resolver.json +17 -0
- package/resources/ecc/agents/go-build-resolver.md +96 -0
- package/resources/ecc/agents/go-reviewer.json +16 -0
- package/resources/ecc/agents/go-reviewer.md +77 -0
- package/resources/ecc/agents/harness-optimizer.json +15 -0
- package/resources/ecc/agents/harness-optimizer.md +34 -0
- package/resources/ecc/agents/loop-operator.json +16 -0
- package/resources/ecc/agents/loop-operator.md +36 -0
- package/resources/ecc/agents/planner.json +15 -0
- package/resources/ecc/agents/planner.md +212 -0
- package/resources/ecc/agents/python-reviewer.json +16 -0
- package/resources/ecc/agents/python-reviewer.md +99 -0
- package/resources/ecc/agents/refactor-cleaner.json +17 -0
- package/resources/ecc/agents/refactor-cleaner.md +87 -0
- package/resources/ecc/agents/security-reviewer.json +16 -0
- package/resources/ecc/agents/security-reviewer.md +109 -0
- package/resources/ecc/agents/tdd-guide.json +17 -0
- package/resources/ecc/agents/tdd-guide.md +93 -0
- package/resources/ecc/commands/add-language-rules.md +39 -0
- package/resources/ecc/commands/database-migration.md +36 -0
- package/resources/ecc/commands/feature-development.md +38 -0
- package/resources/ecc/prompts/build-fix.prompt.md +47 -0
- package/resources/ecc/prompts/code-review.prompt.md +56 -0
- package/resources/ecc/prompts/plan.prompt.md +52 -0
- package/resources/ecc/prompts/refactor.prompt.md +50 -0
- package/resources/ecc/prompts/security-review.prompt.md +70 -0
- package/resources/ecc/prompts/tdd.prompt.md +47 -0
- package/resources/ecc/rules/common-agents.md +53 -0
- package/resources/ecc/rules/common-coding-style.md +52 -0
- package/resources/ecc/rules/common-development-workflow.md +33 -0
- package/resources/ecc/rules/common-git-workflow.md +28 -0
- package/resources/ecc/rules/common-hooks.md +34 -0
- package/resources/ecc/rules/common-patterns.md +35 -0
- package/resources/ecc/rules/common-performance.md +59 -0
- package/resources/ecc/rules/common-security.md +33 -0
- package/resources/ecc/rules/common-testing.md +33 -0
- package/resources/ecc/rules/golang-coding-style.md +31 -0
- package/resources/ecc/rules/golang-hooks.md +16 -0
- package/resources/ecc/rules/golang-patterns.md +44 -0
- package/resources/ecc/rules/golang-security.md +33 -0
- package/resources/ecc/rules/golang-testing.md +30 -0
- package/resources/ecc/rules/kotlin-coding-style.md +39 -0
- package/resources/ecc/rules/kotlin-hooks.md +16 -0
- package/resources/ecc/rules/kotlin-patterns.md +50 -0
- package/resources/ecc/rules/kotlin-security.md +58 -0
- package/resources/ecc/rules/kotlin-testing.md +38 -0
- package/resources/ecc/rules/php-coding-style.md +25 -0
- package/resources/ecc/rules/php-hooks.md +21 -0
- package/resources/ecc/rules/php-patterns.md +23 -0
- package/resources/ecc/rules/php-security.md +24 -0
- package/resources/ecc/rules/php-testing.md +26 -0
- package/resources/ecc/rules/python-coding-style.md +42 -0
- package/resources/ecc/rules/python-hooks.md +19 -0
- package/resources/ecc/rules/python-patterns.md +39 -0
- package/resources/ecc/rules/python-security.md +30 -0
- package/resources/ecc/rules/python-testing.md +38 -0
- package/resources/ecc/rules/swift-coding-style.md +47 -0
- package/resources/ecc/rules/swift-hooks.md +20 -0
- package/resources/ecc/rules/swift-patterns.md +66 -0
- package/resources/ecc/rules/swift-security.md +33 -0
- package/resources/ecc/rules/swift-testing.md +45 -0
- package/resources/ecc/rules/typescript-coding-style.md +63 -0
- package/resources/ecc/rules/typescript-hooks.md +20 -0
- package/resources/ecc/rules/typescript-patterns.md +50 -0
- package/resources/ecc/rules/typescript-security.md +26 -0
- package/resources/ecc/rules/typescript-testing.md +16 -0
- package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +152 -0
- package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
- package/resources/ecc/skills/agent-sort/SKILL.md +214 -0
- package/resources/ecc/skills/agent-sort/agents/openai.yaml +7 -0
- package/resources/ecc/skills/api-design/SKILL.md +522 -0
- package/resources/ecc/skills/api-design/agents/openai.yaml +7 -0
- package/resources/ecc/skills/article-writing/SKILL.md +78 -0
- package/resources/ecc/skills/article-writing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/backend-patterns/SKILL.md +597 -0
- package/resources/ecc/skills/backend-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/brand-voice/SKILL.md +96 -0
- package/resources/ecc/skills/brand-voice/agents/openai.yaml +7 -0
- package/resources/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/resources/ecc/skills/bun-runtime/SKILL.md +83 -0
- package/resources/ecc/skills/bun-runtime/agents/openai.yaml +7 -0
- package/resources/ecc/skills/coding-standards/SKILL.md +548 -0
- package/resources/ecc/skills/coding-standards/agents/openai.yaml +7 -0
- package/resources/ecc/skills/content-engine/SKILL.md +130 -0
- package/resources/ecc/skills/content-engine/agents/openai.yaml +7 -0
- package/resources/ecc/skills/crosspost/SKILL.md +110 -0
- package/resources/ecc/skills/crosspost/agents/openai.yaml +7 -0
- package/resources/ecc/skills/deep-research/SKILL.md +154 -0
- package/resources/ecc/skills/deep-research/agents/openai.yaml +7 -0
- package/resources/ecc/skills/dmux-workflows/SKILL.md +143 -0
- package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +7 -0
- package/resources/ecc/skills/documentation-lookup/SKILL.md +89 -0
- package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +7 -0
- package/resources/ecc/skills/e2e-testing/SKILL.md +325 -0
- package/resources/ecc/skills/e2e-testing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/eval-harness/SKILL.md +235 -0
- package/resources/ecc/skills/eval-harness/agents/openai.yaml +7 -0
- package/resources/ecc/skills/everything-claude-code/SKILL.md +442 -0
- package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +7 -0
- package/resources/ecc/skills/exa-search/SKILL.md +169 -0
- package/resources/ecc/skills/exa-search/agents/openai.yaml +7 -0
- package/resources/ecc/skills/fal-ai-media/SKILL.md +276 -0
- package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +7 -0
- package/resources/ecc/skills/frontend-patterns/SKILL.md +647 -0
- package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/frontend-slides/SKILL.md +183 -0
- package/resources/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/resources/ecc/skills/frontend-slides/agents/openai.yaml +7 -0
- package/resources/ecc/skills/investor-materials/SKILL.md +95 -0
- package/resources/ecc/skills/investor-materials/agents/openai.yaml +7 -0
- package/resources/ecc/skills/investor-outreach/SKILL.md +90 -0
- package/resources/ecc/skills/investor-outreach/agents/openai.yaml +7 -0
- package/resources/ecc/skills/market-research/SKILL.md +74 -0
- package/resources/ecc/skills/market-research/agents/openai.yaml +7 -0
- package/resources/ecc/skills/mcp-server-patterns/SKILL.md +66 -0
- package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/mle-workflow/SKILL.md +346 -0
- package/resources/ecc/skills/mle-workflow/agents/openai.yaml +7 -0
- package/resources/ecc/skills/nextjs-turbopack/SKILL.md +43 -0
- package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +7 -0
- package/resources/ecc/skills/product-capability/SKILL.md +140 -0
- package/resources/ecc/skills/product-capability/agents/openai.yaml +7 -0
- package/resources/ecc/skills/security-review/SKILL.md +494 -0
- package/resources/ecc/skills/security-review/agents/openai.yaml +7 -0
- package/resources/ecc/skills/strategic-compact/SKILL.md +102 -0
- package/resources/ecc/skills/strategic-compact/agents/openai.yaml +7 -0
- package/resources/ecc/skills/tdd-workflow/SKILL.md +409 -0
- package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +7 -0
- package/resources/ecc/skills/verification-loop/SKILL.md +125 -0
- package/resources/ecc/skills/verification-loop/agents/openai.yaml +7 -0
- package/resources/ecc/skills/video-editing/SKILL.md +307 -0
- package/resources/ecc/skills/video-editing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/x-api/SKILL.md +229 -0
- package/resources/ecc/skills/x-api/agents/openai.yaml +7 -0
package/dist/users.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Users table — persistent user management.
|
|
3
|
+
* Stores user data in ~/.crowcoder/users.json
|
|
4
|
+
*
|
|
5
|
+
* Each user has a unique ID, display name, and metadata.
|
|
6
|
+
* Users can be activated/deactivated, and the active user's context
|
|
7
|
+
* is injected into the system prompt so the LLM knows who it's working with.
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
12
|
+
import { getConfigDir } from './config.js';
|
|
13
|
+
import { createEmptyUsersTable } from './schema.js';
|
|
14
|
+
const USERS_FILE = join(getConfigDir(), 'users.json');
|
|
15
|
+
function defaultUsersData() {
|
|
16
|
+
return createEmptyUsersTable();
|
|
17
|
+
}
|
|
18
|
+
function loadUsers() {
|
|
19
|
+
if (!existsSync(USERS_FILE)) {
|
|
20
|
+
return defaultUsersData();
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const raw = readFileSync(USERS_FILE, 'utf-8');
|
|
24
|
+
return JSON.parse(raw);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return defaultUsersData();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function saveUsers(data) {
|
|
31
|
+
mkdirSync(getConfigDir(), { recursive: true });
|
|
32
|
+
writeFileSync(USERS_FILE, JSON.stringify(data, null, 2), 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a new user. Returns the created User.
|
|
36
|
+
*/
|
|
37
|
+
export function createUser(name, email, role) {
|
|
38
|
+
const data = loadUsers();
|
|
39
|
+
const user = {
|
|
40
|
+
id: randomUUID(),
|
|
41
|
+
name,
|
|
42
|
+
email,
|
|
43
|
+
role,
|
|
44
|
+
active: false,
|
|
45
|
+
createdAt: new Date().toISOString(),
|
|
46
|
+
updatedAt: new Date().toISOString(),
|
|
47
|
+
metadata: {},
|
|
48
|
+
};
|
|
49
|
+
data.users.push(user);
|
|
50
|
+
saveUsers(data);
|
|
51
|
+
return user;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* List all users.
|
|
55
|
+
*/
|
|
56
|
+
export function listUsers() {
|
|
57
|
+
return loadUsers().users;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get a user by ID.
|
|
61
|
+
*/
|
|
62
|
+
export function getUser(id) {
|
|
63
|
+
const data = loadUsers();
|
|
64
|
+
return data.users.find((u) => u.id === id) || null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get a user by email address.
|
|
68
|
+
*/
|
|
69
|
+
export function getUserByEmail(email) {
|
|
70
|
+
const data = loadUsers();
|
|
71
|
+
return data.users.find((u) => u.email?.toLowerCase() === email.toLowerCase()) || null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the currently active user.
|
|
75
|
+
*/
|
|
76
|
+
export function getActiveUser() {
|
|
77
|
+
const data = loadUsers();
|
|
78
|
+
if (!data.activeUserId)
|
|
79
|
+
return null;
|
|
80
|
+
return getUser(data.activeUserId);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Update a user's fields. Returns the updated User or null if not found.
|
|
84
|
+
*/
|
|
85
|
+
export function updateUser(id, updates) {
|
|
86
|
+
const data = loadUsers();
|
|
87
|
+
const idx = data.users.findIndex((u) => u.id === id);
|
|
88
|
+
if (idx === -1)
|
|
89
|
+
return null;
|
|
90
|
+
const user = data.users[idx];
|
|
91
|
+
if (updates.name !== undefined)
|
|
92
|
+
user.name = updates.name;
|
|
93
|
+
if (updates.email !== undefined)
|
|
94
|
+
user.email = updates.email;
|
|
95
|
+
if (updates.role !== undefined)
|
|
96
|
+
user.role = updates.role;
|
|
97
|
+
if (updates.active !== undefined)
|
|
98
|
+
user.active = updates.active;
|
|
99
|
+
if (updates.metadata !== undefined)
|
|
100
|
+
user.metadata = { ...user.metadata, ...updates.metadata };
|
|
101
|
+
user.updatedAt = new Date().toISOString();
|
|
102
|
+
// If activating this user, deactivate all others
|
|
103
|
+
if (updates.active === true) {
|
|
104
|
+
data.activeUserId = id;
|
|
105
|
+
for (let i = 0; i < data.users.length; i++) {
|
|
106
|
+
if (i !== idx) {
|
|
107
|
+
data.users[i].active = false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (updates.active === false && data.activeUserId === id) {
|
|
112
|
+
data.activeUserId = null;
|
|
113
|
+
}
|
|
114
|
+
data.users[idx] = user;
|
|
115
|
+
saveUsers(data);
|
|
116
|
+
return user;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Delete a user by ID. Returns true if deleted, false if not found.
|
|
120
|
+
*/
|
|
121
|
+
export function deleteUser(id) {
|
|
122
|
+
const data = loadUsers();
|
|
123
|
+
const idx = data.users.findIndex((u) => u.id === id);
|
|
124
|
+
if (idx === -1)
|
|
125
|
+
return false;
|
|
126
|
+
if (data.activeUserId === id) {
|
|
127
|
+
data.activeUserId = null;
|
|
128
|
+
}
|
|
129
|
+
data.users.splice(idx, 1);
|
|
130
|
+
saveUsers(data);
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Set the active user by ID. Returns the activated User or null if not found.
|
|
135
|
+
*/
|
|
136
|
+
export function setActiveUser(id) {
|
|
137
|
+
const user = getUser(id);
|
|
138
|
+
if (!user)
|
|
139
|
+
return null;
|
|
140
|
+
return updateUser(id, { active: true });
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Set user metadata key/value pair.
|
|
144
|
+
*/
|
|
145
|
+
export function setUserMetadata(id, key, value) {
|
|
146
|
+
const user = getUser(id);
|
|
147
|
+
if (!user)
|
|
148
|
+
return null;
|
|
149
|
+
return updateUser(id, { metadata: { ...user.metadata, [key]: value } });
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get a metadata value for a user.
|
|
153
|
+
*/
|
|
154
|
+
export function getUserMetadata(id, key) {
|
|
155
|
+
const user = getUser(id);
|
|
156
|
+
return user?.metadata[key];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Print a formatted user list to stdout.
|
|
160
|
+
*/
|
|
161
|
+
export function printUserList() {
|
|
162
|
+
const { users, activeUserId } = loadUsers();
|
|
163
|
+
if (users.length === 0) {
|
|
164
|
+
console.log(' No users defined yet.');
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
for (const u of users) {
|
|
168
|
+
const marker = u.id === activeUserId ? ' ◀ active' : '';
|
|
169
|
+
const status = u.active ? '' : ' (inactive)';
|
|
170
|
+
const email = u.email ? ` <${u.email}>` : '';
|
|
171
|
+
const role = u.role ? ` [${u.role}]` : '';
|
|
172
|
+
console.log(` ${u.id.slice(0, 8)} ${u.name}${email}${role}${status}${marker}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Build a context string about the active user for the system prompt.
|
|
177
|
+
*/
|
|
178
|
+
export function buildUserContext() {
|
|
179
|
+
const user = getActiveUser();
|
|
180
|
+
if (!user)
|
|
181
|
+
return '';
|
|
182
|
+
const lines = [`# Active User: ${user.name}`];
|
|
183
|
+
if (user.email)
|
|
184
|
+
lines.push(`# Email: ${user.email}`);
|
|
185
|
+
if (user.role)
|
|
186
|
+
lines.push(`# Role: ${user.role}`);
|
|
187
|
+
const customKeys = Object.keys(user.metadata).filter((k) => !['name', 'email', 'role'].includes(k));
|
|
188
|
+
for (const k of customKeys) {
|
|
189
|
+
lines.push(`# ${k}: ${user.metadata[k]}`);
|
|
190
|
+
}
|
|
191
|
+
return lines.join('\n');
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../src/users.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification loop engine and checkpoint system
|
|
3
|
+
* - Verification loop (/verify): Runs tests, analyzes failures, fixes code, repeats
|
|
4
|
+
* - Checkpoint system (/checkpoint): Saves/restores git state
|
|
5
|
+
*/
|
|
6
|
+
export interface Checkpoint {
|
|
7
|
+
id: string;
|
|
8
|
+
sessionId: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
headSha: string;
|
|
11
|
+
isDirty: boolean;
|
|
12
|
+
dirtyFiles: string[];
|
|
13
|
+
timestamp: string;
|
|
14
|
+
cwd: string;
|
|
15
|
+
}
|
|
16
|
+
export interface VerificationConfig {
|
|
17
|
+
maxIterations: number;
|
|
18
|
+
timeoutMs: number;
|
|
19
|
+
verbose: boolean;
|
|
20
|
+
}
|
|
21
|
+
declare function ensureCheckpointsDir(): void;
|
|
22
|
+
declare function checkpointPath(sessionId: string, checkpointId: string): string;
|
|
23
|
+
declare function generateCheckpointId(): string;
|
|
24
|
+
declare function getGitHeadSha(cwd: string): string;
|
|
25
|
+
declare function getGitDirtyFiles(cwd: string): string[];
|
|
26
|
+
declare function isGitDirty(cwd: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Save current git state as a checkpoint
|
|
29
|
+
* @param sessionId - Unique session identifier
|
|
30
|
+
* @param cwd - Working directory to checkpoint
|
|
31
|
+
* @param label - Optional label for the checkpoint
|
|
32
|
+
* @returns Checkpoint metadata
|
|
33
|
+
*/
|
|
34
|
+
export declare function saveCheckpoint(sessionId: string, cwd: string, label?: string): Checkpoint;
|
|
35
|
+
/**
|
|
36
|
+
* List all checkpoints for a session
|
|
37
|
+
* @param sessionId - Session identifier
|
|
38
|
+
* @returns Array of checkpoint metadata
|
|
39
|
+
*/
|
|
40
|
+
export declare function listCheckpoints(sessionId: string): Checkpoint[];
|
|
41
|
+
/**
|
|
42
|
+
* Restore a checkpoint (returns instructions for restoration)
|
|
43
|
+
* @param sessionId - Session identifier
|
|
44
|
+
* @param checkpointId - Checkpoint identifier
|
|
45
|
+
* @returns Instructions string for restoring the checkpoint
|
|
46
|
+
*/
|
|
47
|
+
export declare function restoreCheckpoint(sessionId: string, checkpointId: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Auto-detect the test command for the current project
|
|
50
|
+
* @param cwd - Working directory
|
|
51
|
+
* @returns Test command string
|
|
52
|
+
*/
|
|
53
|
+
export declare function autoDetectTestCommand(cwd: string): string;
|
|
54
|
+
/**
|
|
55
|
+
* Build a detailed verification loop prompt
|
|
56
|
+
* @param cwd - Working directory
|
|
57
|
+
* @param command - Optional test command (auto-detected if not provided)
|
|
58
|
+
* @returns Detailed prompt string
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildVerifyPrompt(cwd: string, command?: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Run a verification loop (for CLI reference/testing)
|
|
63
|
+
* @param cwd - Working directory
|
|
64
|
+
* @param command - Test command
|
|
65
|
+
* @param config - Verification configuration
|
|
66
|
+
* @returns Verification result
|
|
67
|
+
*/
|
|
68
|
+
export declare function runVerificationLoop(cwd: string, command: string, config?: VerificationConfig): Promise<{
|
|
69
|
+
success: boolean;
|
|
70
|
+
iterations: number;
|
|
71
|
+
errors: string[];
|
|
72
|
+
}>;
|
|
73
|
+
export { getGitHeadSha, getGitDirtyFiles, isGitDirty, generateCheckpointId, checkpointPath, ensureCheckpointsDir, };
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification loop engine and checkpoint system
|
|
3
|
+
* - Verification loop (/verify): Runs tests, analyzes failures, fixes code, repeats
|
|
4
|
+
* - Checkpoint system (/checkpoint): Saves/restores git state
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import { readFileSync, writeFileSync, readdirSync, mkdirSync, existsSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { getConfigDir } from './config.js';
|
|
11
|
+
// ── Checkpoint System ──────────────────────────────────
|
|
12
|
+
const CHECKPOINTS_DIR = join(getConfigDir(), 'checkpoints');
|
|
13
|
+
function ensureCheckpointsDir() {
|
|
14
|
+
mkdirSync(CHECKPOINTS_DIR, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
function checkpointPath(sessionId, checkpointId) {
|
|
17
|
+
return join(CHECKPOINTS_DIR, `${sessionId}__${checkpointId}.json`);
|
|
18
|
+
}
|
|
19
|
+
function generateCheckpointId() {
|
|
20
|
+
const ts = Date.now().toString(36);
|
|
21
|
+
const rand = Math.random().toString(36).slice(2, 8);
|
|
22
|
+
return `${ts}-${rand}`;
|
|
23
|
+
}
|
|
24
|
+
function getGitHeadSha(cwd) {
|
|
25
|
+
try {
|
|
26
|
+
return execSync('git rev-parse HEAD', { cwd, encoding: 'utf-8' }).trim();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new Error('Not a git repository');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function getGitDirtyFiles(cwd) {
|
|
33
|
+
try {
|
|
34
|
+
const output = execSync('git status --porcelain', { cwd, encoding: 'utf-8' }).trim();
|
|
35
|
+
return output ? output.split('\n').map((line) => line.slice(3)) : [];
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function isGitDirty(cwd) {
|
|
42
|
+
try {
|
|
43
|
+
const output = execSync('git status --porcelain', { cwd, encoding: 'utf-8' }).trim();
|
|
44
|
+
return output.length > 0;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Save current git state as a checkpoint
|
|
52
|
+
* @param sessionId - Unique session identifier
|
|
53
|
+
* @param cwd - Working directory to checkpoint
|
|
54
|
+
* @param label - Optional label for the checkpoint
|
|
55
|
+
* @returns Checkpoint metadata
|
|
56
|
+
*/
|
|
57
|
+
export function saveCheckpoint(sessionId, cwd, label) {
|
|
58
|
+
ensureCheckpointsDir();
|
|
59
|
+
const checkpointId = generateCheckpointId();
|
|
60
|
+
const headSha = getGitHeadSha(cwd);
|
|
61
|
+
const isDirty = isGitDirty(cwd);
|
|
62
|
+
const dirtyFiles = getGitDirtyFiles(cwd);
|
|
63
|
+
const checkpoint = {
|
|
64
|
+
id: checkpointId,
|
|
65
|
+
sessionId,
|
|
66
|
+
label,
|
|
67
|
+
headSha,
|
|
68
|
+
isDirty,
|
|
69
|
+
dirtyFiles,
|
|
70
|
+
timestamp: new Date().toISOString(),
|
|
71
|
+
cwd,
|
|
72
|
+
};
|
|
73
|
+
const path = checkpointPath(sessionId, checkpointId);
|
|
74
|
+
writeFileSync(path, JSON.stringify(checkpoint, null, 2), 'utf-8');
|
|
75
|
+
return checkpoint;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* List all checkpoints for a session
|
|
79
|
+
* @param sessionId - Session identifier
|
|
80
|
+
* @returns Array of checkpoint metadata
|
|
81
|
+
*/
|
|
82
|
+
export function listCheckpoints(sessionId) {
|
|
83
|
+
ensureCheckpointsDir();
|
|
84
|
+
const files = readdirSync(CHECKPOINTS_DIR).filter((f) => f.startsWith(`${sessionId}__`) && f.endsWith('.json'));
|
|
85
|
+
const checkpoints = [];
|
|
86
|
+
for (const file of files) {
|
|
87
|
+
try {
|
|
88
|
+
const raw = readFileSync(join(CHECKPOINTS_DIR, file), 'utf-8');
|
|
89
|
+
checkpoints.push(JSON.parse(raw));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// skip corrupt files
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return checkpoints.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Restore a checkpoint (returns instructions for restoration)
|
|
99
|
+
* @param sessionId - Session identifier
|
|
100
|
+
* @param checkpointId - Checkpoint identifier
|
|
101
|
+
* @returns Instructions string for restoring the checkpoint
|
|
102
|
+
*/
|
|
103
|
+
export function restoreCheckpoint(sessionId, checkpointId) {
|
|
104
|
+
ensureCheckpointsDir();
|
|
105
|
+
const path = checkpointPath(sessionId, checkpointId);
|
|
106
|
+
if (!existsSync(path)) {
|
|
107
|
+
throw new Error(`Checkpoint not found: ${checkpointId}`);
|
|
108
|
+
}
|
|
109
|
+
const checkpoint = JSON.parse(readFileSync(path, 'utf-8'));
|
|
110
|
+
// Build restoration instructions
|
|
111
|
+
const instructions = [];
|
|
112
|
+
instructions.push(`${chalk.bold('Checkpoint Restoration Instructions')}:`);
|
|
113
|
+
instructions.push('');
|
|
114
|
+
instructions.push(`Label: ${checkpoint.label || '(unlabeled)'}`);
|
|
115
|
+
instructions.push(`Timestamp: ${checkpoint.timestamp}`);
|
|
116
|
+
instructions.push(`HEAD SHA: ${checkpoint.headSha}`);
|
|
117
|
+
instructions.push('');
|
|
118
|
+
instructions.push('To restore this checkpoint, run:');
|
|
119
|
+
instructions.push('');
|
|
120
|
+
instructions.push(` cd "${checkpoint.cwd}"`);
|
|
121
|
+
instructions.push(` git checkout ${checkpoint.headSha}`);
|
|
122
|
+
if (checkpoint.isDirty) {
|
|
123
|
+
instructions.push('');
|
|
124
|
+
instructions.push('Note: This checkpoint had uncommitted changes:');
|
|
125
|
+
for (const file of checkpoint.dirtyFiles) {
|
|
126
|
+
instructions.push(` - ${file}`);
|
|
127
|
+
}
|
|
128
|
+
instructions.push('');
|
|
129
|
+
instructions.push('You may want to preserve them:');
|
|
130
|
+
instructions.push(' git stash');
|
|
131
|
+
instructions.push(' git checkout <your-branch>');
|
|
132
|
+
instructions.push(' git stash pop');
|
|
133
|
+
}
|
|
134
|
+
return instructions.join('\n');
|
|
135
|
+
}
|
|
136
|
+
// ── Verification Loop ──────────────────────────────────
|
|
137
|
+
/**
|
|
138
|
+
* Auto-detect the test command for the current project
|
|
139
|
+
* @param cwd - Working directory
|
|
140
|
+
* @returns Test command string
|
|
141
|
+
*/
|
|
142
|
+
export function autoDetectTestCommand(cwd) {
|
|
143
|
+
const checks = [
|
|
144
|
+
{ file: 'package.json', cmd: 'npm test' },
|
|
145
|
+
{ file: 'pyproject.toml', cmd: 'pytest' },
|
|
146
|
+
{ file: 'setup.py', cmd: 'pytest' },
|
|
147
|
+
{ file: 'Cargo.toml', cmd: 'cargo test' },
|
|
148
|
+
{ file: 'go.mod', cmd: 'go test ./...' },
|
|
149
|
+
{ file: 'Gemfile', cmd: 'bundle exec rake test' },
|
|
150
|
+
{ file: 'pom.xml', cmd: 'mvn test' },
|
|
151
|
+
{ file: 'build.gradle', cmd: 'gradle test' },
|
|
152
|
+
];
|
|
153
|
+
for (const { file, cmd } of checks) {
|
|
154
|
+
if (existsSync(join(cwd, file))) {
|
|
155
|
+
return cmd;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return 'npm test'; // default fallback
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Build a detailed verification loop prompt
|
|
162
|
+
* @param cwd - Working directory
|
|
163
|
+
* @param command - Optional test command (auto-detected if not provided)
|
|
164
|
+
* @returns Detailed prompt string
|
|
165
|
+
*/
|
|
166
|
+
export function buildVerifyPrompt(cwd, command) {
|
|
167
|
+
const testCmd = command || autoDetectTestCommand(cwd);
|
|
168
|
+
const prompt = `You are now in verification mode. Your goal is to run tests, analyze failures, fix the code, and repeat until all tests pass.
|
|
169
|
+
|
|
170
|
+
${chalk.bold('Verification Loop Process:')}
|
|
171
|
+
|
|
172
|
+
1. ${chalk.cyan('Run the test command')}
|
|
173
|
+
Execute: ${chalk.yellow(testCmd)}
|
|
174
|
+
Capture all output, stderr, and exit codes
|
|
175
|
+
|
|
176
|
+
2. ${chalk.cyan('Analyze the output')}
|
|
177
|
+
Look for:
|
|
178
|
+
- Failed test names and error messages
|
|
179
|
+
- Stack traces and assertion failures
|
|
180
|
+
- Missing imports or undefined references
|
|
181
|
+
- Type errors (if applicable)
|
|
182
|
+
- Any other compilation/runtime errors
|
|
183
|
+
|
|
184
|
+
3. ${chalk.cyan('Fix the failing code')}
|
|
185
|
+
Based on the errors:
|
|
186
|
+
- Identify the root cause
|
|
187
|
+
- Modify the minimal necessary code to fix the issue
|
|
188
|
+
- Do NOT refactor unrelated code
|
|
189
|
+
- Ensure fixes are targeted and precise
|
|
190
|
+
|
|
191
|
+
4. ${chalk.cyan('Re-run the test command')}
|
|
192
|
+
Execute: ${chalk.yellow(testCmd)}
|
|
193
|
+
Verify the fix resolved the issue
|
|
194
|
+
|
|
195
|
+
5. ${chalk.cyan('Repeat until success')}
|
|
196
|
+
Continue the loop until either:
|
|
197
|
+
- All tests pass (SUCCESS)
|
|
198
|
+
- You've made 5 iterations (STOP - escalate)
|
|
199
|
+
|
|
200
|
+
${chalk.bold('Important Guidelines:')}
|
|
201
|
+
- ${chalk.dim('Work in:')} ${cwd}
|
|
202
|
+
- ${chalk.dim('Run tests with:')} ${testCmd}
|
|
203
|
+
- ${chalk.dim('Max iterations:')} 5 (safety limit)
|
|
204
|
+
- ${chalk.dim('Be systematic:')} Fix one issue at a time
|
|
205
|
+
- ${chalk.dim('Show progress:')} Report iteration count and current status
|
|
206
|
+
- ${chalk.dim('Be explicit:')} Show the exact commands you run and their output
|
|
207
|
+
- ${chalk.dim('Stop if stuck:')} If you can't make progress after 5 iterations, explain what you've tried and ask for help
|
|
208
|
+
|
|
209
|
+
${chalk.bold('Output Format:')}
|
|
210
|
+
For each iteration, clearly indicate:
|
|
211
|
+
- Iteration number (e.g., "Iteration 1/5")
|
|
212
|
+
- Test command being run
|
|
213
|
+
- Output/errors found
|
|
214
|
+
- Root cause analysis
|
|
215
|
+
- Fix applied
|
|
216
|
+
- Result of re-run
|
|
217
|
+
|
|
218
|
+
When complete, provide a summary of:
|
|
219
|
+
- Total iterations taken
|
|
220
|
+
- Issues fixed
|
|
221
|
+
- Final test status (PASS/FAIL)
|
|
222
|
+
- Any remaining concerns
|
|
223
|
+
`;
|
|
224
|
+
return prompt;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Run a verification loop (for CLI reference/testing)
|
|
228
|
+
* @param cwd - Working directory
|
|
229
|
+
* @param command - Test command
|
|
230
|
+
* @param config - Verification configuration
|
|
231
|
+
* @returns Verification result
|
|
232
|
+
*/
|
|
233
|
+
export async function runVerificationLoop(cwd, command, config = { maxIterations: 5, timeoutMs: 30000, verbose: false }) {
|
|
234
|
+
const errors = [];
|
|
235
|
+
let iterations = 0;
|
|
236
|
+
for (iterations = 1; iterations <= config.maxIterations; iterations++) {
|
|
237
|
+
if (config.verbose) {
|
|
238
|
+
console.log(`\n${chalk.blue(`Iteration ${iterations}/${config.maxIterations}`)}`);
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
const output = execSync(command, {
|
|
242
|
+
cwd,
|
|
243
|
+
encoding: 'utf-8',
|
|
244
|
+
stdio: 'pipe',
|
|
245
|
+
timeout: config.timeoutMs,
|
|
246
|
+
});
|
|
247
|
+
if (config.verbose) {
|
|
248
|
+
console.log(chalk.green('All tests passed!'));
|
|
249
|
+
}
|
|
250
|
+
return { success: true, iterations, errors: [] };
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
const errorOutput = err instanceof Error ? err.message : String(err);
|
|
254
|
+
errors.push(errorOutput);
|
|
255
|
+
if (config.verbose) {
|
|
256
|
+
console.log(chalk.red('Test failed'));
|
|
257
|
+
console.log(chalk.dim(errorOutput.slice(0, 200) + '...'));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
success: false,
|
|
263
|
+
iterations: config.maxIterations,
|
|
264
|
+
errors,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
// ── Exports ────────────────────────────────────────────
|
|
268
|
+
export { getGitHeadSha, getGitDirtyFiles, isGitDirty, generateCheckpointId, checkpointPath, ensureCheckpointsDir, };
|
|
269
|
+
//# sourceMappingURL=verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walkthrough prompt — agent-led tour of Crowcoder.
|
|
3
|
+
*
|
|
4
|
+
* Invoked via `/walkthrough` (or `/tour` / `/guide`). Returns a prompt that
|
|
5
|
+
* puts the assistant into Onboarding Guide mode for the rest of the session
|
|
6
|
+
* (until the user runs `/clear` or switches modes). The guide leads the user
|
|
7
|
+
* through the canonical command surface — no duplicates, no ECC-vs-built-in
|
|
8
|
+
* choices to make.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildWalkthroughPrompt(): string;
|