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
|
-
|
|
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
|
|
79
|
-
const
|
|
79
|
+
// Build qualified file keys for shared-files reporting
|
|
80
|
+
const qualifiedFiles = new Map();
|
|
80
81
|
for (const issue of issues) {
|
|
81
|
-
|
|
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,
|
|
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",
|