maestro-flow 0.4.18 → 0.4.20
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/agents/workflow-collab-planner.md +4 -1
- package/.agents/agents/workflow-plan-checker.md +11 -1
- package/.agents/agents/workflow-planner.md +4 -1
- package/.agents/skills/maestro/SKILL.md +8 -5
- package/.agents/skills/maestro-analyze/SKILL.md +1 -1
- package/.agents/skills/maestro-brainstorm/SKILL.md +2 -1
- package/.agents/skills/maestro-companion/SKILL.md +533 -0
- package/.agents/skills/maestro-grill/SKILL.md +116 -0
- package/.agents/skills/maestro-next/SKILL.md +147 -112
- package/.agents/skills/maestro-plan/SKILL.md +4 -0
- package/.agents/skills/maestro-ralph/SKILL.md +11 -7
- package/.agents/skills/maestro-swarm-workflow/SKILL.md +258 -0
- package/.agents/skills/manage-codebase-rebuild/SKILL.md +13 -1
- package/.agents/skills/manage-codebase-refresh/SKILL.md +3 -0
- package/.agents/skills/spec-setup/SKILL.md +9 -5
- package/.agents/skills/team-swarm/SKILL.md +180 -0
- package/.agents/skills/team-swarm/roles/analyst/role.md +187 -0
- package/.agents/skills/team-swarm/roles/ant/role.md +169 -0
- package/.agents/skills/team-swarm/roles/coordinator/commands/converge.md +146 -0
- package/.agents/skills/team-swarm/roles/coordinator/commands/init-swarm.md +136 -0
- package/.agents/skills/team-swarm/roles/coordinator/commands/iterate.md +232 -0
- package/.agents/skills/team-swarm/roles/coordinator/role.md +211 -0
- package/.agents/skills/team-swarm/roles/scorer/role.md +157 -0
- package/.agents/skills/team-swarm/scripts/aco.py +473 -0
- package/.agents/skills/team-swarm/scripts/pheromone.py +144 -0
- package/.agents/skills/team-swarm/scripts/scoring.py +92 -0
- package/.agents/skills/team-swarm/scripts/test_aco.py +475 -0
- package/.agents/skills/team-swarm/specs/ant-output-schema.md +119 -0
- package/.agents/skills/team-swarm/specs/convergence-criteria.md +106 -0
- package/.agents/skills/team-swarm/specs/pheromone-schema.md +123 -0
- package/.agents/skills/team-swarm/specs/swarm-config-template.json +71 -0
- package/.agents/skills/team-swarm/specs/swarm-protocol.md +117 -0
- package/.agy/agents/workflow-collab-planner.md +4 -1
- package/.agy/agents/workflow-plan-checker.md +11 -1
- package/.agy/agents/workflow-planner.md +4 -1
- package/.agy/skills/maestro/SKILL.md +8 -5
- package/.agy/skills/maestro-analyze/SKILL.md +1 -1
- package/.agy/skills/maestro-brainstorm/SKILL.md +2 -1
- package/.agy/skills/maestro-companion/SKILL.md +529 -0
- package/.agy/skills/maestro-grill/SKILL.md +116 -0
- package/.agy/skills/maestro-next/SKILL.md +147 -112
- package/.agy/skills/maestro-plan/SKILL.md +4 -0
- package/.agy/skills/maestro-ralph/SKILL.md +11 -7
- package/.agy/skills/maestro-swarm-workflow/SKILL.md +255 -0
- package/.agy/skills/manage-codebase-rebuild/SKILL.md +13 -1
- package/.agy/skills/manage-codebase-refresh/SKILL.md +3 -0
- package/.agy/skills/spec-setup/SKILL.md +9 -5
- package/.agy/skills/team-swarm/SKILL.md +176 -0
- package/.agy/skills/team-swarm/roles/analyst/role.md +183 -0
- package/.agy/skills/team-swarm/roles/ant/role.md +165 -0
- package/.agy/skills/team-swarm/roles/coordinator/commands/converge.md +134 -0
- package/.agy/skills/team-swarm/roles/coordinator/commands/init-swarm.md +136 -0
- package/.agy/skills/team-swarm/roles/coordinator/commands/iterate.md +202 -0
- package/.agy/skills/team-swarm/roles/coordinator/role.md +209 -0
- package/.agy/skills/team-swarm/roles/scorer/role.md +153 -0
- package/.agy/skills/team-swarm/scripts/aco.py +473 -0
- package/.agy/skills/team-swarm/scripts/pheromone.py +144 -0
- package/.agy/skills/team-swarm/scripts/scoring.py +92 -0
- package/.agy/skills/team-swarm/scripts/test_aco.py +475 -0
- package/.agy/skills/team-swarm/specs/ant-output-schema.md +119 -0
- package/.agy/skills/team-swarm/specs/convergence-criteria.md +106 -0
- package/.agy/skills/team-swarm/specs/pheromone-schema.md +123 -0
- package/.agy/skills/team-swarm/specs/swarm-config-template.json +71 -0
- package/.agy/skills/team-swarm/specs/swarm-protocol.md +117 -0
- package/.claude/agents/workflow-collab-planner.md +4 -1
- package/.claude/agents/workflow-plan-checker.md +11 -1
- package/.claude/agents/workflow-planner.md +4 -1
- package/.claude/commands/maestro-analyze.md +1 -1
- package/.claude/commands/maestro-brainstorm.md +2 -1
- package/.claude/commands/maestro-companion.md +531 -0
- package/.claude/commands/maestro-grill.md +114 -0
- package/.claude/commands/maestro-next.md +147 -112
- package/.claude/commands/maestro-plan.md +4 -0
- package/.claude/commands/maestro-ralph.md +11 -7
- package/.claude/commands/maestro-swarm-workflow.md +256 -0
- package/.claude/commands/maestro.md +8 -5
- package/.claude/commands/manage-codebase-rebuild.md +13 -1
- package/.claude/commands/manage-codebase-refresh.md +3 -0
- package/.claude/commands/spec-setup.md +9 -5
- package/.claude/skills/team-swarm/SKILL.md +178 -0
- package/.claude/skills/team-swarm/roles/analyst/role.md +185 -0
- package/.claude/skills/team-swarm/roles/ant/role.md +167 -0
- package/.claude/skills/team-swarm/roles/coordinator/commands/converge.md +146 -0
- package/.claude/skills/team-swarm/roles/coordinator/commands/init-swarm.md +136 -0
- package/.claude/skills/team-swarm/roles/coordinator/commands/iterate.md +232 -0
- package/.claude/skills/team-swarm/roles/coordinator/role.md +209 -0
- package/.claude/skills/team-swarm/roles/scorer/role.md +155 -0
- package/.claude/skills/team-swarm/scripts/aco.py +473 -0
- package/.claude/skills/team-swarm/scripts/pheromone.py +144 -0
- package/.claude/skills/team-swarm/scripts/scoring.py +92 -0
- package/.claude/skills/team-swarm/scripts/test_aco.py +475 -0
- package/.claude/skills/team-swarm/specs/ant-output-schema.md +119 -0
- package/.claude/skills/team-swarm/specs/convergence-criteria.md +106 -0
- package/.claude/skills/team-swarm/specs/pheromone-schema.md +123 -0
- package/.claude/skills/team-swarm/specs/swarm-config-template.json +71 -0
- package/.claude/skills/team-swarm/specs/swarm-protocol.md +117 -0
- package/.codex/skills/maestro/SKILL.md +7 -2
- package/.codex/skills/maestro-companion/SKILL.md +485 -0
- package/.codex/skills/maestro-grill/SKILL.md +111 -0
- package/.codex/skills/maestro-next/SKILL.md +297 -0
- package/.codex/skills/maestro-ralph/SKILL.md +11 -7
- package/.codex/skills/manage-codebase-rebuild/SKILL.md +6 -0
- package/.codex/skills/manage-codebase-refresh/SKILL.md +6 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.d.ts +36 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js +138 -2
- package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/search.js +13 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/search.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.d.ts +11 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js +178 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +1 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +39 -23
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
- package/dist/src/cli.js +1 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/install-backend.d.ts +7 -0
- package/dist/src/commands/install-backend.d.ts.map +1 -1
- package/dist/src/commands/install-backend.js +14 -0
- package/dist/src/commands/install-backend.js.map +1 -1
- package/dist/src/commands/install.d.ts.map +1 -1
- package/dist/src/commands/install.js +23 -1
- package/dist/src/commands/install.js.map +1 -1
- package/dist/src/commands/kg.d.ts +11 -0
- package/dist/src/commands/kg.d.ts.map +1 -0
- package/dist/src/commands/kg.js +515 -0
- package/dist/src/commands/kg.js.map +1 -0
- package/dist/src/i18n/locales/en.d.ts.map +1 -1
- package/dist/src/i18n/locales/en.js +19 -0
- package/dist/src/i18n/locales/en.js.map +1 -1
- package/dist/src/i18n/locales/zh.d.ts.map +1 -1
- package/dist/src/i18n/locales/zh.js +19 -0
- package/dist/src/i18n/locales/zh.js.map +1 -1
- package/dist/src/i18n/types.d.ts +12 -0
- package/dist/src/i18n/types.d.ts.map +1 -1
- package/dist/src/tui/install-ui/HooksConfig.d.ts +5 -1
- package/dist/src/tui/install-ui/HooksConfig.d.ts.map +1 -1
- package/dist/src/tui/install-ui/HooksConfig.js +5 -3
- package/dist/src/tui/install-ui/HooksConfig.js.map +1 -1
- package/dist/src/tui/install-ui/InstallConfirm.d.ts +3 -0
- package/dist/src/tui/install-ui/InstallConfirm.d.ts.map +1 -1
- package/dist/src/tui/install-ui/InstallConfirm.js +1 -1
- package/dist/src/tui/install-ui/InstallConfirm.js.map +1 -1
- package/dist/src/tui/install-ui/InstallExecution.d.ts +2 -0
- package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -1
- package/dist/src/tui/install-ui/InstallExecution.js +48 -3
- package/dist/src/tui/install-ui/InstallExecution.js.map +1 -1
- package/dist/src/tui/install-ui/InstallFlow.d.ts +1 -1
- package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -1
- package/dist/src/tui/install-ui/InstallFlow.js +95 -17
- package/dist/src/tui/install-ui/InstallFlow.js.map +1 -1
- package/dist/src/tui/install-ui/InstallHub.d.ts +4 -0
- package/dist/src/tui/install-ui/InstallHub.d.ts.map +1 -1
- package/dist/src/tui/install-ui/InstallHub.js +14 -0
- package/dist/src/tui/install-ui/InstallHub.js.map +1 -1
- package/dist/src/tui/install-ui/InstallResult.d.ts.map +1 -1
- package/dist/src/tui/install-ui/InstallResult.js +1 -1
- package/dist/src/tui/install-ui/InstallResult.js.map +1 -1
- package/dist/src/tui/install-ui/KgVendorConfig.d.ts +7 -0
- package/dist/src/tui/install-ui/KgVendorConfig.d.ts.map +1 -0
- package/dist/src/tui/install-ui/KgVendorConfig.js +9 -0
- package/dist/src/tui/install-ui/KgVendorConfig.js.map +1 -0
- package/dist/src/utils/update-notices.js +22 -0
- package/dist/src/utils/update-notices.js.map +1 -1
- package/package.json +1 -1
- package/workflows/analyze.md +2 -1
- package/workflows/brainstorm.md +24 -1
- package/workflows/codebase-rebuild.md +141 -1
- package/workflows/codebase-refresh.md +20 -0
- package/workflows/finish-work.md +7 -2
- package/workflows/grill.md +513 -0
- package/workflows/plan.md +7 -4
- package/workflows/specs-setup.md +99 -3
- package/workflows/swarm/wf-analyze.js +186 -0
- package/workflows/swarm/wf-brainstorm.js +284 -0
- package/workflows/swarm/wf-execute.js +203 -0
- package/workflows/swarm/wf-grill.js +198 -0
- package/workflows/swarm/wf-milestone-audit.js +236 -0
- package/workflows/swarm/wf-plan.js +233 -0
- package/workflows/swarm/wf-review.js +226 -0
- package/workflows/swarm/wf-verify.js +298 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: maestro-next
|
|
3
|
+
description: Single-command recommendation — pick the best next skill from the pool and execute it in-context
|
|
4
|
+
argument-hint: "\"<intent>\" [-y] [--dry-run] [--top N] [--list]"
|
|
5
|
+
allowed-tools: Read, Bash, Glob, Grep, request_user_input
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<purpose>
|
|
9
|
+
单链推荐:解析 intent + project state → 路由表评分 → 推荐**单个原子 skill** → 确认后**在协调器上下文直接调用** `$skill {args}`。
|
|
10
|
+
|
|
11
|
+
Entry points:
|
|
12
|
+
- **`$maestro-next "intent"`** — 推荐并确认后执行
|
|
13
|
+
- **`$maestro-next -y "intent"`** — 跳过确认直接执行 top pick
|
|
14
|
+
- **`$maestro-next --dry-run "intent"`** — 仅显示推荐
|
|
15
|
+
- **`$maestro-next --list`** — 仅列出可推荐 skill 池(按 workflow 簇分组)
|
|
16
|
+
|
|
17
|
+
Codex specifics:
|
|
18
|
+
- **No agent spawning** — top pick 直接在协调器上下文以 `$skill {args}` 形式调用,单次执行后结束
|
|
19
|
+
- **Skill pool discovery via CLI** — `maestro ralph skills --platform codex --json --quiet`(project `.codex/skills/` 覆盖 global `~/.codex/skills/`)
|
|
20
|
+
- **No session, no status.json, no goal** — 不调 `create_goal` / `update_plan`,由目标 skill 自行管理产出
|
|
21
|
+
|
|
22
|
+
与 `$maestro` / `$maestro-ralph` 区别:
|
|
23
|
+
- 不创建 session、不构建 chain、不写 status.json
|
|
24
|
+
- 始终只推 1 个 top pick,最多列 2-3 个备选
|
|
25
|
+
- 适用场景:意图清晰且单步即可完成;或需要定向推荐时
|
|
26
|
+
</purpose>
|
|
27
|
+
|
|
28
|
+
<context>
|
|
29
|
+
$ARGUMENTS — 意图文本 + 可选 flags。
|
|
30
|
+
|
|
31
|
+
**Flags:**
|
|
32
|
+
- `-y, --yes` — 跳过确认,直接执行 top pick;若目标 skill 支持 `-y`,透传
|
|
33
|
+
- `--dry-run` — 仅显示推荐结果,不执行
|
|
34
|
+
- `--top N` — 显示前 N 个候选(默认 3)
|
|
35
|
+
- `--list` — 仅列出可推荐 skill 池(按 workflow 簇分组),不做推荐
|
|
36
|
+
|
|
37
|
+
**候选池:** 仅 A_SCORE_CANDIDATES 路由表中列出的 skill。管线编排器(`maestro` / `maestro-ralph*` / `maestro-player` / `maestro-composer`)**永远不在候选池**。
|
|
38
|
+
|
|
39
|
+
**State files:**
|
|
40
|
+
- `.workflow/state.json` — phase / milestone / artifact registry
|
|
41
|
+
- `.workflow/scratch/` — 最近 artifact(按 mtime 倒序定位 lifecycle)
|
|
42
|
+
- `.workflow/.maestro/` — 进行中的 session(仅作引用,不修改)
|
|
43
|
+
</context>
|
|
44
|
+
|
|
45
|
+
<invariants>
|
|
46
|
+
1. **不创建 session / 不写 status.json / 不调用 create_goal/update_plan** — 单次原子调用,产出由目标 skill 自行管理
|
|
47
|
+
2. **管线编排器不在候选池** — `maestro` / `maestro-ralph*` / `maestro-player` / `maestro-composer` 永远不会被推荐
|
|
48
|
+
3. **Skill 发现限定 codex 平台** — 通过 `maestro ralph skills --platform codex --json --quiet` 解析 `command_scope` + `command_path`(project 覆盖 global,限定 `.codex/skills/`);未命中即 E003
|
|
49
|
+
4. **空 intent 或 "continue/next/go/继续/下一步/接下来"** → 直接采用 lifecycle_position 推断的自然下一步
|
|
50
|
+
5. **字面命中路由表优先** — lifecycle 仅作加分;命中失败时 lifecycle 上升为决定性信号
|
|
51
|
+
6. **In-context invocation** — top pick 以 `$skill-name {args}` 形式在协调器上下文直接调用,**禁止** spawn_agent / spawn_agents_on_csv / exec_command 包装
|
|
52
|
+
7. **参数传递** — 默认 intent 原文作为第一个 arg;用户可在 S_CONFIRM 修改;`-y` 仅当用户传入时透传到 skill args
|
|
53
|
+
8. **`--list` 模式跳过 lifecycle 推断与评分**,仅按 workflow 簇分组列出全部候选
|
|
54
|
+
</invariants>
|
|
55
|
+
|
|
56
|
+
<state_machine>
|
|
57
|
+
|
|
58
|
+
<states>
|
|
59
|
+
S_PARSE — 解析 ARGUMENTS、提取 flags PERSIST: —
|
|
60
|
+
S_STATE — 读 project state、推断 lifecycle_position PERSIST: —
|
|
61
|
+
S_RANK — 路由表评分、生成 top-N candidates PERSIST: —
|
|
62
|
+
S_VALIDATE — `ralph skills --platform codex` 校验 top picks PERSIST: —
|
|
63
|
+
S_LIST — `--list` 模式:分组展示候选池 PERSIST: —
|
|
64
|
+
S_PRESENT — 显示 top pick + 备选 + 推荐理由 + 执行参数 PERSIST: —
|
|
65
|
+
S_CONFIRM — request_user_input 选择/修改参数(auto_mode 跳过) PERSIST: —
|
|
66
|
+
S_EXECUTE — 在协调器上下文以 `$skill {args}` 直调 PERSIST: —
|
|
67
|
+
S_FALLBACK — intent 空且 clarification 失败 PERSIST: —
|
|
68
|
+
</states>
|
|
69
|
+
|
|
70
|
+
<transitions>
|
|
71
|
+
|
|
72
|
+
S_PARSE:
|
|
73
|
+
→ S_LIST WHEN: --list flag
|
|
74
|
+
→ S_STATE WHEN: intent text present
|
|
75
|
+
→ S_STATE WHEN: keyword "continue"/"next"/"go"/"继续"/"下一步"/"接下来"
|
|
76
|
+
→ S_PARSE WHEN: no intent (max 1 clarify round) DO: request_user_input
|
|
77
|
+
→ S_FALLBACK WHEN: clarification empty
|
|
78
|
+
|
|
79
|
+
S_STATE:
|
|
80
|
+
→ S_RANK DO: A_INFER_LIFECYCLE
|
|
81
|
+
|
|
82
|
+
S_RANK:
|
|
83
|
+
→ S_VALIDATE DO: A_SCORE_CANDIDATES
|
|
84
|
+
|
|
85
|
+
S_VALIDATE:
|
|
86
|
+
→ S_PRESENT WHEN: top pick 命中 codex skill 池 DO: A_RESOLVE_COMMAND_PATH
|
|
87
|
+
→ S_PRESENT WHEN: top pick missing → 降级到下一个候选 DO: A_RESOLVE_COMMAND_PATH
|
|
88
|
+
→ S_FALLBACK WHEN: top-N 全部 missing DO: raise E003
|
|
89
|
+
|
|
90
|
+
S_LIST:
|
|
91
|
+
→ END DO: A_LIST_BY_CLUSTER
|
|
92
|
+
|
|
93
|
+
S_PRESENT:
|
|
94
|
+
→ END WHEN: --dry-run
|
|
95
|
+
→ S_EXECUTE WHEN: -y / --yes
|
|
96
|
+
→ S_CONFIRM WHEN: not auto_mode
|
|
97
|
+
|
|
98
|
+
S_CONFIRM:
|
|
99
|
+
→ S_EXECUTE WHEN: 用户确认 top pick / 选备选 / 改参数
|
|
100
|
+
→ END WHEN: 用户取消
|
|
101
|
+
|
|
102
|
+
S_EXECUTE:
|
|
103
|
+
→ END DO: A_INVOKE_SKILL → 输出 "✓ executed $<skill>"
|
|
104
|
+
|
|
105
|
+
S_FALLBACK:
|
|
106
|
+
→ END DO: raise E001
|
|
107
|
+
|
|
108
|
+
</transitions>
|
|
109
|
+
|
|
110
|
+
<actions>
|
|
111
|
+
|
|
112
|
+
### A_INFER_LIFECYCLE
|
|
113
|
+
|
|
114
|
+
读 project state 推断 `lifecycle_position`(核心信号):
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
cat .workflow/state.json 2>/dev/null # phase / milestone / artifacts
|
|
118
|
+
ls -la .workflow/scratch/ 2>/dev/null | head -10 # 最近 artifact (mtime DESC)
|
|
119
|
+
ls -la .workflow/.maestro/ 2>/dev/null | head -5 # 进行中的 session
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**项目状态 → lifecycle_position → 自然下一步:**
|
|
123
|
+
|
|
124
|
+
| 项目状态 | lifecycle_position | 自然下一步 |
|
|
125
|
+
|---------|-------------------|-----------|
|
|
126
|
+
| 无 `.workflow/` + 无源码 | brainstorm | `maestro-brainstorm` |
|
|
127
|
+
| 无 `.workflow/` + 有源码 | init | `maestro-init` |
|
|
128
|
+
| 有 state.json,无 roadmap,无 milestones | analyze-macro | `maestro-analyze` (宏观调研) |
|
|
129
|
+
| 有 macro analyze artifact,无 roadmap | roadmap | `maestro-roadmap` |
|
|
130
|
+
| 有 roadmap,未启动 phase | analyze | `maestro-analyze {phase}` |
|
|
131
|
+
| 最新 artifact = analyze | plan | `maestro-plan {phase}` |
|
|
132
|
+
| 最新 artifact = plan | execute | `maestro-execute {phase}` |
|
|
133
|
+
| 最新 artifact = execute | verify | `maestro-verify {phase}` |
|
|
134
|
+
| verify passed | review | `quality-review {phase}` |
|
|
135
|
+
| review verdict=PASS | test-gen | `quality-auto-test {phase}` |
|
|
136
|
+
| 测试全绿 | milestone-audit | `maestro-milestone-audit` |
|
|
137
|
+
| 当前 milestone 全 phase 完成 | milestone-complete | `maestro-milestone-complete` |
|
|
138
|
+
| 任一 stage 产物含 gaps/failed | debug | `quality-debug {gap}` |
|
|
139
|
+
|
|
140
|
+
**Maestro Lifecycle 主线:**
|
|
141
|
+
```
|
|
142
|
+
brainstorm → blueprint → init → analyze-macro → roadmap
|
|
143
|
+
→ [per phase] analyze → plan → execute → verify
|
|
144
|
+
→ [quality gate] review → auto-test → test
|
|
145
|
+
→ milestone-audit → milestone-complete → milestone-release
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### A_SCORE_CANDIDATES
|
|
149
|
+
|
|
150
|
+
**评分信号**(高→低):
|
|
151
|
+
|
|
152
|
+
| 信号 | 权重 | 说明 |
|
|
153
|
+
|------|------|------|
|
|
154
|
+
| intent 命中路由表关键词 | 高 | 字面匹配主依据 |
|
|
155
|
+
| **lifecycle 自然下一步** | **高** | 空 intent / "continue" / "next" 时为决定性 |
|
|
156
|
+
| `name` 关键词命中 intent | 中 | intent 含 "test" → quality-test/quality-auto-test 加分 |
|
|
157
|
+
| Workflow 簇匹配 | 中 | intent 涉及学习/知识/issue 等场景触发对应簇 |
|
|
158
|
+
| Recent activity 反向避免 | 低 | 刚完成的 stage 短期内降权 |
|
|
159
|
+
|
|
160
|
+
**特殊意图处理:**
|
|
161
|
+
|
|
162
|
+
| Intent 模式 | top pick |
|
|
163
|
+
|------------|---------|
|
|
164
|
+
| 空 / "continue" / "next" / "go" / "继续" / "下一步" / "接下来" | lifecycle 自然下一步 |
|
|
165
|
+
| "status" / "状态" / "现在到哪了" | `manage-status` |
|
|
166
|
+
| 字面命中路由表 | 路由表优先(lifecycle 仅加分) |
|
|
167
|
+
| 无任何匹配 | lifecycle 下一步 + raise W002 |
|
|
168
|
+
|
|
169
|
+
**意图 → skill 路由表**(候选池):
|
|
170
|
+
|
|
171
|
+
| 意图关键词 | 推荐 skill |
|
|
172
|
+
|-----------|-----------|
|
|
173
|
+
| 头脑风暴 / 探索 / brainstorm / ideate | `maestro-brainstorm` |
|
|
174
|
+
| 规格 / 正式文档 / spec-generate / blueprint | `maestro-blueprint` |
|
|
175
|
+
| 分析 / analyze / 多维度调研 | `maestro-analyze` |
|
|
176
|
+
| 规划 / plan / 任务分解 | `maestro-plan` |
|
|
177
|
+
| 实现 / 执行 / execute | `maestro-execute` |
|
|
178
|
+
| 验证 / verify / 验收 | `maestro-verify` |
|
|
179
|
+
| 调试 / debug / 排查 / bug | `quality-debug` |
|
|
180
|
+
| 审查 / review / 代码审查 | `quality-review` |
|
|
181
|
+
| 测试 / test / UAT | `quality-test` / `quality-auto-test` |
|
|
182
|
+
| 重构 / refactor / 技术债 | `quality-refactor` |
|
|
183
|
+
| 同步文档 / sync docs | `quality-sync` |
|
|
184
|
+
| 回顾 / retro | `quality-retrospective` / `learn-retro` |
|
|
185
|
+
| issue / 缺陷管理 | `manage-issue` / `manage-issue-discover` |
|
|
186
|
+
| wiki / 知识图谱 | `manage-wiki` / `wiki-connect` / `wiki-digest` |
|
|
187
|
+
| spec / 规则 / 约束 | `spec-load` / `spec-add` / `spec-setup` |
|
|
188
|
+
| 项目初始化 / init | `maestro-init` |
|
|
189
|
+
| 状态 / status / 仪表盘 | `manage-status` |
|
|
190
|
+
| 文档重建 / codebase 文档 | `manage-codebase-rebuild` / `manage-codebase-refresh` |
|
|
191
|
+
| 安全 / security / OWASP | `security-audit` |
|
|
192
|
+
| 跟读 / 学习 / 阅读源码 | `learn-follow` / `learn-investigate` |
|
|
193
|
+
| 第二意见 / challenge / consult | `learn-second-opinion` |
|
|
194
|
+
| 提取知识 / harvest | `manage-harvest` / `manage-knowhow-capture` |
|
|
195
|
+
| 设计 / UI / 前端打磨 | `maestro-impeccable` |
|
|
196
|
+
| 里程碑 / milestone | `maestro-milestone-audit` / `maestro-milestone-release` / `maestro-milestone-complete` |
|
|
197
|
+
| fork / 分支 / 并行开发 | `maestro-fork` / `maestro-merge` |
|
|
198
|
+
| 覆盖层 / overlay / amend | `maestro-overlay` / `maestro-amend` |
|
|
199
|
+
|
|
200
|
+
**辅助 workflow 簇**(场景触发,非主线):
|
|
201
|
+
|
|
202
|
+
| 簇 | 触发 | 主推链路 |
|
|
203
|
+
|----|------|---------|
|
|
204
|
+
| Learning | 接触新代码/未知模块 | `learn-follow` → `learn-decompose` → `learn-second-opinion` |
|
|
205
|
+
| Knowledge | 提炼经验 / 沉淀知识 | `manage-harvest` → `manage-knowhow-capture` → `spec-add` |
|
|
206
|
+
| Wiki | 知识图谱整理 | `manage-wiki` → `wiki-connect` → `wiki-digest` |
|
|
207
|
+
| Issue | 缺陷管理 | `manage-issue-discover` → `manage-issue` |
|
|
208
|
+
| 文档同步 | 代码大改后 | `quality-sync` → `manage-codebase-refresh` |
|
|
209
|
+
| 重构 | 技术债积累 | `quality-refactor` → `quality-review` |
|
|
210
|
+
| 发布 | 里程碑结束 | `maestro-milestone-audit` → `maestro-milestone-release` |
|
|
211
|
+
| 并行开发 | 多 milestone 并行 | `maestro-fork` → ... → `maestro-merge` |
|
|
212
|
+
|
|
213
|
+
输出 ranked candidates,取 top N(默认 3)。
|
|
214
|
+
|
|
215
|
+
### A_RESOLVE_COMMAND_PATH
|
|
216
|
+
|
|
217
|
+
校验候选 skill 在 codex 平台可用:
|
|
218
|
+
|
|
219
|
+
1. `Bash("maestro ralph skills --platform codex --json --quiet")` — 一次性拉取 codex 可用 skills(project `.codex/skills/` 覆盖 global `~/.codex/skills/`)
|
|
220
|
+
2. 对每个 candidate 匹配 skill 名:
|
|
221
|
+
- 命中 → `command_scope ∈ {global, project}`, `command_path = <abs SKILL.md path>`
|
|
222
|
+
- 未命中 → `command_scope = "missing"`,从候选列表剔除
|
|
223
|
+
3. top pick missing → 降级到下一候选;top-N 全部 missing → S_FALLBACK 报 E003
|
|
224
|
+
|
|
225
|
+
### A_LIST_BY_CLUSTER
|
|
226
|
+
|
|
227
|
+
按 workflow 簇(**主线** / Learning / Knowledge / Wiki / Issue / 文档 / 重构 / 发布 / 并行)分组展示全部候选 + description。每项标 `[project|global]` scope,便于用户判断来源。
|
|
228
|
+
|
|
229
|
+
### A_INVOKE_SKILL
|
|
230
|
+
|
|
231
|
+
在协调器上下文以 `$skill-name {args}` 直接调用(**NO spawn_agent, NO exec_command 包装**):
|
|
232
|
+
|
|
233
|
+
1. 解析最终 args:
|
|
234
|
+
- 默认:`{intent}`(原文,去除已识别的关键词如 "continue")
|
|
235
|
+
- 用户改过:使用用户输入
|
|
236
|
+
- `-y` 透传:附加 `-y`(仅当用户传入且目标 skill 支持)
|
|
237
|
+
2. 在响应中直接写出调用指令,例如:`$maestro-analyze "优化登录流程"`
|
|
238
|
+
3. 读取目标 skill 产出后输出 `✓ executed $<skill-name>`
|
|
239
|
+
4. 不修改任何 `.workflow/` 文件;不创建 session;不触发后续 chain
|
|
240
|
+
|
|
241
|
+
</actions>
|
|
242
|
+
|
|
243
|
+
</state_machine>
|
|
244
|
+
|
|
245
|
+
<presentation>
|
|
246
|
+
|
|
247
|
+
### `--list` 模式
|
|
248
|
+
|
|
249
|
+
按 workflow 簇分组展示全部候选 + description + `[project|global]` scope,结束。
|
|
250
|
+
|
|
251
|
+
### 正常模式
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
🎯 推荐 (top pick): $<skill-name> [project|global]
|
|
255
|
+
<description>
|
|
256
|
+
推荐理由: <命中规则 + lifecycle 位置一句话>
|
|
257
|
+
|
|
258
|
+
备选:
|
|
259
|
+
2. $<alt-1> [scope] — <description>
|
|
260
|
+
3. $<alt-2> [scope] — <description>
|
|
261
|
+
|
|
262
|
+
执行参数: <args>
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
`--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则 `request_user_input` 提供:执行 top pick / 选备选 / 修改参数 / 取消。
|
|
266
|
+
|
|
267
|
+
</presentation>
|
|
268
|
+
|
|
269
|
+
<appendix>
|
|
270
|
+
|
|
271
|
+
### Error Codes
|
|
272
|
+
|
|
273
|
+
| Code | Severity | Condition | Recovery |
|
|
274
|
+
|------|----------|-----------|----------|
|
|
275
|
+
| E001 | error | intent 空且 clarification 后仍空 | 提供意图描述或使用 `--list` 浏览 |
|
|
276
|
+
| E002 | error | codex skill 池为空(`maestro ralph skills --platform codex` 无结果) | 检查 `.codex/skills/` 与 `~/.codex/skills/` |
|
|
277
|
+
| E003 | error | 选定命令在 codex 平台未命中(`command_scope == "missing"`) | 列出 codex 可用 skill 让用户重选 |
|
|
278
|
+
| W001 | warning | top1 与 top2 得分差距 < 阈值 | 强制展示前 3 让用户裁决 |
|
|
279
|
+
| W002 | warning | intent 与所有候选匹配度均低 | 提示考虑 `$maestro` 或 `$maestro-ralph` 走管线 |
|
|
280
|
+
|
|
281
|
+
### Success Criteria
|
|
282
|
+
|
|
283
|
+
- [ ] Intent 解析 + flags 提取完成
|
|
284
|
+
- [ ] 读取 `.workflow/state.json` + scratch artifacts 推断 lifecycle_position
|
|
285
|
+
- [ ] 候选池等于路由表(管线编排器不在)
|
|
286
|
+
- [ ] 评分综合:intent 字面匹配 + lifecycle 下一步 + workflow 簇 + recent activity
|
|
287
|
+
- [ ] 空 intent / "continue" / "next" → 直接采用 lifecycle 推断的下一步
|
|
288
|
+
- [ ] top pick 展示附"推荐理由"(命中规则 + lifecycle 位置)
|
|
289
|
+
- [ ] `maestro ralph skills --platform codex --json --quiet` 校验 top picks;missing 降级到下一候选
|
|
290
|
+
- [ ] `--dry-run` 仅展示,不执行
|
|
291
|
+
- [ ] `-y` 自动执行 top pick;用户传入时透传到 skill args
|
|
292
|
+
- [ ] 非自动模式通过 `request_user_input` 确认或选备选
|
|
293
|
+
- [ ] 选定 skill 在协调器上下文以 `$skill {args}` 直调(NO spawn_agent / NO exec_command 包装)
|
|
294
|
+
- [ ] 不创建 session / 不生成 status.json / 不调用 create_goal/update_plan / 不触发后续 chain
|
|
295
|
+
- [ ] `--list` 模式按 workflow 簇分组展示,每项标 `[project|global]` scope
|
|
296
|
+
|
|
297
|
+
</appendix>
|
|
@@ -129,20 +129,20 @@ S_INFER:
|
|
|
129
129
|
|
|
130
130
|
S_RESOLVE_SCOPE:
|
|
131
131
|
→ S_QUALITY_MODE DO: A_RESOLVE_SCOPE_VERDICT
|
|
132
|
-
GUARD: position ∈ {brainstorm, blueprint, init} → skip (scope_verdict = null)
|
|
132
|
+
GUARD: position ∈ {grill, brainstorm, blueprint, init} → skip (scope_verdict = null)
|
|
133
133
|
|
|
134
134
|
S_QUALITY_MODE:
|
|
135
135
|
→ S_PLANNING_MODE DO: A_DETERMINE_QUALITY_MODE
|
|
136
136
|
|
|
137
137
|
S_PLANNING_MODE:
|
|
138
138
|
→ S_DECOMPOSE DO: A_DETERMINE_PLANNING_MODE
|
|
139
|
-
GUARD: lifecycle_position ∈ {brainstorm, blueprint, init, analyze-macro, roadmap} → skip (force independent)
|
|
139
|
+
GUARD: lifecycle_position ∈ {grill, brainstorm, blueprint, init, analyze-macro, roadmap} → skip (force independent)
|
|
140
140
|
|
|
141
141
|
S_DECOMPOSE:
|
|
142
142
|
→ S_BUILD_CHAIN DO: A_DECOMPOSE_TASKS
|
|
143
143
|
GUARD: broad intent → MUST clarify boundary even if auto_confirm
|
|
144
144
|
GUARD: narrow intent → auto-derive, skip questions
|
|
145
|
-
GUARD: position ∈ {brainstorm, blueprint, init} → skip decomposition
|
|
145
|
+
GUARD: position ∈ {grill, brainstorm, blueprint, init} → skip decomposition
|
|
146
146
|
|
|
147
147
|
S_BUILD_CHAIN:
|
|
148
148
|
→ S_CREATE_SESSION DO: A_BUILD_STEPS
|
|
@@ -242,6 +242,7 @@ resolve_milestone(phase_number):
|
|
|
242
242
|
|
|
243
243
|
| Pattern | Position |
|
|
244
244
|
|---------|----------|
|
|
245
|
+
| 压力测试 / 拷问 / 验证假设 / grill / stress-test | `grill`(**auto_confirm=true 时跳过,直接 `brainstorm`**) |
|
|
245
246
|
| brainstorm / 头脑风暴 / 探索 / ideate / 设计思路 | `brainstorm` |
|
|
246
247
|
| blueprint / 规格 / 正式文档 / spec-generate / 7-phase | `blueprint` |
|
|
247
248
|
| broad/medium intent 无数字 phase (重构/全面/重写/迁移/新功能 X) | `analyze-macro` |
|
|
@@ -262,7 +263,7 @@ resolve_milestone(phase_number):
|
|
|
262
263
|
| `phase_is_new == true` (新 phase) | `analyze` |
|
|
263
264
|
| no milestones AND no roadmap.md AND has analyze macro artifact | `roadmap` |
|
|
264
265
|
| no milestones AND no roadmap.md AND no analyze artifact | `analyze-macro` |
|
|
265
|
-
| `phase == null` (brainstorm/blueprint/init/roadmap/analyze-macro override 已定) | n/a |
|
|
266
|
+
| `phase == null` (grill/brainstorm/blueprint/init/roadmap/analyze-macro override 已定) | n/a |
|
|
266
267
|
| phase 已存在 + 无任何 artifact | `analyze` |
|
|
267
268
|
| phase 已存在 + 最新 artifact = analyze | `plan` |
|
|
268
269
|
| phase 已存在 + 最新 artifact = plan | `execute` |
|
|
@@ -317,7 +318,7 @@ resolve_milestone(phase_number):
|
|
|
317
318
|
|
|
318
319
|
| Condition | Mode | Reason |
|
|
319
320
|
|-----------|------|--------|
|
|
320
|
-
| lifecycle_position ∈ {brainstorm, init, roadmap} | `independent` | 前期阶段不涉及多 phase 规划 |
|
|
321
|
+
| lifecycle_position ∈ {grill, brainstorm, init, roadmap} | `independent` | 前期阶段不涉及多 phase 规划 |
|
|
321
322
|
| `phase_is_new == true` | `independent` | 新 phase 尚无里程碑上下文 |
|
|
322
323
|
| intent 显式指定 phase 编号(如 "phase 2"、"P3") | `independent` | 用户明确针对单个 phase |
|
|
323
324
|
| milestone 仅含 1 个 phase(读 state.json) | `independent` | 统一无意义 |
|
|
@@ -380,7 +381,8 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
|
|
|
380
381
|
|
|
381
382
|
| Stage | Skill (independent) | Skill (unified) | Decision after | quality_mode |
|
|
382
383
|
|-------|---------------------|-----------------|----------------|--------------|
|
|
383
|
-
|
|
|
384
|
+
| grill | `maestro-grill "{intent}"` | *(same)* | — | all (**skip when auto_confirm**) |
|
|
385
|
+
| brainstorm | `maestro-brainstorm "{intent}" --from grill:{grill_id}` *(if grill ran)* / `maestro-brainstorm "{intent}"` *(otherwise)* | *(same)* | — | all |
|
|
384
386
|
| blueprint | `maestro-blueprint "{intent}"` | *(same)* | — | all |
|
|
385
387
|
| init | `maestro-init` | *(same)* | — | all |
|
|
386
388
|
| analyze-macro | `maestro-analyze "{intent}"` | *(same)* | `post-analyze-scope` | all |
|
|
@@ -405,6 +407,7 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
|
|
|
405
407
|
1. **起点**:从 `session.lifecycle_position` 开始
|
|
406
408
|
2. **跳过已完成**:跳过当前 milestone+phase 下已有 completed artifact 的 stage(按 `session.phase` 过滤);unified 按 milestone 过滤
|
|
407
409
|
3. **quality_mode 过滤**:按 `session.quality_mode` 排除不匹配 stage
|
|
410
|
+
3.5. **grill auto_confirm 跳过**:`auto_confirm == true` 时删除 `grill` stage(grill 为交互式苏格拉底拷问,不支持自动模式);brainstorm args 不含 `--from grill:*`
|
|
408
411
|
4. **决策节点**:每个 Decision after 非空的 stage 之后插入 `{ decision: "<gate>", retry_count: 0, max_retries: 2, command_scope: null, command_path: null }`
|
|
409
412
|
5. **goal-audit 插入**:`task_decomposition` 存在时,在最后一个 evidence-producing stage(verify/review/test)之后、`milestone-complete` 之前插入 `decision:post-goal-audit`
|
|
410
413
|
6. **终点硬约束**:chain 以 `milestone-complete` 结尾
|
|
@@ -742,7 +745,8 @@ decision:post-goal-audit {retry+1}
|
|
|
742
745
|
- [ ] Phase 先于 position 解析;phase_is_new 标记写入 session
|
|
743
746
|
- [ ] D-007 反查:phase 数字 → `session.milestone`,禁止读 current_milestone;写入 step.milestone_id
|
|
744
747
|
- [ ] phase_is_new=true → lifecycle_position 强制 `analyze`
|
|
745
|
-
- [ ] Intent overrides 识别 brainstorm / blueprint / analyze-macro
|
|
748
|
+
- [ ] Intent overrides 识别 grill / brainstorm / blueprint / analyze-macro
|
|
749
|
+
- [ ] auto_confirm=true 时 grill stage 跳过(交互式拷问不支持自动模式)
|
|
746
750
|
- [ ] A_RESOLVE_SCOPE_VERDICT 读 macro analyze conclusions.scope_verdict,写入 session.scope_verdict + analyze_macro_id
|
|
747
751
|
- [ ] 链路起点 = analyze-macro 时:large→roadmap+analyze+plan(phase);medium/small→直跳 plan --from analyze:{ANL_ID}(跳过 roadmap+analyze)
|
|
748
752
|
- [ ] post-analyze-scope decision 节点在 macro analyze 之后插入;A_SCOPE_EVALUATE/A_APPLY_SCOPE_VERDICT 重塑链路
|
|
@@ -153,6 +153,9 @@ Single wave generates `wave-1.csv`. No `prev_context` needed (all tasks independ
|
|
|
153
153
|
| `tech-registry/{slug}.md` | Per-component documentation |
|
|
154
154
|
| `feature-maps/_index.md` | Feature index table |
|
|
155
155
|
| `feature-maps/{slug}.md` | Per-feature documentation |
|
|
156
|
+
| `knowledge-graph.json` | UA Knowledge Graph: nodes, edges, layers, tour (if UA vendor installed) |
|
|
157
|
+
|
|
158
|
+
**Wiki Integration**: After rebuild, KG nodes are automatically indexed as virtual wiki entries (type: knowhow, virtualKind: ua-kg-node/ua-kg-layer/ua-kg-tour-step) on next `maestro wiki` access. Verify with `maestro wiki list --keyword kg`. Use `maestro kg diff-wiki` for future change impact analysis.
|
|
156
159
|
|
|
157
160
|
### Session Structure
|
|
158
161
|
|
|
@@ -350,6 +353,9 @@ Generators: {completed}/{total} succeeded
|
|
|
350
353
|
Next steps:
|
|
351
354
|
Skill({ skill: "manage-status" })
|
|
352
355
|
Skill({ skill: "manage-codebase-refresh" })
|
|
356
|
+
maestro kg stats # verify KG
|
|
357
|
+
maestro wiki list --keyword kg # verify wiki integration
|
|
358
|
+
maestro kg diff-wiki # future change impact
|
|
353
359
|
```
|
|
354
360
|
|
|
355
361
|
### Shared Discovery Board Protocol
|
|
@@ -38,6 +38,10 @@ Resolve baseline: `--since` flag > `state.json.codebase_last_refreshed` > `codeb
|
|
|
38
38
|
|
|
39
39
|
Read `.workflow/codebase/doc-index.json` to find doc entries covering changed files. Build affected entry list.
|
|
40
40
|
|
|
41
|
+
### Step 3.5: KG Impact Analysis (if KG exists)
|
|
42
|
+
|
|
43
|
+
If `.workflow/codebase/knowledge-graph.json` exists: run `maestro kg diff-wiki --json`. Parse output for `affectedWiki` entries. If any, log WARNING for each: "KG impact: code changes affect [entry.id] — [entry.title]". Log summary: "{directNodes} direct, {impactedNodes} impacted KG nodes, {affectedWiki.length} wiki entries flagged". If KG does not exist: skip silently.
|
|
44
|
+
|
|
41
45
|
### Step 4: Refresh Affected Docs
|
|
42
46
|
|
|
43
47
|
For each affected entry: re-read changed source files, update corresponding doc in `.workflow/codebase/`, update timestamp in `doc-index.json`. With `--deep`: also re-scan adjacent files.
|
|
@@ -59,6 +63,8 @@ Update `doc-index.json` timestamps and `state.json.codebase_last_refreshed`. Dis
|
|
|
59
63
|
- [ ] Preconditions validated (.workflow/ and .workflow/codebase/ exist)
|
|
60
64
|
- [ ] Change detection baseline resolved (--since flag, state.json, or 7-day fallback)
|
|
61
65
|
- [ ] Git changes detected and mapped to doc entries via doc-index.json
|
|
66
|
+
- [ ] KG impact analysis run (if knowledge-graph.json exists)
|
|
67
|
+
- [ ] Affected wiki entries flagged with warnings (if any)
|
|
62
68
|
- [ ] Affected docs refreshed with updated source content
|
|
63
69
|
- [ ] --deep flag triggers adjacent file re-scan
|
|
64
70
|
- [ ] doc-index.json timestamps and state.json codebase_last_refreshed updated
|
|
@@ -44,5 +44,41 @@ export declare function detectDeadEnds(graph: WikiGraph): BrokenLink[];
|
|
|
44
44
|
/**
|
|
45
45
|
* Heuristic health score: 100 minus weighted counts of broken links,
|
|
46
46
|
* orphaned entries, and entries missing titles. Floored at 0.
|
|
47
|
+
*
|
|
48
|
+
* KG virtual entries are excluded from broken-link scoring so that
|
|
49
|
+
* unresolved KG-internal references don't distort the wiki health metric.
|
|
47
50
|
*/
|
|
48
51
|
export declare function computeHealth(index: WikiIndex, graph: WikiGraph): WikiHealth;
|
|
52
|
+
export interface SemanticEdge {
|
|
53
|
+
source: string;
|
|
54
|
+
target: string;
|
|
55
|
+
edgeType: string;
|
|
56
|
+
weight: number;
|
|
57
|
+
}
|
|
58
|
+
export interface SemanticGraph {
|
|
59
|
+
adjacency: Map<string, SemanticEdge[]>;
|
|
60
|
+
nodeCount: number;
|
|
61
|
+
edgeCount: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Build a weighted adjacency list from KG entries' ext.kgEdges. Also
|
|
65
|
+
* includes standard wiki forward links at a default weight so the
|
|
66
|
+
* semantic graph covers both KG and markdown entries.
|
|
67
|
+
*/
|
|
68
|
+
export declare function buildSemanticGraph(index: WikiIndex, graph: WikiGraph): SemanticGraph;
|
|
69
|
+
export interface SemanticPathResult {
|
|
70
|
+
from: string;
|
|
71
|
+
to: string;
|
|
72
|
+
found: boolean;
|
|
73
|
+
totalWeight: number;
|
|
74
|
+
steps: Array<{
|
|
75
|
+
node: string;
|
|
76
|
+
edgeType: string;
|
|
77
|
+
weight: number;
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Dijkstra shortest path on the semantic graph (lower total weight = stronger
|
|
82
|
+
* relationship chain). Treats edges as undirected for reachability.
|
|
83
|
+
*/
|
|
84
|
+
export declare function semanticPath(sg: SemanticGraph, fromId: string, toId: string): SemanticPathResult;
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
// ── Edge-type distance penalties for semantic traversal ─────────────────
|
|
2
|
+
// Lower = closer relationship. Used by semanticPath() for weighted
|
|
3
|
+
// shortest-path search across KG-enriched wiki entries.
|
|
4
|
+
const EDGE_TYPE_WEIGHT = {
|
|
5
|
+
implements: 0.2,
|
|
6
|
+
extends: 0.2,
|
|
7
|
+
calls: 0.3,
|
|
8
|
+
imports: 0.4,
|
|
9
|
+
depends_on: 0.4,
|
|
10
|
+
exports: 0.5,
|
|
11
|
+
contains: 0.3,
|
|
12
|
+
uses: 0.5,
|
|
13
|
+
references: 0.7,
|
|
14
|
+
mentions: 1.0,
|
|
15
|
+
related_to: 0.8,
|
|
16
|
+
tests: 0.4,
|
|
17
|
+
configures: 0.6,
|
|
18
|
+
};
|
|
1
19
|
const LINK_RE = /\[\[([^\]]+)\]\]/g;
|
|
2
20
|
/**
|
|
3
21
|
* Compute forward links + broken links from the current index. Backlinks are
|
|
@@ -83,21 +101,34 @@ export function detectHubs(graph, topN = 10) {
|
|
|
83
101
|
export function detectDeadEnds(graph) {
|
|
84
102
|
return graph.brokenLinks.slice();
|
|
85
103
|
}
|
|
104
|
+
function isKgEntry(entry) {
|
|
105
|
+
const vk = entry.ext?.virtualKind;
|
|
106
|
+
return vk === 'ua-kg-node' || vk === 'ua-kg-layer' || vk === 'ua-kg-tour-step';
|
|
107
|
+
}
|
|
86
108
|
/**
|
|
87
109
|
* Heuristic health score: 100 minus weighted counts of broken links,
|
|
88
110
|
* orphaned entries, and entries missing titles. Floored at 0.
|
|
111
|
+
*
|
|
112
|
+
* KG virtual entries are excluded from broken-link scoring so that
|
|
113
|
+
* unresolved KG-internal references don't distort the wiki health metric.
|
|
89
114
|
*/
|
|
90
115
|
export function computeHealth(index, graph) {
|
|
91
116
|
const orphans = detectOrphans(graph, index.entries);
|
|
92
117
|
const hubs = detectHubs(graph, 10);
|
|
93
118
|
const missingTitles = index.entries.filter((d) => d.source.kind === 'file' && (!d.title || d.title === d.id.split('-').slice(1).join('-'))).length;
|
|
94
|
-
|
|
119
|
+
// Exclude broken links originating from KG virtual entries — their
|
|
120
|
+
// internal cross-references are expected to be unresolvable as wiki IDs.
|
|
121
|
+
const brokenLinks = graph.brokenLinks.filter(b => {
|
|
122
|
+
const src = index.byId[b.sourceId];
|
|
123
|
+
return !src || !isKgEntry(src);
|
|
124
|
+
});
|
|
125
|
+
const fileEntryCount = index.entries.filter(d => d.source.kind === 'file').length;
|
|
95
126
|
const rawScore = 100 - 2 * brokenLinks.length - 1 * orphans.length - 3 * missingTitles;
|
|
96
127
|
const score = Math.max(0, Math.min(100, rawScore));
|
|
97
128
|
return {
|
|
98
129
|
score,
|
|
99
130
|
totals: {
|
|
100
|
-
entries:
|
|
131
|
+
entries: fileEntryCount,
|
|
101
132
|
brokenLinks: brokenLinks.length,
|
|
102
133
|
orphans: orphans.length,
|
|
103
134
|
missingTitles,
|
|
@@ -108,4 +139,109 @@ export function computeHealth(index, graph) {
|
|
|
108
139
|
lastUpdated: index.generatedAt,
|
|
109
140
|
};
|
|
110
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Build a weighted adjacency list from KG entries' ext.kgEdges. Also
|
|
144
|
+
* includes standard wiki forward links at a default weight so the
|
|
145
|
+
* semantic graph covers both KG and markdown entries.
|
|
146
|
+
*/
|
|
147
|
+
export function buildSemanticGraph(index, graph) {
|
|
148
|
+
const adj = new Map();
|
|
149
|
+
let edgeCount = 0;
|
|
150
|
+
const push = (e) => {
|
|
151
|
+
let list = adj.get(e.source);
|
|
152
|
+
if (!list) {
|
|
153
|
+
list = [];
|
|
154
|
+
adj.set(e.source, list);
|
|
155
|
+
}
|
|
156
|
+
list.push(e);
|
|
157
|
+
edgeCount++;
|
|
158
|
+
};
|
|
159
|
+
for (const entry of index.entries) {
|
|
160
|
+
// KG edges with typed weights
|
|
161
|
+
if (Array.isArray(entry.ext?.kgEdges)) {
|
|
162
|
+
for (const ke of entry.ext.kgEdges) {
|
|
163
|
+
if (!ke.target)
|
|
164
|
+
continue;
|
|
165
|
+
const w = EDGE_TYPE_WEIGHT[ke.type] ?? 0.8;
|
|
166
|
+
push({ source: entry.id, target: ke.target, edgeType: ke.type, weight: w });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Standard forward links at default weight
|
|
170
|
+
const fwd = graph.forwardLinks[entry.id];
|
|
171
|
+
if (fwd) {
|
|
172
|
+
for (const t of fwd) {
|
|
173
|
+
push({ source: entry.id, target: t, edgeType: 'wiki-link', weight: 0.6 });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return { adjacency: adj, nodeCount: index.entries.length, edgeCount };
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Dijkstra shortest path on the semantic graph (lower total weight = stronger
|
|
181
|
+
* relationship chain). Treats edges as undirected for reachability.
|
|
182
|
+
*/
|
|
183
|
+
export function semanticPath(sg, fromId, toId) {
|
|
184
|
+
const dist = new Map();
|
|
185
|
+
const prev = new Map();
|
|
186
|
+
dist.set(fromId, 0);
|
|
187
|
+
// Build undirected adjacency
|
|
188
|
+
const undirected = new Map();
|
|
189
|
+
for (const [src, edges] of sg.adjacency) {
|
|
190
|
+
for (const e of edges) {
|
|
191
|
+
let fwd = undirected.get(src);
|
|
192
|
+
if (!fwd) {
|
|
193
|
+
fwd = [];
|
|
194
|
+
undirected.set(src, fwd);
|
|
195
|
+
}
|
|
196
|
+
fwd.push(e);
|
|
197
|
+
let rev = undirected.get(e.target);
|
|
198
|
+
if (!rev) {
|
|
199
|
+
rev = [];
|
|
200
|
+
undirected.set(e.target, rev);
|
|
201
|
+
}
|
|
202
|
+
rev.push({ source: e.target, target: src, edgeType: e.edgeType, weight: e.weight });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Simple priority queue (adequate for wiki-scale graphs)
|
|
206
|
+
const queue = [{ node: fromId, cost: 0 }];
|
|
207
|
+
const visited = new Set();
|
|
208
|
+
while (queue.length > 0) {
|
|
209
|
+
queue.sort((a, b) => a.cost - b.cost);
|
|
210
|
+
const { node, cost } = queue.shift();
|
|
211
|
+
if (visited.has(node))
|
|
212
|
+
continue;
|
|
213
|
+
visited.add(node);
|
|
214
|
+
if (node === toId)
|
|
215
|
+
break;
|
|
216
|
+
for (const e of undirected.get(node) ?? []) {
|
|
217
|
+
const alt = cost + e.weight;
|
|
218
|
+
if (alt < (dist.get(e.target) ?? Infinity)) {
|
|
219
|
+
dist.set(e.target, alt);
|
|
220
|
+
prev.set(e.target, { node, edgeType: e.edgeType, weight: e.weight });
|
|
221
|
+
queue.push({ node: e.target, cost: alt });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (!dist.has(toId)) {
|
|
226
|
+
return { from: fromId, to: toId, found: false, totalWeight: 0, steps: [] };
|
|
227
|
+
}
|
|
228
|
+
// Reconstruct path
|
|
229
|
+
const steps = [];
|
|
230
|
+
let cur = toId;
|
|
231
|
+
while (cur !== fromId) {
|
|
232
|
+
const p = prev.get(cur);
|
|
233
|
+
if (!p)
|
|
234
|
+
break;
|
|
235
|
+
steps.unshift({ node: cur, edgeType: p.edgeType, weight: p.weight });
|
|
236
|
+
cur = p.node;
|
|
237
|
+
}
|
|
238
|
+
steps.unshift({ node: fromId, edgeType: '', weight: 0 });
|
|
239
|
+
return {
|
|
240
|
+
from: fromId,
|
|
241
|
+
to: toId,
|
|
242
|
+
found: true,
|
|
243
|
+
totalWeight: dist.get(toId),
|
|
244
|
+
steps,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
111
247
|
//# sourceMappingURL=graph-analysis.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-analysis.js","sourceRoot":"","sources":["../../../../../src/server/wiki/graph-analysis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph-analysis.js","sourceRoot":"","sources":["../../../../../src/server/wiki/graph-analysis.ts"],"names":[],"mappings":"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"}
|