ralph-hero-mcp-server 2.5.16 → 2.5.18

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.
@@ -47,6 +47,7 @@ export const RepoDefaultsSchema = z.object({
47
47
  * Example YAML:
48
48
  * mcp-server:
49
49
  * owner: cdubiel08
50
+ * localDir: ~/projects/mcp-server
50
51
  * domain: platform
51
52
  * tech: [typescript, node]
52
53
  * defaults:
@@ -58,6 +59,10 @@ export const RepoEntrySchema = z.object({
58
59
  .string()
59
60
  .optional()
60
61
  .describe("GitHub owner (user or org); falls back to RALPH_GH_OWNER if omitted"),
62
+ localDir: z
63
+ .string()
64
+ .optional()
65
+ .describe("On-disk checkout location (e.g., '~/projects/ralph-hero'); used by agents for cross-repo Read/Grep/Glob"),
61
66
  domain: z
62
67
  .string()
63
68
  .describe("Functional domain this repo belongs to (e.g., 'platform', 'frontend')"),
@@ -11,6 +11,7 @@ const SEMANTIC_INTENTS = {
11
11
  __LOCK__: {
12
12
  ralph_research: "Research in Progress",
13
13
  ralph_plan: "Plan in Progress",
14
+ ralph_plan_epic: "Plan in Progress",
14
15
  ralph_impl: "In Progress",
15
16
  },
16
17
  __COMPLETE__: {
@@ -18,6 +19,7 @@ const SEMANTIC_INTENTS = {
18
19
  ralph_split: "Backlog",
19
20
  ralph_research: "Ready for Plan",
20
21
  ralph_plan: "Plan in Review",
22
+ ralph_plan_epic: "In Progress",
21
23
  ralph_impl: "In Review",
22
24
  ralph_review: "In Progress",
23
25
  ralph_merge: "Done",
@@ -35,9 +37,10 @@ const COMMAND_ALLOWED_STATES = {
35
37
  "Canceled",
36
38
  "Human Needed",
37
39
  ],
38
- ralph_split: ["Backlog"],
40
+ ralph_split: ["Backlog", "In Progress", "Ready for Plan"],
39
41
  ralph_research: ["Research in Progress", "Ready for Plan", "Human Needed"],
40
- ralph_plan: ["Plan in Progress", "Plan in Review", "Human Needed"],
42
+ ralph_plan: ["Plan in Progress", "Plan in Review", "In Progress", "Human Needed"],
43
+ ralph_plan_epic: ["Plan in Progress", "In Progress", "Human Needed"],
41
44
  ralph_impl: ["In Progress", "In Review", "Human Needed"],
42
45
  ralph_review: ["In Progress", "Ready for Plan", "Human Needed"],
43
46
  ralph_hero: ["In Review", "Human Needed"],
@@ -57,7 +57,8 @@ export function detectWorkStreams(issues) {
57
57
  const issueKey = `issue:${issue.number}`;
58
58
  // File-overlap edges: union issue with each of its files
59
59
  for (const file of issue.files) {
60
- uf.union(`file:${file}`, issueKey);
60
+ const fileKey = issue.repo ? `file:${issue.repo}:${file}` : `file:${file}`;
61
+ uf.union(fileKey, issueKey);
61
62
  }
62
63
  // Dependency edges: union with blockedBy issues (only if in input set)
63
64
  for (const dep of issue.blockedBy) {
@@ -75,10 +76,10 @@ export function detectWorkStreams(issues) {
75
76
  }
76
77
  components.get(root).push(issue.number);
77
78
  }
78
- // Build file ownership lookup: issue number -> files
79
- const issueFiles = new Map();
79
+ // Build qualified file keys for shared-files reporting
80
+ const qualifiedFiles = new Map();
80
81
  for (const issue of issues) {
81
- issueFiles.set(issue.number, issue.files);
82
+ qualifiedFiles.set(issue.number, issue.files.map((f) => (issue.repo ? `${issue.repo}:${f}` : f)));
82
83
  }
83
84
  // Build blockedBy lookup for rationale
84
85
  const issueBlockedBy = new Map();
@@ -90,7 +91,7 @@ export function detectWorkStreams(issues) {
90
91
  for (const issueNumbers of components.values()) {
91
92
  const sorted = [...issueNumbers].sort((a, b) => a - b);
92
93
  const id = `stream-${sorted.join("-")}`;
93
- const sharedFiles = computeSharedFiles(sorted, issueFiles);
94
+ const sharedFiles = computeSharedFiles(sorted, qualifiedFiles);
94
95
  const primaryIssue = sorted[0];
95
96
  streams.push({ id, issues: sorted, sharedFiles, primaryIssue });
96
97
  }
@@ -104,6 +104,20 @@ export function isValidState(state) {
104
104
  * - In Progress = work actively being processed (lock states + review)
105
105
  * - Done = terminal/escalated states (no automated progression)
106
106
  */
107
+ /**
108
+ * Maps parent plan document type to the entry state for children
109
+ * created by ralph_split from that plan.
110
+ *
111
+ * When a parent issue has a plan-of-plans, its feature children
112
+ * skip to "Ready for Plan" (they need their own detailed plan).
113
+ *
114
+ * When a parent issue has an implementation plan, its atomic children
115
+ * skip to "In Progress" (the plan already covers their implementation).
116
+ */
117
+ export const SKIP_ENTRY_STATES = {
118
+ "plan-of-plans": "Ready for Plan",
119
+ "plan": "In Progress",
120
+ };
107
121
  export const WORKFLOW_STATE_TO_STATUS = {
108
122
  "Backlog": "Todo",
109
123
  "Research Needed": "Todo",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ralph-hero-mcp-server",
3
- "version": "2.5.16",
3
+ "version": "2.5.18",
4
4
  "description": "MCP server for GitHub Projects V2 - Ralph workflow automation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",