mcoda 0.1.33 → 0.1.34

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.
@@ -15,6 +15,7 @@ interface ParsedArgs {
15
15
  qaRequires?: string[];
16
16
  sdsPreflightCommit: boolean;
17
17
  sdsPreflightCommitMessage?: string;
18
+ unknownEpicServicePolicy?: "auto-remediate" | "fail";
18
19
  inputs: string[];
19
20
  }
20
21
  type ProjectKeyCandidate = {
@@ -1 +1 @@
1
- {"version":3,"file":"CreateTasksCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/planning/CreateTasksCommand.ts"],"names":[],"mappings":"AAKA,UAAU,UAAU;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,KAAK,mBAAmB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AA2D5D,eAAO,MAAM,yBAAyB,GAAI,SAAS;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC,KAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAmD3C,CAAC;AAUF,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,EAAE,KAAG,UA6JrD,CAAC;AAEF,qBAAa,kBAAkB;WAChB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAqEhD"}
1
+ {"version":3,"file":"CreateTasksCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/planning/CreateTasksCommand.ts"],"names":[],"mappings":"AAKA,UAAU,UAAU;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,wBAAwB,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IACrD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,KAAK,mBAAmB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AA2D5D,eAAO,MAAM,yBAAyB,GAAI,SAAS;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC,KAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAiD3C,CAAC;AAUF,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,EAAE,KAAG,UA0LrD,CAAC;AAEF,qBAAa,kBAAkB;WAChB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAsEhD"}
@@ -2,7 +2,7 @@ import path from "node:path";
2
2
  import { promises as fs } from "node:fs";
3
3
  import { CreateTasksService, WorkspaceResolver } from "@mcoda/core";
4
4
  import { PathHelper } from "@mcoda/shared";
5
- const usage = `mcoda create-tasks [INPUT...] [--workspace-root <path>] [--project-key <key>] [--agent <name>] [--agent-stream [true|false]] [--rate-agents] [--force] [--max-epics N] [--max-stories-per-epic N] [--max-tasks-per-story N] [--qa-profile <csv>] [--qa-entry-url <url>] [--qa-start-command <cmd>] [--qa-requires <csv>] [--sds-preflight-commit [true|false]] [--sds-preflight-commit-message <text>] [--quiet]`;
5
+ const usage = `mcoda create-tasks [INPUT...] [--workspace-root <path>] [--project-key <key>] [--agent <name>] [--agent-stream [true|false]] [--rate-agents] [--force] [--max-epics N] [--max-stories-per-epic N] [--max-tasks-per-story N] [--qa-profile <csv>] [--qa-entry-url <url>] [--qa-start-command <cmd>] [--qa-requires <csv>] [--sds-preflight-commit [true|false]] [--sds-preflight-commit-message <text>] [--unknown-epic-service-policy <auto-remediate|fail>] [--quiet]`;
6
6
  const readWorkspaceConfig = async (mcodaDir) => {
7
7
  const configPath = path.join(mcodaDir, "config.json");
8
8
  try {
@@ -85,17 +85,13 @@ export const pickCreateTasksProjectKey = (options) => {
85
85
  }
86
86
  return { projectKey: configuredKey, warnings };
87
87
  }
88
- if (latestExisting) {
89
- const selected = latestExisting;
90
- if (!options.requestedKey && selected !== derivedKey) {
91
- warnings.push(`Reusing existing project key "${selected}" from workspace task plans.`);
92
- }
93
- if (existing.length > 1) {
94
- warnings.push(`Multiple task plan folders detected (${existing.map((item) => item.key).join(", ")}); using "${selected}".`);
95
- }
96
- return { projectKey: selected, warnings };
88
+ if (latestExisting && latestExisting !== derivedKey) {
89
+ warnings.push(`Existing task plans were found for "${latestExisting}", but using derived project key "${derivedKey}" to avoid accidental cross-project reuse. Pass --project-key to reuse an existing project.`);
90
+ }
91
+ if (existing.length > 1) {
92
+ warnings.push(`Multiple task plan folders detected (${existing.map((item) => item.key).join(", ")}); using derived project key "${derivedKey}".`);
97
93
  }
98
- return { projectKey: options.requestedKey ?? derivedKey, warnings };
94
+ return { projectKey: derivedKey, warnings };
99
95
  };
100
96
  const parseBooleanFlag = (value, defaultValue) => {
101
97
  if (value === undefined)
@@ -125,6 +121,15 @@ export const parseCreateTasksArgs = (argv) => {
125
121
  let qaRequires;
126
122
  let sdsPreflightCommit = false;
127
123
  let sdsPreflightCommitMessage;
124
+ let unknownEpicServicePolicy;
125
+ const normalizePolicy = (value) => {
126
+ if (!value)
127
+ return undefined;
128
+ const normalized = value.trim().toLowerCase();
129
+ if (normalized === "auto-remediate" || normalized === "fail")
130
+ return normalized;
131
+ return undefined;
132
+ };
128
133
  for (let i = 0; i < argv.length; i += 1) {
129
134
  const arg = argv[i];
130
135
  if (arg.startsWith("--")) {
@@ -138,6 +143,15 @@ export const parseCreateTasksArgs = (argv) => {
138
143
  sdsPreflightCommit = parseBooleanFlag(raw, true);
139
144
  continue;
140
145
  }
146
+ if (arg.startsWith("--unknown-epic-service-policy=")) {
147
+ const [, raw] = arg.split("=", 2);
148
+ const normalizedPolicy = normalizePolicy(raw);
149
+ if (!normalizedPolicy) {
150
+ throw new Error(`Invalid --unknown-epic-service-policy value: ${raw}. Expected auto-remediate or fail.`);
151
+ }
152
+ unknownEpicServicePolicy = normalizedPolicy;
153
+ continue;
154
+ }
141
155
  switch (arg) {
142
156
  case "--workspace-root":
143
157
  workspaceRoot = argv[i + 1] ? path.resolve(argv[i + 1]) : undefined;
@@ -227,6 +241,16 @@ export const parseCreateTasksArgs = (argv) => {
227
241
  sdsPreflightCommitMessage = argv[i + 1];
228
242
  i += 1;
229
243
  break;
244
+ case "--unknown-epic-service-policy": {
245
+ const value = argv[i + 1];
246
+ const normalizedPolicy = normalizePolicy(value);
247
+ if (!normalizedPolicy) {
248
+ throw new Error(`Invalid --unknown-epic-service-policy value: ${value ?? "(missing)"}. Expected auto-remediate or fail.`);
249
+ }
250
+ unknownEpicServicePolicy = normalizedPolicy;
251
+ i += 1;
252
+ break;
253
+ }
230
254
  case "--quiet":
231
255
  quiet = true;
232
256
  break;
@@ -264,6 +288,7 @@ export const parseCreateTasksArgs = (argv) => {
264
288
  qaRequires,
265
289
  sdsPreflightCommit,
266
290
  sdsPreflightCommitMessage,
291
+ unknownEpicServicePolicy,
267
292
  inputs,
268
293
  };
269
294
  };
@@ -314,6 +339,7 @@ export class CreateTasksCommand {
314
339
  qaRequires: parsed.qaRequires,
315
340
  sdsPreflightCommit: parsed.sdsPreflightCommit,
316
341
  sdsPreflightCommitMessage: parsed.sdsPreflightCommitMessage,
342
+ unknownEpicServicePolicy: parsed.unknownEpicServicePolicy,
317
343
  });
318
344
  const dbPath = PathHelper.getWorkspaceDbPath(workspace.workspaceRoot);
319
345
  if (!parsed.quiet) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcoda",
3
- "version": "0.1.33",
3
+ "version": "0.1.34",
4
4
  "description": "Local-first CLI for planning, documentation, and execution workflows with agent assistance.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -45,12 +45,12 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "yaml": "^2.4.2",
48
- "@mcoda/core": "0.1.33",
49
- "@mcoda/shared": "0.1.33"
48
+ "@mcoda/core": "0.1.34",
49
+ "@mcoda/shared": "0.1.34"
50
50
  },
51
51
  "devDependencies": {
52
- "@mcoda/db": "0.1.33",
53
- "@mcoda/integrations": "0.1.33"
52
+ "@mcoda/db": "0.1.34",
53
+ "@mcoda/integrations": "0.1.34"
54
54
  },
55
55
  "scripts": {
56
56
  "build": "tsc -p tsconfig.json",