@geminilight/mindos 0.6.29 → 0.6.31
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 +10 -4
- package/README_zh.md +10 -4
- package/app/app/api/acp/config/route.ts +82 -0
- package/app/app/api/acp/detect/route.ts +71 -48
- package/app/app/api/acp/install/route.ts +51 -0
- package/app/app/api/acp/session/route.ts +141 -11
- package/app/app/api/ask/route.ts +126 -18
- package/app/app/api/export/route.ts +105 -0
- package/app/app/api/workflows/route.ts +156 -0
- package/app/app/globals.css +2 -2
- package/app/app/page.tsx +7 -2
- package/app/app/trash/page.tsx +7 -0
- package/app/app/view/[...path]/ViewPageClient.tsx +234 -2
- package/app/components/ActivityBar.tsx +12 -4
- package/app/components/AskModal.tsx +4 -1
- package/app/components/ExportModal.tsx +220 -0
- package/app/components/FileTree.tsx +42 -11
- package/app/components/HomeContent.tsx +92 -20
- package/app/components/MarkdownView.tsx +45 -10
- package/app/components/Panel.tsx +1 -0
- package/app/components/RightAskPanel.tsx +5 -1
- package/app/components/Sidebar.tsx +10 -1
- package/app/components/SidebarLayout.tsx +6 -0
- package/app/components/TrashPageClient.tsx +263 -0
- package/app/components/agents/AgentDetailContent.tsx +263 -47
- package/app/components/agents/AgentsContentPage.tsx +11 -0
- package/app/components/agents/AgentsPanelA2aTab.tsx +285 -46
- package/app/components/agents/AgentsPanelSessionsTab.tsx +166 -0
- package/app/components/agents/agents-content-model.ts +2 -2
- package/app/components/ask/AgentSelectorCapsule.tsx +218 -0
- package/app/components/ask/AskContent.tsx +197 -239
- package/app/components/ask/FileChip.tsx +82 -17
- package/app/components/ask/MentionPopover.tsx +21 -3
- package/app/components/ask/MessageList.tsx +30 -9
- package/app/components/ask/SlashCommandPopover.tsx +21 -3
- package/app/components/ask/ToolCallBlock.tsx +102 -18
- package/app/components/changes/ChangesContentPage.tsx +58 -14
- package/app/components/explore/ExploreContent.tsx +4 -7
- package/app/components/explore/UseCaseCard.tsx +18 -1
- package/app/components/explore/use-cases.generated.ts +76 -0
- package/app/components/explore/use-cases.yaml +185 -0
- package/app/components/panels/AgentsPanel.tsx +1 -0
- package/app/components/panels/AgentsPanelHubNav.tsx +9 -2
- package/app/components/panels/DiscoverPanel.tsx +1 -1
- package/app/components/panels/WorkflowsPanel.tsx +206 -0
- package/app/components/renderers/workflow-yaml/StepEditor.tsx +164 -0
- package/app/components/renderers/workflow-yaml/WorkflowEditor.tsx +211 -0
- package/app/components/renderers/workflow-yaml/WorkflowRunner.tsx +269 -0
- package/app/components/renderers/workflow-yaml/WorkflowYamlRenderer.tsx +126 -0
- package/app/components/renderers/workflow-yaml/execution.ts +229 -0
- package/app/components/renderers/workflow-yaml/index.ts +6 -0
- package/app/components/renderers/workflow-yaml/manifest.ts +21 -0
- package/app/components/renderers/workflow-yaml/parser.ts +172 -0
- package/app/components/renderers/workflow-yaml/selectors.tsx +574 -0
- package/app/components/renderers/workflow-yaml/serializer.ts +56 -0
- package/app/components/renderers/workflow-yaml/types.ts +46 -0
- package/app/components/settings/AiTab.tsx +191 -174
- package/app/components/settings/AppearanceTab.tsx +168 -77
- package/app/components/settings/KnowledgeTab.tsx +131 -136
- package/app/components/settings/McpTab.tsx +11 -11
- package/app/components/settings/Primitives.tsx +60 -0
- package/app/components/settings/SettingsContent.tsx +15 -8
- package/app/components/settings/SyncTab.tsx +12 -12
- package/app/components/settings/UninstallTab.tsx +8 -18
- package/app/components/settings/UpdateTab.tsx +82 -82
- package/app/components/settings/types.ts +17 -8
- package/app/hooks/useAcpConfig.ts +96 -0
- package/app/hooks/useAcpDetection.ts +69 -14
- package/app/hooks/useAcpRegistry.ts +46 -11
- package/app/hooks/useAskModal.ts +12 -5
- package/app/hooks/useAskPanel.ts +8 -5
- package/app/hooks/useAskSession.ts +19 -2
- package/app/hooks/useImageUpload.ts +152 -0
- package/app/lib/acp/acp-tools.ts +3 -1
- package/app/lib/acp/agent-descriptors.ts +274 -0
- package/app/lib/acp/bridge.ts +6 -0
- package/app/lib/acp/index.ts +20 -4
- package/app/lib/acp/registry.ts +74 -7
- package/app/lib/acp/session.ts +490 -28
- package/app/lib/acp/subprocess.ts +307 -21
- package/app/lib/acp/types.ts +158 -20
- package/app/lib/actions.ts +57 -3
- package/app/lib/agent/model.ts +18 -3
- package/app/lib/agent/stream-consumer.ts +18 -0
- package/app/lib/agent/to-agent-messages.ts +25 -2
- package/app/lib/agent/tools.ts +56 -9
- package/app/lib/core/export.ts +116 -0
- package/app/lib/core/trash.ts +241 -0
- package/app/lib/fs.ts +47 -0
- package/app/lib/hooks/usePinnedFiles.ts +90 -0
- package/app/lib/i18n/generated/explore-i18n.generated.ts +138 -0
- package/app/lib/i18n/index.ts +3 -0
- package/app/lib/i18n/modules/knowledge.ts +124 -6
- package/app/lib/i18n/modules/navigation.ts +2 -0
- package/app/lib/i18n/modules/onboarding.ts +2 -134
- package/app/lib/i18n/modules/panels.ts +146 -2
- package/app/lib/i18n/modules/settings.ts +12 -0
- package/app/lib/pi-integration/skills.ts +21 -6
- package/app/lib/renderers/index.ts +2 -2
- package/app/lib/settings.ts +10 -0
- package/app/lib/types.ts +12 -1
- package/app/next-env.d.ts +1 -1
- package/app/package.json +11 -3
- package/app/scripts/generate-explore.ts +145 -0
- package/package.json +1 -1
- package/templates/en/.mindos/workflows/Sprint Release.flow.yaml +130 -0
- package/templates/zh/.mindos/workflows//345/221/250/350/277/255/344/273/243/346/243/200/346/237/245.flow.yaml +84 -0
- package/app/components/explore/use-cases.ts +0 -58
- package/app/components/renderers/workflow/WorkflowRenderer.tsx +0 -409
- package/app/components/renderers/workflow/manifest.ts +0 -14
package/app/lib/settings.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import os from 'os';
|
|
4
|
+
import { parseAcpAgentOverrides } from './acp/agent-descriptors';
|
|
4
5
|
|
|
5
6
|
const SETTINGS_PATH = path.join(os.homedir(), '.mindos', 'config.json');
|
|
6
7
|
|
|
@@ -49,6 +50,8 @@ export interface ServerSettings {
|
|
|
49
50
|
setupPending?: boolean; // true → / redirects to /setup
|
|
50
51
|
disabledSkills?: string[];
|
|
51
52
|
guideState?: GuideState;
|
|
53
|
+
/** Per-agent ACP overrides (command, args, env, enabled). Keyed by agent ID. */
|
|
54
|
+
acpAgents?: Record<string, import('./acp/agent-descriptors').AcpAgentOverride>;
|
|
52
55
|
}
|
|
53
56
|
|
|
54
57
|
const DEFAULTS: ServerSettings = {
|
|
@@ -133,6 +136,11 @@ function parseAgent(raw: unknown): AgentConfig | undefined {
|
|
|
133
136
|
return Object.keys(result).length > 0 ? result : undefined;
|
|
134
137
|
}
|
|
135
138
|
|
|
139
|
+
/** Parse acpAgents config field, delegates to agent-descriptors.ts */
|
|
140
|
+
function parseAcpAgentsField(raw: unknown): Record<string, import('./acp/agent-descriptors').AcpAgentOverride> | undefined {
|
|
141
|
+
return parseAcpAgentOverrides(raw);
|
|
142
|
+
}
|
|
143
|
+
|
|
136
144
|
/** Parse guideState from unknown input */
|
|
137
145
|
function parseGuideState(raw: unknown): GuideState | undefined {
|
|
138
146
|
if (!raw || typeof raw !== 'object') return undefined;
|
|
@@ -159,6 +167,7 @@ export function readSettings(): ServerSettings {
|
|
|
159
167
|
return {
|
|
160
168
|
ai: migrateAi(parsed),
|
|
161
169
|
agent: parseAgent(parsed.agent),
|
|
170
|
+
acpAgents: parseAcpAgentsField(parsed.acpAgents),
|
|
162
171
|
mindRoot: (parsed.mindRoot ?? parsed.sopRoot ?? DEFAULTS.mindRoot) as string,
|
|
163
172
|
webPassword: typeof parsed.webPassword === 'string' ? parsed.webPassword : undefined,
|
|
164
173
|
authToken: typeof parsed.authToken === 'string' ? parsed.authToken : undefined,
|
|
@@ -189,6 +198,7 @@ export function writeSettings(settings: ServerSettings): void {
|
|
|
189
198
|
if (settings.startMode !== undefined) merged.startMode = settings.startMode;
|
|
190
199
|
if (settings.disabledSkills !== undefined) merged.disabledSkills = settings.disabledSkills;
|
|
191
200
|
if (settings.guideState !== undefined) merged.guideState = settings.guideState;
|
|
201
|
+
if (settings.acpAgents !== undefined) merged.acpAgents = settings.acpAgents;
|
|
192
202
|
// setupPending: false/undefined → remove the field (cleanup); true → set it
|
|
193
203
|
if ('setupPending' in settings) {
|
|
194
204
|
if (settings.setupPending) merged.setupPending = true;
|
package/app/lib/types.ts
CHANGED
|
@@ -32,7 +32,16 @@ export interface ReasoningPart {
|
|
|
32
32
|
text: string;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
export type
|
|
35
|
+
export type ImageMimeType = 'image/png' | 'image/jpeg' | 'image/gif' | 'image/webp';
|
|
36
|
+
|
|
37
|
+
export interface ImagePart {
|
|
38
|
+
type: 'image';
|
|
39
|
+
/** Base64-encoded image data (no data: prefix) */
|
|
40
|
+
data: string;
|
|
41
|
+
mimeType: ImageMimeType;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type MessagePart = TextPart | ToolCallPart | ReasoningPart | ImagePart;
|
|
36
45
|
|
|
37
46
|
export interface Message {
|
|
38
47
|
role: 'user' | 'assistant';
|
|
@@ -41,6 +50,8 @@ export interface Message {
|
|
|
41
50
|
timestamp?: number;
|
|
42
51
|
/** Structured parts for assistant messages (tool calls + text segments) */
|
|
43
52
|
parts?: MessagePart[];
|
|
53
|
+
/** Images attached to this message (user messages only) */
|
|
54
|
+
images?: ImagePart[];
|
|
44
55
|
/** Skill name used for this user message (rendered as a capsule in the UI) */
|
|
45
56
|
skillName?: string;
|
|
46
57
|
}
|
package/app/next-env.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="next" />
|
|
2
2
|
/// <reference types="next/image-types/global" />
|
|
3
|
-
import "./.next/types/routes.d.ts";
|
|
3
|
+
import "./.next/dev/types/routes.d.ts";
|
|
4
4
|
|
|
5
5
|
// NOTE: This file should not be edited
|
|
6
6
|
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
package/app/package.json
CHANGED
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"scripts": {
|
|
6
|
-
"
|
|
7
|
-
"
|
|
6
|
+
"generate": "npx tsx scripts/generate-explore.ts",
|
|
7
|
+
"dev": "npx tsx scripts/generate-explore.ts && next dev -p ${MINDOS_WEB_PORT:-3456}",
|
|
8
|
+
"prebuild": "npx tsx scripts/generate-explore.ts && node ../scripts/gen-renderer-index.js",
|
|
8
9
|
"build": "next build --webpack",
|
|
9
10
|
"start": "next start -p ${MINDOS_WEB_PORT:-3456}",
|
|
10
11
|
"lint": "eslint",
|
|
@@ -32,16 +33,20 @@
|
|
|
32
33
|
"@tiptap/extension-task-list": "^3.20.1",
|
|
33
34
|
"@tiptap/react": "^3.20.1",
|
|
34
35
|
"@tiptap/starter-kit": "^3.20.1",
|
|
36
|
+
"@types/archiver": "^7.0.0",
|
|
35
37
|
"@xyflow/react": "^12.10.1",
|
|
38
|
+
"archiver": "^7.0.1",
|
|
36
39
|
"class-variance-authority": "^0.7.1",
|
|
37
40
|
"clsx": "^2.1.1",
|
|
38
41
|
"codemirror": "^6.0.2",
|
|
39
42
|
"extend": "^3.0.2",
|
|
40
43
|
"fuse.js": "^7.1.0",
|
|
41
44
|
"github-slugger": "^2.0.0",
|
|
45
|
+
"js-yaml": "^4.1.1",
|
|
42
46
|
"lucide-react": "^0.577.0",
|
|
43
|
-
"
|
|
47
|
+
"marked": "^17.0.5",
|
|
44
48
|
"mcporter": "^0.7.3",
|
|
49
|
+
"nanoid": "^5.1.0",
|
|
45
50
|
"next": "16.1.6",
|
|
46
51
|
"papaparse": "^5.5.3",
|
|
47
52
|
"pdfjs-dist": "^4.10.38",
|
|
@@ -52,7 +57,9 @@
|
|
|
52
57
|
"rehype-highlight": "^7.0.2",
|
|
53
58
|
"rehype-raw": "^7.0.0",
|
|
54
59
|
"rehype-slug": "^6.0.0",
|
|
60
|
+
"remark": "^15.0.1",
|
|
55
61
|
"remark-gfm": "^4.0.1",
|
|
62
|
+
"remark-html": "^16.0.1",
|
|
56
63
|
"source-map-js": "^1.2.1",
|
|
57
64
|
"tailwind-merge": "^3.5.0",
|
|
58
65
|
"tiptap-markdown": "^0.9.0",
|
|
@@ -61,6 +68,7 @@
|
|
|
61
68
|
},
|
|
62
69
|
"devDependencies": {
|
|
63
70
|
"@tailwindcss/postcss": "^4",
|
|
71
|
+
"@types/js-yaml": "^4.0.9",
|
|
64
72
|
"@types/node": "^20",
|
|
65
73
|
"@types/papaparse": "^5.5.2",
|
|
66
74
|
"@types/react": "^19",
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* generate-explore.ts — YAML → TypeScript code generator for Explore use cases.
|
|
4
|
+
*
|
|
5
|
+
* Reads: components/explore/use-cases.yaml (single source of truth)
|
|
6
|
+
* Generates:
|
|
7
|
+
* 1. components/explore/use-cases.generated.ts (UseCase[] array + types)
|
|
8
|
+
* 2. lib/i18n/generated/explore-i18n.generated.ts (zh + en translation objects)
|
|
9
|
+
*
|
|
10
|
+
* Run: npx tsx scripts/generate-explore.ts
|
|
11
|
+
* Or: npm run generate (via package.json hook)
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
14
|
+
import { resolve, dirname } from 'path';
|
|
15
|
+
import yaml from 'js-yaml';
|
|
16
|
+
|
|
17
|
+
const BANNER = '// ⚠️ AUTO-GENERATED — DO NOT EDIT. Source: components/explore/use-cases.yaml\n// Run `npm run generate` to regenerate.\n';
|
|
18
|
+
|
|
19
|
+
interface YamlText { title: string; desc: string; prompt: string }
|
|
20
|
+
interface YamlCase {
|
|
21
|
+
id: string;
|
|
22
|
+
icon: string;
|
|
23
|
+
image?: string;
|
|
24
|
+
category: string;
|
|
25
|
+
scenario: string;
|
|
26
|
+
zh: YamlText;
|
|
27
|
+
en: YamlText;
|
|
28
|
+
}
|
|
29
|
+
interface YamlMeta {
|
|
30
|
+
categories: Record<string, { en: string; zh: string }>;
|
|
31
|
+
scenarios: Record<string, { en: string; zh: string }>;
|
|
32
|
+
ui: Record<string, { en: string; zh: string }>;
|
|
33
|
+
}
|
|
34
|
+
interface YamlRoot { meta: YamlMeta; cases: YamlCase[] }
|
|
35
|
+
|
|
36
|
+
// ── Load YAML ──
|
|
37
|
+
const appDir = resolve(__dirname, '..');
|
|
38
|
+
const yamlPath = resolve(appDir, 'components/explore/use-cases.yaml');
|
|
39
|
+
const raw = readFileSync(yamlPath, 'utf-8');
|
|
40
|
+
const data = yaml.load(raw) as YamlRoot;
|
|
41
|
+
|
|
42
|
+
if (!data?.cases?.length) {
|
|
43
|
+
console.error('[generate-explore] No cases found in YAML');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
if (!data?.meta) {
|
|
47
|
+
console.error('[generate-explore] No meta section found in YAML');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ── Validate ──
|
|
52
|
+
const validCategories = new Set(Object.keys(data.meta.categories));
|
|
53
|
+
const validScenarios = new Set(Object.keys(data.meta.scenarios));
|
|
54
|
+
for (const c of data.cases) {
|
|
55
|
+
if (!c.id || !c.icon || !c.category || !c.scenario || !c.zh || !c.en) {
|
|
56
|
+
console.error(`[generate-explore] Invalid case: ${JSON.stringify(c)}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
if (!validCategories.has(c.category)) {
|
|
60
|
+
console.error(`[generate-explore] Unknown category "${c.category}" in case ${c.id}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
if (!validScenarios.has(c.scenario)) {
|
|
64
|
+
console.error(`[generate-explore] Unknown scenario "${c.scenario}" in case ${c.id}`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ── Generate use-cases.generated.ts ──
|
|
70
|
+
const categoryUnion = Object.keys(data.meta.categories).map(k => `'${k}'`).join(' | ');
|
|
71
|
+
const scenarioUnion = Object.keys(data.meta.scenarios).map(k => `'${k}'`).join(' | ');
|
|
72
|
+
|
|
73
|
+
const useCasesTs = `${BANNER}
|
|
74
|
+
/** Capability axis — maps to product pillars */
|
|
75
|
+
export type UseCaseCategory = ${categoryUnion};
|
|
76
|
+
|
|
77
|
+
/** Scenario axis — maps to user journey phase */
|
|
78
|
+
export type UseCaseScenario = ${scenarioUnion};
|
|
79
|
+
|
|
80
|
+
export interface UseCase {
|
|
81
|
+
id: string;
|
|
82
|
+
icon: string;
|
|
83
|
+
image?: string;
|
|
84
|
+
category: UseCaseCategory;
|
|
85
|
+
scenario: UseCaseScenario;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export const useCases: UseCase[] = ${JSON.stringify(
|
|
89
|
+
data.cases.map(c => ({
|
|
90
|
+
id: c.id,
|
|
91
|
+
icon: c.icon,
|
|
92
|
+
...(c.image ? { image: c.image } : {}),
|
|
93
|
+
category: c.category,
|
|
94
|
+
scenario: c.scenario,
|
|
95
|
+
})),
|
|
96
|
+
null,
|
|
97
|
+
2,
|
|
98
|
+
)};
|
|
99
|
+
|
|
100
|
+
export const categories: UseCaseCategory[] = ${JSON.stringify(Object.keys(data.meta.categories))};
|
|
101
|
+
export const scenarios: UseCaseScenario[] = ${JSON.stringify(Object.keys(data.meta.scenarios))};
|
|
102
|
+
`;
|
|
103
|
+
|
|
104
|
+
const useCasesPath = resolve(appDir, 'components/explore/use-cases.generated.ts');
|
|
105
|
+
writeFileSync(useCasesPath, useCasesTs, 'utf-8');
|
|
106
|
+
console.log(`[generate-explore] ✓ ${useCasesPath}`);
|
|
107
|
+
|
|
108
|
+
// ── Generate explore-i18n.generated.ts ──
|
|
109
|
+
function buildI18n(lang: 'en' | 'zh') {
|
|
110
|
+
const ui: Record<string, string> = {};
|
|
111
|
+
for (const [key, val] of Object.entries(data.meta.ui)) {
|
|
112
|
+
ui[key] = val[lang];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const categories: Record<string, string> = {};
|
|
116
|
+
for (const [key, val] of Object.entries(data.meta.categories)) {
|
|
117
|
+
categories[key] = val[lang];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const scenarios: Record<string, string> = {};
|
|
121
|
+
for (const [key, val] of Object.entries(data.meta.scenarios)) {
|
|
122
|
+
scenarios[key] = val[lang];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const cases: Record<string, { title: string; desc: string; prompt: string }> = {};
|
|
126
|
+
for (const c of data.cases) {
|
|
127
|
+
cases[c.id] = c[lang];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return { ...ui, categories, scenarios, ...cases };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const i18nTs = `${BANNER}
|
|
134
|
+
export const exploreEn = ${JSON.stringify(buildI18n('en'), null, 2)} as const;
|
|
135
|
+
|
|
136
|
+
export const exploreZh = ${JSON.stringify(buildI18n('zh'), null, 2)} as const;
|
|
137
|
+
`;
|
|
138
|
+
|
|
139
|
+
const i18nDir = resolve(appDir, 'lib/i18n/generated');
|
|
140
|
+
mkdirSync(i18nDir, { recursive: true });
|
|
141
|
+
const i18nPath = resolve(i18nDir, 'explore-i18n.generated.ts');
|
|
142
|
+
writeFileSync(i18nPath, i18nTs, 'utf-8');
|
|
143
|
+
console.log(`[generate-explore] ✓ ${i18nPath}`);
|
|
144
|
+
|
|
145
|
+
console.log(`[generate-explore] Done — ${data.cases.length} use cases generated.`);
|
package/package.json
CHANGED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
title: Sprint Release Workflow
|
|
2
|
+
description: Weekly sprint release process with multi-agent collaboration and comprehensive QA
|
|
3
|
+
|
|
4
|
+
# Global configuration - skills available across all steps
|
|
5
|
+
skills:
|
|
6
|
+
- software-architecture
|
|
7
|
+
- code-review-quality
|
|
8
|
+
- document-release
|
|
9
|
+
|
|
10
|
+
# Global tools guidance (advisory - LLM auto-selects based on context)
|
|
11
|
+
tools:
|
|
12
|
+
- git
|
|
13
|
+
- npm
|
|
14
|
+
- github
|
|
15
|
+
|
|
16
|
+
# Workflow steps - executed sequentially
|
|
17
|
+
steps:
|
|
18
|
+
# Step 1: Run comprehensive test suite
|
|
19
|
+
- id: run_tests
|
|
20
|
+
name: Run tests
|
|
21
|
+
description: Execute full test suite and report results with coverage metrics
|
|
22
|
+
agent: cursor
|
|
23
|
+
prompt: |
|
|
24
|
+
Execute the full test suite for this project.
|
|
25
|
+
|
|
26
|
+
Provide:
|
|
27
|
+
1. Total tests run, passed, failed
|
|
28
|
+
2. Coverage report (lines/branches/functions)
|
|
29
|
+
3. Any critical failures with recommendations
|
|
30
|
+
4. Time taken
|
|
31
|
+
|
|
32
|
+
If failures exist, list the top 3 most critical with suggested fixes.
|
|
33
|
+
timeout: 120
|
|
34
|
+
|
|
35
|
+
# Step 2: Code review with dedicated AI agent
|
|
36
|
+
- id: code_review
|
|
37
|
+
name: Code review
|
|
38
|
+
description: Comprehensive code review using software architecture principles
|
|
39
|
+
agent: claude-code
|
|
40
|
+
skill: code-review-quality
|
|
41
|
+
prompt: |
|
|
42
|
+
Review the recent code changes using the code-review-quality standard.
|
|
43
|
+
|
|
44
|
+
Evaluate:
|
|
45
|
+
1. Correctness - error handling, edge cases
|
|
46
|
+
2. Security - authentication, input validation, secrets
|
|
47
|
+
3. Performance - N+1 queries, caching, complexity
|
|
48
|
+
4. Maintainability - naming, tests, documentation
|
|
49
|
+
5. Architecture - follows project patterns, no anti-patterns
|
|
50
|
+
|
|
51
|
+
Provide a rating (e.g., 8.5/10) and key recommendations.
|
|
52
|
+
timeout: 120
|
|
53
|
+
|
|
54
|
+
# Step 3: Automated security scan (no agent - use LLM with tools)
|
|
55
|
+
- id: security_check
|
|
56
|
+
name: Security scan
|
|
57
|
+
description: Run security analysis and dependency checks
|
|
58
|
+
tools:
|
|
59
|
+
- npm
|
|
60
|
+
- github
|
|
61
|
+
prompt: |
|
|
62
|
+
Perform security checks on this project:
|
|
63
|
+
|
|
64
|
+
1. Check for known vulnerabilities in npm dependencies
|
|
65
|
+
2. Review recent dependency changes
|
|
66
|
+
3. Check for hardcoded secrets or credentials
|
|
67
|
+
4. Evaluate access control and authentication mechanisms
|
|
68
|
+
5. Assess error handling for information leaks
|
|
69
|
+
|
|
70
|
+
Report severity and recommended fixes.
|
|
71
|
+
timeout: 60
|
|
72
|
+
|
|
73
|
+
# Step 4: Update documentation using document-release skill
|
|
74
|
+
- id: update_docs
|
|
75
|
+
name: Update documentation
|
|
76
|
+
description: Sync CHANGELOG, README, and API docs with shipped changes
|
|
77
|
+
skill: document-release
|
|
78
|
+
prompt: |
|
|
79
|
+
Update project documentation based on the shipped changes:
|
|
80
|
+
|
|
81
|
+
1. Update CHANGELOG.md following semantic versioning
|
|
82
|
+
2. Update README.md if features or APIs changed
|
|
83
|
+
3. Update API documentation if endpoints changed
|
|
84
|
+
4. Verify all documentation links are valid
|
|
85
|
+
5. Check code examples match current implementation
|
|
86
|
+
|
|
87
|
+
Provide a summary of all documentation updates made.
|
|
88
|
+
timeout: 60
|
|
89
|
+
|
|
90
|
+
# Step 5: Final checklist before release
|
|
91
|
+
- id: pre_release_check
|
|
92
|
+
name: Pre-release verification
|
|
93
|
+
description: Final comprehensive verification before shipping
|
|
94
|
+
agent: mindos
|
|
95
|
+
prompt: |
|
|
96
|
+
Perform final pre-release verification:
|
|
97
|
+
|
|
98
|
+
Checklist:
|
|
99
|
+
☐ All tests passing
|
|
100
|
+
☐ Code review completed and issues resolved
|
|
101
|
+
☐ Security scan passed or risks accepted
|
|
102
|
+
☐ Documentation updated and links valid
|
|
103
|
+
☐ Version bumped correctly (semver)
|
|
104
|
+
☐ Git tags and commits clean
|
|
105
|
+
☐ No uncommitted changes
|
|
106
|
+
☐ Changelog entry present
|
|
107
|
+
☐ Dependencies updated and locked
|
|
108
|
+
☐ Performance benchmarks acceptable
|
|
109
|
+
|
|
110
|
+
Confirm release readiness or list any blockers.
|
|
111
|
+
timeout: 60
|
|
112
|
+
|
|
113
|
+
# Step 6: Create release tag and prepare release notes
|
|
114
|
+
- id: create_release
|
|
115
|
+
name: Create release
|
|
116
|
+
description: Tag release and prepare release notes for publishing
|
|
117
|
+
tools:
|
|
118
|
+
- git
|
|
119
|
+
- npm
|
|
120
|
+
prompt: |
|
|
121
|
+
Prepare the project for release:
|
|
122
|
+
|
|
123
|
+
1. Confirm version in package.json matches intended release
|
|
124
|
+
2. Create git tag for this version (vX.Y.Z)
|
|
125
|
+
3. Generate release notes from CHANGELOG.md
|
|
126
|
+
4. Prepare npm release command (do not execute yet)
|
|
127
|
+
5. List all deliverables included in this release
|
|
128
|
+
|
|
129
|
+
Provide step-by-step commands for final publishing.
|
|
130
|
+
timeout: 60
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
title: 周迭代检查工作流
|
|
2
|
+
description: 每周进行代码审查、测试运行和文档更新的标准工作流
|
|
3
|
+
|
|
4
|
+
# 全局配置 - 此工作流可用的技能
|
|
5
|
+
skills:
|
|
6
|
+
- software-architecture
|
|
7
|
+
- code-review-quality
|
|
8
|
+
|
|
9
|
+
# 工作流步骤 - 按顺序执行
|
|
10
|
+
steps:
|
|
11
|
+
# 第 1 步:运行测试套件
|
|
12
|
+
- id: run_tests
|
|
13
|
+
name: 运行测试
|
|
14
|
+
description: 执行完整测试套件并报告覆盖率
|
|
15
|
+
agent: cursor
|
|
16
|
+
prompt: |
|
|
17
|
+
执行此项目的完整测试套件。
|
|
18
|
+
|
|
19
|
+
提供以下信息:
|
|
20
|
+
1. 运行的总测试数、通过数、失败数
|
|
21
|
+
2. 覆盖率报告(行/分支/函数)
|
|
22
|
+
3. 任何严重失败及修复建议
|
|
23
|
+
4. 耗时
|
|
24
|
+
|
|
25
|
+
如果有失败,列出前 3 个最严重的失败及建议的修复方案。
|
|
26
|
+
timeout: 120
|
|
27
|
+
|
|
28
|
+
# 第 2 步:代码审查
|
|
29
|
+
- id: code_review
|
|
30
|
+
name: 代码审查
|
|
31
|
+
description: 使用标准进行代码审查
|
|
32
|
+
agent: claude-code
|
|
33
|
+
skill: code-review-quality
|
|
34
|
+
prompt: |
|
|
35
|
+
使用代码审查标准对最近的代码变更进行审查。
|
|
36
|
+
|
|
37
|
+
评估以下方面:
|
|
38
|
+
1. 正确性 - 错误处理、边界情况
|
|
39
|
+
2. 安全性 - 认证、输入验证、密钥管理
|
|
40
|
+
3. 性能 - 查询优化、缓存策略、复杂度
|
|
41
|
+
4. 可维护性 - 命名规范、测试覆盖、文档完整性
|
|
42
|
+
5. 架构 - 是否遵循项目模式,有无反模式
|
|
43
|
+
|
|
44
|
+
给出评分(如 8.5/10)和主要建议。
|
|
45
|
+
timeout: 120
|
|
46
|
+
|
|
47
|
+
# 第 3 步:更新文档
|
|
48
|
+
- id: update_docs
|
|
49
|
+
name: 更新文档
|
|
50
|
+
description: 同步 CHANGELOG 和 README
|
|
51
|
+
skill: document-release
|
|
52
|
+
prompt: |
|
|
53
|
+
根据本次发布的变更更新项目文档:
|
|
54
|
+
|
|
55
|
+
1. 更新 CHANGELOG.md,遵循语义化版本规范
|
|
56
|
+
2. 如果功能或 API 变更,更新 README.md
|
|
57
|
+
3. 如果端点变更,更新 API 文档
|
|
58
|
+
4. 验证所有文档链接有效
|
|
59
|
+
5. 检查代码示例是否匹配当前实现
|
|
60
|
+
|
|
61
|
+
提供所有文档变更的摘要。
|
|
62
|
+
timeout: 60
|
|
63
|
+
|
|
64
|
+
# 第 4 步:发布前最终检查
|
|
65
|
+
- id: final_check
|
|
66
|
+
name: 发布前验证
|
|
67
|
+
description: 最终确认一切就绪
|
|
68
|
+
agent: mindos
|
|
69
|
+
prompt: |
|
|
70
|
+
进行最终的发布前验证检查:
|
|
71
|
+
|
|
72
|
+
清单:
|
|
73
|
+
☐ 所有测试通过
|
|
74
|
+
☐ 代码审查完成并问题已解决
|
|
75
|
+
☐ 文档已更新并链接有效
|
|
76
|
+
☐ 版本号正确升级(语义化版本)
|
|
77
|
+
☐ Git 标签和提交干净
|
|
78
|
+
☐ 无未提交的更改
|
|
79
|
+
☐ CHANGELOG 条目存在
|
|
80
|
+
☐ 依赖项已更新并锁定
|
|
81
|
+
☐ 性能基准可接受
|
|
82
|
+
|
|
83
|
+
确认发布就绪或列出任何阻碍因素。
|
|
84
|
+
timeout: 60
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/** Capability axis — maps to product pillars */
|
|
2
|
-
export type UseCaseCategory = 'knowledge-management' | 'memory-sync' | 'auto-execute' | 'experience-evolution' | 'human-insights' | 'audit-control';
|
|
3
|
-
|
|
4
|
-
/** Scenario axis — maps to user journey phase */
|
|
5
|
-
export type UseCaseScenario = 'first-day' | 'daily' | 'project' | 'advanced';
|
|
6
|
-
|
|
7
|
-
export interface UseCase {
|
|
8
|
-
id: string;
|
|
9
|
-
icon: string;
|
|
10
|
-
category: UseCaseCategory;
|
|
11
|
-
scenario: UseCaseScenario;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* C1-C9 use case definitions.
|
|
16
|
-
* All display text (title, description, prompt) comes from i18n — this file is structure only.
|
|
17
|
-
*
|
|
18
|
-
* Category (capability axis):
|
|
19
|
-
* knowledge-management — Inject, organize, and maintain knowledge
|
|
20
|
-
* memory-sync — Record once, all Agents know
|
|
21
|
-
* auto-execute — One sentence, auto-execute
|
|
22
|
-
* experience-evolution — Gets smarter with use
|
|
23
|
-
* human-insights — Understand and manage relationships
|
|
24
|
-
* audit-control — You have final say
|
|
25
|
-
*
|
|
26
|
-
* Scenario (journey axis):
|
|
27
|
-
* first-day — Onboarding / first-time tasks
|
|
28
|
-
* daily — Everyday workflows
|
|
29
|
-
* project — Project-scoped work
|
|
30
|
-
* advanced — Power-user patterns
|
|
31
|
-
*/
|
|
32
|
-
export const useCases: UseCase[] = [
|
|
33
|
-
{ id: 'c1', icon: '👤', category: 'memory-sync', scenario: 'first-day' },
|
|
34
|
-
{ id: 'c2', icon: '📥', category: 'knowledge-management', scenario: 'daily' },
|
|
35
|
-
{ id: 'c3', icon: '🔄', category: 'memory-sync', scenario: 'project' },
|
|
36
|
-
{ id: 'c4', icon: '🔁', category: 'experience-evolution', scenario: 'daily' },
|
|
37
|
-
{ id: 'c5', icon: '💡', category: 'auto-execute', scenario: 'daily' },
|
|
38
|
-
{ id: 'c6', icon: '🚀', category: 'auto-execute', scenario: 'project' },
|
|
39
|
-
{ id: 'c7', icon: '🔍', category: 'knowledge-management', scenario: 'project' },
|
|
40
|
-
{ id: 'c8', icon: '🤝', category: 'human-insights', scenario: 'daily' },
|
|
41
|
-
{ id: 'c9', icon: '🛡️', category: 'audit-control', scenario: 'advanced' },
|
|
42
|
-
];
|
|
43
|
-
|
|
44
|
-
export const categories: UseCaseCategory[] = [
|
|
45
|
-
'knowledge-management',
|
|
46
|
-
'memory-sync',
|
|
47
|
-
'auto-execute',
|
|
48
|
-
'experience-evolution',
|
|
49
|
-
'human-insights',
|
|
50
|
-
'audit-control',
|
|
51
|
-
];
|
|
52
|
-
|
|
53
|
-
export const scenarios: UseCaseScenario[] = [
|
|
54
|
-
'first-day',
|
|
55
|
-
'daily',
|
|
56
|
-
'project',
|
|
57
|
-
'advanced',
|
|
58
|
-
];
|