yapout 0.7.0 → 0.8.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/dist/index.js +117 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -522,7 +522,7 @@ function registerProtocolHandler() {
|
|
|
522
522
|
}
|
|
523
523
|
|
|
524
524
|
// src/commands/login.ts
|
|
525
|
-
var CLI_VERSION = "0.
|
|
525
|
+
var CLI_VERSION = "0.8.0";
|
|
526
526
|
function safeReturnTo(raw) {
|
|
527
527
|
if (!raw) return null;
|
|
528
528
|
try {
|
|
@@ -2697,6 +2697,7 @@ The finding transitions: enriching \u2192 enriched \u2192 ready.`,
|
|
|
2697
2697
|
isOversized: z11.boolean().optional().describe("Set to true if this finding is too large for a single PR"),
|
|
2698
2698
|
suggestedSplit: z11.array(z11.string()).optional().describe("If oversized: suggested sub-finding titles for breaking it down"),
|
|
2699
2699
|
nature: z11.enum(["implementable", "operational", "spike"]).optional().describe("Override the finding's nature if enrichment reveals it should be reclassified"),
|
|
2700
|
+
cloudSafe: z11.boolean().optional().describe("Set to true ONLY if this is a small mechanical change a cloud agent can ship without sandbox testing \u2014 text/copy edits, classname tweaks, single-named-constant changes, \u226430 lines, single file, no logic/type/dependency changes. Default false."),
|
|
2700
2701
|
sessionId: z11.string().optional().describe("Bulk enrichment session ID (from yapout_start_enrichment). Updates session stats.")
|
|
2701
2702
|
},
|
|
2702
2703
|
async (args) => {
|
|
@@ -2712,7 +2713,8 @@ The finding transitions: enriching \u2192 enriched \u2192 ready.`,
|
|
|
2712
2713
|
clarifications: args.clarifications,
|
|
2713
2714
|
isOversized: args.isOversized,
|
|
2714
2715
|
suggestedSplit: args.suggestedSplit,
|
|
2715
|
-
nature: args.nature
|
|
2716
|
+
nature: args.nature,
|
|
2717
|
+
cloudSafe: args.cloudSafe
|
|
2716
2718
|
}
|
|
2717
2719
|
);
|
|
2718
2720
|
await ctx.client.action(
|
|
@@ -3688,6 +3690,7 @@ Call yapout_sync_bundle_to_linear afterwards to create the Linear project.`,
|
|
|
3688
3690
|
enrichedDescription: z21.string().describe("Bundle-level description \u2014 the cohesive story of what this bundle delivers"),
|
|
3689
3691
|
acceptanceCriteria: z21.array(z21.string()).describe("Bundle-level acceptance criteria"),
|
|
3690
3692
|
implementationBrief: z21.string().describe("Bundle-level implementation brief \u2014 overall approach, architecture decisions, key files"),
|
|
3693
|
+
cloudSafe: z21.boolean().optional().describe("Set true ONLY if the entire bundle is small mechanical work (\u226430 lines total, single-file ideally, text/className/constant edits). Default false. If unsure, false."),
|
|
3691
3694
|
findings: z21.array(z21.object({
|
|
3692
3695
|
findingId: z21.string().describe("Finding ID"),
|
|
3693
3696
|
title: z21.string().describe("Refined finding title"),
|
|
@@ -3706,6 +3709,7 @@ Call yapout_sync_bundle_to_linear afterwards to create the Linear project.`,
|
|
|
3706
3709
|
enrichedDescription: args.enrichedDescription,
|
|
3707
3710
|
acceptanceCriteria: args.acceptanceCriteria,
|
|
3708
3711
|
implementationBrief: args.implementationBrief,
|
|
3712
|
+
cloudSafe: args.cloudSafe,
|
|
3709
3713
|
findings: args.findings.map((f) => ({
|
|
3710
3714
|
findingId: f.findingId,
|
|
3711
3715
|
title: f.title,
|
|
@@ -3737,6 +3741,113 @@ Call yapout_sync_bundle_to_linear afterwards to create the Linear project.`,
|
|
|
3737
3741
|
);
|
|
3738
3742
|
}
|
|
3739
3743
|
|
|
3744
|
+
// src/mcp/tools/block-enrichment.ts
|
|
3745
|
+
import { z as z22 } from "zod";
|
|
3746
|
+
function registerBlockEnrichmentTool(server, ctx) {
|
|
3747
|
+
server.tool(
|
|
3748
|
+
"yapout_block_enrichment",
|
|
3749
|
+
`Refuse to enrich a finding because the user has not provided enough specifics for an autonomous agent to complete the work end-to-end.
|
|
3750
|
+
|
|
3751
|
+
Use this when the finding lacks any of: target file/component, intended behavior, scope boundaries, or success criteria. Do NOT produce a half-baked enrichment "for review" \u2014 block instead. The bar for "enriched" is "another agent can ship this with zero further input."
|
|
3752
|
+
|
|
3753
|
+
The finding must currently be in "enriching" status (claimed via yapout_get_unenriched_finding).
|
|
3754
|
+
|
|
3755
|
+
Transitions: enriching \u2192 needs_input. The user sees the blockerReason and questions in the UI, adds context, and resubmits.`,
|
|
3756
|
+
{
|
|
3757
|
+
findingId: z22.string().describe("The finding ID to block (currently in 'enriching')"),
|
|
3758
|
+
blockerReason: z22.string().describe("One sentence: why this finding cannot be enriched as written. State the missing piece concretely."),
|
|
3759
|
+
blockerQuestions: z22.array(z22.string()).min(1).describe("2-5 specific questions the user must answer before enrichment can succeed. Each must be answerable in a sentence or two.")
|
|
3760
|
+
},
|
|
3761
|
+
async (args) => {
|
|
3762
|
+
try {
|
|
3763
|
+
await ctx.client.mutation(
|
|
3764
|
+
anyApi3.functions.localPipeline.blockLocalEnrichment,
|
|
3765
|
+
{
|
|
3766
|
+
findingId: args.findingId,
|
|
3767
|
+
blockerReason: args.blockerReason,
|
|
3768
|
+
blockerQuestions: args.blockerQuestions
|
|
3769
|
+
}
|
|
3770
|
+
);
|
|
3771
|
+
return {
|
|
3772
|
+
content: [
|
|
3773
|
+
{
|
|
3774
|
+
type: "text",
|
|
3775
|
+
text: JSON.stringify(
|
|
3776
|
+
{
|
|
3777
|
+
findingId: args.findingId,
|
|
3778
|
+
status: "needs_input",
|
|
3779
|
+
message: "Enrichment blocked. The user will see your questions and resubmit with more context."
|
|
3780
|
+
},
|
|
3781
|
+
null,
|
|
3782
|
+
2
|
|
3783
|
+
)
|
|
3784
|
+
}
|
|
3785
|
+
]
|
|
3786
|
+
};
|
|
3787
|
+
} catch (err) {
|
|
3788
|
+
return {
|
|
3789
|
+
content: [
|
|
3790
|
+
{
|
|
3791
|
+
type: "text",
|
|
3792
|
+
text: `Error blocking enrichment: ${err.message}`
|
|
3793
|
+
}
|
|
3794
|
+
],
|
|
3795
|
+
isError: true
|
|
3796
|
+
};
|
|
3797
|
+
}
|
|
3798
|
+
}
|
|
3799
|
+
);
|
|
3800
|
+
server.tool(
|
|
3801
|
+
"yapout_block_bundle_enrichment",
|
|
3802
|
+
`Refuse to enrich a bundle because the user has not provided enough specifics for an autonomous agent to ship it end-to-end.
|
|
3803
|
+
|
|
3804
|
+
Same semantics as yapout_block_enrichment but for an entire bundle. Bundle status transitions enriching \u2192 needs_input; child findings revert to draft.`,
|
|
3805
|
+
{
|
|
3806
|
+
bundleId: z22.string().describe("The bundle ID to block (currently in 'enriching')"),
|
|
3807
|
+
blockerReason: z22.string().describe("One sentence: why this bundle cannot be enriched."),
|
|
3808
|
+
blockerQuestions: z22.array(z22.string()).min(1).describe("2-5 specific questions the user must answer.")
|
|
3809
|
+
},
|
|
3810
|
+
async (args) => {
|
|
3811
|
+
try {
|
|
3812
|
+
await ctx.client.mutation(
|
|
3813
|
+
anyApi3.functions.bundles.blockBundleEnrichment,
|
|
3814
|
+
{
|
|
3815
|
+
bundleId: args.bundleId,
|
|
3816
|
+
blockerReason: args.blockerReason,
|
|
3817
|
+
blockerQuestions: args.blockerQuestions
|
|
3818
|
+
}
|
|
3819
|
+
);
|
|
3820
|
+
return {
|
|
3821
|
+
content: [
|
|
3822
|
+
{
|
|
3823
|
+
type: "text",
|
|
3824
|
+
text: JSON.stringify(
|
|
3825
|
+
{
|
|
3826
|
+
bundleId: args.bundleId,
|
|
3827
|
+
status: "needs_input",
|
|
3828
|
+
message: "Bundle enrichment blocked. The user will see your questions and resubmit."
|
|
3829
|
+
},
|
|
3830
|
+
null,
|
|
3831
|
+
2
|
|
3832
|
+
)
|
|
3833
|
+
}
|
|
3834
|
+
]
|
|
3835
|
+
};
|
|
3836
|
+
} catch (err) {
|
|
3837
|
+
return {
|
|
3838
|
+
content: [
|
|
3839
|
+
{
|
|
3840
|
+
type: "text",
|
|
3841
|
+
text: `Error blocking bundle enrichment: ${err.message}`
|
|
3842
|
+
}
|
|
3843
|
+
],
|
|
3844
|
+
isError: true
|
|
3845
|
+
};
|
|
3846
|
+
}
|
|
3847
|
+
}
|
|
3848
|
+
);
|
|
3849
|
+
}
|
|
3850
|
+
|
|
3740
3851
|
// src/mcp/server.ts
|
|
3741
3852
|
async function startMcpServer() {
|
|
3742
3853
|
const cwd = process.cwd();
|
|
@@ -3767,7 +3878,7 @@ async function startMcpServer() {
|
|
|
3767
3878
|
};
|
|
3768
3879
|
const server = new McpServer({
|
|
3769
3880
|
name: "yapout",
|
|
3770
|
-
version: "0.
|
|
3881
|
+
version: "0.8.0"
|
|
3771
3882
|
});
|
|
3772
3883
|
registerInitTool(server, ctx);
|
|
3773
3884
|
registerCompactTool(server, ctx);
|
|
@@ -3793,6 +3904,7 @@ async function startMcpServer() {
|
|
|
3793
3904
|
registerEnrichNextTool(server, ctx);
|
|
3794
3905
|
registerEnrichBundleTool(server, ctx);
|
|
3795
3906
|
registerSaveBundleEnrichmentTool(server, ctx);
|
|
3907
|
+
registerBlockEnrichmentTool(server, ctx);
|
|
3796
3908
|
const transport = new StdioServerTransport();
|
|
3797
3909
|
await server.connect(transport);
|
|
3798
3910
|
}
|
|
@@ -4533,7 +4645,7 @@ var watchCommand = new Command10("watch").description("Watch for work and spawn
|
|
|
4533
4645
|
chalk11.green("Watcher started in background") + chalk11.dim(` (PID ${process.pid}, log: ${LOG_FILE})`)
|
|
4534
4646
|
);
|
|
4535
4647
|
}
|
|
4536
|
-
console.log(chalk11.bold(`yapout watch v${"0.
|
|
4648
|
+
console.log(chalk11.bold(`yapout watch v${"0.8.0"}`));
|
|
4537
4649
|
console.log(
|
|
4538
4650
|
`Project: ${chalk11.green(mapping.projectName)} (${mapping.projectId})`
|
|
4539
4651
|
);
|
|
@@ -5086,7 +5198,7 @@ var handleUriCommand = new Command15("handle-uri").description("Handle a yapout:
|
|
|
5086
5198
|
|
|
5087
5199
|
// src/index.ts
|
|
5088
5200
|
var program = new Command16();
|
|
5089
|
-
program.name("yapout").description("yapout \u2014 from meeting transcript to merged PR").version("0.
|
|
5201
|
+
program.name("yapout").description("yapout \u2014 from meeting transcript to merged PR").version("0.8.0");
|
|
5090
5202
|
program.addCommand(loginCommand);
|
|
5091
5203
|
program.addCommand(logoutCommand);
|
|
5092
5204
|
program.addCommand(initCommand);
|