@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.
Files changed (107) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +38 -0
  3. package/dist/constants/index.d.ts +2 -0
  4. package/dist/constants/index.d.ts.map +1 -0
  5. package/dist/constants/index.js +2 -0
  6. package/dist/constants/index.js.map +1 -0
  7. package/dist/constants/paths.d.ts +13 -0
  8. package/dist/constants/paths.d.ts.map +1 -0
  9. package/dist/constants/paths.js +13 -0
  10. package/dist/constants/paths.js.map +1 -0
  11. package/dist/constants/paths.test.d.ts +2 -0
  12. package/dist/constants/paths.test.d.ts.map +1 -0
  13. package/dist/constants/paths.test.js +11 -0
  14. package/dist/constants/paths.test.js.map +1 -0
  15. package/dist/index.d.ts +7 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +7 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/rules/consistency.d.ts +12 -0
  20. package/dist/rules/consistency.d.ts.map +1 -0
  21. package/dist/rules/consistency.js +34 -0
  22. package/dist/rules/consistency.js.map +1 -0
  23. package/dist/rules/consistency.test.d.ts +2 -0
  24. package/dist/rules/consistency.test.d.ts.map +1 -0
  25. package/dist/rules/consistency.test.js +97 -0
  26. package/dist/rules/consistency.test.js.map +1 -0
  27. package/dist/rules/index.d.ts +3 -0
  28. package/dist/rules/index.d.ts.map +1 -0
  29. package/dist/rules/index.js +3 -0
  30. package/dist/rules/index.js.map +1 -0
  31. package/dist/rules/status-transitions.d.ts +5 -0
  32. package/dist/rules/status-transitions.d.ts.map +1 -0
  33. package/dist/rules/status-transitions.js +13 -0
  34. package/dist/rules/status-transitions.js.map +1 -0
  35. package/dist/rules/status-transitions.test.d.ts +2 -0
  36. package/dist/rules/status-transitions.test.d.ts.map +1 -0
  37. package/dist/rules/status-transitions.test.js +53 -0
  38. package/dist/rules/status-transitions.test.js.map +1 -0
  39. package/dist/schemas/common.d.ts +33 -0
  40. package/dist/schemas/common.d.ts.map +1 -0
  41. package/dist/schemas/common.js +19 -0
  42. package/dist/schemas/common.js.map +1 -0
  43. package/dist/schemas/feedback.d.ts +249 -0
  44. package/dist/schemas/feedback.d.ts.map +1 -0
  45. package/dist/schemas/feedback.js +39 -0
  46. package/dist/schemas/feedback.js.map +1 -0
  47. package/dist/schemas/feedback.test.d.ts +2 -0
  48. package/dist/schemas/feedback.test.d.ts.map +1 -0
  49. package/dist/schemas/feedback.test.js +234 -0
  50. package/dist/schemas/feedback.test.js.map +1 -0
  51. package/dist/schemas/index.d.ts +8 -0
  52. package/dist/schemas/index.d.ts.map +1 -0
  53. package/dist/schemas/index.js +8 -0
  54. package/dist/schemas/index.js.map +1 -0
  55. package/dist/schemas/project-context.d.ts +116 -0
  56. package/dist/schemas/project-context.d.ts.map +1 -0
  57. package/dist/schemas/project-context.js +25 -0
  58. package/dist/schemas/project-context.js.map +1 -0
  59. package/dist/schemas/requirement.d.ts +242 -0
  60. package/dist/schemas/requirement.d.ts.map +1 -0
  61. package/dist/schemas/requirement.js +52 -0
  62. package/dist/schemas/requirement.js.map +1 -0
  63. package/dist/schemas/requirement.test.d.ts +2 -0
  64. package/dist/schemas/requirement.test.d.ts.map +1 -0
  65. package/dist/schemas/requirement.test.js +38 -0
  66. package/dist/schemas/requirement.test.js.map +1 -0
  67. package/dist/schemas/specification.d.ts +217 -0
  68. package/dist/schemas/specification.d.ts.map +1 -0
  69. package/dist/schemas/specification.js +32 -0
  70. package/dist/schemas/specification.js.map +1 -0
  71. package/dist/schemas/specification.test.d.ts +2 -0
  72. package/dist/schemas/specification.test.d.ts.map +1 -0
  73. package/dist/schemas/specification.test.js +89 -0
  74. package/dist/schemas/specification.test.js.map +1 -0
  75. package/dist/schemas/task.d.ts +177 -0
  76. package/dist/schemas/task.d.ts.map +1 -0
  77. package/dist/schemas/task.js +29 -0
  78. package/dist/schemas/task.js.map +1 -0
  79. package/dist/schemas/task.test.d.ts +2 -0
  80. package/dist/schemas/task.test.d.ts.map +1 -0
  81. package/dist/schemas/task.test.js +203 -0
  82. package/dist/schemas/task.test.js.map +1 -0
  83. package/dist/schemas/validation.d.ts +174 -0
  84. package/dist/schemas/validation.d.ts.map +1 -0
  85. package/dist/schemas/validation.js +31 -0
  86. package/dist/schemas/validation.js.map +1 -0
  87. package/dist/utils/zod-error-formatter.d.ts +25 -0
  88. package/dist/utils/zod-error-formatter.d.ts.map +1 -0
  89. package/dist/utils/zod-error-formatter.js +115 -0
  90. package/dist/utils/zod-error-formatter.js.map +1 -0
  91. package/dist/utils/zod-error-formatter.test.d.ts +2 -0
  92. package/dist/utils/zod-error-formatter.test.d.ts.map +1 -0
  93. package/dist/utils/zod-error-formatter.test.js +314 -0
  94. package/dist/utils/zod-error-formatter.test.js.map +1 -0
  95. package/dist/validation/ambiguous-phrases.d.ts +11 -0
  96. package/dist/validation/ambiguous-phrases.d.ts.map +1 -0
  97. package/dist/validation/ambiguous-phrases.js +56 -0
  98. package/dist/validation/ambiguous-phrases.js.map +1 -0
  99. package/dist/validation/smart-scoring.d.ts +15 -0
  100. package/dist/validation/smart-scoring.d.ts.map +1 -0
  101. package/dist/validation/smart-scoring.js +225 -0
  102. package/dist/validation/smart-scoring.js.map +1 -0
  103. package/dist/validation/smart-scoring.test.d.ts +2 -0
  104. package/dist/validation/smart-scoring.test.d.ts.map +1 -0
  105. package/dist/validation/smart-scoring.test.js +136 -0
  106. package/dist/validation/smart-scoring.test.js.map +1 -0
  107. 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
+ [![npm](https://img.shields.io/npm/v/@reqord/shared)](https://www.npmjs.com/package/@reqord/shared)
6
+ [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](../../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,2 @@
1
+ export { REQORD_DIR, CONTEXT_DIR, REQUIREMENTS_DIR, SPECIFICATIONS_DIR, SETTINGS_DIR, TEMPLATES_DIR, RULES_DIR, ASSETS_DIR, DOMAIN_DIR, ISSUE_TEMPLATES_DIR, FEEDBACK_DIR, ISSUES_DIR, } from "./paths.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { REQORD_DIR, CONTEXT_DIR, REQUIREMENTS_DIR, SPECIFICATIONS_DIR, SETTINGS_DIR, TEMPLATES_DIR, RULES_DIR, ASSETS_DIR, DOMAIN_DIR, ISSUE_TEMPLATES_DIR, FEEDBACK_DIR, ISSUES_DIR, } from "./paths.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=paths.test.d.ts.map
@@ -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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=consistency.test.d.ts.map
@@ -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,3 @@
1
+ export * from "./status-transitions.js";
2
+ export * from "./consistency.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export * from "./status-transitions.js";
2
+ export * from "./consistency.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=status-transitions.test.d.ts.map
@@ -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"}