@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.
- package/README.md +51 -26
- package/dist/cli/formatters/markdown.d.ts.map +1 -1
- package/dist/cli/formatters/markdown.js +0 -4
- package/dist/cli/formatters/markdown.js.map +1 -1
- package/dist/cli/formatters/quiet.d.ts.map +1 -1
- package/dist/cli/formatters/quiet.js +0 -2
- package/dist/cli/formatters/quiet.js.map +1 -1
- package/dist/cli/formatters/table.d.ts.map +1 -1
- package/dist/cli/formatters/table.js +0 -5
- package/dist/cli/formatters/table.js.map +1 -1
- package/dist/cli/project-resolver.js +1 -1
- package/dist/cli/project-resolver.js.map +1 -1
- package/dist/cli/project.d.ts +0 -1
- package/dist/cli/project.d.ts.map +1 -1
- package/dist/cli/project.js +2 -35
- package/dist/cli/project.js.map +1 -1
- package/dist/cli/task.d.ts.map +1 -1
- package/dist/cli/task.js +22 -7
- package/dist/cli/task.js.map +1 -1
- package/dist/config/registry.d.ts +0 -9
- package/dist/config/registry.d.ts.map +1 -1
- package/dist/config/registry.js +1 -31
- package/dist/config/registry.js.map +1 -1
- package/dist/config/resolver.d.ts +3 -4
- package/dist/config/resolver.d.ts.map +1 -1
- package/dist/config/resolver.js +7 -24
- package/dist/config/resolver.js.map +1 -1
- package/dist/db/schema.d.ts +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +70 -4
- package/dist/db/schema.js.map +1 -1
- package/dist/models/common.d.ts +2 -2
- package/dist/models/common.d.ts.map +1 -1
- package/dist/models/project.d.ts +2 -4
- package/dist/models/project.d.ts.map +1 -1
- package/dist/models/project.js +0 -1
- package/dist/models/project.js.map +1 -1
- package/dist/services/project.d.ts +0 -10
- package/dist/services/project.d.ts.map +1 -1
- package/dist/services/project.js +2 -26
- package/dist/services/project.js.map +1 -1
- package/dist/services/stage-validator.d.ts +19 -18
- package/dist/services/stage-validator.d.ts.map +1 -1
- package/dist/services/stage-validator.js +41 -42
- package/dist/services/stage-validator.js.map +1 -1
- package/dist/services/task.d.ts +18 -21
- package/dist/services/task.d.ts.map +1 -1
- package/dist/services/task.js +96 -86
- package/dist/services/task.js.map +1 -1
- package/dist/state-machines/task-state.d.ts +8 -8
- package/dist/state-machines/task-state.d.ts.map +1 -1
- package/dist/state-machines/task-state.js +33 -31
- package/dist/state-machines/task-state.js.map +1 -1
- package/dist/utils/errors.d.ts +21 -51
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +63 -114
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/format.d.ts +0 -11
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/format.js +1 -10
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/levenshtein.d.ts +10 -0
- package/dist/utils/levenshtein.d.ts.map +1 -0
- package/dist/utils/levenshtein.js +42 -0
- package/dist/utils/levenshtein.js.map +1 -0
- package/dist/validators/owner-validator.d.ts +20 -16
- package/dist/validators/owner-validator.d.ts.map +1 -1
- package/dist/validators/owner-validator.js +37 -38
- package/dist/validators/owner-validator.js.map +1 -1
- package/package.json +9 -2
package/dist/utils/format.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/utils/format.js
CHANGED
|
@@ -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.
|
package/dist/utils/format.js.map
CHANGED
|
@@ -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;;
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
12
|
-
*
|
|
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
|
|
16
|
-
* @
|
|
17
|
-
* @throws
|
|
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
|
|
22
|
+
export declare function validateOwnerRole(owner: string): RoleName;
|
|
22
23
|
/**
|
|
23
|
-
* Validate that an owner
|
|
24
|
-
*
|
|
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
|
-
* @
|
|
29
|
+
* @param owner - The task owner role
|
|
30
|
+
* @param _stage - The task stage (unused in v2)
|
|
27
31
|
*/
|
|
28
|
-
export declare function
|
|
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":"
|
|
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
|
-
//
|
|
4
|
-
// Implements AD-
|
|
5
|
-
//
|
|
6
|
-
// + FS-SS-005-0011 (captain-only
|
|
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
|
|
31
|
+
return ROLE_LOWERCASE_MAP.has(role.toLowerCase());
|
|
30
32
|
}
|
|
31
33
|
/**
|
|
32
|
-
*
|
|
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
|
-
*
|
|
35
|
-
*
|
|
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
|
|
39
|
-
* @
|
|
40
|
-
* @throws
|
|
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
|
|
45
|
-
|
|
46
|
-
if (
|
|
47
|
-
|
|
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
|
|
61
|
-
*
|
|
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
|
-
* @
|
|
63
|
+
* @param owner - The task owner role
|
|
64
|
+
* @param _stage - The task stage (unused in v2)
|
|
64
65
|
*/
|
|
65
|
-
function
|
|
66
|
-
|
|
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,
|
|
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.
|
|
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": [
|
|
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",
|