@sanqianx/project-knowledge 4.6.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/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +17 -0
- package/CHANGELOG.md +780 -0
- package/LICENSE +201 -0
- package/NOTICE +5 -0
- package/README.md +266 -0
- package/_site/README.md +30 -0
- package/_site/_test/ai-profile-resolver-test.js +137 -0
- package/_site/_test/ai-profile-test.js +75 -0
- package/_site/_test/ai-vendor-presets-test.js +91 -0
- package/_site/_test/automation-queue-test.js +14 -0
- package/_site/_test/automation-ui-test.js +40 -0
- package/_site/_test/background-task-registry-test.js +43 -0
- package/_site/_test/baseline-schema-test.js +91 -0
- package/_site/_test/bin-cli-test.js +218 -0
- package/_site/_test/bridge-adapter-test.js +95 -0
- package/_site/_test/bridge-consumer-service-test.js +310 -0
- package/_site/_test/cdp-browser-failure-test.js +100 -0
- package/_site/_test/chat-claudecodeui-match-test.js +92 -0
- package/_site/_test/claude-executable-discovery-test.js +90 -0
- package/_site/_test/claude-session-lifecycle-sweep-test.js +252 -0
- package/_site/_test/claude-workbench-test.js +170 -0
- package/_site/_test/client-capture-restart-e2e-test.js +189 -0
- package/_site/_test/codex-conversation-projection-test.js +59 -0
- package/_site/_test/codex-notify-fanout-test.js +45 -0
- package/_site/_test/commit-boundary-freeze-test.js +147 -0
- package/_site/_test/commit-conversation-binding-test.js +99 -0
- package/_site/_test/commit-evidence-test.js +110 -0
- package/_site/_test/context-pack-test.js +198 -0
- package/_site/_test/conversation-api-test.js +119 -0
- package/_site/_test/conversation-store-test.js +136 -0
- package/_site/_test/cross-repo-isolation-e2e-test.js +187 -0
- package/_site/_test/data-dir-migration-test.js +77 -0
- package/_site/_test/desktop-browser-compat-test.js +28 -0
- package/_site/_test/desktop-hook-runtime-regression-test.js +204 -0
- package/_site/_test/embedding-config-test.js +32 -0
- package/_site/_test/explicit-commit-processor-test.js +37 -0
- package/_site/_test/fixtures/fake-browser-exit.js +10 -0
- package/_site/_test/fixtures/fake-browser-hang.js +10 -0
- package/_site/_test/fixtures/make-git-repos.js +89 -0
- package/_site/_test/folder-picker-output-test.js +19 -0
- package/_site/_test/full-integration-e2e-test.js +165 -0
- package/_site/_test/git-validation-test.js +81 -0
- package/_site/_test/hook-runtime-endpoint-test.js +88 -0
- package/_site/_test/hook-status-repair-api-test.js +152 -0
- package/_site/_test/hook-trigger-test.js +85 -0
- package/_site/_test/hook-worktree-test.js +42 -0
- package/_site/_test/import-preflight-api-test.js +233 -0
- package/_site/_test/import-ui-flow-test.js +171 -0
- package/_site/_test/index-builder-test.js +41 -0
- package/_site/_test/index-writer-concurrency-test.js +135 -0
- package/_site/_test/integration-adapters-test.js +243 -0
- package/_site/_test/integration-capture-setup-test.js +108 -0
- package/_site/_test/integration-surface-coverage-test.js +165 -0
- package/_site/_test/kb-framework-test.js +57 -0
- package/_site/_test/kbpath-follow-test.js +63 -0
- package/_site/_test/knowledge-db-test.js +144 -0
- package/_site/_test/knowledge-language-control-test.js +170 -0
- package/_site/_test/knowledge-maintenance-test.js +40 -0
- package/_site/_test/knowledge-migration-test.js +75 -0
- package/_site/_test/knowledge-promotion-recovery-test.js +260 -0
- package/_site/_test/knowledge-query-test.js +54 -0
- package/_site/_test/knowledge-retrieval-service-test.js +77 -0
- package/_site/_test/knowledge-scopes-test.js +37 -0
- package/_site/_test/knowledge-storage-location-test.js +28 -0
- package/_site/_test/knowledge-storage-startup-test.js +52 -0
- package/_site/_test/knowledge-store-logs-supervision-test.js +89 -0
- package/_site/_test/legacy-claude-session-alias-test.js +106 -0
- package/_site/_test/legacy-forward-compat-test.js +257 -0
- package/_site/_test/legacy-project-upgrade-e2e-test.js +363 -0
- package/_site/_test/legacy-routes-removed-test.js +47 -0
- package/_site/_test/legacy-workbench-exclusion-test.js +92 -0
- package/_site/_test/log-redaction-test.js +58 -0
- package/_site/_test/logging-api-test.js +89 -0
- package/_site/_test/logging-sse-no-gap-test.js +88 -0
- package/_site/_test/logging-ui-test.js +104 -0
- package/_site/_test/markdown-delta-overlay-test.js +85 -0
- package/_site/_test/markdown-maintenance-api-test.js +75 -0
- package/_site/_test/markdown-maintenance-test.js +11 -0
- package/_site/_test/mcp-server-test.js +149 -0
- package/_site/_test/model-context-windows-test.js +89 -0
- package/_site/_test/module-bridge-eventbridge-test.js +193 -0
- package/_site/_test/non-release-ci-test.js +34 -0
- package/_site/_test/offline-boundary-isolation-test.js +32 -0
- package/_site/_test/orphaned-claim-recovery-test.js +80 -0
- package/_site/_test/p0-data-migration-characterization-test.js +37 -0
- package/_site/_test/p0-e2e-gate-test.js +347 -0
- package/_site/_test/package-boundary-test.js +42 -0
- package/_site/_test/package-startup-test.js +56 -0
- package/_site/_test/packaged-ui-smoke-test.js +79 -0
- package/_site/_test/path-consistency-test.js +151 -0
- package/_site/_test/pending-sweep-test.js +9 -0
- package/_site/_test/post-commit-automation-test.js +87 -0
- package/_site/_test/pr-consumer-contract-test.js +55 -0
- package/_site/_test/project-control-panel-task14-test.js +63 -0
- package/_site/_test/project-delete-recovery-test.js +64 -0
- package/_site/_test/project-goal-editor-test.js +145 -0
- package/_site/_test/project-layout-v2-migration-test.js +127 -0
- package/_site/_test/project-lifecycle-transaction-test.js +106 -0
- package/_site/_test/project-remove-running-guard-test.js +79 -0
- package/_site/_test/project-store-test.js +90 -0
- package/_site/_test/prompt-settings-test.js +115 -0
- package/_site/_test/protected-architecture-gate-test.js +123 -0
- package/_site/_test/refactor-characterization-test.js +36 -0
- package/_site/_test/release-version-sync-test.js +98 -0
- package/_site/_test/requirement-binding-test.js +113 -0
- package/_site/_test/requirement-recorder-test.js +173 -0
- package/_site/_test/run-all-tests.js +156 -0
- package/_site/_test/runtime-endpoint-test.js +64 -0
- package/_site/_test/scanner-test.js +83 -0
- package/_site/_test/server-runtime-migration-safety-test.js +27 -0
- package/_site/_test/server-security-test.js +96 -0
- package/_site/_test/sessions-stream-test.js +92 -0
- package/_site/_test/shared-contracts-test.js +58 -0
- package/_site/_test/simple-import-test.js +97 -0
- package/_site/_test/startup-analysis-disabled-test.js +16 -0
- package/_site/_test/storage-foundation-test.js +78 -0
- package/_site/_test/structured-logger-test.js +101 -0
- package/_site/_test/task15-20-ui-flow-test.js +148 -0
- package/_site/_test/team-knowledge-store-sparse-checkout-test.js +196 -0
- package/_site/_test/team-knowledge-store-test.js +131 -0
- package/_site/_test/tracking-start-test.js +143 -0
- package/_site/_test/ui-i18n-toggle-test.js +114 -0
- package/_site/_test/ui-smoke-test.js +73 -0
- package/_site/_test/v4122-upgrade-data-contract-test.js +56 -0
- package/_site/_test/workbench-permission-test.js +118 -0
- package/_site/_test/workspace-ui-contract-test.js +43 -0
- package/_site/lib/ai-profile-resolver.js +78 -0
- package/_site/lib/ai-vendor-presets.js +83 -0
- package/_site/lib/ai-workspace.js +104 -0
- package/_site/lib/atomic-file.js +204 -0
- package/_site/lib/automation-config.js +140 -0
- package/_site/lib/bridge-adapter.js +256 -0
- package/_site/lib/bridge-consumer-service.js +402 -0
- package/_site/lib/claude-cli-runner.js +1599 -0
- package/_site/lib/commit-conversation-binder.js +246 -0
- package/_site/lib/commit-processing-ledger.js +27 -0
- package/_site/lib/commit-prompt.js +202 -0
- package/_site/lib/commit-reconciler.js +444 -0
- package/_site/lib/context-pack-builder.js +299 -0
- package/_site/lib/contracts.js +279 -0
- package/_site/lib/conversation-exclusions.js +204 -0
- package/_site/lib/conversation-query-service.js +161 -0
- package/_site/lib/conversation-store.js +385 -0
- package/_site/lib/data-dir.js +81 -0
- package/_site/lib/data-state-classifier.js +40 -0
- package/_site/lib/embedding-service.js +85 -0
- package/_site/lib/evidence-bundle.js +228 -0
- package/_site/lib/folder-picker-output.js +24 -0
- package/_site/lib/git-runner.js +62 -0
- package/_site/lib/github-team-store.js +1175 -0
- package/_site/lib/hook-manager.js +202 -0
- package/_site/lib/index-builder.js +157 -0
- package/_site/lib/index-service.js +173 -0
- package/_site/lib/integration-installer.js +907 -0
- package/_site/lib/kb-framework.js +191 -0
- package/_site/lib/kb-validator.js +124 -0
- package/_site/lib/knowledge-db.js +363 -0
- package/_site/lib/knowledge-promotion.js +435 -0
- package/_site/lib/knowledge-retrieval-service.js +401 -0
- package/_site/lib/knowledge-schema.js +121 -0
- package/_site/lib/knowledge-tool-runtime.js +359 -0
- package/_site/lib/legacy-data-manifest.js +26 -0
- package/_site/lib/llm-client.js +173 -0
- package/_site/lib/markdown-knowledge-indexer.js +230 -0
- package/_site/lib/migration-service.js +442 -0
- package/_site/lib/model-context-windows.js +82 -0
- package/_site/lib/module-bridge.js +496 -0
- package/_site/lib/post-commit-automation.js +141 -0
- package/_site/lib/project-lifecycle-service.js +511 -0
- package/_site/lib/project-registry-store.js +129 -0
- package/_site/lib/project-store.js +262 -0
- package/_site/lib/prompt-registry.js +148 -0
- package/_site/lib/requirement-adapters.js +10 -0
- package/_site/lib/requirement-binder.js +112 -0
- package/_site/lib/requirement-recorder.js +278 -0
- package/_site/lib/runtime-endpoint.js +160 -0
- package/_site/lib/scanner.js +298 -0
- package/_site/lib/server-app.js +1520 -0
- package/_site/lib/settings-store.js +113 -0
- package/_site/lib/storage-layout.js +162 -0
- package/_site/lib/structured-logger.js +574 -0
- package/_site/scripts/codex-notify-fanout.cjs +51 -0
- package/_site/scripts/folder-picker.ps1 +156 -0
- package/_site/scripts/hook-trigger.js +156 -0
- package/_site/scripts/sync-release-version.js +158 -0
- package/_site/server.js +12 -0
- package/_site/start.bat +26 -0
- package/_site/stop.bat +11 -0
- package/bin/project-knowledge-integrations.js +241 -0
- package/bin/project-knowledge-kb.js +65 -0
- package/bin/project-knowledge-mcp.js +195 -0
- package/bin/project-knowledge.js +439 -0
- package/claude-prompts.json +21 -0
- package/docs/README.zh-CN.md +175 -0
- package/docs/assets/architecture.svg +182 -0
- package/docs/assets/dashboard.png +0 -0
- package/docs/assets/draft-review.png +0 -0
- package/docs/assets/logo.svg +50 -0
- package/docs/assets/runs-drafts.png +0 -0
- package/docs/assets/settings.png +0 -0
- package/docs/project-registry-schema.md +33 -0
- package/docs/team-knowledge-mode-a-plan.md +73 -0
- package/docs/testing-strategy.md +33 -0
- package/package.json +100 -0
- package/plugins/project-knowledge/.claude-plugin/plugin.json +19 -0
- package/plugins/project-knowledge/.codex-plugin/plugin.json +38 -0
- package/plugins/project-knowledge/.mcp.json +14 -0
- package/plugins/project-knowledge/opencode/project-knowledge.md +3 -0
- package/plugins/project-knowledge/skills/project-knowledge/SKILL.md +28 -0
- package/plugins/project-knowledge/skills/project-knowledge/agents/openai.yaml +11 -0
- package/templates/change.md +30 -0
- package/templates/project-readme.md +52 -0
- package/ui/app.css +58 -0
- package/ui/app.js +607 -0
- package/ui/favicon.svg +38 -0
- package/ui/i18n.js +146 -0
- package/ui/index.html +162 -0
package/ui/i18n.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// ui/i18n.js
|
|
2
|
+
//
|
|
3
|
+
// T10 — minimal zh-CN / en-US translation dictionary + helpers.
|
|
4
|
+
// Restored from v4.1.22 I18N content (functional baseline, not code
|
|
5
|
+
// structure). Loaded as a plain script before app.js so the IIFE in
|
|
6
|
+
// app.js can pick it up via the global `I18N` symbol.
|
|
7
|
+
|
|
8
|
+
(function () {
|
|
9
|
+
'use strict';
|
|
10
|
+
const DICT = {
|
|
11
|
+
'zh-CN': {
|
|
12
|
+
'app.title': 'Project Knowledge',
|
|
13
|
+
'app.brand.eyebrow': 'AI 知识库',
|
|
14
|
+
'app.brand.title': '控制中心',
|
|
15
|
+
'app.nav.workbench': 'Claude Code',
|
|
16
|
+
'app.nav.badge': '项目',
|
|
17
|
+
'app.action.theme.dark': '深色模式',
|
|
18
|
+
'app.action.theme.light': '浅色模式',
|
|
19
|
+
'app.action.settings': '设置',
|
|
20
|
+
'app.workbench.empty.title': '从项目知识开始对话',
|
|
21
|
+
'app.workbench.empty.hint': '选择左侧项目,输入问题或开发需求。',
|
|
22
|
+
'app.workbench.placeholder': '向 Claude 发送消息…',
|
|
23
|
+
'app.workbench.state.ready': '就绪',
|
|
24
|
+
'app.workbench.state.reconnecting': '正在重连',
|
|
25
|
+
'app.import.title': '导入项目',
|
|
26
|
+
'app.import.help': '导入只建立项目登记、Git 跟踪基线和托管 Hook,不运行初始化分析。下方的所有输入都会触发后端 preflight,导入按钮在所有必填项就绪前保持禁用。',
|
|
27
|
+
'app.import.path.label': '本地路径',
|
|
28
|
+
'app.import.path.placeholder': 'D:\\Projects\\my-project',
|
|
29
|
+
'app.import.path.web.help': '桌面端会调用原生目录选择器;Web 模式请直接输入绝对路径。',
|
|
30
|
+
'app.import.pickFolder': '选择目录…',
|
|
31
|
+
'app.import.language.label': '知识输出语言',
|
|
32
|
+
'app.import.profile.label': 'AI 配置',
|
|
33
|
+
'app.import.profile.help': '由后端解析;不指定则使用默认 / 第一个可用配置。',
|
|
34
|
+
'app.import.team.label': '使用 Team Knowledge(可选)',
|
|
35
|
+
'app.import.team.store': 'Team Store 本地路径',
|
|
36
|
+
'app.import.team.subdir': '子目录',
|
|
37
|
+
'app.import.team.provider': 'Provider',
|
|
38
|
+
'app.import.team.help': '仅当项目需要绑定到共享知识库时填写。',
|
|
39
|
+
'app.import.preflight.ready': '所有前置条件就绪,可以导入。',
|
|
40
|
+
'app.import.preflight.problemsTitle': '导入前需要处理:',
|
|
41
|
+
'app.import.submit': '导入',
|
|
42
|
+
'app.import.reset': '重置',
|
|
43
|
+
'app.import.success': '项目已导入。',
|
|
44
|
+
'app.settings.ai': 'AI 模型',
|
|
45
|
+
'app.settings.knowledge': '知识库存储',
|
|
46
|
+
'app.settings.relations': '知识关联',
|
|
47
|
+
'app.settings.logs': '日志',
|
|
48
|
+
'app.settings.client': '桌面客户端',
|
|
49
|
+
'app.settings.ai.help': '配置模型并为项目分配 Profile。',
|
|
50
|
+
'app.settings.knowledge.rootLabel': '知识库根目录',
|
|
51
|
+
'app.settings.knowledge.save': '保存',
|
|
52
|
+
'app.language.toggle': '界面语言',
|
|
53
|
+
},
|
|
54
|
+
'en-US': {
|
|
55
|
+
'app.title': 'Project Knowledge',
|
|
56
|
+
'app.brand.eyebrow': 'AI Knowledge Base',
|
|
57
|
+
'app.brand.title': 'Control Center',
|
|
58
|
+
'app.nav.workbench': 'Claude Code',
|
|
59
|
+
'app.nav.badge': 'Projects',
|
|
60
|
+
'app.action.theme.dark': 'Dark mode',
|
|
61
|
+
'app.action.theme.light': 'Light mode',
|
|
62
|
+
'app.action.settings': 'Settings',
|
|
63
|
+
'app.workbench.empty.title': 'Start a conversation with project knowledge',
|
|
64
|
+
'app.workbench.empty.hint': 'Pick a project on the left, then ask a question or describe a development need.',
|
|
65
|
+
'app.workbench.placeholder': 'Send a message to Claude…',
|
|
66
|
+
'app.workbench.state.ready': 'Ready',
|
|
67
|
+
'app.workbench.state.reconnecting': 'Reconnecting',
|
|
68
|
+
'app.import.title': 'Import project',
|
|
69
|
+
'app.import.help': 'Import only registers the project, freezes the Git tracking baseline, and installs a managed post-commit hook. No initial AI analysis runs. Every change below triggers a backend preflight, and the Import button stays disabled until every mandatory prerequisite is satisfied.',
|
|
70
|
+
'app.import.path.label': 'Local path',
|
|
71
|
+
'app.import.path.placeholder': 'D:\\Projects\\my-project',
|
|
72
|
+
'app.import.path.web.help': 'Desktop mode uses the native folder picker; in Web mode paste the absolute path.',
|
|
73
|
+
'app.import.pickFolder': 'Pick folder…',
|
|
74
|
+
'app.import.language.label': 'Knowledge output language',
|
|
75
|
+
'app.import.profile.label': 'AI profile',
|
|
76
|
+
'app.import.profile.help': 'Resolved server-side; if unset, the default / first-usable profile is used.',
|
|
77
|
+
'app.import.team.label': 'Bind to a Team Knowledge store (optional)',
|
|
78
|
+
'app.import.team.store': 'Team store local path',
|
|
79
|
+
'app.import.team.subdir': 'Subdirectory',
|
|
80
|
+
'app.import.team.provider': 'Provider',
|
|
81
|
+
'app.import.team.help': 'Fill in only when the project must join a shared knowledge base.',
|
|
82
|
+
'app.import.preflight.ready': 'All prerequisites are satisfied — ready to import.',
|
|
83
|
+
'app.import.preflight.problemsTitle': 'Resolve before importing:',
|
|
84
|
+
'app.import.submit': 'Import',
|
|
85
|
+
'app.import.reset': 'Reset',
|
|
86
|
+
'app.import.success': 'Project imported.',
|
|
87
|
+
'app.settings.ai': 'AI Profiles',
|
|
88
|
+
'app.settings.knowledge': 'Knowledge Store',
|
|
89
|
+
'app.settings.relations': 'Related Knowledge',
|
|
90
|
+
'app.settings.logs': 'Logs',
|
|
91
|
+
'app.settings.client': 'Desktop Client',
|
|
92
|
+
'app.settings.ai.help': 'Configure models and assign a profile per project.',
|
|
93
|
+
'app.settings.knowledge.rootLabel': 'Knowledge root',
|
|
94
|
+
'app.settings.knowledge.save': 'Save',
|
|
95
|
+
'app.language.toggle': 'UI language',
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const STORAGE_KEY = 'pk.uiLanguage';
|
|
100
|
+
|
|
101
|
+
function readPersistedLanguage() {
|
|
102
|
+
try {
|
|
103
|
+
const raw = window.localStorage && window.localStorage.getItem(STORAGE_KEY);
|
|
104
|
+
if (raw === 'zh-CN' || raw === 'en-US') return raw;
|
|
105
|
+
} catch {}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function persistLanguage(lang) {
|
|
110
|
+
try {
|
|
111
|
+
if (window.localStorage) window.localStorage.setItem(STORAGE_KEY, lang);
|
|
112
|
+
} catch {}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function activeLanguage() {
|
|
116
|
+
if (window.__PK_I18N_ACTIVE__) return window.__PK_I18N_ACTIVE__;
|
|
117
|
+
return readPersistedLanguage() || 'zh-CN';
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function t(key, fallback) {
|
|
121
|
+
const lang = activeLanguage();
|
|
122
|
+
const dict = DICT[lang] || DICT['zh-CN'];
|
|
123
|
+
return dict[key] != null ? dict[key] : (fallback != null ? fallback : key);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function setLanguage(lang) {
|
|
127
|
+
if (!DICT[lang]) lang = 'zh-CN';
|
|
128
|
+
window.__PK_I18N_ACTIVE__ = lang;
|
|
129
|
+
persistLanguage(lang);
|
|
130
|
+
if (typeof document !== 'undefined') {
|
|
131
|
+
document.documentElement.lang = lang === 'en-US' ? 'en' : 'zh-CN';
|
|
132
|
+
}
|
|
133
|
+
if (typeof window.__PK_I18N_ONCHANGE__ === 'function') {
|
|
134
|
+
window.__PK_I18N_ONCHANGE__(lang);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function availableLanguages() {
|
|
139
|
+
return Object.keys(DICT);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (typeof document !== 'undefined') {
|
|
143
|
+
document.documentElement.lang = activeLanguage() === 'en-US' ? 'en' : 'zh-CN';
|
|
144
|
+
}
|
|
145
|
+
window.I18N = { t, setLanguage, activeLanguage, availableLanguages };
|
|
146
|
+
})();
|
package/ui/index.html
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN" data-theme="light">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="color-scheme" content="light dark">
|
|
7
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
8
|
+
<link rel="stylesheet" href="/app.css">
|
|
9
|
+
<title>Project Knowledge</title>
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div class="shell">
|
|
13
|
+
<aside class="sidebar">
|
|
14
|
+
<div class="brand">
|
|
15
|
+
<div class="eyebrow">AI Knowledge Base</div>
|
|
16
|
+
<h1>Control Center</h1>
|
|
17
|
+
<div class="root" id="brand-root"></div>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="project-area">
|
|
20
|
+
<div class="project-head"><span>项目 · 右键管理</span><button class="small-btn" type="button" data-go="import">导入项目</button></div>
|
|
21
|
+
<div class="project-list" id="project-list"></div>
|
|
22
|
+
</div>
|
|
23
|
+
<nav class="sidebar-nav">
|
|
24
|
+
<button class="nav-btn active" type="button" data-go="terminal"><span>🤖 Agent 终端</span><span class="nav-badge">终端</span><span class="nav-fold" data-fold="term" title="模块项目列表:已折叠,点击展开">▤</span></button>
|
|
25
|
+
<button class="nav-btn" type="button" data-go="search"><span>🔎 知识检索</span><span class="nav-badge">检索</span><span class="nav-fold" data-fold="vh" title="模块项目列表:已折叠,点击展开">▤</span></button>
|
|
26
|
+
<button class="nav-btn" type="button" data-go="bridge"><span>💬 会话浏览</span><span class="nav-badge">会话</span><span class="nav-fold" data-fold="eb" title="模块项目列表:已折叠,点击展开">▤</span></button>
|
|
27
|
+
</nav>
|
|
28
|
+
</aside>
|
|
29
|
+
|
|
30
|
+
<main class="main">
|
|
31
|
+
<header class="main-header">
|
|
32
|
+
<div><div class="subtitle">Project Knowledge</div><div class="page-title" id="page-title">Agent 终端</div></div>
|
|
33
|
+
<div class="header-actions">
|
|
34
|
+
<button class="btn" type="button" id="theme-button">深色模式</button>
|
|
35
|
+
<button class="btn" type="button" id="open-settings">设置</button>
|
|
36
|
+
</div>
|
|
37
|
+
</header>
|
|
38
|
+
|
|
39
|
+
<div class="mobile-strip">
|
|
40
|
+
<select class="input" id="mobile-project" aria-label="选择项目"></select>
|
|
41
|
+
<button class="btn" type="button" data-go="import">导入项目</button>
|
|
42
|
+
<button class="btn" type="button" id="mobile-settings">设置</button>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<!-- Agent 终端:原版 claude-ai-workbench UI(嵌入模式) -->
|
|
46
|
+
<section class="view active" id="view-terminal">
|
|
47
|
+
<div class="embed-head">
|
|
48
|
+
<span class="embed-status" id="st-5760"><span class="st-dot"></span><span class="st-text">检测 127.0.0.1:5760 …</span></span>
|
|
49
|
+
<span class="chip" id="sync-5760">联动: —</span>
|
|
50
|
+
<a class="btn compact embed-open" id="open-5760" href="#" target="_blank" rel="noopener">独立打开 ↗</a>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="embed"><iframe id="fr-5760" title="Agent Terminal"></iframe></div>
|
|
53
|
+
</section>
|
|
54
|
+
|
|
55
|
+
<!-- 知识检索:原版 vector-hub 控制台(嵌入模式) -->
|
|
56
|
+
<section class="view" id="view-search">
|
|
57
|
+
<div class="embed-head">
|
|
58
|
+
<span class="embed-status" id="st-8787"><span class="st-dot"></span><span class="st-text">检测 127.0.0.1:8787 …</span></span>
|
|
59
|
+
<span class="chip" id="sync-8787">联动: —</span>
|
|
60
|
+
<a class="btn compact embed-open" id="open-8787" href="#" target="_blank" rel="noopener">独立打开 ↗</a>
|
|
61
|
+
</div>
|
|
62
|
+
<div class="embed"><iframe id="fr-8787" title="vector-hub 控制台"></iframe></div>
|
|
63
|
+
</section>
|
|
64
|
+
|
|
65
|
+
<!-- 会话浏览:原版 ai-coding-event-bridge 会话浏览器(嵌入模式) -->
|
|
66
|
+
<section class="view" id="view-bridge">
|
|
67
|
+
<div class="embed-head">
|
|
68
|
+
<span class="embed-status" id="st-8790"><span class="st-dot"></span><span class="st-text">检测 127.0.0.1:8790 …</span></span>
|
|
69
|
+
<a class="btn compact embed-open" id="open-8790" href="#" target="_blank" rel="noopener">独立打开 ↗</a>
|
|
70
|
+
</div>
|
|
71
|
+
<div class="embed"><iframe id="fr-8790" title="ai-coding-event-bridge 会话浏览器"></iframe></div>
|
|
72
|
+
</section>
|
|
73
|
+
|
|
74
|
+
<section class="view" id="view-import">
|
|
75
|
+
<div class="split">
|
|
76
|
+
<section class="panel form-panel">
|
|
77
|
+
<div class="section-title">导入项目</div>
|
|
78
|
+
<div class="section-help">导入只建立项目登记、Git 跟踪基线和托管 Hook,不运行初始化分析。两个地址在导入时由人选定,项目与模块的一一对应在登记那一刻确定。</div>
|
|
79
|
+
<form id="import-form" class="form-grid">
|
|
80
|
+
<div class="field"><label for="import-path">① 开发项目地址 · 登记到 Agent 终端</label>
|
|
81
|
+
<div style="display:flex;gap:8px">
|
|
82
|
+
<input class="input code" id="import-path" required placeholder="也可手动输入路径" style="flex:1">
|
|
83
|
+
<button class="btn" type="button" id="import-pick-folder">选择目录…</button>
|
|
84
|
+
</div>
|
|
85
|
+
<span class="muted import-field-help">打开本地目录选择框(终端原生选择器);确认后登记为终端项目</span>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="field"><label for="import-knowledge-path">② 知识库地址 · 登记到 vector-hub</label>
|
|
88
|
+
<div style="display:flex;gap:8px">
|
|
89
|
+
<input class="input code" id="import-knowledge-path" placeholder="也可手动输入路径" style="flex:1">
|
|
90
|
+
<button class="btn" type="button" id="import-pick-knowledge">选择目录…</button>
|
|
91
|
+
</div>
|
|
92
|
+
<span class="muted import-field-help">打开本地目录选择框(检索控制台原生选择器);确认后建索引并监控</span>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="notice" id="import-preflight" hidden></div>
|
|
95
|
+
<div class="notice error" id="import-errors" hidden></div>
|
|
96
|
+
<div class="notice" id="import-auto-init" hidden><strong>该目录不是 Git 仓库</strong><div class="muted">导入事务会自动执行 <code>git init</code>,并将当前目录加入跟踪基线。</div></div>
|
|
97
|
+
<div style="display:flex;gap:8px"><button class="btn-primary" type="submit" id="import-submit" disabled>导入</button><button class="btn" type="reset" id="import-reset">重置</button></div>
|
|
98
|
+
</form>
|
|
99
|
+
</section>
|
|
100
|
+
<aside class="panel preview-panel">
|
|
101
|
+
<div class="section-title">导入目标</div>
|
|
102
|
+
<div class="section-help">两个地址在导入时由人选定,项目与模块的一一对应在登记那一刻确定。</div>
|
|
103
|
+
<div class="preview-list">
|
|
104
|
+
<div class="panel2 preview-item"><div class="preview-label">Git 状态</div><div class="preview-value" id="pv-git-status">等待 preflight</div></div>
|
|
105
|
+
<div class="panel2 preview-item"><div class="preview-label">知识库地址</div><div class="preview-value code" id="pv-knowledge-root">—</div></div>
|
|
106
|
+
<div class="panel2 preview-item"><div class="preview-label">模块登记</div><div class="preview-value" id="pv-modules">待登记</div></div>
|
|
107
|
+
</div>
|
|
108
|
+
</aside>
|
|
109
|
+
</div>
|
|
110
|
+
</section>
|
|
111
|
+
</main>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div class="backdrop" id="settings-backdrop"></div>
|
|
115
|
+
<aside class="drawer" id="settings-drawer" aria-label="设置">
|
|
116
|
+
<nav class="settings-nav"><h3>设置</h3><button class="active" type="button" data-settings="logs">日志</button></nav>
|
|
117
|
+
<div class="settings-content">
|
|
118
|
+
<div class="drawer-head"><div><h2 id="settings-title">日志</h2><div class="section-help" id="settings-help">查看系统和项目的运行记录;异常会自动突出显示。</div></div><div style="display:flex;gap:8px;align-items:center"><label for="ui-language" data-i18n="app.language.toggle" style="font-size:12px;color:var(--muted)">界面语言</label><select class="input" id="ui-language" style="width:auto"><option value="zh-CN">中文</option><option value="en-US">English</option></select><button class="btn" type="button" id="close-settings">×</button></div></div>
|
|
119
|
+
|
|
120
|
+
<section class="settings-section active" id="settings-logs" data-layout-contract="fill-settings-available-height">
|
|
121
|
+
<div class="panel2 settings-card logs-card">
|
|
122
|
+
<div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:12px">
|
|
123
|
+
<div><strong>运行记录</strong><p class="section-help">查看系统和项目的运行过程。正常记录保持安静,警告和错误会自动突出;点击记录可查看完整上下文。</p></div>
|
|
124
|
+
<button class="btn" type="button" id="logs-export">导出</button>
|
|
125
|
+
</div>
|
|
126
|
+
<div class="record-sync-warning" id="logs-connection">新记录同步暂时中断,正在自动恢复。</div>
|
|
127
|
+
<div class="record-toolbar">
|
|
128
|
+
<input class="input" id="logs-date" type="date" aria-label="记录日期">
|
|
129
|
+
<select class="input" id="logs-project" aria-label="项目筛选"><option value="">全部项目</option></select>
|
|
130
|
+
<select class="input" id="logs-scope" aria-label="记录范围"><option value="all">全部记录</option><option value="important">重要记录</option><option value="errors">仅异常</option></select>
|
|
131
|
+
<select class="input" id="logs-limit" aria-label="显示记录数量"><option value="500" selected>500 条</option><option value="1000">1000 条</option><option value="2000">2000 条</option><option value="5000">5000 条</option></select>
|
|
132
|
+
<input class="input record-search" id="logs-search" placeholder="搜索运行记录…">
|
|
133
|
+
</div>
|
|
134
|
+
<div class="record-shell">
|
|
135
|
+
<div class="record-list" id="record-list"></div>
|
|
136
|
+
<div class="record-empty" id="record-empty">这个筛选条件下没有运行记录。</div>
|
|
137
|
+
<button class="new-records" type="button" id="new-records" hidden>有新记录</button>
|
|
138
|
+
<div class="record-footer"><span id="logs-summary">正在读取运行记录…</span><span class="record-note">点击任意记录查看级别、阶段和操作详情</span></div>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</section>
|
|
142
|
+
</div>
|
|
143
|
+
</aside>
|
|
144
|
+
|
|
145
|
+
<div class="context-menu" id="context-menu"><div class="muted" style="padding:5px 8px;font-size:10px" id="context-id">project</div><button type="button" id="remove-project">移除项目…</button></div>
|
|
146
|
+
|
|
147
|
+
<dialog id="delete-dialog">
|
|
148
|
+
<div class="dialog-head"><h3>移除项目</h3></div>
|
|
149
|
+
<div class="dialog-body">
|
|
150
|
+
<p class="muted" id="delete-copy" style="margin:0;font-size:12px">确认移除项目?默认保留知识目录。</p>
|
|
151
|
+
<p class="muted" style="margin:0;font-size:12px">同时解除模块登记:终端项目(保留会话记录)、vector-hub 索引(不动源文件)、会话浏览登记(journal 与封存文档全部保留)。</p>
|
|
152
|
+
<label class="check"><input type="checkbox" id="delete-knowledge"> 同时删除由本应用拥有的知识目录(危险)</label>
|
|
153
|
+
<div class="field" id="delete-confirm-field" hidden><label for="delete-confirm">输入项目 ID 以确认删除知识</label><input class="input code" id="delete-confirm"></div>
|
|
154
|
+
<div class="notice error" id="delete-error" hidden></div>
|
|
155
|
+
</div>
|
|
156
|
+
<div class="dialog-foot"><button class="btn" type="button" id="delete-cancel">取消</button><button class="btn-danger" type="button" id="delete-submit">移除项目</button></div>
|
|
157
|
+
</dialog>
|
|
158
|
+
|
|
159
|
+
<script src="/i18n.js"></script>
|
|
160
|
+
<script src="/app.js"></script>
|
|
161
|
+
</body>
|
|
162
|
+
</html>
|