@reqord/shared 0.1.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/LICENSE +661 -0
- package/README.md +38 -0
- package/dist/constants/index.d.ts +2 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +2 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/paths.d.ts +13 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +13 -0
- package/dist/constants/paths.js.map +1 -0
- package/dist/constants/paths.test.d.ts +2 -0
- package/dist/constants/paths.test.d.ts.map +1 -0
- package/dist/constants/paths.test.js +11 -0
- package/dist/constants/paths.test.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/consistency.d.ts +12 -0
- package/dist/rules/consistency.d.ts.map +1 -0
- package/dist/rules/consistency.js +34 -0
- package/dist/rules/consistency.js.map +1 -0
- package/dist/rules/consistency.test.d.ts +2 -0
- package/dist/rules/consistency.test.d.ts.map +1 -0
- package/dist/rules/consistency.test.js +97 -0
- package/dist/rules/consistency.test.js.map +1 -0
- package/dist/rules/index.d.ts +3 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +3 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/status-transitions.d.ts +5 -0
- package/dist/rules/status-transitions.d.ts.map +1 -0
- package/dist/rules/status-transitions.js +13 -0
- package/dist/rules/status-transitions.js.map +1 -0
- package/dist/rules/status-transitions.test.d.ts +2 -0
- package/dist/rules/status-transitions.test.d.ts.map +1 -0
- package/dist/rules/status-transitions.test.js +53 -0
- package/dist/rules/status-transitions.test.js.map +1 -0
- package/dist/schemas/common.d.ts +33 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +19 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/feedback.d.ts +249 -0
- package/dist/schemas/feedback.d.ts.map +1 -0
- package/dist/schemas/feedback.js +39 -0
- package/dist/schemas/feedback.js.map +1 -0
- package/dist/schemas/feedback.test.d.ts +2 -0
- package/dist/schemas/feedback.test.d.ts.map +1 -0
- package/dist/schemas/feedback.test.js +234 -0
- package/dist/schemas/feedback.test.js.map +1 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +8 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/project-context.d.ts +116 -0
- package/dist/schemas/project-context.d.ts.map +1 -0
- package/dist/schemas/project-context.js +25 -0
- package/dist/schemas/project-context.js.map +1 -0
- package/dist/schemas/requirement.d.ts +242 -0
- package/dist/schemas/requirement.d.ts.map +1 -0
- package/dist/schemas/requirement.js +52 -0
- package/dist/schemas/requirement.js.map +1 -0
- package/dist/schemas/requirement.test.d.ts +2 -0
- package/dist/schemas/requirement.test.d.ts.map +1 -0
- package/dist/schemas/requirement.test.js +38 -0
- package/dist/schemas/requirement.test.js.map +1 -0
- package/dist/schemas/specification.d.ts +217 -0
- package/dist/schemas/specification.d.ts.map +1 -0
- package/dist/schemas/specification.js +32 -0
- package/dist/schemas/specification.js.map +1 -0
- package/dist/schemas/specification.test.d.ts +2 -0
- package/dist/schemas/specification.test.d.ts.map +1 -0
- package/dist/schemas/specification.test.js +89 -0
- package/dist/schemas/specification.test.js.map +1 -0
- package/dist/schemas/task.d.ts +177 -0
- package/dist/schemas/task.d.ts.map +1 -0
- package/dist/schemas/task.js +29 -0
- package/dist/schemas/task.js.map +1 -0
- package/dist/schemas/task.test.d.ts +2 -0
- package/dist/schemas/task.test.d.ts.map +1 -0
- package/dist/schemas/task.test.js +203 -0
- package/dist/schemas/task.test.js.map +1 -0
- package/dist/schemas/validation.d.ts +174 -0
- package/dist/schemas/validation.d.ts.map +1 -0
- package/dist/schemas/validation.js +31 -0
- package/dist/schemas/validation.js.map +1 -0
- package/dist/utils/zod-error-formatter.d.ts +25 -0
- package/dist/utils/zod-error-formatter.d.ts.map +1 -0
- package/dist/utils/zod-error-formatter.js +115 -0
- package/dist/utils/zod-error-formatter.js.map +1 -0
- package/dist/utils/zod-error-formatter.test.d.ts +2 -0
- package/dist/utils/zod-error-formatter.test.d.ts.map +1 -0
- package/dist/utils/zod-error-formatter.test.js +314 -0
- package/dist/utils/zod-error-formatter.test.js.map +1 -0
- package/dist/validation/ambiguous-phrases.d.ts +11 -0
- package/dist/validation/ambiguous-phrases.d.ts.map +1 -0
- package/dist/validation/ambiguous-phrases.js +56 -0
- package/dist/validation/ambiguous-phrases.js.map +1 -0
- package/dist/validation/smart-scoring.d.ts +15 -0
- package/dist/validation/smart-scoring.d.ts.map +1 -0
- package/dist/validation/smart-scoring.js +225 -0
- package/dist/validation/smart-scoring.js.map +1 -0
- package/dist/validation/smart-scoring.test.d.ts +2 -0
- package/dist/validation/smart-scoring.test.d.ts.map +1 -0
- package/dist/validation/smart-scoring.test.js +136 -0
- package/dist/validation/smart-scoring.test.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# @reqord/shared
|
|
2
|
+
|
|
3
|
+
**Shared Zod schemas, types, and utilities for Reqord.**
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@reqord/shared)
|
|
6
|
+
[](../../LICENSE)
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @reqord/shared
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import {
|
|
18
|
+
requirementSchema,
|
|
19
|
+
specificationSchema,
|
|
20
|
+
feedbackIndexSchema,
|
|
21
|
+
type Requirement,
|
|
22
|
+
type Specification,
|
|
23
|
+
} from "@reqord/shared";
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Exports
|
|
27
|
+
|
|
28
|
+
| Module | Description |
|
|
29
|
+
|--------|-------------|
|
|
30
|
+
| `schemas/` | Zod schemas for requirements, specifications, feedback, context |
|
|
31
|
+
| `constants/` | Shared constants (ID formats, status values) |
|
|
32
|
+
| `rules/` | Business rules and validation logic |
|
|
33
|
+
| `validation/` | SMART scoring, ambiguous phrase detection |
|
|
34
|
+
| `utils/` | Zod error formatting utilities |
|
|
35
|
+
|
|
36
|
+
## License
|
|
37
|
+
|
|
38
|
+
[AGPL-3.0](../../LICENSE)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const REQORD_DIR = ".reqord";
|
|
2
|
+
export declare const CONTEXT_DIR = "context";
|
|
3
|
+
export declare const REQUIREMENTS_DIR = "requirements";
|
|
4
|
+
export declare const SPECIFICATIONS_DIR = "specifications";
|
|
5
|
+
export declare const SETTINGS_DIR = "settings";
|
|
6
|
+
export declare const TEMPLATES_DIR = "templates";
|
|
7
|
+
export declare const RULES_DIR = "rules";
|
|
8
|
+
export declare const ASSETS_DIR = "assets";
|
|
9
|
+
export declare const DOMAIN_DIR = "domain";
|
|
10
|
+
export declare const ISSUE_TEMPLATES_DIR = "issue-templates";
|
|
11
|
+
export declare const FEEDBACK_DIR = "feedback";
|
|
12
|
+
export declare const ISSUES_DIR = "issues";
|
|
13
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/constants/paths.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,WAAW,YAAY,CAAC;AACrC,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAC/C,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AACrD,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,UAAU,WAAW,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const REQORD_DIR = ".reqord";
|
|
2
|
+
export const CONTEXT_DIR = "context";
|
|
3
|
+
export const REQUIREMENTS_DIR = "requirements";
|
|
4
|
+
export const SPECIFICATIONS_DIR = "specifications";
|
|
5
|
+
export const SETTINGS_DIR = "settings";
|
|
6
|
+
export const TEMPLATES_DIR = "templates";
|
|
7
|
+
export const RULES_DIR = "rules";
|
|
8
|
+
export const ASSETS_DIR = "assets";
|
|
9
|
+
export const DOMAIN_DIR = "domain";
|
|
10
|
+
export const ISSUE_TEMPLATES_DIR = "issue-templates";
|
|
11
|
+
export const FEEDBACK_DIR = "feedback";
|
|
12
|
+
export const ISSUES_DIR = "issues";
|
|
13
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/constants/paths.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AACnD,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;AACjC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AACvC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.test.d.ts","sourceRoot":"","sources":["../../src/constants/paths.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { FEEDBACK_DIR, ISSUES_DIR } from "./paths.js";
|
|
3
|
+
describe("paths constants", () => {
|
|
4
|
+
it("should define FEEDBACK_DIR constant", () => {
|
|
5
|
+
expect(FEEDBACK_DIR).toBe("feedback");
|
|
6
|
+
});
|
|
7
|
+
it("should define ISSUES_DIR constant", () => {
|
|
8
|
+
expect(ISSUES_DIR).toBe("issues");
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=paths.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../src/constants/paths.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./schemas/index.js";
|
|
2
|
+
export * from "./constants/index.js";
|
|
3
|
+
export * from "./rules/index.js";
|
|
4
|
+
export * from "./validation/ambiguous-phrases.js";
|
|
5
|
+
export * from "./validation/smart-scoring.js";
|
|
6
|
+
export * from "./utils/zod-error-formatter.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./schemas/index.js";
|
|
2
|
+
export * from "./constants/index.js";
|
|
3
|
+
export * from "./rules/index.js";
|
|
4
|
+
export * from "./validation/ambiguous-phrases.js";
|
|
5
|
+
export * from "./validation/smart-scoring.js";
|
|
6
|
+
export * from "./utils/zod-error-formatter.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Requirement } from "../schemas/requirement.js";
|
|
2
|
+
import type { Specification } from "../schemas/specification.js";
|
|
3
|
+
export type ConsistencyWarningType = "all-specs-implemented" | "deprecated-with-active-specs";
|
|
4
|
+
export type ConsistencyWarning = {
|
|
5
|
+
type: ConsistencyWarningType;
|
|
6
|
+
requirementId: string;
|
|
7
|
+
specificationIds: string[];
|
|
8
|
+
message: string;
|
|
9
|
+
severity: "warning";
|
|
10
|
+
};
|
|
11
|
+
export declare function checkConsistency(req: Requirement, specs: Specification[]): ConsistencyWarning[];
|
|
12
|
+
//# sourceMappingURL=consistency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consistency.d.ts","sourceRoot":"","sources":["../../src/rules/consistency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAC9B,uBAAuB,GACvB,8BAA8B,CAAC;AAEnC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,kBAAkB,EAAE,CAsCtB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function checkConsistency(req, specs) {
|
|
2
|
+
if (specs.length === 0) {
|
|
3
|
+
return [];
|
|
4
|
+
}
|
|
5
|
+
const warnings = [];
|
|
6
|
+
// 全関連SpecがimplementedだがReqがapproved → 警告
|
|
7
|
+
if (req.status === "approved") {
|
|
8
|
+
const allImplemented = specs.every((s) => s.status === "implemented");
|
|
9
|
+
if (allImplemented) {
|
|
10
|
+
warnings.push({
|
|
11
|
+
type: "all-specs-implemented",
|
|
12
|
+
requirementId: req.id,
|
|
13
|
+
specificationIds: specs.map((s) => s.id),
|
|
14
|
+
message: `All specifications are implemented but requirement ${req.id} is still approved`,
|
|
15
|
+
severity: "warning",
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// Reqがdeprecatedだが関連Specがdraft/approved → 警告
|
|
20
|
+
if (req.status === "deprecated") {
|
|
21
|
+
const activeSpecs = specs.filter((s) => s.status === "draft" || s.status === "approved");
|
|
22
|
+
if (activeSpecs.length > 0) {
|
|
23
|
+
warnings.push({
|
|
24
|
+
type: "deprecated-with-active-specs",
|
|
25
|
+
requirementId: req.id,
|
|
26
|
+
specificationIds: activeSpecs.map((s) => s.id),
|
|
27
|
+
message: `Requirement ${req.id} is deprecated but has active specifications`,
|
|
28
|
+
severity: "warning",
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return warnings;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=consistency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consistency.js","sourceRoot":"","sources":["../../src/rules/consistency.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,gBAAgB,CAC9B,GAAgB,EAChB,KAAsB;IAEtB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAE1C,yCAAyC;IACzC,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;QACtE,IAAI,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,uBAAuB;gBAC7B,aAAa,EAAE,GAAG,CAAC,EAAE;gBACrB,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,OAAO,EAAE,sDAAsD,GAAG,CAAC,EAAE,oBAAoB;gBACzF,QAAQ,EAAE,SAAS;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CACvD,CAAC;QACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,8BAA8B;gBACpC,aAAa,EAAE,GAAG,CAAC,EAAE;gBACrB,gBAAgB,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,OAAO,EAAE,eAAe,GAAG,CAAC,EAAE,8CAA8C;gBAC5E,QAAQ,EAAE,SAAS;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consistency.test.d.ts","sourceRoot":"","sources":["../../src/rules/consistency.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { checkConsistency } from "./consistency.js";
|
|
3
|
+
function createReq(overrides = {}) {
|
|
4
|
+
return {
|
|
5
|
+
id: "req-000001",
|
|
6
|
+
version: "1.0.0",
|
|
7
|
+
title: "Test requirement",
|
|
8
|
+
status: "draft",
|
|
9
|
+
priority: "medium",
|
|
10
|
+
createdAt: "2024-01-01T00:00:00Z",
|
|
11
|
+
updatedAt: "2024-01-01T00:00:00Z",
|
|
12
|
+
versionHistory: [],
|
|
13
|
+
files: { description: "description.md", supplementary: [] },
|
|
14
|
+
successCriteria: [],
|
|
15
|
+
format: { type: "free-form" },
|
|
16
|
+
dependencies: { blockedBy: [], blocks: [], relatedTo: [] },
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function createSpec(overrides = {}) {
|
|
21
|
+
return {
|
|
22
|
+
id: "spec-000001",
|
|
23
|
+
requirementId: "req-000001",
|
|
24
|
+
version: "1.0.0",
|
|
25
|
+
status: "draft",
|
|
26
|
+
createdAt: "2024-01-01T00:00:00Z",
|
|
27
|
+
updatedAt: "2024-01-01T00:00:00Z",
|
|
28
|
+
versionHistory: [],
|
|
29
|
+
files: { design: "design.md", supplementary: [] },
|
|
30
|
+
...overrides,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
describe("checkConsistency", () => {
|
|
34
|
+
it("全SpecがimplementedだがReqがapprovedの場合、警告を返す", () => {
|
|
35
|
+
const req = createReq({ status: "approved" });
|
|
36
|
+
const specs = [
|
|
37
|
+
createSpec({ id: "spec-000001", status: "implemented" }),
|
|
38
|
+
createSpec({ id: "spec-000002", status: "implemented" }),
|
|
39
|
+
];
|
|
40
|
+
const warnings = checkConsistency(req, specs);
|
|
41
|
+
expect(warnings).toHaveLength(1);
|
|
42
|
+
expect(warnings[0]).toEqual({
|
|
43
|
+
type: "all-specs-implemented",
|
|
44
|
+
requirementId: "req-000001",
|
|
45
|
+
specificationIds: ["spec-000001", "spec-000002"],
|
|
46
|
+
message: expect.stringContaining("implemented"),
|
|
47
|
+
severity: "warning",
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
it("ReqがdeprecatedだがSpecがdraft/approvedの場合、警告を返す", () => {
|
|
51
|
+
const req = createReq({ status: "deprecated" });
|
|
52
|
+
const specs = [
|
|
53
|
+
createSpec({ id: "spec-000001", status: "draft" }),
|
|
54
|
+
createSpec({ id: "spec-000002", status: "approved" }),
|
|
55
|
+
createSpec({ id: "spec-000003", status: "deprecated" }),
|
|
56
|
+
];
|
|
57
|
+
const warnings = checkConsistency(req, specs);
|
|
58
|
+
expect(warnings).toHaveLength(1);
|
|
59
|
+
expect(warnings[0]).toEqual({
|
|
60
|
+
type: "deprecated-with-active-specs",
|
|
61
|
+
requirementId: "req-000001",
|
|
62
|
+
specificationIds: ["spec-000001", "spec-000002"],
|
|
63
|
+
message: expect.stringContaining("deprecated"),
|
|
64
|
+
severity: "warning",
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
it("正常状態の場合、空配列を返す", () => {
|
|
68
|
+
const req = createReq({ status: "approved" });
|
|
69
|
+
const specs = [
|
|
70
|
+
createSpec({ status: "draft" }),
|
|
71
|
+
createSpec({ id: "spec-000002", status: "approved" }),
|
|
72
|
+
];
|
|
73
|
+
const warnings = checkConsistency(req, specs);
|
|
74
|
+
expect(warnings).toEqual([]);
|
|
75
|
+
});
|
|
76
|
+
it("Specが0件の場合、空配列を返す", () => {
|
|
77
|
+
const req = createReq({ status: "approved" });
|
|
78
|
+
const warnings = checkConsistency(req, []);
|
|
79
|
+
expect(warnings).toEqual([]);
|
|
80
|
+
});
|
|
81
|
+
it("ReqがimplementedでSpecもimplementedの場合、警告なし", () => {
|
|
82
|
+
const req = createReq({ status: "implemented" });
|
|
83
|
+
const specs = [createSpec({ status: "implemented" })];
|
|
84
|
+
const warnings = checkConsistency(req, specs);
|
|
85
|
+
expect(warnings).toEqual([]);
|
|
86
|
+
});
|
|
87
|
+
it("Reqがdeprecatedで全Specもdeprecatedの場合、警告なし", () => {
|
|
88
|
+
const req = createReq({ status: "deprecated" });
|
|
89
|
+
const specs = [
|
|
90
|
+
createSpec({ status: "deprecated" }),
|
|
91
|
+
createSpec({ id: "spec-000002", status: "deprecated" }),
|
|
92
|
+
];
|
|
93
|
+
const warnings = checkConsistency(req, specs);
|
|
94
|
+
expect(warnings).toEqual([]);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=consistency.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consistency.test.js","sourceRoot":"","sources":["../../src/rules/consistency.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Status } from "../schemas/common.js";
|
|
2
|
+
export declare const STATUS_TRANSITIONS: Record<Status, Status[]>;
|
|
3
|
+
export declare function isValidTransition(from: Status, to: Status): boolean;
|
|
4
|
+
export declare function getAvailableTransitions(current: Status): Status[];
|
|
5
|
+
//# sourceMappingURL=status-transitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-transitions.d.ts","sourceRoot":"","sources":["../../src/rules/status-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAKvD,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const STATUS_TRANSITIONS = {
|
|
2
|
+
draft: ["approved", "deprecated"],
|
|
3
|
+
approved: ["implemented", "deprecated"],
|
|
4
|
+
implemented: ["deprecated"],
|
|
5
|
+
deprecated: [],
|
|
6
|
+
};
|
|
7
|
+
export function isValidTransition(from, to) {
|
|
8
|
+
return STATUS_TRANSITIONS[from].includes(to);
|
|
9
|
+
}
|
|
10
|
+
export function getAvailableTransitions(current) {
|
|
11
|
+
return STATUS_TRANSITIONS[current];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=status-transitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-transitions.js","sourceRoot":"","sources":["../../src/rules/status-transitions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAA6B;IAC1D,KAAK,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC;IACjC,QAAQ,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC;IACvC,WAAW,EAAE,CAAC,YAAY,CAAC;IAC3B,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,EAAU;IACxD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-transitions.test.d.ts","sourceRoot":"","sources":["../../src/rules/status-transitions.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { STATUS_TRANSITIONS, isValidTransition, getAvailableTransitions, } from "./status-transitions.js";
|
|
3
|
+
describe("STATUS_TRANSITIONS", () => {
|
|
4
|
+
it("draftからapprovedとdeprecatedに遷移できる", () => {
|
|
5
|
+
expect(STATUS_TRANSITIONS.draft).toEqual(["approved", "deprecated"]);
|
|
6
|
+
});
|
|
7
|
+
it("approvedからimplementedとdeprecatedに遷移できる", () => {
|
|
8
|
+
expect(STATUS_TRANSITIONS.approved).toEqual([
|
|
9
|
+
"implemented",
|
|
10
|
+
"deprecated",
|
|
11
|
+
]);
|
|
12
|
+
});
|
|
13
|
+
it("implementedからdeprecatedにのみ遷移できる", () => {
|
|
14
|
+
expect(STATUS_TRANSITIONS.implemented).toEqual(["deprecated"]);
|
|
15
|
+
});
|
|
16
|
+
it("deprecatedからはどこにも遷移できない", () => {
|
|
17
|
+
expect(STATUS_TRANSITIONS.deprecated).toEqual([]);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe("isValidTransition", () => {
|
|
21
|
+
it("有効な遷移はtrueを返す", () => {
|
|
22
|
+
expect(isValidTransition("draft", "approved")).toBe(true);
|
|
23
|
+
expect(isValidTransition("draft", "deprecated")).toBe(true);
|
|
24
|
+
expect(isValidTransition("approved", "implemented")).toBe(true);
|
|
25
|
+
expect(isValidTransition("approved", "deprecated")).toBe(true);
|
|
26
|
+
expect(isValidTransition("implemented", "deprecated")).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
it("無効な遷移はfalseを返す", () => {
|
|
29
|
+
expect(isValidTransition("deprecated", "draft")).toBe(false);
|
|
30
|
+
expect(isValidTransition("implemented", "approved")).toBe(false);
|
|
31
|
+
expect(isValidTransition("implemented", "draft")).toBe(false);
|
|
32
|
+
expect(isValidTransition("approved", "draft")).toBe(false);
|
|
33
|
+
expect(isValidTransition("deprecated", "approved")).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
it("同一ステータスへの遷移はfalseを返す", () => {
|
|
36
|
+
const statuses = ["draft", "approved", "implemented", "deprecated"];
|
|
37
|
+
for (const status of statuses) {
|
|
38
|
+
expect(isValidTransition(status, status)).toBe(false);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe("getAvailableTransitions", () => {
|
|
43
|
+
it("各ステータスの遷移先を正しく返す", () => {
|
|
44
|
+
expect(getAvailableTransitions("draft")).toEqual(["approved", "deprecated"]);
|
|
45
|
+
expect(getAvailableTransitions("approved")).toEqual([
|
|
46
|
+
"implemented",
|
|
47
|
+
"deprecated",
|
|
48
|
+
]);
|
|
49
|
+
expect(getAvailableTransitions("implemented")).toEqual(["deprecated"]);
|
|
50
|
+
expect(getAvailableTransitions("deprecated")).toEqual([]);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=status-transitions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-transitions.test.js","sourceRoot":"","sources":["../../src/rules/status-transitions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAGjC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YAC1C,aAAa;YACb,YAAY;SACb,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QACvB,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,CAAC,iBAAiB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,iBAAiB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,CAAC,iBAAiB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,iBAAiB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,QAAQ,GAAa,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAC9E,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;QAC7E,MAAM,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;YAClD,aAAa;YACb,YAAY;SACb,CAAC,CAAC;QACH,MAAM,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const StatusSchema: z.ZodEnum<["draft", "approved", "implemented", "deprecated"]>;
|
|
3
|
+
export type Status = z.infer<typeof StatusSchema>;
|
|
4
|
+
export declare const PrioritySchema: z.ZodEnum<["low", "medium", "high"]>;
|
|
5
|
+
export type Priority = z.infer<typeof PrioritySchema>;
|
|
6
|
+
export declare const ComplexitySchema: z.ZodEnum<["small", "medium", "large", "xlarge"]>;
|
|
7
|
+
export type Complexity = z.infer<typeof ComplexitySchema>;
|
|
8
|
+
export declare const FormatTypeSchema: z.ZodEnum<["user-story", "ears", "free-form"]>;
|
|
9
|
+
export type FormatType = z.infer<typeof FormatTypeSchema>;
|
|
10
|
+
export declare const VersionHistoryEntrySchema: z.ZodObject<{
|
|
11
|
+
version: z.ZodString;
|
|
12
|
+
status: z.ZodEnum<["draft", "approved", "implemented", "deprecated"]>;
|
|
13
|
+
changedAt: z.ZodString;
|
|
14
|
+
summary: z.ZodString;
|
|
15
|
+
approvedAt: z.ZodOptional<z.ZodString>;
|
|
16
|
+
approvedBy: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
version: string;
|
|
19
|
+
status: "draft" | "approved" | "implemented" | "deprecated";
|
|
20
|
+
changedAt: string;
|
|
21
|
+
summary: string;
|
|
22
|
+
approvedAt?: string | undefined;
|
|
23
|
+
approvedBy?: string[] | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
version: string;
|
|
26
|
+
status: "draft" | "approved" | "implemented" | "deprecated";
|
|
27
|
+
changedAt: string;
|
|
28
|
+
summary: string;
|
|
29
|
+
approvedAt?: string | undefined;
|
|
30
|
+
approvedBy?: string[] | undefined;
|
|
31
|
+
}>;
|
|
32
|
+
export type VersionHistoryEntry = z.infer<typeof VersionHistoryEntrySchema>;
|
|
33
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY,+DAKvB,CAAC;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,MAAM,cAAc,sCAAoC,CAAC;AAChE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,gBAAgB,mDAAiD,CAAC;AAC/E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,gBAAgB,gDAA8C,CAAC;AAC5E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;EAOpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const StatusSchema = z.enum([
|
|
3
|
+
"draft",
|
|
4
|
+
"approved",
|
|
5
|
+
"implemented",
|
|
6
|
+
"deprecated",
|
|
7
|
+
]);
|
|
8
|
+
export const PrioritySchema = z.enum(["low", "medium", "high"]);
|
|
9
|
+
export const ComplexitySchema = z.enum(["small", "medium", "large", "xlarge"]);
|
|
10
|
+
export const FormatTypeSchema = z.enum(["user-story", "ears", "free-form"]);
|
|
11
|
+
export const VersionHistoryEntrySchema = z.object({
|
|
12
|
+
version: z.string(),
|
|
13
|
+
status: StatusSchema,
|
|
14
|
+
changedAt: z.string(),
|
|
15
|
+
summary: z.string(),
|
|
16
|
+
approvedAt: z.string().optional(),
|
|
17
|
+
approvedBy: z.array(z.string()).optional(),
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC;IACjC,OAAO;IACP,UAAU;IACV,aAAa;IACb,YAAY;CACb,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAGhE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAG/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AAG5E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,YAAY;IACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC"}
|