@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.
Files changed (110) hide show
  1. package/README.md +10 -4
  2. package/README_zh.md +10 -4
  3. package/app/app/api/acp/config/route.ts +82 -0
  4. package/app/app/api/acp/detect/route.ts +71 -48
  5. package/app/app/api/acp/install/route.ts +51 -0
  6. package/app/app/api/acp/session/route.ts +141 -11
  7. package/app/app/api/ask/route.ts +126 -18
  8. package/app/app/api/export/route.ts +105 -0
  9. package/app/app/api/workflows/route.ts +156 -0
  10. package/app/app/globals.css +2 -2
  11. package/app/app/page.tsx +7 -2
  12. package/app/app/trash/page.tsx +7 -0
  13. package/app/app/view/[...path]/ViewPageClient.tsx +234 -2
  14. package/app/components/ActivityBar.tsx +12 -4
  15. package/app/components/AskModal.tsx +4 -1
  16. package/app/components/ExportModal.tsx +220 -0
  17. package/app/components/FileTree.tsx +42 -11
  18. package/app/components/HomeContent.tsx +92 -20
  19. package/app/components/MarkdownView.tsx +45 -10
  20. package/app/components/Panel.tsx +1 -0
  21. package/app/components/RightAskPanel.tsx +5 -1
  22. package/app/components/Sidebar.tsx +10 -1
  23. package/app/components/SidebarLayout.tsx +6 -0
  24. package/app/components/TrashPageClient.tsx +263 -0
  25. package/app/components/agents/AgentDetailContent.tsx +263 -47
  26. package/app/components/agents/AgentsContentPage.tsx +11 -0
  27. package/app/components/agents/AgentsPanelA2aTab.tsx +285 -46
  28. package/app/components/agents/AgentsPanelSessionsTab.tsx +166 -0
  29. package/app/components/agents/agents-content-model.ts +2 -2
  30. package/app/components/ask/AgentSelectorCapsule.tsx +218 -0
  31. package/app/components/ask/AskContent.tsx +197 -239
  32. package/app/components/ask/FileChip.tsx +82 -17
  33. package/app/components/ask/MentionPopover.tsx +21 -3
  34. package/app/components/ask/MessageList.tsx +30 -9
  35. package/app/components/ask/SlashCommandPopover.tsx +21 -3
  36. package/app/components/ask/ToolCallBlock.tsx +102 -18
  37. package/app/components/changes/ChangesContentPage.tsx +58 -14
  38. package/app/components/explore/ExploreContent.tsx +4 -7
  39. package/app/components/explore/UseCaseCard.tsx +18 -1
  40. package/app/components/explore/use-cases.generated.ts +76 -0
  41. package/app/components/explore/use-cases.yaml +185 -0
  42. package/app/components/panels/AgentsPanel.tsx +1 -0
  43. package/app/components/panels/AgentsPanelHubNav.tsx +9 -2
  44. package/app/components/panels/DiscoverPanel.tsx +1 -1
  45. package/app/components/panels/WorkflowsPanel.tsx +206 -0
  46. package/app/components/renderers/workflow-yaml/StepEditor.tsx +164 -0
  47. package/app/components/renderers/workflow-yaml/WorkflowEditor.tsx +211 -0
  48. package/app/components/renderers/workflow-yaml/WorkflowRunner.tsx +269 -0
  49. package/app/components/renderers/workflow-yaml/WorkflowYamlRenderer.tsx +126 -0
  50. package/app/components/renderers/workflow-yaml/execution.ts +229 -0
  51. package/app/components/renderers/workflow-yaml/index.ts +6 -0
  52. package/app/components/renderers/workflow-yaml/manifest.ts +21 -0
  53. package/app/components/renderers/workflow-yaml/parser.ts +172 -0
  54. package/app/components/renderers/workflow-yaml/selectors.tsx +574 -0
  55. package/app/components/renderers/workflow-yaml/serializer.ts +56 -0
  56. package/app/components/renderers/workflow-yaml/types.ts +46 -0
  57. package/app/components/settings/AiTab.tsx +191 -174
  58. package/app/components/settings/AppearanceTab.tsx +168 -77
  59. package/app/components/settings/KnowledgeTab.tsx +131 -136
  60. package/app/components/settings/McpTab.tsx +11 -11
  61. package/app/components/settings/Primitives.tsx +60 -0
  62. package/app/components/settings/SettingsContent.tsx +15 -8
  63. package/app/components/settings/SyncTab.tsx +12 -12
  64. package/app/components/settings/UninstallTab.tsx +8 -18
  65. package/app/components/settings/UpdateTab.tsx +82 -82
  66. package/app/components/settings/types.ts +17 -8
  67. package/app/hooks/useAcpConfig.ts +96 -0
  68. package/app/hooks/useAcpDetection.ts +69 -14
  69. package/app/hooks/useAcpRegistry.ts +46 -11
  70. package/app/hooks/useAskModal.ts +12 -5
  71. package/app/hooks/useAskPanel.ts +8 -5
  72. package/app/hooks/useAskSession.ts +19 -2
  73. package/app/hooks/useImageUpload.ts +152 -0
  74. package/app/lib/acp/acp-tools.ts +3 -1
  75. package/app/lib/acp/agent-descriptors.ts +274 -0
  76. package/app/lib/acp/bridge.ts +6 -0
  77. package/app/lib/acp/index.ts +20 -4
  78. package/app/lib/acp/registry.ts +74 -7
  79. package/app/lib/acp/session.ts +490 -28
  80. package/app/lib/acp/subprocess.ts +307 -21
  81. package/app/lib/acp/types.ts +158 -20
  82. package/app/lib/actions.ts +57 -3
  83. package/app/lib/agent/model.ts +18 -3
  84. package/app/lib/agent/stream-consumer.ts +18 -0
  85. package/app/lib/agent/to-agent-messages.ts +25 -2
  86. package/app/lib/agent/tools.ts +56 -9
  87. package/app/lib/core/export.ts +116 -0
  88. package/app/lib/core/trash.ts +241 -0
  89. package/app/lib/fs.ts +47 -0
  90. package/app/lib/hooks/usePinnedFiles.ts +90 -0
  91. package/app/lib/i18n/generated/explore-i18n.generated.ts +138 -0
  92. package/app/lib/i18n/index.ts +3 -0
  93. package/app/lib/i18n/modules/knowledge.ts +124 -6
  94. package/app/lib/i18n/modules/navigation.ts +2 -0
  95. package/app/lib/i18n/modules/onboarding.ts +2 -134
  96. package/app/lib/i18n/modules/panels.ts +146 -2
  97. package/app/lib/i18n/modules/settings.ts +12 -0
  98. package/app/lib/pi-integration/skills.ts +21 -6
  99. package/app/lib/renderers/index.ts +2 -2
  100. package/app/lib/settings.ts +10 -0
  101. package/app/lib/types.ts +12 -1
  102. package/app/next-env.d.ts +1 -1
  103. package/app/package.json +11 -3
  104. package/app/scripts/generate-explore.ts +145 -0
  105. package/package.json +1 -1
  106. package/templates/en/.mindos/workflows/Sprint Release.flow.yaml +130 -0
  107. package/templates/zh/.mindos/workflows//345/221/250/350/277/255/344/273/243/346/243/200/346/237/245.flow.yaml +84 -0
  108. package/app/components/explore/use-cases.ts +0 -58
  109. package/app/components/renderers/workflow/WorkflowRenderer.tsx +0 -409
  110. package/app/components/renderers/workflow/manifest.ts +0 -14
@@ -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 MessagePart = TextPart | ToolCallPart | ReasoningPart;
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
- "dev": "next dev -p ${MINDOS_WEB_PORT:-3456}",
7
- "prebuild": "node ../scripts/gen-renderer-index.js",
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
- "nanoid": "^5.1.0",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geminilight/mindos",
3
- "version": "0.6.29",
3
+ "version": "0.6.31",
4
4
  "description": "MindOS — Human-Agent Collaborative Mind System. Local-first knowledge base that syncs your mind to all AI Agents via MCP.",
5
5
  "keywords": [
6
6
  "mindos",
@@ -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
- ];