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.
Files changed (2) hide show
  1. package/dist/index.js +117 -5
  2. 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.7.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.7.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.7.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.7.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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yapout",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "yapout CLI — link local repos, authenticate, and manage projects",
5
5
  "type": "module",
6
6
  "bin": {