@autonav/core 1.5.0 → 1.7.0
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 +2 -2
- package/dist/adapter/index.d.ts +3 -3
- package/dist/adapter/index.d.ts.map +1 -1
- package/dist/adapter/index.js +3 -3
- package/dist/adapter/index.js.map +1 -1
- package/dist/adapter/navigator-adapter.d.ts +196 -0
- package/dist/adapter/navigator-adapter.d.ts.map +1 -0
- package/dist/adapter/navigator-adapter.js +579 -0
- package/dist/adapter/navigator-adapter.js.map +1 -0
- package/dist/cli/autonav.d.ts +2 -5
- package/dist/cli/autonav.d.ts.map +1 -1
- package/dist/cli/autonav.js +35 -49
- package/dist/cli/autonav.js.map +1 -1
- package/dist/cli/nav-chat.d.ts +2 -1
- package/dist/cli/nav-chat.d.ts.map +1 -1
- package/dist/cli/nav-chat.js +32 -3
- package/dist/cli/nav-chat.js.map +1 -1
- package/dist/cli/nav-init.d.ts +2 -1
- package/dist/cli/nav-init.d.ts.map +1 -1
- package/dist/cli/nav-init.js +12 -4
- package/dist/cli/nav-init.js.map +1 -1
- package/dist/cli/nav-install.d.ts +2 -1
- package/dist/cli/nav-install.d.ts.map +1 -1
- package/dist/cli/nav-install.js +4 -2
- package/dist/cli/nav-install.js.map +1 -1
- package/dist/cli/nav-memento.d.ts +21 -0
- package/dist/cli/nav-memento.d.ts.map +1 -0
- package/dist/cli/nav-memento.js +185 -0
- package/dist/cli/nav-memento.js.map +1 -0
- package/dist/cli/nav-mend.d.ts +2 -1
- package/dist/cli/nav-mend.d.ts.map +1 -1
- package/dist/cli/nav-mend.js +4 -1
- package/dist/cli/nav-mend.js.map +1 -1
- package/dist/cli/nav-migrate.d.ts +2 -1
- package/dist/cli/nav-migrate.d.ts.map +1 -1
- package/dist/cli/nav-migrate.js +2 -6
- package/dist/cli/nav-migrate.js.map +1 -1
- package/dist/cli/nav-query.d.ts +2 -1
- package/dist/cli/nav-query.d.ts.map +1 -1
- package/dist/cli/nav-query.js +12 -6
- package/dist/cli/nav-query.js.map +1 -1
- package/dist/cli/nav-standup.d.ts +18 -0
- package/dist/cli/nav-standup.d.ts.map +1 -0
- package/dist/cli/nav-standup.js +151 -0
- package/dist/cli/nav-standup.js.map +1 -0
- package/dist/cli/nav-uninstall.d.ts +2 -1
- package/dist/cli/nav-uninstall.d.ts.map +1 -1
- package/dist/cli/nav-uninstall.js +4 -2
- package/dist/cli/nav-uninstall.js.map +1 -1
- package/dist/cli/nav-update.d.ts +2 -1
- package/dist/cli/nav-update.d.ts.map +1 -1
- package/dist/cli/nav-update.js +11 -6
- package/dist/cli/nav-update.js.map +1 -1
- package/dist/conversation/App.d.ts +9 -2
- package/dist/conversation/App.d.ts.map +1 -1
- package/dist/conversation/App.js +304 -111
- package/dist/conversation/App.js.map +1 -1
- package/dist/conversation/index.d.ts +5 -0
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js +17 -2
- package/dist/conversation/index.js.map +1 -1
- package/dist/harness/chibi-harness.d.ts +36 -0
- package/dist/harness/chibi-harness.d.ts.map +1 -0
- package/dist/harness/chibi-harness.js +383 -0
- package/dist/harness/chibi-harness.js.map +1 -0
- package/dist/harness/chibi-plugins/get_plugin_config +64 -0
- package/dist/harness/chibi-plugins/query_navigator +114 -0
- package/dist/harness/chibi-plugins/submit_answer +38 -0
- package/dist/harness/chibi-plugins/update_plugin_config +91 -0
- package/dist/harness/claude-code-harness.d.ts +24 -0
- package/dist/harness/claude-code-harness.d.ts.map +1 -0
- package/dist/harness/claude-code-harness.js +242 -0
- package/dist/harness/claude-code-harness.js.map +1 -0
- package/dist/harness/ephemeral-home.d.ts +34 -0
- package/dist/harness/ephemeral-home.d.ts.map +1 -0
- package/dist/harness/ephemeral-home.js +56 -0
- package/dist/harness/ephemeral-home.js.map +1 -0
- package/dist/harness/factory.d.ts +47 -0
- package/dist/harness/factory.d.ts.map +1 -0
- package/dist/harness/factory.js +84 -0
- package/dist/harness/factory.js.map +1 -0
- package/dist/harness/helpers.d.ts +58 -0
- package/dist/harness/helpers.d.ts.map +1 -0
- package/dist/harness/helpers.js +78 -0
- package/dist/harness/helpers.js.map +1 -0
- package/dist/harness/index.d.ts +14 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +13 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/opencode-harness.d.ts +79 -0
- package/dist/harness/opencode-harness.d.ts.map +1 -0
- package/dist/harness/opencode-harness.js +537 -0
- package/dist/harness/opencode-harness.js.map +1 -0
- package/dist/harness/opencode-tools/get_plugin_config.ts +72 -0
- package/dist/harness/opencode-tools/query_navigator.ts +126 -0
- package/dist/harness/opencode-tools/submit_answer.ts +40 -0
- package/dist/harness/opencode-tools/update_plugin_config.ts +105 -0
- package/dist/harness/sandbox.d.ts +59 -0
- package/dist/harness/sandbox.d.ts.map +1 -0
- package/dist/harness/sandbox.js +152 -0
- package/dist/harness/sandbox.js.map +1 -0
- package/dist/harness/tool-server.d.ts +50 -0
- package/dist/harness/tool-server.d.ts.map +1 -0
- package/dist/harness/tool-server.js +27 -0
- package/dist/harness/tool-server.js.map +1 -0
- package/dist/harness/types.d.ts +168 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +12 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/interview/App.d.ts +4 -2
- package/dist/interview/App.d.ts.map +1 -1
- package/dist/interview/App.js +36 -56
- package/dist/interview/App.js.map +1 -1
- package/dist/interview/index.d.ts +3 -0
- package/dist/interview/index.d.ts.map +1 -1
- package/dist/interview/index.js +1 -0
- package/dist/interview/index.js.map +1 -1
- package/dist/interview/prompts.d.ts +3 -1
- package/dist/interview/prompts.d.ts.map +1 -1
- package/dist/interview/prompts.js +5 -1
- package/dist/interview/prompts.js.map +1 -1
- package/dist/interview/ui/ChatBanner.d.ts +17 -0
- package/dist/interview/ui/ChatBanner.d.ts.map +1 -0
- package/dist/interview/ui/ChatBanner.js +30 -0
- package/dist/interview/ui/ChatBanner.js.map +1 -0
- package/dist/interview/ui/ChatInput.d.ts +36 -0
- package/dist/interview/ui/ChatInput.d.ts.map +1 -0
- package/dist/interview/ui/ChatInput.js +304 -0
- package/dist/interview/ui/ChatInput.js.map +1 -0
- package/dist/interview/ui/MarkdownText.d.ts +13 -0
- package/dist/interview/ui/MarkdownText.d.ts.map +1 -0
- package/dist/interview/ui/MarkdownText.js +107 -0
- package/dist/interview/ui/MarkdownText.js.map +1 -0
- package/dist/interview/ui/index.d.ts +3 -0
- package/dist/interview/ui/index.d.ts.map +1 -1
- package/dist/interview/ui/index.js +3 -0
- package/dist/interview/ui/index.js.map +1 -1
- package/dist/memento/git-operations.d.ts +95 -0
- package/dist/memento/git-operations.d.ts.map +1 -0
- package/dist/memento/git-operations.js +256 -0
- package/dist/memento/git-operations.js.map +1 -0
- package/dist/memento/implementer-agent.d.ts +31 -0
- package/dist/memento/implementer-agent.d.ts.map +1 -0
- package/dist/memento/implementer-agent.js +95 -0
- package/dist/memento/implementer-agent.js.map +1 -0
- package/dist/memento/index.d.ts +32 -0
- package/dist/memento/index.d.ts.map +1 -0
- package/dist/memento/index.js +40 -0
- package/dist/memento/index.js.map +1 -0
- package/dist/memento/loop.d.ts +34 -0
- package/dist/memento/loop.d.ts.map +1 -0
- package/dist/memento/loop.js +1227 -0
- package/dist/memento/loop.js.map +1 -0
- package/dist/memento/matrix-animation.d.ts +103 -0
- package/dist/memento/matrix-animation.d.ts.map +1 -0
- package/dist/memento/matrix-animation.js +303 -0
- package/dist/memento/matrix-animation.js.map +1 -0
- package/dist/memento/nav-protocol.d.ts +30 -0
- package/dist/memento/nav-protocol.d.ts.map +1 -0
- package/dist/memento/nav-protocol.js +75 -0
- package/dist/memento/nav-protocol.js.map +1 -0
- package/dist/memento/prompts.d.ts +57 -0
- package/dist/memento/prompts.d.ts.map +1 -0
- package/dist/memento/prompts.js +208 -0
- package/dist/memento/prompts.js.map +1 -0
- package/dist/memento/rate-limit.d.ts +85 -0
- package/dist/memento/rate-limit.d.ts.map +1 -0
- package/dist/memento/rate-limit.js +221 -0
- package/dist/memento/rate-limit.js.map +1 -0
- package/dist/memento/types.d.ts +123 -0
- package/dist/memento/types.d.ts.map +1 -0
- package/dist/memento/types.js +30 -0
- package/dist/memento/types.js.map +1 -0
- package/dist/memento/worker-agent.d.ts +33 -0
- package/dist/memento/worker-agent.d.ts.map +1 -0
- package/dist/memento/worker-agent.js +93 -0
- package/dist/memento/worker-agent.js.map +1 -0
- package/dist/registry.d.ts +35 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +87 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-analyzer/index.d.ts +2 -1
- package/dist/repo-analyzer/index.d.ts.map +1 -1
- package/dist/repo-analyzer/index.js +6 -17
- package/dist/repo-analyzer/index.js.map +1 -1
- package/dist/standup/config.d.ts +19 -0
- package/dist/standup/config.d.ts.map +1 -0
- package/dist/standup/config.js +42 -0
- package/dist/standup/config.js.map +1 -0
- package/dist/standup/index.d.ts +24 -0
- package/dist/standup/index.d.ts.map +1 -0
- package/dist/standup/index.js +29 -0
- package/dist/standup/index.js.map +1 -0
- package/dist/standup/loop.d.ts +36 -0
- package/dist/standup/loop.d.ts.map +1 -0
- package/dist/standup/loop.js +508 -0
- package/dist/standup/loop.js.map +1 -0
- package/dist/standup/prompts.d.ts +62 -0
- package/dist/standup/prompts.d.ts.map +1 -0
- package/dist/standup/prompts.js +211 -0
- package/dist/standup/prompts.js.map +1 -0
- package/dist/standup/standup-protocol.d.ts +33 -0
- package/dist/standup/standup-protocol.d.ts.map +1 -0
- package/dist/standup/standup-protocol.js +189 -0
- package/dist/standup/standup-protocol.js.map +1 -0
- package/dist/standup/types.d.ts +185 -0
- package/dist/standup/types.d.ts.map +1 -0
- package/dist/standup/types.js +67 -0
- package/dist/standup/types.js.map +1 -0
- package/dist/tools/cross-nav.d.ts +21 -0
- package/dist/tools/cross-nav.d.ts.map +1 -0
- package/dist/tools/cross-nav.js +93 -0
- package/dist/tools/cross-nav.js.map +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/related-navs-config.d.ts +15 -0
- package/dist/tools/related-navs-config.d.ts.map +1 -0
- package/dist/tools/related-navs-config.js +132 -0
- package/dist/tools/related-navs-config.js.map +1 -0
- package/dist/tools/related-navs.d.ts +23 -0
- package/dist/tools/related-navs.d.ts.map +1 -0
- package/dist/tools/related-navs.js +107 -0
- package/dist/tools/related-navs.js.map +1 -0
- package/dist/tools/response.d.ts +3 -2
- package/dist/tools/response.d.ts.map +1 -1
- package/dist/tools/response.js +7 -11
- package/dist/tools/response.js.map +1 -1
- package/dist/tools/self-config.d.ts +2 -1
- package/dist/tools/self-config.d.ts.map +1 -1
- package/dist/tools/self-config.js +5 -9
- package/dist/tools/self-config.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompts for Standup Mode
|
|
3
|
+
*
|
|
4
|
+
* System prompts and user prompts for the report and sync phases.
|
|
5
|
+
* Uses shared Agent Identity Protocol from communication-layer.
|
|
6
|
+
*
|
|
7
|
+
* Prompt engineering principles applied:
|
|
8
|
+
* - XML tags separate data from instructions (Anthropic best practice)
|
|
9
|
+
* - System prompts define role/constraints; user prompts define task/data (no duplication)
|
|
10
|
+
* - Guided chain-of-thought before tool submission
|
|
11
|
+
* - Explicit context: what output is used for, who reads it, where it fits in workflow
|
|
12
|
+
* - Minimize noise: no redundant instructions between system and user prompts
|
|
13
|
+
*/
|
|
14
|
+
import { buildAgentIdentityProtocol, } from "@autonav/communication-layer";
|
|
15
|
+
/**
|
|
16
|
+
* Build the system prompt for a navigator in the report phase.
|
|
17
|
+
*
|
|
18
|
+
* Role definition + behavioral constraints only.
|
|
19
|
+
* Task-specific instructions live in the user prompt to avoid duplication.
|
|
20
|
+
*/
|
|
21
|
+
export function buildReportSystemPrompt(navSystemPrompt) {
|
|
22
|
+
return `${navSystemPrompt}
|
|
23
|
+
|
|
24
|
+
<standup_role>
|
|
25
|
+
You are participating in Phase 1 (Report) of a multi-navigator standup. Your output will be read by other navigators in Phase 2 (Sync) to identify cross-navigator dependencies and resolve blockers.
|
|
26
|
+
|
|
27
|
+
Your sole deliverable is a structured status report submitted via the \`submit_status_report\` tool. Do not produce any other output.
|
|
28
|
+
|
|
29
|
+
<constraints>
|
|
30
|
+
- You have READ-ONLY access. Do not attempt to write, edit, or create files.
|
|
31
|
+
- Base every claim on evidence from your knowledge base or working directories. If you have no evidence of recent progress, say so rather than fabricating items.
|
|
32
|
+
- A blocker is something that prevents YOU from making progress. Do not report general risks or hypotheticals as blockers.
|
|
33
|
+
- For each blocker, if you know which specific navigator could help, set \`needsFrom\` to their exact name. Otherwise set it to "any".
|
|
34
|
+
- \`severity\` meanings: "critical" = completely blocked, cannot proceed; "moderate" = slowed but can work around; "minor" = inconvenience, low priority.
|
|
35
|
+
- \`canHelpWith\` should describe concrete capabilities, not vague offers. Bad: "general advice". Good: "Kubernetes ingress configuration for multi-tenant setups".
|
|
36
|
+
</constraints>
|
|
37
|
+
</standup_role>`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build the user prompt for the report phase.
|
|
41
|
+
*
|
|
42
|
+
* Provides task context, data via XML tags, and guided chain-of-thought.
|
|
43
|
+
*/
|
|
44
|
+
export function buildReportPrompt(context, identity) {
|
|
45
|
+
const identityProtocol = buildAgentIdentityProtocol(identity, {
|
|
46
|
+
name: "Autonav Standup",
|
|
47
|
+
request: "Provide your status report for this multi-navigator standup using the `submit_status_report` tool.",
|
|
48
|
+
});
|
|
49
|
+
const otherNavsList = context.otherNavigators.length > 0
|
|
50
|
+
? context.otherNavigators.map((n) => ` - ${n}`).join("\n")
|
|
51
|
+
: " (none)";
|
|
52
|
+
return `${identityProtocol}
|
|
53
|
+
<task_context>
|
|
54
|
+
This is a multi-navigator standup. After all navigators submit their reports in parallel, each navigator will review ALL reports and attempt to resolve each other's blockers. Your report directly determines whether other navigators can help you, so specificity matters.
|
|
55
|
+
</task_context>
|
|
56
|
+
|
|
57
|
+
<your_environment>
|
|
58
|
+
<directory>${context.navDirectory}</directory>
|
|
59
|
+
<knowledge_base>${context.knowledgeBasePath}</knowledge_base>
|
|
60
|
+
<other_navigators>
|
|
61
|
+
${otherNavsList}
|
|
62
|
+
</other_navigators>
|
|
63
|
+
</your_environment>
|
|
64
|
+
|
|
65
|
+
<instructions>
|
|
66
|
+
Think step-by-step before submitting your report:
|
|
67
|
+
|
|
68
|
+
1. Read your CLAUDE.md file to understand your current role, domain, and responsibilities.
|
|
69
|
+
2. Scan your knowledge base directory to identify recent work, changes, or documented progress.
|
|
70
|
+
3. If you have working directories configured, scan those for additional context about your current state.
|
|
71
|
+
4. Think through the following in order:
|
|
72
|
+
a. What is your primary focus area right now? Be specific — name the feature, system, or problem.
|
|
73
|
+
b. What concrete progress have you made? List only things you can point to evidence for.
|
|
74
|
+
c. What is actually blocking you? Only report real blockers, not hypothetical risks. For each one, assess severity and whether a specific other navigator could help.
|
|
75
|
+
d. Given the other navigators in this standup, what concrete expertise or knowledge could you offer them?
|
|
76
|
+
e. Are there areas where you lack knowledge that another navigator might cover?
|
|
77
|
+
5. Submit your report using the \`submit_status_report\` tool with your findings.
|
|
78
|
+
</instructions>`;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Build the system prompt for a navigator in the sync phase.
|
|
82
|
+
*
|
|
83
|
+
* Role definition + behavioral constraints only.
|
|
84
|
+
*/
|
|
85
|
+
export function buildSyncSystemPrompt(navSystemPrompt) {
|
|
86
|
+
return `${navSystemPrompt}
|
|
87
|
+
|
|
88
|
+
<standup_role>
|
|
89
|
+
You are participating in Phase 2 (Sync) of a multi-navigator standup. You have received status reports from all navigators and must help resolve their blockers using your domain expertise.
|
|
90
|
+
|
|
91
|
+
Your sole deliverable is a structured sync response submitted via the \`submit_sync_response\` tool.
|
|
92
|
+
|
|
93
|
+
<constraints>
|
|
94
|
+
- You MAY read and modify files in your own directory.
|
|
95
|
+
- You MAY write shared artifacts (docs, configs, scripts) to the standup directory.
|
|
96
|
+
- You MUST NOT modify files in other navigators' directories.
|
|
97
|
+
- Prioritize blockers by severity: resolve "critical" blockers first, then "moderate", then "minor".
|
|
98
|
+
- For each resolution, honestly assess your confidence: "high" = you are certain this resolves the blocker; "medium" = likely helpful but the navigator should verify; "low" = best-effort suggestion, may not fully resolve it.
|
|
99
|
+
- If you create an artifact file to help resolve a blocker, write it to the standup directory and reference its path in \`artifactPath\`.
|
|
100
|
+
- Set \`followUpNeeded\` to true only if there are unresolved critical blockers or if your resolution requires the other navigator to take action and confirm.
|
|
101
|
+
</constraints>
|
|
102
|
+
</standup_role>`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Build the user prompt for the sync phase.
|
|
106
|
+
*
|
|
107
|
+
* Data sections use XML tags for clean separation.
|
|
108
|
+
* Includes guided chain-of-thought for blocker prioritization.
|
|
109
|
+
*/
|
|
110
|
+
export function buildSyncPrompt(context, identity) {
|
|
111
|
+
const identityProtocol = buildAgentIdentityProtocol(identity, {
|
|
112
|
+
name: "Autonav Standup",
|
|
113
|
+
request: "Review all status reports and help resolve blockers using the `submit_sync_response` tool.",
|
|
114
|
+
});
|
|
115
|
+
const reportsXml = context.allReports
|
|
116
|
+
.map((r) => formatReportAsXml(r))
|
|
117
|
+
.join("\n\n");
|
|
118
|
+
const previousSyncXml = context.previousSyncResponses.length > 0
|
|
119
|
+
? `<previous_sync_responses>
|
|
120
|
+
${context.previousSyncResponses.map((s) => formatSyncAsXml(s)).join("\n\n")}
|
|
121
|
+
</previous_sync_responses>`
|
|
122
|
+
: "";
|
|
123
|
+
return `${identityProtocol}
|
|
124
|
+
<task_context>
|
|
125
|
+
This is the sync phase of a multi-navigator standup. Each navigator takes a turn reviewing all status reports and attempting to resolve blockers from their domain expertise. You are seeing all reports plus any sync responses from navigators who went before you. Your goal is to unblock other navigators wherever your knowledge applies.
|
|
126
|
+
</task_context>
|
|
127
|
+
|
|
128
|
+
<your_environment>
|
|
129
|
+
<directory>${context.navDirectory}</directory>
|
|
130
|
+
<standup_output_directory>${context.standupDir}</standup_output_directory>
|
|
131
|
+
</your_environment>
|
|
132
|
+
|
|
133
|
+
<status_reports>
|
|
134
|
+
${reportsXml}
|
|
135
|
+
</status_reports>
|
|
136
|
+
|
|
137
|
+
${previousSyncXml}
|
|
138
|
+
|
|
139
|
+
<instructions>
|
|
140
|
+
Think step-by-step before submitting your sync response:
|
|
141
|
+
|
|
142
|
+
1. Read through every status report above. For each blocker, note:
|
|
143
|
+
- Does \`needsFrom\` match your name ("${identity?.name || "your name"}")? These are your primary responsibility.
|
|
144
|
+
- Is \`needsFrom\` set to "any"? You should attempt these if they fall in your domain.
|
|
145
|
+
- What is the severity? Prioritize critical > moderate > minor.
|
|
146
|
+
|
|
147
|
+
2. For each blocker you can address:
|
|
148
|
+
a. Read relevant files from your knowledge base or working directories to find the answer.
|
|
149
|
+
b. Determine whether you can fully resolve it, partially help, or only offer a lead.
|
|
150
|
+
c. If the resolution would benefit from a written artifact (e.g., a config snippet, a runbook, a script), write it to the standup output directory and note the path.
|
|
151
|
+
d. Assess your confidence honestly.
|
|
152
|
+
|
|
153
|
+
3. Review whether previous sync responses (if any) already addressed some blockers. Do not duplicate work — build on or refine previous resolutions instead.
|
|
154
|
+
|
|
155
|
+
4. Note any new cross-cutting insights you discovered while reviewing all the reports together (e.g., two navigators working on conflicting approaches, shared dependencies, opportunities for collaboration).
|
|
156
|
+
|
|
157
|
+
5. Submit your sync response using the \`submit_sync_response\` tool.
|
|
158
|
+
</instructions>`;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Format a status report as XML for the sync phase context.
|
|
162
|
+
* XML tags provide clean boundaries between data sections.
|
|
163
|
+
*/
|
|
164
|
+
function formatReportAsXml(report) {
|
|
165
|
+
const blockersList = report.blockers.length > 0
|
|
166
|
+
? report.blockers
|
|
167
|
+
.map((b) => ` <blocker severity="${b.severity}"${b.needsFrom ? ` needs_from="${b.needsFrom}"` : ""}>${b.description}</blocker>`)
|
|
168
|
+
.join("\n")
|
|
169
|
+
: " <none/>";
|
|
170
|
+
const canHelpList = report.canHelpWith.length > 0
|
|
171
|
+
? report.canHelpWith.map((h) => ` <capability>${h}</capability>`).join("\n")
|
|
172
|
+
: " <none/>";
|
|
173
|
+
const gapsList = report.knowledgeGaps && report.knowledgeGaps.length > 0
|
|
174
|
+
? `\n <knowledge_gaps>\n${report.knowledgeGaps.map((g) => ` <gap>${g}</gap>`).join("\n")}\n </knowledge_gaps>`
|
|
175
|
+
: "";
|
|
176
|
+
return `<report navigator="${report.navigatorName}">
|
|
177
|
+
<current_focus>${report.currentFocus}</current_focus>
|
|
178
|
+
<recent_progress>
|
|
179
|
+
${report.recentProgress.map((p) => ` <item>${p}</item>`).join("\n")}
|
|
180
|
+
</recent_progress>
|
|
181
|
+
<blockers>
|
|
182
|
+
${blockersList}
|
|
183
|
+
</blockers>
|
|
184
|
+
<can_help_with>
|
|
185
|
+
${canHelpList}
|
|
186
|
+
</can_help_with>${gapsList}
|
|
187
|
+
</report>`;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Format a sync response as XML for accumulating context
|
|
191
|
+
*/
|
|
192
|
+
function formatSyncAsXml(sync) {
|
|
193
|
+
const resolutions = sync.blockerResolutions.length > 0
|
|
194
|
+
? sync.blockerResolutions
|
|
195
|
+
.map((r) => ` <resolution for="${r.navigatorName}" confidence="${r.confidence}"${r.artifactPath ? ` artifact="${r.artifactPath}"` : ""}>
|
|
196
|
+
<blocker>${r.blockerDescription}</blocker>
|
|
197
|
+
<answer>${r.resolution}</answer>
|
|
198
|
+
</resolution>`)
|
|
199
|
+
.join("\n")
|
|
200
|
+
: " <none/>";
|
|
201
|
+
const insights = sync.newInsights && sync.newInsights.length > 0
|
|
202
|
+
? `\n <insights>\n${sync.newInsights.map((i) => ` <insight>${i}</insight>`).join("\n")}\n </insights>`
|
|
203
|
+
: "";
|
|
204
|
+
return `<sync_response navigator="${sync.navigatorName}" follow_up_needed="${sync.followUpNeeded}">
|
|
205
|
+
<summary>${sync.summary}</summary>
|
|
206
|
+
<blocker_resolutions>
|
|
207
|
+
${resolutions}
|
|
208
|
+
</blocker_resolutions>${insights}
|
|
209
|
+
</sync_response>`;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/standup/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standup Protocol MCP Servers
|
|
3
|
+
*
|
|
4
|
+
* MCP server factories providing submit_status_report and submit_sync_response
|
|
5
|
+
* tools for the standup report and sync phases respectively.
|
|
6
|
+
*/
|
|
7
|
+
import { type StatusReport, type SyncResponse } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Tool names
|
|
10
|
+
*/
|
|
11
|
+
export declare const SUBMIT_STATUS_REPORT_TOOL = "submit_status_report";
|
|
12
|
+
export declare const SUBMIT_SYNC_RESPONSE_TOOL = "submit_sync_response";
|
|
13
|
+
/**
|
|
14
|
+
* Create an MCP server with the submit_status_report tool for the report phase.
|
|
15
|
+
*
|
|
16
|
+
* Each navigator gets its own server instance (separate closure).
|
|
17
|
+
*/
|
|
18
|
+
export declare function createReportProtocolTools(): {
|
|
19
|
+
tools: import("../harness/tool-server.js").ToolDefinition[];
|
|
20
|
+
getCapturedReport: () => StatusReport | null;
|
|
21
|
+
resetCapturedReport: () => void;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Create an MCP server with the submit_sync_response tool for the sync phase.
|
|
25
|
+
*
|
|
26
|
+
* Each navigator gets its own server instance (separate closure).
|
|
27
|
+
*/
|
|
28
|
+
export declare function createSyncProtocolTools(): {
|
|
29
|
+
tools: import("../harness/tool-server.js").ToolDefinition[];
|
|
30
|
+
getCapturedSync: () => SyncResponse | null;
|
|
31
|
+
resetCapturedSync: () => void;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=standup-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standup-protocol.d.ts","sourceRoot":"","sources":["../../src/standup/standup-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAChE,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAwBhE;;;;GAIG;AACH,wBAAgB,yBAAyB;;6BAgFd,YAAY,GAAG,IAAI;;EAK7C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB;;2BA0Ed,YAAY,GAAG,IAAI;;EAK3C"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standup Protocol MCP Servers
|
|
3
|
+
*
|
|
4
|
+
* MCP server factories providing submit_status_report and submit_sync_response
|
|
5
|
+
* tools for the standup report and sync phases respectively.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { defineTool } from "../harness/index.js";
|
|
9
|
+
import { StatusReportSchema, SyncResponseSchema, } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Tool names
|
|
12
|
+
*/
|
|
13
|
+
export const SUBMIT_STATUS_REPORT_TOOL = "submit_status_report";
|
|
14
|
+
export const SUBMIT_SYNC_RESPONSE_TOOL = "submit_sync_response";
|
|
15
|
+
const DEBUG = process.env.AUTONAV_DEBUG === "1" || process.env.DEBUG === "1";
|
|
16
|
+
/**
|
|
17
|
+
* Recursively strip null values to undefined so Zod .optional() accepts them.
|
|
18
|
+
*
|
|
19
|
+
* Models produce JSON where optional fields are `null` (JSON has no `undefined`).
|
|
20
|
+
* Zod's `.optional()` expects `T | undefined`, rejecting `null`. This mismatch
|
|
21
|
+
* silently breaks MCP tool handlers.
|
|
22
|
+
*/
|
|
23
|
+
function stripNulls(obj) {
|
|
24
|
+
if (obj === null)
|
|
25
|
+
return undefined;
|
|
26
|
+
if (Array.isArray(obj))
|
|
27
|
+
return obj.map(stripNulls);
|
|
28
|
+
if (typeof obj === "object" && obj !== null) {
|
|
29
|
+
const result = {};
|
|
30
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
31
|
+
result[key] = stripNulls(value);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
return obj;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create an MCP server with the submit_status_report tool for the report phase.
|
|
39
|
+
*
|
|
40
|
+
* Each navigator gets its own server instance (separate closure).
|
|
41
|
+
*/
|
|
42
|
+
export function createReportProtocolTools() {
|
|
43
|
+
let capturedReport = null;
|
|
44
|
+
const tools = [
|
|
45
|
+
defineTool(SUBMIT_STATUS_REPORT_TOOL, `Submit your structured status report. This is the ONLY way to deliver your report — the standup loop captures your output exclusively through this tool. Plain text responses are discarded.
|
|
46
|
+
|
|
47
|
+
Other navigators will read your report in the sync phase to identify blockers they can resolve for you. Be specific: vague blockers cannot be acted on, and vague offers to help will be ignored.`, {
|
|
48
|
+
navigatorName: z.string().describe("Your exact navigator name as it appears in config.json"),
|
|
49
|
+
currentFocus: z.string().min(5).describe("Specific feature, system, or problem you are working on right now"),
|
|
50
|
+
recentProgress: z
|
|
51
|
+
.array(z.string())
|
|
52
|
+
.describe("Concrete accomplishments you have evidence for. Each item should be a single sentence."),
|
|
53
|
+
blockers: z
|
|
54
|
+
.array(z.object({
|
|
55
|
+
description: z.string().describe("Specific description of what is blocked and why. Include enough detail for another navigator to act on it."),
|
|
56
|
+
needsFrom: z
|
|
57
|
+
.string()
|
|
58
|
+
.nullish()
|
|
59
|
+
.describe("Exact name of the navigator who can help, or 'any' if anyone with relevant expertise could help"),
|
|
60
|
+
severity: z
|
|
61
|
+
.enum(["critical", "moderate", "minor"])
|
|
62
|
+
.describe("critical = completely blocked; moderate = slowed, can work around; minor = inconvenience"),
|
|
63
|
+
}))
|
|
64
|
+
.describe("Real blockers preventing progress. Do not include hypothetical risks."),
|
|
65
|
+
canHelpWith: z
|
|
66
|
+
.array(z.string())
|
|
67
|
+
.describe("Concrete capabilities you can offer others. Be specific enough that another navigator can decide whether to ask you."),
|
|
68
|
+
knowledgeGaps: z
|
|
69
|
+
.array(z.string())
|
|
70
|
+
.nullish()
|
|
71
|
+
.describe("Specific areas where you lack knowledge that another navigator might cover"),
|
|
72
|
+
}, async (args) => {
|
|
73
|
+
if (DEBUG) {
|
|
74
|
+
console.error(`[debug] submit_status_report HANDLER ENTERED`);
|
|
75
|
+
console.error(`[debug] Raw args keys:`, Object.keys(args));
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const cleaned = stripNulls(args);
|
|
79
|
+
const report = StatusReportSchema.parse(cleaned);
|
|
80
|
+
capturedReport = report;
|
|
81
|
+
const blockerSummary = report.blockers.length > 0
|
|
82
|
+
? `${report.blockers.length} blocker(s) reported.`
|
|
83
|
+
: "No blockers.";
|
|
84
|
+
return {
|
|
85
|
+
content: [
|
|
86
|
+
{
|
|
87
|
+
type: "text",
|
|
88
|
+
text: JSON.stringify({
|
|
89
|
+
success: true,
|
|
90
|
+
message: `Status report submitted. ${blockerSummary}`,
|
|
91
|
+
report,
|
|
92
|
+
}),
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
isError: false,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (DEBUG) {
|
|
100
|
+
console.error(`[debug] submit_status_report handler error:`, error);
|
|
101
|
+
console.error(`[debug] Raw args:`, JSON.stringify(args, null, 2));
|
|
102
|
+
}
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}),
|
|
106
|
+
];
|
|
107
|
+
return {
|
|
108
|
+
tools,
|
|
109
|
+
getCapturedReport: () => capturedReport,
|
|
110
|
+
resetCapturedReport: () => {
|
|
111
|
+
capturedReport = null;
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create an MCP server with the submit_sync_response tool for the sync phase.
|
|
117
|
+
*
|
|
118
|
+
* Each navigator gets its own server instance (separate closure).
|
|
119
|
+
*/
|
|
120
|
+
export function createSyncProtocolTools() {
|
|
121
|
+
let capturedSync = null;
|
|
122
|
+
const tools = [
|
|
123
|
+
defineTool(SUBMIT_SYNC_RESPONSE_TOOL, `Submit your structured sync response after reviewing all status reports. This is the ONLY way to deliver your response — the standup loop captures your output exclusively through this tool. Plain text responses are discarded.
|
|
124
|
+
|
|
125
|
+
Prioritize resolving blockers where \`needsFrom\` matches your name, then those set to "any" that fall in your domain. Assess confidence honestly per resolution.`, {
|
|
126
|
+
navigatorName: z.string().describe("Your exact navigator name as it appears in config.json"),
|
|
127
|
+
summary: z.string().min(5).describe("One-paragraph summary of what you contributed in this sync round"),
|
|
128
|
+
blockerResolutions: z
|
|
129
|
+
.array(z.object({
|
|
130
|
+
navigatorName: z
|
|
131
|
+
.string()
|
|
132
|
+
.describe("Exact name of the navigator whose blocker you are resolving"),
|
|
133
|
+
blockerDescription: z.string().describe("The blocker description as written in their report, so it can be matched"),
|
|
134
|
+
resolution: z
|
|
135
|
+
.string()
|
|
136
|
+
.describe("Actionable resolution: what the navigator should do, with enough detail to act on immediately"),
|
|
137
|
+
artifactPath: z
|
|
138
|
+
.string()
|
|
139
|
+
.nullish()
|
|
140
|
+
.describe("Absolute path to any artifact you wrote to the standup directory to support this resolution"),
|
|
141
|
+
confidence: z
|
|
142
|
+
.enum(["high", "medium", "low"])
|
|
143
|
+
.describe("high = certain this resolves it; medium = likely helpful, should verify; low = best-effort suggestion"),
|
|
144
|
+
}))
|
|
145
|
+
.describe("One entry per blocker you addressed. Do not duplicate resolutions already provided by previous sync responses."),
|
|
146
|
+
newInsights: z
|
|
147
|
+
.array(z.string())
|
|
148
|
+
.nullish()
|
|
149
|
+
.describe("Cross-cutting insights from reviewing all reports together (e.g., conflicting approaches, shared dependencies, collaboration opportunities)"),
|
|
150
|
+
followUpNeeded: z
|
|
151
|
+
.boolean()
|
|
152
|
+
.describe("true only if unresolved critical blockers remain or your resolution requires confirmation from the other navigator"),
|
|
153
|
+
}, async (args) => {
|
|
154
|
+
try {
|
|
155
|
+
const cleaned = stripNulls(args);
|
|
156
|
+
const sync = SyncResponseSchema.parse(cleaned);
|
|
157
|
+
capturedSync = sync;
|
|
158
|
+
return {
|
|
159
|
+
content: [
|
|
160
|
+
{
|
|
161
|
+
type: "text",
|
|
162
|
+
text: JSON.stringify({
|
|
163
|
+
success: true,
|
|
164
|
+
message: `Sync response submitted with ${sync.blockerResolutions.length} blocker resolution(s).`,
|
|
165
|
+
sync,
|
|
166
|
+
}),
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
isError: false,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
if (DEBUG) {
|
|
174
|
+
console.error(`[debug] submit_sync_response handler error:`, error);
|
|
175
|
+
console.error(`[debug] Raw args:`, JSON.stringify(args, null, 2));
|
|
176
|
+
}
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}),
|
|
180
|
+
];
|
|
181
|
+
return {
|
|
182
|
+
tools,
|
|
183
|
+
getCapturedSync: () => capturedSync,
|
|
184
|
+
resetCapturedSync: () => {
|
|
185
|
+
capturedSync = null;
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=standup-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standup-protocol.js","sourceRoot":"","sources":["../../src/standup/standup-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAEhE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AAE7E;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,GAAY;IAC9B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB;IACvC,IAAI,cAAc,GAAwB,IAAI,CAAC;IAE/C,MAAM,KAAK,GAAG;QACZ,UAAU,CACR,yBAAyB,EACzB;;kMAE4L,EAC5L;YACE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;YAC5F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mEAAmE,CAAC;YAC7G,cAAc,EAAE,CAAC;iBACd,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,CAAC,wFAAwF,CAAC;YACrG,QAAQ,EAAE,CAAC;iBACR,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4GAA4G,CAAC;gBAC9I,SAAS,EAAE,CAAC;qBACT,MAAM,EAAE;qBACR,OAAO,EAAE;qBACT,QAAQ,CACP,iGAAiG,CAClG;gBACH,QAAQ,EAAE,CAAC;qBACR,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;qBACvC,QAAQ,CAAC,0FAA0F,CAAC;aACxG,CAAC,CACH;iBACA,QAAQ,CAAC,uEAAuE,CAAC;YACpF,WAAW,EAAE,CAAC;iBACX,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,CAAC,sHAAsH,CAAC;YACnI,aAAa,EAAE,CAAC;iBACb,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,OAAO,EAAE;iBACT,QAAQ,CAAC,4EAA4E,CAAC;SAC1F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBAC9D,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjD,cAAc,GAAG,MAAM,CAAC;gBAExB,MAAM,cAAc,GAClB,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACxB,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,uBAAuB;oBAClD,CAAC,CAAC,cAAc,CAAC;gBAErB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,OAAO,EAAE,IAAI;gCACb,OAAO,EAAE,4BAA4B,cAAc,EAAE;gCACrD,MAAM;6BACP,CAAC;yBACH;qBACF;oBACD,OAAO,EAAE,KAAK;iBACf,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;oBACpE,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpE,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CACF;KACF,CAAC;IAEF,OAAO;QACL,KAAK;QACL,iBAAiB,EAAE,GAAwB,EAAE,CAAC,cAAc;QAC5D,mBAAmB,EAAE,GAAG,EAAE;YACxB,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACrC,IAAI,YAAY,GAAwB,IAAI,CAAC;IAE7C,MAAM,KAAK,GAAG;QACZ,UAAU,CACR,yBAAyB,EACzB;;kKAE4J,EAC5J;YACE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;YAC5F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kEAAkE,CAAC;YACvG,kBAAkB,EAAE,CAAC;iBAClB,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,aAAa,EAAE,CAAC;qBACb,MAAM,EAAE;qBACR,QAAQ,CAAC,6DAA6D,CAAC;gBAC1E,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;gBACnH,UAAU,EAAE,CAAC;qBACV,MAAM,EAAE;qBACR,QAAQ,CAAC,+FAA+F,CAAC;gBAC5G,YAAY,EAAE,CAAC;qBACZ,MAAM,EAAE;qBACR,OAAO,EAAE;qBACT,QAAQ,CACP,6FAA6F,CAC9F;gBACH,UAAU,EAAE,CAAC;qBACV,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;qBAC/B,QAAQ,CAAC,uGAAuG,CAAC;aACrH,CAAC,CACH;iBACA,QAAQ,CAAC,gHAAgH,CAAC;YAC7H,WAAW,EAAE,CAAC;iBACX,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,OAAO,EAAE;iBACT,QAAQ,CAAC,6IAA6I,CAAC;YAC1J,cAAc,EAAE,CAAC;iBACd,OAAO,EAAE;iBACT,QAAQ,CAAC,oHAAoH,CAAC;SAClI,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC/C,YAAY,GAAG,IAAI,CAAC;gBAEpB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,OAAO,EAAE,IAAI;gCACb,OAAO,EAAE,gCAAgC,IAAI,CAAC,kBAAkB,CAAC,MAAM,yBAAyB;gCAChG,IAAI;6BACL,CAAC;yBACH;qBACF;oBACD,OAAO,EAAE,KAAK;iBACf,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;oBACpE,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpE,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CACF;KACF,CAAC;IAEF,OAAO;QACL,KAAK;QACL,eAAe,EAAE,GAAwB,EAAE,CAAC,YAAY;QACxD,iBAAiB,EAAE,GAAG,EAAE;YACtB,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standup Types
|
|
3
|
+
*
|
|
4
|
+
* Core type definitions for the multi-navigator stand-up mode
|
|
5
|
+
* that orchestrates parallel status reports and sequential blocker sync.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
/**
|
|
9
|
+
* Schema for a blocker reported by a navigator
|
|
10
|
+
*/
|
|
11
|
+
export declare const BlockerSchema: z.ZodObject<{
|
|
12
|
+
description: z.ZodString;
|
|
13
|
+
needsFrom: z.ZodOptional<z.ZodString>;
|
|
14
|
+
severity: z.ZodEnum<["critical", "moderate", "minor"]>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
description: string;
|
|
17
|
+
severity: "critical" | "moderate" | "minor";
|
|
18
|
+
needsFrom?: string | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
description: string;
|
|
21
|
+
severity: "critical" | "moderate" | "minor";
|
|
22
|
+
needsFrom?: string | undefined;
|
|
23
|
+
}>;
|
|
24
|
+
export type Blocker = z.infer<typeof BlockerSchema>;
|
|
25
|
+
/**
|
|
26
|
+
* Schema for a status report submitted by a navigator during the report phase
|
|
27
|
+
*/
|
|
28
|
+
export declare const StatusReportSchema: z.ZodObject<{
|
|
29
|
+
navigatorName: z.ZodString;
|
|
30
|
+
currentFocus: z.ZodString;
|
|
31
|
+
recentProgress: z.ZodArray<z.ZodString, "many">;
|
|
32
|
+
blockers: z.ZodArray<z.ZodObject<{
|
|
33
|
+
description: z.ZodString;
|
|
34
|
+
needsFrom: z.ZodOptional<z.ZodString>;
|
|
35
|
+
severity: z.ZodEnum<["critical", "moderate", "minor"]>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
description: string;
|
|
38
|
+
severity: "critical" | "moderate" | "minor";
|
|
39
|
+
needsFrom?: string | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
description: string;
|
|
42
|
+
severity: "critical" | "moderate" | "minor";
|
|
43
|
+
needsFrom?: string | undefined;
|
|
44
|
+
}>, "many">;
|
|
45
|
+
canHelpWith: z.ZodArray<z.ZodString, "many">;
|
|
46
|
+
knowledgeGaps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
47
|
+
}, "strip", z.ZodTypeAny, {
|
|
48
|
+
navigatorName: string;
|
|
49
|
+
currentFocus: string;
|
|
50
|
+
recentProgress: string[];
|
|
51
|
+
blockers: {
|
|
52
|
+
description: string;
|
|
53
|
+
severity: "critical" | "moderate" | "minor";
|
|
54
|
+
needsFrom?: string | undefined;
|
|
55
|
+
}[];
|
|
56
|
+
canHelpWith: string[];
|
|
57
|
+
knowledgeGaps?: string[] | undefined;
|
|
58
|
+
}, {
|
|
59
|
+
navigatorName: string;
|
|
60
|
+
currentFocus: string;
|
|
61
|
+
recentProgress: string[];
|
|
62
|
+
blockers: {
|
|
63
|
+
description: string;
|
|
64
|
+
severity: "critical" | "moderate" | "minor";
|
|
65
|
+
needsFrom?: string | undefined;
|
|
66
|
+
}[];
|
|
67
|
+
canHelpWith: string[];
|
|
68
|
+
knowledgeGaps?: string[] | undefined;
|
|
69
|
+
}>;
|
|
70
|
+
export type StatusReport = z.infer<typeof StatusReportSchema>;
|
|
71
|
+
/**
|
|
72
|
+
* Schema for a blocker resolution provided during the sync phase
|
|
73
|
+
*/
|
|
74
|
+
export declare const BlockerResolutionSchema: z.ZodObject<{
|
|
75
|
+
navigatorName: z.ZodString;
|
|
76
|
+
blockerDescription: z.ZodString;
|
|
77
|
+
resolution: z.ZodString;
|
|
78
|
+
artifactPath: z.ZodOptional<z.ZodString>;
|
|
79
|
+
confidence: z.ZodEnum<["high", "medium", "low"]>;
|
|
80
|
+
}, "strip", z.ZodTypeAny, {
|
|
81
|
+
navigatorName: string;
|
|
82
|
+
blockerDescription: string;
|
|
83
|
+
resolution: string;
|
|
84
|
+
confidence: "high" | "medium" | "low";
|
|
85
|
+
artifactPath?: string | undefined;
|
|
86
|
+
}, {
|
|
87
|
+
navigatorName: string;
|
|
88
|
+
blockerDescription: string;
|
|
89
|
+
resolution: string;
|
|
90
|
+
confidence: "high" | "medium" | "low";
|
|
91
|
+
artifactPath?: string | undefined;
|
|
92
|
+
}>;
|
|
93
|
+
export type BlockerResolution = z.infer<typeof BlockerResolutionSchema>;
|
|
94
|
+
/**
|
|
95
|
+
* Schema for a sync response submitted by a navigator during the sync phase
|
|
96
|
+
*/
|
|
97
|
+
export declare const SyncResponseSchema: z.ZodObject<{
|
|
98
|
+
navigatorName: z.ZodString;
|
|
99
|
+
summary: z.ZodString;
|
|
100
|
+
blockerResolutions: z.ZodArray<z.ZodObject<{
|
|
101
|
+
navigatorName: z.ZodString;
|
|
102
|
+
blockerDescription: z.ZodString;
|
|
103
|
+
resolution: z.ZodString;
|
|
104
|
+
artifactPath: z.ZodOptional<z.ZodString>;
|
|
105
|
+
confidence: z.ZodEnum<["high", "medium", "low"]>;
|
|
106
|
+
}, "strip", z.ZodTypeAny, {
|
|
107
|
+
navigatorName: string;
|
|
108
|
+
blockerDescription: string;
|
|
109
|
+
resolution: string;
|
|
110
|
+
confidence: "high" | "medium" | "low";
|
|
111
|
+
artifactPath?: string | undefined;
|
|
112
|
+
}, {
|
|
113
|
+
navigatorName: string;
|
|
114
|
+
blockerDescription: string;
|
|
115
|
+
resolution: string;
|
|
116
|
+
confidence: "high" | "medium" | "low";
|
|
117
|
+
artifactPath?: string | undefined;
|
|
118
|
+
}>, "many">;
|
|
119
|
+
newInsights: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
120
|
+
followUpNeeded: z.ZodBoolean;
|
|
121
|
+
}, "strip", z.ZodTypeAny, {
|
|
122
|
+
navigatorName: string;
|
|
123
|
+
summary: string;
|
|
124
|
+
blockerResolutions: {
|
|
125
|
+
navigatorName: string;
|
|
126
|
+
blockerDescription: string;
|
|
127
|
+
resolution: string;
|
|
128
|
+
confidence: "high" | "medium" | "low";
|
|
129
|
+
artifactPath?: string | undefined;
|
|
130
|
+
}[];
|
|
131
|
+
followUpNeeded: boolean;
|
|
132
|
+
newInsights?: string[] | undefined;
|
|
133
|
+
}, {
|
|
134
|
+
navigatorName: string;
|
|
135
|
+
summary: string;
|
|
136
|
+
blockerResolutions: {
|
|
137
|
+
navigatorName: string;
|
|
138
|
+
blockerDescription: string;
|
|
139
|
+
resolution: string;
|
|
140
|
+
confidence: "high" | "medium" | "low";
|
|
141
|
+
artifactPath?: string | undefined;
|
|
142
|
+
}[];
|
|
143
|
+
followUpNeeded: boolean;
|
|
144
|
+
newInsights?: string[] | undefined;
|
|
145
|
+
}>;
|
|
146
|
+
export type SyncResponse = z.infer<typeof SyncResponseSchema>;
|
|
147
|
+
/**
|
|
148
|
+
* Command line options for standup command
|
|
149
|
+
*/
|
|
150
|
+
export interface StandupOptions {
|
|
151
|
+
/** Global config directory override */
|
|
152
|
+
configDir?: string;
|
|
153
|
+
/** Show detailed logging */
|
|
154
|
+
verbose?: boolean;
|
|
155
|
+
/** Model for agents */
|
|
156
|
+
model?: string;
|
|
157
|
+
/** Max turns per agent */
|
|
158
|
+
maxTurns?: number;
|
|
159
|
+
/** Skip sync phase, only generate reports */
|
|
160
|
+
reportOnly?: boolean;
|
|
161
|
+
/** Max cost per agent in USD */
|
|
162
|
+
maxBudgetUsd?: number;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Final result of standup execution
|
|
166
|
+
*/
|
|
167
|
+
export interface StandupResult {
|
|
168
|
+
/** Whether the standup completed successfully */
|
|
169
|
+
success: boolean;
|
|
170
|
+
/** Path to the standup output directory */
|
|
171
|
+
standupDir: string;
|
|
172
|
+
/** Status reports from each navigator */
|
|
173
|
+
reports: StatusReport[];
|
|
174
|
+
/** Sync responses from each navigator */
|
|
175
|
+
syncResponses: SyncResponse[];
|
|
176
|
+
/** Total duration in milliseconds */
|
|
177
|
+
durationMs: number;
|
|
178
|
+
/** Total cost in USD across all agents */
|
|
179
|
+
totalCostUsd: number;
|
|
180
|
+
/** Context utilization percentage per navigator name */
|
|
181
|
+
contextUtilization: Record<string, number>;
|
|
182
|
+
/** Any errors that occurred */
|
|
183
|
+
errors?: string[];
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/standup/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;EAOxB,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;EAalC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IAEjB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IAEnB,yCAAyC;IACzC,OAAO,EAAE,YAAY,EAAE,CAAC;IAExB,yCAAyC;IACzC,aAAa,EAAE,YAAY,EAAE,CAAC;IAE9B,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IAEnB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IAErB,wDAAwD;IACxD,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3C,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB"}
|