@lwelliott/cortex-cli 1.0.6 → 1.0.7

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 (70) hide show
  1. package/README.md +51 -26
  2. package/dist/cli/formatters/markdown.d.ts.map +1 -1
  3. package/dist/cli/formatters/markdown.js +0 -4
  4. package/dist/cli/formatters/markdown.js.map +1 -1
  5. package/dist/cli/formatters/quiet.d.ts.map +1 -1
  6. package/dist/cli/formatters/quiet.js +0 -2
  7. package/dist/cli/formatters/quiet.js.map +1 -1
  8. package/dist/cli/formatters/table.d.ts.map +1 -1
  9. package/dist/cli/formatters/table.js +0 -5
  10. package/dist/cli/formatters/table.js.map +1 -1
  11. package/dist/cli/project-resolver.js +1 -1
  12. package/dist/cli/project-resolver.js.map +1 -1
  13. package/dist/cli/project.d.ts +0 -1
  14. package/dist/cli/project.d.ts.map +1 -1
  15. package/dist/cli/project.js +2 -35
  16. package/dist/cli/project.js.map +1 -1
  17. package/dist/cli/task.d.ts.map +1 -1
  18. package/dist/cli/task.js +22 -7
  19. package/dist/cli/task.js.map +1 -1
  20. package/dist/config/registry.d.ts +0 -9
  21. package/dist/config/registry.d.ts.map +1 -1
  22. package/dist/config/registry.js +1 -31
  23. package/dist/config/registry.js.map +1 -1
  24. package/dist/config/resolver.d.ts +3 -4
  25. package/dist/config/resolver.d.ts.map +1 -1
  26. package/dist/config/resolver.js +7 -24
  27. package/dist/config/resolver.js.map +1 -1
  28. package/dist/db/schema.d.ts +1 -1
  29. package/dist/db/schema.d.ts.map +1 -1
  30. package/dist/db/schema.js +70 -4
  31. package/dist/db/schema.js.map +1 -1
  32. package/dist/models/common.d.ts +2 -2
  33. package/dist/models/common.d.ts.map +1 -1
  34. package/dist/models/project.d.ts +2 -4
  35. package/dist/models/project.d.ts.map +1 -1
  36. package/dist/models/project.js +0 -1
  37. package/dist/models/project.js.map +1 -1
  38. package/dist/services/project.d.ts +0 -10
  39. package/dist/services/project.d.ts.map +1 -1
  40. package/dist/services/project.js +2 -26
  41. package/dist/services/project.js.map +1 -1
  42. package/dist/services/stage-validator.d.ts +19 -18
  43. package/dist/services/stage-validator.d.ts.map +1 -1
  44. package/dist/services/stage-validator.js +41 -42
  45. package/dist/services/stage-validator.js.map +1 -1
  46. package/dist/services/task.d.ts +18 -21
  47. package/dist/services/task.d.ts.map +1 -1
  48. package/dist/services/task.js +96 -86
  49. package/dist/services/task.js.map +1 -1
  50. package/dist/state-machines/task-state.d.ts +8 -8
  51. package/dist/state-machines/task-state.d.ts.map +1 -1
  52. package/dist/state-machines/task-state.js +33 -31
  53. package/dist/state-machines/task-state.js.map +1 -1
  54. package/dist/utils/errors.d.ts +21 -51
  55. package/dist/utils/errors.d.ts.map +1 -1
  56. package/dist/utils/errors.js +63 -114
  57. package/dist/utils/errors.js.map +1 -1
  58. package/dist/utils/format.d.ts +0 -11
  59. package/dist/utils/format.d.ts.map +1 -1
  60. package/dist/utils/format.js +1 -10
  61. package/dist/utils/format.js.map +1 -1
  62. package/dist/utils/levenshtein.d.ts +10 -0
  63. package/dist/utils/levenshtein.d.ts.map +1 -0
  64. package/dist/utils/levenshtein.js +42 -0
  65. package/dist/utils/levenshtein.js.map +1 -0
  66. package/dist/validators/owner-validator.d.ts +20 -16
  67. package/dist/validators/owner-validator.d.ts.map +1 -1
  68. package/dist/validators/owner-validator.js +37 -38
  69. package/dist/validators/owner-validator.js.map +1 -1
  70. package/package.json +9 -2
@@ -5,7 +5,6 @@ export interface ProjectResultData {
5
5
  folder: string;
6
6
  dbPath: string;
7
7
  isNew: boolean;
8
- isDefault: boolean;
9
8
  }
10
9
  /** Structured return from formatProjectRemoval */
11
10
  export interface ProjectRemovalData {
@@ -17,11 +16,6 @@ export interface ProjectRemovalData {
17
16
  export interface ProjectListItem {
18
17
  name: string;
19
18
  folder: string;
20
- isDefault: boolean;
21
- }
22
- /** Structured return from formatDefaultProject */
23
- export interface DefaultProjectData {
24
- defaultProject: string | null;
25
19
  }
26
20
  /**
27
21
  * Transform project result into structured data.
@@ -39,11 +33,6 @@ export declare function formatProjectRemoval(name: string, dbPath: string): Proj
39
33
  * Pure data transformer — no rendering logic.
40
34
  */
41
35
  export declare function formatProjectList(registry: ProjectsRegistry): ProjectListItem[];
42
- /**
43
- * Transform default project info into structured data.
44
- * Pure data transformer — no rendering logic.
45
- */
46
- export declare function formatDefaultProject(name: string | null): DefaultProjectData;
47
36
  /**
48
37
  * Transform project info into structured data (pass-through).
49
38
  * Pure data transformer — no rendering logic.
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEtF,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,8DAA8D;AAC9D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAQ5E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAMrF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,eAAe,EAAE,CAS/E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,CAE5E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAEhE"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEtF,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,8DAA8D;AAC9D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAO5E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAMrF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,eAAe,EAAE,CAQ/E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAEhE"}
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  // Output formatters: project data transforms → structured objects
3
3
  // Implements plan §5.1: Project Commands
4
+ // v2: Removed default project concept — no isDefault fields, no default project formatter
4
5
  // SAD-0039 hotfix: functions return structured data, not pre-rendered strings;
5
6
  // rendering is handled by formatters (table.ts, markdown.ts, quiet.ts, json.ts).
6
7
  Object.defineProperty(exports, "__esModule", { value: true });
7
8
  exports.formatProjectResult = formatProjectResult;
8
9
  exports.formatProjectRemoval = formatProjectRemoval;
9
10
  exports.formatProjectList = formatProjectList;
10
- exports.formatDefaultProject = formatDefaultProject;
11
11
  exports.formatProjectInfo = formatProjectInfo;
12
12
  /**
13
13
  * Transform project result into structured data.
@@ -19,7 +19,6 @@ function formatProjectResult(result) {
19
19
  folder: result.folder,
20
20
  dbPath: result.dbPath,
21
21
  isNew: result.isNew,
22
- isDefault: result.isDefault,
23
22
  };
24
23
  }
25
24
  /**
@@ -45,16 +44,8 @@ function formatProjectList(registry) {
45
44
  return projects.map(([name, entry]) => ({
46
45
  name,
47
46
  folder: entry.folder,
48
- isDefault: registry.default === name,
49
47
  }));
50
48
  }
51
- /**
52
- * Transform default project info into structured data.
53
- * Pure data transformer — no rendering logic.
54
- */
55
- function formatDefaultProject(name) {
56
- return { defaultProject: name };
57
- }
58
49
  /**
59
50
  * Transform project info into structured data (pass-through).
60
51
  * Pure data transformer — no rendering logic.
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":";AAAA,kEAAkE;AAClE,yCAAyC;AACzC,+EAA+E;AAC/E,iFAAiF;;AAoCjF,kDAQC;AAMD,oDAMC;AAOD,8CASC;AAMD,oDAEC;AAMD,8CAEC;AAxDD;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAAqB;IACvD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,IAAY,EAAE,MAAc;IAC/D,OAAO;QACL,IAAI;QACJ,MAAM;QACN,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,QAA0B;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI;QACJ,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,QAAQ,CAAC,OAAO,KAAK,IAAI;KACrC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,IAAmB;IACtD,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,IAAiB;IACjD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":";AAAA,kEAAkE;AAClE,yCAAyC;AACzC,0FAA0F;AAC1F,+EAA+E;AAC/E,iFAAiF;;AA6BjF,kDAOC;AAMD,oDAMC;AAOD,8CAQC;AAMD,8CAEC;AA9CD;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAAqB;IACvD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,IAAY,EAAE,MAAc;IAC/D,OAAO;QACL,IAAI;QACJ,MAAM;QACN,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,QAA0B;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI;QACJ,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,IAAiB;IACjD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Compute Levenshtein (edit) distance between two strings.
3
+ * Used for closest-match suggestions on invalid inputs.
4
+ */
5
+ export declare function levenshteinDistance(a: string, b: string): number;
6
+ /**
7
+ * Get the top N closest-match suggestions for an invalid value.
8
+ */
9
+ export declare function getClosestMatches(value: string, validValues: string[], topN?: number): string[];
10
+ //# sourceMappingURL=levenshtein.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"levenshtein.d.ts","sourceRoot":"","sources":["../../src/utils/levenshtein.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,MAAU,GAAG,MAAM,EAAE,CAOlG"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ // Shared Levenshtein distance utilities
3
+ // Extracted to eliminate duplication across stage-validator, owner-validator, and task.ts
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.levenshteinDistance = levenshteinDistance;
6
+ exports.getClosestMatches = getClosestMatches;
7
+ /**
8
+ * Compute Levenshtein (edit) distance between two strings.
9
+ * Used for closest-match suggestions on invalid inputs.
10
+ */
11
+ function levenshteinDistance(a, b) {
12
+ const m = a.length;
13
+ const n = b.length;
14
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
15
+ for (let i = 0; i <= m; i++)
16
+ dp[i][0] = i;
17
+ for (let j = 0; j <= n; j++)
18
+ dp[0][j] = j;
19
+ for (let i = 1; i <= m; i++) {
20
+ for (let j = 1; j <= n; j++) {
21
+ if (a[i - 1] === b[j - 1]) {
22
+ dp[i][j] = dp[i - 1][j - 1];
23
+ }
24
+ else {
25
+ dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
26
+ }
27
+ }
28
+ }
29
+ return dp[m][n];
30
+ }
31
+ /**
32
+ * Get the top N closest-match suggestions for an invalid value.
33
+ */
34
+ function getClosestMatches(value, validValues, topN = 3) {
35
+ const lowerValue = value.toLowerCase();
36
+ return validValues
37
+ .map(v => ({ value: v, distance: levenshteinDistance(lowerValue, v.toLowerCase()) }))
38
+ .sort((a, b) => a.distance - b.distance)
39
+ .slice(0, topN)
40
+ .map(v => v.value);
41
+ }
42
+ //# sourceMappingURL=levenshtein.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"levenshtein.js","sourceRoot":"","sources":["../../src/utils/levenshtein.ts"],"names":[],"mappings":";AAAA,wCAAwC;AACxC,0FAA0F;;AAM1F,kDAmBC;AAKD,8CAOC;AAnCD;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,CAAS,EAAE,CAAS;IACtD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC1B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAa,EAAE,WAAqB,EAAE,OAAe,CAAC;IACtF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,OAAO,WAAW;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;SACpF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -1,30 +1,34 @@
1
- import type { RoleName, TaskStage } from '../models/common';
1
+ import type { RoleName } from '../models/common';
2
2
  /** Valid role names */
3
3
  export declare const VALID_ROLES: RoleName[];
4
4
  /**
5
- * Check if a given string is a valid role name.
5
+ * Check if a given string is a valid role name (case-insensitive).
6
6
  */
7
7
  export declare function isValidRole(role: string): role is RoleName;
8
8
  /**
9
- * Validate that an owner can own a task in a given stage.
9
+ * Normalize a role name to canonical case.
10
+ */
11
+ export declare function normalizeRole(role: string): RoleName | null;
12
+ /**
13
+ * Validate that an owner role string is a valid role name (case-insensitive).
10
14
  *
11
- * Rules (AD-0008, updated per URD-030):
12
- * - Planning and Release: only "captain" can own
13
- * - Other stages: any valid role is allowed
15
+ * v2: Basic role-name validation only — no stage-based captain-only rules.
16
+ * Returns the normalized role name on success.
14
17
  *
15
- * @param owner - The task owner role
16
- * @param stage - The task stage
17
- * @throws TaskOwnerPlanningError if captain-only but owner is not captain
18
- * @throws TaskOwnerReleaseError if captain-only but owner is not captain
19
- * @throws TaskInvalidOwnerError if the owner role is not a valid role name
18
+ * @param owner - The owner role to validate
19
+ * @returns The canonical role name
20
+ * @throws TaskInvalidOwnerError with closest-match suggestions if invalid
20
21
  */
21
- export declare function validateOwnerForStage(owner: string, stage: TaskStage): void;
22
+ export declare function validateOwnerRole(owner: string): RoleName;
22
23
  /**
23
- * Validate that an owner role string is a valid role name.
24
- * Does NOT check captain-only restrictions — use validateOwnerForStage for that.
24
+ * Validate that an owner can own a task in a given stage.
25
+ *
26
+ * v2: No captain-only restrictions. Any valid role can own a task in any stage.
27
+ * Kept for API compatibility — delegates to validateOwnerRole.
25
28
  *
26
- * @throws TaskInvalidOwnerError if the role is not valid
29
+ * @param owner - The task owner role
30
+ * @param _stage - The task stage (unused in v2)
27
31
  */
28
- export declare function validateOwnerRole(owner: string): void;
32
+ export declare function validateOwnerForStage(owner: string, _stage?: unknown): void;
29
33
  export { validateOwnerForStage as validateOwnerForState };
30
34
  //# sourceMappingURL=owner-validator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"owner-validator.d.ts","sourceRoot":"","sources":["../../src/validators/owner-validator.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI5D,uBAAuB;AACvB,eAAO,MAAM,WAAW,EAAE,QAAQ,EAOjC,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,QAAQ,CAE1D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAe3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrD;AAGD,OAAO,EAAE,qBAAqB,IAAI,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"owner-validator.d.ts","sourceRoot":"","sources":["../../src/validators/owner-validator.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,uBAAuB;AACvB,eAAO,MAAM,WAAW,EAAE,QAAQ,EAOjC,CAAC;AAOF;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,QAAQ,CAE1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAE3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAQzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAE3E;AAGD,OAAO,EAAE,qBAAqB,IAAI,qBAAqB,EAAE,CAAC"}
@@ -1,18 +1,18 @@
1
1
  "use strict";
2
2
  // Owner validator
3
- // Enforces captain-only rules for Planning and Release stages
4
- // Implements AD-0008: Centralized State Machines + Owner Validation
5
- // + FS-SS-005-0010 (captain-only owner in Planning stage)
6
- // + FS-SS-005-0011 (captain-only owner in Release stage)
7
- // Updated per URD-030: stage-based not state-based
3
+ // Basic role-name validation only (case-insensitive with closest-match suggestions)
4
+ // Implements AD-0031 v2: Consolidated Stage/Status Workflow Engine
5
+ // v2: No stage-based captain-only rules basic role-name validation only
6
+ // + FS-SS-005-0010, FS-SS-005-0011 (captain-only removed in v2)
8
7
  Object.defineProperty(exports, "__esModule", { value: true });
9
8
  exports.VALID_ROLES = void 0;
10
9
  exports.isValidRole = isValidRole;
10
+ exports.normalizeRole = normalizeRole;
11
+ exports.validateOwnerRole = validateOwnerRole;
11
12
  exports.validateOwnerForStage = validateOwnerForStage;
12
13
  exports.validateOwnerForState = validateOwnerForStage;
13
- exports.validateOwnerRole = validateOwnerRole;
14
- const task_state_1 = require("../state-machines/task-state");
15
14
  const errors_1 = require("../utils/errors");
15
+ const levenshtein_1 = require("../utils/levenshtein");
16
16
  /** Valid role names */
17
17
  exports.VALID_ROLES = [
18
18
  'analyst',
@@ -22,49 +22,48 @@ exports.VALID_ROLES = [
22
22
  'master',
23
23
  'captain',
24
24
  ];
25
+ /** Lowercase mapping for case-insensitive lookup */
26
+ const ROLE_LOWERCASE_MAP = new Map(exports.VALID_ROLES.map(r => [r.toLowerCase(), r]));
25
27
  /**
26
- * Check if a given string is a valid role name.
28
+ * Check if a given string is a valid role name (case-insensitive).
27
29
  */
28
30
  function isValidRole(role) {
29
- return exports.VALID_ROLES.includes(role);
31
+ return ROLE_LOWERCASE_MAP.has(role.toLowerCase());
30
32
  }
31
33
  /**
32
- * Validate that an owner can own a task in a given stage.
34
+ * Normalize a role name to canonical case.
35
+ */
36
+ function normalizeRole(role) {
37
+ return ROLE_LOWERCASE_MAP.get(role.toLowerCase()) ?? null;
38
+ }
39
+ /**
40
+ * Validate that an owner role string is a valid role name (case-insensitive).
33
41
  *
34
- * Rules (AD-0008, updated per URD-030):
35
- * - Planning and Release: only "captain" can own
36
- * - Other stages: any valid role is allowed
42
+ * v2: Basic role-name validation only — no stage-based captain-only rules.
43
+ * Returns the normalized role name on success.
37
44
  *
38
- * @param owner - The task owner role
39
- * @param stage - The task stage
40
- * @throws TaskOwnerPlanningError if captain-only but owner is not captain
41
- * @throws TaskOwnerReleaseError if captain-only but owner is not captain
42
- * @throws TaskInvalidOwnerError if the owner role is not a valid role name
45
+ * @param owner - The owner role to validate
46
+ * @returns The canonical role name
47
+ * @throws TaskInvalidOwnerError with closest-match suggestions if invalid
43
48
  */
44
- function validateOwnerForStage(owner, stage) {
45
- // Check if the owner is a valid role
46
- if (!isValidRole(owner)) {
47
- throw new errors_1.TaskInvalidOwnerError(owner, exports.VALID_ROLES);
48
- }
49
- // Captain-only stages: Planning and Release
50
- if (task_state_1.CAPTAIN_ONLY_STAGES.includes(stage) && owner !== 'captain') {
51
- if (stage === 'Planning') {
52
- throw new errors_1.TaskOwnerPlanningError(owner);
53
- }
54
- if (stage === 'Release') {
55
- throw new errors_1.TaskOwnerReleaseError(owner);
56
- }
49
+ function validateOwnerRole(owner) {
50
+ const normalized = normalizeRole(owner);
51
+ if (normalized !== null) {
52
+ return normalized;
57
53
  }
54
+ const suggestions = (0, levenshtein_1.getClosestMatches)(owner, exports.VALID_ROLES);
55
+ throw new errors_1.TaskInvalidOwnerError(owner, suggestions);
58
56
  }
59
57
  /**
60
- * Validate that an owner role string is a valid role name.
61
- * Does NOT check captain-only restrictions — use validateOwnerForStage for that.
58
+ * Validate that an owner can own a task in a given stage.
59
+ *
60
+ * v2: No captain-only restrictions. Any valid role can own a task in any stage.
61
+ * Kept for API compatibility — delegates to validateOwnerRole.
62
62
  *
63
- * @throws TaskInvalidOwnerError if the role is not valid
63
+ * @param owner - The task owner role
64
+ * @param _stage - The task stage (unused in v2)
64
65
  */
65
- function validateOwnerRole(owner) {
66
- if (!isValidRole(owner)) {
67
- throw new errors_1.TaskInvalidOwnerError(owner, exports.VALID_ROLES);
68
- }
66
+ function validateOwnerForStage(owner, _stage) {
67
+ validateOwnerRole(owner);
69
68
  }
70
69
  //# sourceMappingURL=owner-validator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"owner-validator.js","sourceRoot":"","sources":["../../src/validators/owner-validator.ts"],"names":[],"mappings":";AAAA,kBAAkB;AAClB,8DAA8D;AAC9D,oEAAoE;AACpE,0DAA0D;AAC1D,yDAAyD;AACzD,mDAAmD;;;AAmBnD,kCAEC;AAeD,sDAeC;AAeiC,sDAAqB;AAPvD,8CAIC;AA5DD,6DAAmE;AACnE,4CAAuG;AAEvG,uBAAuB;AACV,QAAA,WAAW,GAAe;IACrC,SAAS;IACT,WAAW;IACX,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;CACV,CAAC;AAEF;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAQ,mBAAiC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,qBAAqB,CAAC,KAAa,EAAE,KAAgB;IACnE,qCAAqC;IACrC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,8BAAqB,CAAC,KAAK,EAAE,mBAAuB,CAAC,CAAC;IAClE,CAAC;IAED,4CAA4C;IAC5C,IAAI,gCAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/D,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACzB,MAAM,IAAI,+BAAsB,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,8BAAqB,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,8BAAqB,CAAC,KAAK,EAAE,mBAAuB,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"owner-validator.js","sourceRoot":"","sources":["../../src/validators/owner-validator.ts"],"names":[],"mappings":";AAAA,kBAAkB;AAClB,oFAAoF;AACpF,mEAAmE;AACnE,0EAA0E;AAC1E,gEAAgE;;;AAwBhE,kCAEC;AAKD,sCAEC;AAYD,8CAQC;AAWD,sDAEC;AAGiC,sDAAqB;AAlEvD,4CAAwD;AACxD,sDAAyD;AAEzD,uBAAuB;AACV,QAAA,WAAW,GAAe;IACrC,SAAS;IACT,WAAW;IACX,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;CACV,CAAC;AAEF,oDAAoD;AACpD,MAAM,kBAAkB,GAA0B,IAAI,GAAG,CACvD,mBAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAC3C,CAAC;AAEF;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AAC5D,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,+BAAiB,EAAC,KAAK,EAAE,mBAAuB,CAAC,CAAC;IACtE,MAAM,IAAI,8BAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,qBAAqB,CAAC,KAAa,EAAE,MAAgB;IACnE,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lwelliott/cortex-cli",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "A TypeScript CLI for managing software project artifacts backed by SQLite",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,7 +33,14 @@
33
33
  "README.md",
34
34
  "LICENSE"
35
35
  ],
36
- "keywords": ["cli", "project-management", "sprint", "kanban", "sqlite", "typescript"],
36
+ "keywords": [
37
+ "cli",
38
+ "project-management",
39
+ "sprint",
40
+ "kanban",
41
+ "sqlite",
42
+ "typescript"
43
+ ],
37
44
  "author": "lwelliot",
38
45
  "dependencies": {
39
46
  "better-sqlite3": "^11.7.0",