@kkelly-offical/kkcode 0.1.7 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -674
- package/README.md +452 -387
- package/package.json +50 -46
- package/src/agent/agent.mjs +228 -220
- package/src/agent/custom-agent-loader.mjs +6 -3
- package/src/agent/generator.mjs +2 -2
- package/src/agent/prompt/assistant.txt +12 -0
- package/src/agent/prompt/bug-hunter.txt +89 -89
- package/src/agent/prompt/frontend-designer.txt +58 -58
- package/src/agent/prompt/guide.txt +1 -1
- package/src/agent/prompt/longagent-blueprint-agent.txt +83 -83
- package/src/agent/prompt/longagent-coding-agent.txt +37 -37
- package/src/agent/prompt/longagent-debugging-agent.txt +46 -46
- package/src/agent/prompt/longagent-preview-agent.txt +63 -63
- package/src/command/custom-commands.mjs +2 -2
- package/src/commands/agent.mjs +1 -1
- package/src/commands/background.mjs +145 -4
- package/src/commands/chat.mjs +117 -76
- package/src/commands/config.mjs +148 -1
- package/src/commands/doctor.mjs +30 -6
- package/src/commands/init.mjs +32 -6
- package/src/commands/longagent.mjs +117 -0
- package/src/commands/mcp.mjs +275 -43
- package/src/commands/permission.mjs +1 -1
- package/src/commands/session.mjs +195 -140
- package/src/commands/skill.mjs +63 -0
- package/src/commands/theme.mjs +1 -1
- package/src/config/defaults.mjs +280 -260
- package/src/config/import-config.mjs +1 -1
- package/src/config/load-config.mjs +61 -4
- package/src/config/schema.mjs +591 -574
- package/src/context.mjs +4 -1
- package/src/core/constants.mjs +97 -91
- package/src/core/types.mjs +1 -1
- package/src/github/api.mjs +78 -78
- package/src/github/auth.mjs +294 -286
- package/src/github/flow.mjs +298 -298
- package/src/github/workspace.mjs +225 -212
- package/src/index.mjs +84 -82
- package/src/knowledge/frontend-aesthetics.txt +38 -38
- package/src/mcp/client-http.mjs +139 -141
- package/src/mcp/client-sse.mjs +297 -288
- package/src/mcp/client-stdio.mjs +534 -533
- package/src/mcp/constants.mjs +2 -2
- package/src/mcp/registry.mjs +498 -479
- package/src/mcp/stdio-framing.mjs +135 -133
- package/src/mcp/tool-result.mjs +24 -24
- package/src/observability/edit-diagnostics.mjs +449 -0
- package/src/observability/index.mjs +42 -42
- package/src/observability/metrics.mjs +165 -137
- package/src/observability/tracer.mjs +137 -137
- package/src/onboarding.mjs +209 -0
- package/src/orchestration/background-manager.mjs +567 -372
- package/src/orchestration/background-worker.mjs +419 -305
- package/src/orchestration/interruption-reason.mjs +21 -0
- package/src/orchestration/longagent-manager.mjs +197 -171
- package/src/orchestration/stage-scheduler.mjs +733 -728
- package/src/orchestration/subagent-router.mjs +7 -1
- package/src/orchestration/task-scheduler.mjs +219 -7
- package/src/permission/engine.mjs +1 -1
- package/src/permission/exec-policy.mjs +370 -370
- package/src/permission/file-edit-policy.mjs +108 -0
- package/src/permission/prompt.mjs +1 -1
- package/src/permission/rules.mjs +116 -7
- package/src/plugin/builtin-hooks/post-edit-format.mjs +2 -1
- package/src/plugin/builtin-hooks/post-edit-typecheck.mjs +104 -40
- package/src/plugin/hook-bus.mjs +19 -5
- package/src/plugin/manifest-loader.mjs +222 -0
- package/src/provider/anthropic.mjs +396 -390
- package/src/provider/ollama.mjs +7 -1
- package/src/provider/openai.mjs +382 -340
- package/src/provider/retry-policy.mjs +74 -68
- package/src/provider/router.mjs +242 -241
- package/src/provider/sse.mjs +104 -104
- package/src/provider/wizard.mjs +556 -0
- package/src/repl/capability-facade.mjs +30 -0
- package/src/repl/command-surface.mjs +23 -0
- package/src/repl/controller-entry.mjs +40 -0
- package/src/repl/core-shell.mjs +208 -0
- package/src/repl/dialog-router.mjs +87 -0
- package/src/repl/input-engine.mjs +76 -0
- package/src/repl/keymap.mjs +7 -0
- package/src/repl/operator-surface.mjs +15 -0
- package/src/repl/permission-flow.mjs +49 -0
- package/src/repl/runtime-facade.mjs +36 -0
- package/src/repl/slash-router.mjs +62 -0
- package/src/repl/state-store.mjs +29 -0
- package/src/repl/turn-controller.mjs +58 -0
- package/src/repl/verification.mjs +23 -0
- package/src/repl.mjs +3368 -2981
- package/src/rules/load-rules.mjs +3 -3
- package/src/runtime.mjs +1 -1
- package/src/session/agent-transaction.mjs +86 -0
- package/src/session/checkpoint.mjs +302 -302
- package/src/session/compaction.mjs +298 -298
- package/src/session/engine.mjs +417 -232
- package/src/session/longagent-4stage.mjs +467 -460
- package/src/session/longagent-hybrid.mjs +1344 -1097
- package/src/session/longagent-plan.mjs +376 -365
- package/src/session/longagent-project-memory.mjs +53 -53
- package/src/session/longagent-scaffold.mjs +291 -291
- package/src/session/longagent-task-bus.mjs +138 -54
- package/src/session/longagent-utils.mjs +828 -472
- package/src/session/longagent.mjs +911 -900
- package/src/session/loop.mjs +1005 -930
- package/src/session/prompt/agent.txt +25 -25
- package/src/session/prompt/anthropic.txt +150 -150
- package/src/session/prompt/beast.txt +1 -1
- package/src/session/prompt/plan.txt +31 -31
- package/src/session/prompt/qwen.txt +46 -46
- package/src/session/recovery.mjs +21 -0
- package/src/session/rollback.mjs +196 -195
- package/src/session/routing-observability.mjs +72 -0
- package/src/session/runtime-state.mjs +47 -0
- package/src/session/store.mjs +523 -519
- package/src/session/system-prompt.mjs +308 -273
- package/src/session/task-validator.mjs +267 -267
- package/src/session/usability-gates.mjs +2 -2
- package/src/skill/builtin/commit.mjs +64 -64
- package/src/skill/builtin/design.mjs +76 -76
- package/src/skill/generator.mjs +18 -2
- package/src/skill/registry.mjs +642 -390
- package/src/storage/audit-store.mjs +18 -11
- package/src/storage/event-log.mjs +7 -1
- package/src/storage/ghost-commit-store.mjs +243 -245
- package/src/storage/paths.mjs +13 -0
- package/src/theme/default-theme.mjs +1 -1
- package/src/theme/markdown.mjs +4 -0
- package/src/theme/schema.mjs +1 -1
- package/src/theme/status-bar.mjs +162 -158
- package/src/tool/audit-wrapper.mjs +18 -2
- package/src/tool/edit-transaction.mjs +23 -0
- package/src/tool/executor.mjs +26 -1
- package/src/tool/file-read-state.mjs +65 -0
- package/src/tool/git-auto.mjs +526 -526
- package/src/tool/git-full-auto.mjs +487 -478
- package/src/tool/mutation-guard.mjs +54 -0
- package/src/tool/prompt/edit.txt +3 -3
- package/src/tool/prompt/multiedit.txt +1 -0
- package/src/tool/prompt/notebookedit.txt +2 -1
- package/src/tool/prompt/patch.txt +25 -24
- package/src/tool/prompt/read.txt +3 -3
- package/src/tool/prompt/sysinfo.txt +29 -0
- package/src/tool/prompt/task.txt +66 -4
- package/src/tool/prompt/write.txt +2 -2
- package/src/tool/question-prompt.mjs +99 -93
- package/src/tool/registry.mjs +1701 -1343
- package/src/tool/task-tool.mjs +14 -6
- package/src/ui/activity-renderer.mjs +667 -664
- package/src/ui/repl-background-panel.mjs +7 -0
- package/src/ui/repl-capability-panel.mjs +9 -0
- package/src/ui/repl-dashboard.mjs +54 -4
- package/src/ui/repl-help.mjs +110 -0
- package/src/ui/repl-operator-panel.mjs +12 -0
- package/src/ui/repl-route-feedback.mjs +35 -0
- package/src/ui/repl-status-view.mjs +76 -0
- package/src/ui/repl-task-panel.mjs +5 -0
- package/src/ui/repl-transcript-panel.mjs +56 -0
- package/src/ui/repl-turn-summary.mjs +135 -0
- package/src/usage/pricing.mjs +122 -121
- package/src/usage/usage-meter.mjs +1 -0
- package/src/util/git.mjs +562 -519
- package/src/util/template.mjs +6 -1
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project Memory — 跨会话项目级知识持久化
|
|
3
|
-
* 存储在 .kkcode/project-memory.json,记住技术栈、惯用模式等
|
|
4
|
-
*/
|
|
5
|
-
import { readFile, writeFile, mkdir } from "node:fs/promises"
|
|
6
|
-
import path from "node:path"
|
|
7
|
-
|
|
8
|
-
const MEMORY_FILE = ".kkcode/project-memory.json"
|
|
9
|
-
|
|
10
|
-
export async function loadProjectMemory(cwd) {
|
|
11
|
-
try {
|
|
12
|
-
const raw = await readFile(path.join(cwd, MEMORY_FILE), "utf-8")
|
|
13
|
-
return JSON.parse(raw)
|
|
14
|
-
} catch {
|
|
15
|
-
return { techStack: [], patterns: [], conventions: [], lastUpdated: null }
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export async function saveProjectMemory(cwd, memory) {
|
|
20
|
-
const filePath = path.join(cwd, MEMORY_FILE)
|
|
21
|
-
await mkdir(path.dirname(filePath), { recursive: true })
|
|
22
|
-
memory.lastUpdated = new Date().toISOString()
|
|
23
|
-
await writeFile(filePath, JSON.stringify(memory, null, 2), "utf-8")
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function memoryToContext(memory) {
|
|
27
|
-
const ts = Array.isArray(memory?.techStack) ? memory.techStack : []
|
|
28
|
-
const pt = Array.isArray(memory?.patterns) ? memory.patterns : []
|
|
29
|
-
const cv = Array.isArray(memory?.conventions) ? memory.conventions : []
|
|
30
|
-
if (!ts.length && !pt.length) return ""
|
|
31
|
-
const lines = ["### Project Memory (from previous sessions)"]
|
|
32
|
-
if (ts.length) lines.push(`Tech stack: ${ts.join(", ")}`)
|
|
33
|
-
if (pt.length) lines.push(`Patterns: ${pt.join(", ")}`)
|
|
34
|
-
if (cv.length) lines.push(`Conventions: ${cv.join(", ")}`)
|
|
35
|
-
return lines.join("\n")
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function parseMemoryFromPreview(text) {
|
|
39
|
-
const memory = { techStack: [], patterns: [], conventions: [] }
|
|
40
|
-
// Only match lines that clearly declare tech stack (require colon separator)
|
|
41
|
-
const techMatch = text.match(/(?:tech\s*stack|技术栈|frameworks?|主要语言|dependencies)\s*[::]\s*([^\n]+)/gi)
|
|
42
|
-
if (techMatch) {
|
|
43
|
-
for (const m of techMatch) {
|
|
44
|
-
const items = m.replace(/^[^::]+[::]/, "").split(/[,,、;;]/).map(s => s.trim()).filter(s => {
|
|
45
|
-
// Filter out overly generic or long items (likely false positives)
|
|
46
|
-
return s.length >= 2 && s.length <= 40 && !/^\d+$/.test(s)
|
|
47
|
-
})
|
|
48
|
-
memory.techStack.push(...items)
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
memory.techStack = [...new Set(memory.techStack)].slice(0, 20)
|
|
52
|
-
return memory
|
|
53
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Project Memory — 跨会话项目级知识持久化
|
|
3
|
+
* 存储在 .kkcode/project-memory.json,记住技术栈、惯用模式等
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises"
|
|
6
|
+
import path from "node:path"
|
|
7
|
+
|
|
8
|
+
const MEMORY_FILE = ".kkcode/project-memory.json"
|
|
9
|
+
|
|
10
|
+
export async function loadProjectMemory(cwd) {
|
|
11
|
+
try {
|
|
12
|
+
const raw = await readFile(path.join(cwd, MEMORY_FILE), "utf-8")
|
|
13
|
+
return JSON.parse(raw)
|
|
14
|
+
} catch {
|
|
15
|
+
return { techStack: [], patterns: [], conventions: [], lastUpdated: null }
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function saveProjectMemory(cwd, memory) {
|
|
20
|
+
const filePath = path.join(cwd, MEMORY_FILE)
|
|
21
|
+
await mkdir(path.dirname(filePath), { recursive: true })
|
|
22
|
+
memory.lastUpdated = new Date().toISOString()
|
|
23
|
+
await writeFile(filePath, JSON.stringify(memory, null, 2), "utf-8")
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function memoryToContext(memory) {
|
|
27
|
+
const ts = Array.isArray(memory?.techStack) ? memory.techStack : []
|
|
28
|
+
const pt = Array.isArray(memory?.patterns) ? memory.patterns : []
|
|
29
|
+
const cv = Array.isArray(memory?.conventions) ? memory.conventions : []
|
|
30
|
+
if (!ts.length && !pt.length) return ""
|
|
31
|
+
const lines = ["### Project Memory (from previous sessions)"]
|
|
32
|
+
if (ts.length) lines.push(`Tech stack: ${ts.join(", ")}`)
|
|
33
|
+
if (pt.length) lines.push(`Patterns: ${pt.join(", ")}`)
|
|
34
|
+
if (cv.length) lines.push(`Conventions: ${cv.join(", ")}`)
|
|
35
|
+
return lines.join("\n")
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function parseMemoryFromPreview(text) {
|
|
39
|
+
const memory = { techStack: [], patterns: [], conventions: [] }
|
|
40
|
+
// Only match lines that clearly declare tech stack (require colon separator)
|
|
41
|
+
const techMatch = text.match(/(?:tech\s*stack|技术栈|frameworks?|主要语言|dependencies)\s*[::]\s*([^\n]+)/gi)
|
|
42
|
+
if (techMatch) {
|
|
43
|
+
for (const m of techMatch) {
|
|
44
|
+
const items = m.replace(/^[^::]+[::]/, "").split(/[,,、;;]/).map(s => s.trim()).filter(s => {
|
|
45
|
+
// Filter out overly generic or long items (likely false positives)
|
|
46
|
+
return s.length >= 2 && s.length <= 40 && !/^\d+$/.test(s)
|
|
47
|
+
})
|
|
48
|
+
memory.techStack.push(...items)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
memory.techStack = [...new Set(memory.techStack)].slice(0, 20)
|
|
52
|
+
return memory
|
|
53
|
+
}
|