@gluecharm-lab/easyspecs-cli 0.0.3

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 (66) hide show
  1. package/dist/main.cjs +19663 -0
  2. package/dist/main.cjs.map +7 -0
  3. package/package.json +27 -0
  4. package/resources/opencode-agents/MERMAID.md +20 -0
  5. package/resources/opencode-agents/README.md +67 -0
  6. package/resources/opencode-agents/agent-ace-curator.md +31 -0
  7. package/resources/opencode-agents/agent-ace-reflector.md +16 -0
  8. package/resources/opencode-agents/agent-ace-trace-recorder.md +33 -0
  9. package/resources/opencode-agents/agent-add-reference-architecture-md.md +22 -0
  10. package/resources/opencode-agents/agent-add-reference-project-md.md +21 -0
  11. package/resources/opencode-agents/agent-classify-unreferenced-file.md +61 -0
  12. package/resources/opencode-agents/agent-list-data-model.md +243 -0
  13. package/resources/opencode-agents/agent-list-entity-fields.md +191 -0
  14. package/resources/opencode-agents/agent-list-experiences.md +252 -0
  15. package/resources/opencode-agents/agent-list-features.md +218 -0
  16. package/resources/opencode-agents/agent-list-scenarios.md +179 -0
  17. package/resources/opencode-agents/agent-list-services.md +208 -0
  18. package/resources/opencode-agents/agent-list-tech-stack.md +176 -0
  19. package/resources/opencode-agents/agent-list-use-cases.md +179 -0
  20. package/resources/opencode-agents/agent-md-architecture.md +139 -0
  21. package/resources/opencode-agents/agent-md-docs-project.md +172 -0
  22. package/resources/opencode-agents/agent-md-entity-detail.md +86 -0
  23. package/resources/opencode-agents/agent-md-feature-detail.md +95 -0
  24. package/resources/opencode-agents/agent-md-field-detail.md +80 -0
  25. package/resources/opencode-agents/agent-md-interaction-detail.md +84 -0
  26. package/resources/opencode-agents/agent-md-method-detail.md +86 -0
  27. package/resources/opencode-agents/agent-md-relationship-detail.md +80 -0
  28. package/resources/opencode-agents/agent-md-scenario-detail.md +92 -0
  29. package/resources/opencode-agents/agent-md-service-detail.md +88 -0
  30. package/resources/opencode-agents/agent-md-tool-detail.md +82 -0
  31. package/resources/opencode-agents/agent-md-use-case-detail.md +165 -0
  32. package/resources/opencode-agents/agent-md-view-detail.md +117 -0
  33. package/resources/opencode-agents/agent-reference-coverage-execution-report.md +28 -0
  34. package/resources/opencode-agents/agent-repo-surface-scan.md +136 -0
  35. package/resources/opencode-agents/agent-resolve-open-question.md +42 -0
  36. package/resources/opencode-agents/agent-review-data-model-list.md +26 -0
  37. package/resources/opencode-agents/agent-review-entity-fields-list.md +26 -0
  38. package/resources/opencode-agents/agent-review-experiences-list.md +72 -0
  39. package/resources/opencode-agents/agent-review-features-list.md +52 -0
  40. package/resources/opencode-agents/agent-review-scenarios-list.md +28 -0
  41. package/resources/opencode-agents/agent-review-services-list.md +26 -0
  42. package/resources/opencode-agents/agent-review-tech-stack-list.md +26 -0
  43. package/resources/opencode-agents/agent-review-use-cases-list.md +28 -0
  44. package/resources/opencode-agents/agent-triage-unreferenced-coordination.md +35 -0
  45. package/resources/schemas/ace/ace-agent-overlay.schema.json +29 -0
  46. package/resources/schemas/ace/ace-curator-delta.schema.json +51 -0
  47. package/resources/schemas/ace/ace-generator-trace.schema.json +134 -0
  48. package/resources/schemas/ace/ace-playbook.schema.json +36 -0
  49. package/resources/schemas/ace/ace-reflector-lessons.schema.json +77 -0
  50. package/resources/schemas/context-lists/coordination-duplicates-report.schema.json +97 -0
  51. package/resources/schemas/context-lists/coverage-reference-validation.schema.json +125 -0
  52. package/resources/schemas/context-lists/data-model-list.schema.json +157 -0
  53. package/resources/schemas/context-lists/entity-fields-list.schema.json +104 -0
  54. package/resources/schemas/context-lists/experiences-list.schema.json +132 -0
  55. package/resources/schemas/context-lists/features-list.schema.json +109 -0
  56. package/resources/schemas/context-lists/repo-surface-scan.schema.json +150 -0
  57. package/resources/schemas/context-lists/scenarios-list.schema.json +107 -0
  58. package/resources/schemas/context-lists/services-list.schema.json +132 -0
  59. package/resources/schemas/context-lists/tech-stack-list.schema.json +108 -0
  60. package/resources/schemas/context-lists/use-cases-list.schema.json +108 -0
  61. package/resources/schemas/context-lists/zero-reference-classifier-record.schema.json +61 -0
  62. package/resources/schemas/context-lists/zero-reference-routing.schema.json +98 -0
  63. package/resources/schemas/context-lists/zero-reference-triage-record.schema.json +57 -0
  64. package/resources/schemas/context-lists/zero-reference-triage.schema.json +69 -0
  65. package/resources/schemas/index-application-context.schema.json +202 -0
  66. package/resources/schemas/srs-impact.schema.json +187 -0
@@ -0,0 +1,109 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/features-list.schema.json",
4
+ "title": "features-list",
5
+ "$defs": {
6
+ "sourceReference": {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": ["path", "startLine", "endLine"],
10
+ "properties": {
11
+ "path": {
12
+ "type": "string",
13
+ "minLength": 1,
14
+ "pattern": "^[^/]+(/[^/]+)*$",
15
+ "description": "Repo-relative path to a single file (forward slashes). Not a directory: no trailing slash; list each file in a folder as its own sourceReferences entry."
16
+ },
17
+ "startLine": {
18
+ "type": "integer",
19
+ "minimum": 1,
20
+ "description": "1-based inclusive start line."
21
+ },
22
+ "endLine": {
23
+ "type": "integer",
24
+ "minimum": 1,
25
+ "description": "1-based inclusive end line; should be >= startLine."
26
+ },
27
+ "note": {
28
+ "type": "string",
29
+ "description": "Optional short label for this evidence span."
30
+ }
31
+ }
32
+ },
33
+ "sourceReferenceList": {
34
+ "type": "array",
35
+ "description": "Evidence spans: each item references one file + line range, never a folder path.",
36
+ "items": { "$ref": "#/$defs/sourceReference" }
37
+ }
38
+ },
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "required": ["features"],
42
+ "properties": {
43
+ "kind": {
44
+ "type": "string",
45
+ "const": "easyspecs.features-list",
46
+ "description": "Optional coordination document id; when present must be this value."
47
+ },
48
+ "version": {
49
+ "type": "integer",
50
+ "minimum": 1,
51
+ "description": "Optional coordination format version when present."
52
+ },
53
+ "features": {
54
+ "type": "array",
55
+ "items": {
56
+ "type": "object",
57
+ "additionalProperties": true,
58
+ "required": ["code", "name", "slug", "sourceReferences"],
59
+ "properties": {
60
+ "code": {
61
+ "type": "string",
62
+ "pattern": "^FE-[0-9]+$",
63
+ "description": "Stable feature code; FE- plus one or more digits (e.g. FE-1, FE-01, FE-120)."
64
+ },
65
+ "name": { "type": "string", "minLength": 1 },
66
+ "slug": {
67
+ "type": "string",
68
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
69
+ "description": "URL-safe slug for FE-<nn>-<slug>.md basename."
70
+ },
71
+ "description": { "type": "string" },
72
+ "order": { "type": "integer" },
73
+ "featureKind": {
74
+ "type": "string",
75
+ "enum": ["product", "infrastructure", "testing"],
76
+ "description": "SRS-27: classify product vs platform/ops vs verification-only surface; omit to treat as product in consumers that care."
77
+ },
78
+ "sourceReferences": {
79
+ "type": "array",
80
+ "minItems": 1,
81
+ "description": "Required: at least one file + line range per feature row.",
82
+ "items": { "$ref": "#/$defs/sourceReference" }
83
+ }
84
+ }
85
+ }
86
+ },
87
+ "revisionLog": {
88
+ "type": "array",
89
+ "description": "Append-only log of substantive edits; add an entry whenever this pass changes rows, merges, or refines the coordination file.",
90
+ "items": {
91
+ "type": "object",
92
+ "additionalProperties": false,
93
+ "required": ["summary"],
94
+ "properties": {
95
+ "at": {
96
+ "type": "string",
97
+ "description": "ISO-8601 timestamp when known."
98
+ },
99
+ "summary": {
100
+ "type": "string",
101
+ "minLength": 1,
102
+ "maxLength": 2000,
103
+ "description": "What was added, changed, or refined in this write."
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
@@ -0,0 +1,150 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/repo-surface-scan.schema.json",
4
+ "title": "repo-surface-scan",
5
+ "$defs": {
6
+ "sourceReference": {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": ["path", "startLine", "endLine"],
10
+ "properties": {
11
+ "path": {
12
+ "type": "string",
13
+ "minLength": 1,
14
+ "pattern": "^[^/]+(/[^/]+)*$",
15
+ "description": "Repo-relative path to a single file (forward slashes). Not a directory."
16
+ },
17
+ "startLine": {
18
+ "type": "integer",
19
+ "minimum": 1,
20
+ "description": "1-based inclusive start line."
21
+ },
22
+ "endLine": {
23
+ "type": "integer",
24
+ "minimum": 1,
25
+ "description": "1-based inclusive end line; should be >= startLine."
26
+ },
27
+ "note": {
28
+ "type": "string",
29
+ "description": "Optional short label for this evidence span."
30
+ }
31
+ }
32
+ }
33
+ },
34
+ "type": "object",
35
+ "additionalProperties": false,
36
+ "required": ["hasUi", "hasBackend"],
37
+ "properties": {
38
+ "kind": {
39
+ "type": "string",
40
+ "const": "easyspecs.repo-surface-scan",
41
+ "description": "Optional coordination document id; when present must be this value."
42
+ },
43
+ "version": {
44
+ "type": "integer",
45
+ "minimum": 1,
46
+ "description": "Optional coordination format version when present."
47
+ },
48
+ "hasUi": { "type": "boolean" },
49
+ "hasBackend": { "type": "boolean" },
50
+ "uiSourceReferences": {
51
+ "type": "array",
52
+ "items": { "$ref": "#/$defs/sourceReference" }
53
+ },
54
+ "uiAbsenceReason": {
55
+ "type": "string",
56
+ "minLength": 1,
57
+ "maxLength": 2000
58
+ },
59
+ "backendSourceReferences": {
60
+ "type": "array",
61
+ "items": { "$ref": "#/$defs/sourceReference" }
62
+ },
63
+ "backendAbsenceReason": {
64
+ "type": "string",
65
+ "minLength": 1,
66
+ "maxLength": 2000
67
+ },
68
+ "revisionLog": {
69
+ "type": "array",
70
+ "description": "Append-only log of substantive edits; add an entry whenever this pass changes assessment fields or evidence.",
71
+ "items": {
72
+ "type": "object",
73
+ "additionalProperties": false,
74
+ "required": ["summary"],
75
+ "properties": {
76
+ "at": {
77
+ "type": "string",
78
+ "description": "ISO-8601 timestamp when known."
79
+ },
80
+ "summary": {
81
+ "type": "string",
82
+ "minLength": 1,
83
+ "maxLength": 2000,
84
+ "description": "What was added, changed, or refined in this write."
85
+ }
86
+ }
87
+ }
88
+ }
89
+ },
90
+ "allOf": [
91
+ {
92
+ "if": { "properties": { "hasUi": { "const": true } } },
93
+ "then": {
94
+ "required": ["uiSourceReferences"],
95
+ "properties": {
96
+ "uiSourceReferences": {
97
+ "type": "array",
98
+ "minItems": 1,
99
+ "items": { "$ref": "#/$defs/sourceReference" }
100
+ }
101
+ },
102
+ "not": { "required": ["uiAbsenceReason"] }
103
+ },
104
+ "else": {
105
+ "required": ["uiAbsenceReason"],
106
+ "allOf": [
107
+ {
108
+ "anyOf": [
109
+ { "not": { "required": ["uiSourceReferences"] } },
110
+ {
111
+ "properties": {
112
+ "uiSourceReferences": { "type": "array", "maxItems": 0 }
113
+ }
114
+ }
115
+ ]
116
+ }
117
+ ]
118
+ }
119
+ },
120
+ {
121
+ "if": { "properties": { "hasBackend": { "const": true } } },
122
+ "then": {
123
+ "required": ["backendSourceReferences"],
124
+ "properties": {
125
+ "backendSourceReferences": {
126
+ "type": "array",
127
+ "minItems": 1,
128
+ "items": { "$ref": "#/$defs/sourceReference" }
129
+ }
130
+ },
131
+ "not": { "required": ["backendAbsenceReason"] }
132
+ },
133
+ "else": {
134
+ "required": ["backendAbsenceReason"],
135
+ "allOf": [
136
+ {
137
+ "anyOf": [
138
+ { "not": { "required": ["backendSourceReferences"] } },
139
+ {
140
+ "properties": {
141
+ "backendSourceReferences": { "type": "array", "maxItems": 0 }
142
+ }
143
+ }
144
+ ]
145
+ }
146
+ ]
147
+ }
148
+ }
149
+ ]
150
+ }
@@ -0,0 +1,107 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/scenarios-list.schema.json",
4
+ "title": "FE-nn_UC-uu-scenarios-list",
5
+ "$defs": {
6
+ "sourceReference": {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": ["path", "startLine", "endLine"],
10
+ "properties": {
11
+ "path": {
12
+ "type": "string",
13
+ "minLength": 1,
14
+ "pattern": "^[^/]+(/[^/]+)*$",
15
+ "description": "Repo-relative path to a single file (forward slashes). Not a directory: no trailing slash; list each file in a folder as its own sourceReferences entry."
16
+ },
17
+ "startLine": {
18
+ "type": "integer",
19
+ "minimum": 1,
20
+ "description": "1-based inclusive start line."
21
+ },
22
+ "endLine": {
23
+ "type": "integer",
24
+ "minimum": 1,
25
+ "description": "1-based inclusive end line; should be >= startLine."
26
+ },
27
+ "note": {
28
+ "type": "string",
29
+ "description": "Optional short label for this evidence span."
30
+ }
31
+ }
32
+ },
33
+ "sourceReferenceList": {
34
+ "type": "array",
35
+ "description": "Evidence spans: each item references one file + line range, never a folder path.",
36
+ "items": { "$ref": "#/$defs/sourceReference" }
37
+ }
38
+ },
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "required": ["featureCode", "useCaseCode", "scenarios"],
42
+ "properties": {
43
+ "kind": {
44
+ "type": "string",
45
+ "const": "easyspecs.scenarios-list",
46
+ "description": "Optional coordination document id; when present must be this value."
47
+ },
48
+ "version": {
49
+ "type": "integer",
50
+ "minimum": 1,
51
+ "description": "Optional coordination format version when present."
52
+ },
53
+ "featureCode": {
54
+ "type": "string",
55
+ "pattern": "^FE-[0-9]+$",
56
+ "description": "Feature code from features-list.json."
57
+ },
58
+ "useCaseCode": {
59
+ "type": "string",
60
+ "pattern": "^UC-[0-9]+$"
61
+ },
62
+ "scenarios": {
63
+ "type": "array",
64
+ "items": {
65
+ "type": "object",
66
+ "additionalProperties": true,
67
+ "required": ["code", "name", "sourceReferences"],
68
+ "properties": {
69
+ "code": {
70
+ "type": "string",
71
+ "pattern": "^SC-[0-9]+$"
72
+ },
73
+ "name": { "type": "string", "minLength": 1 },
74
+ "description": { "type": "string" },
75
+ "order": { "type": "integer" },
76
+ "sourceReferences": {
77
+ "type": "array",
78
+ "minItems": 1,
79
+ "description": "Required: at least one file + line range per scenario row.",
80
+ "items": { "$ref": "#/$defs/sourceReference" }
81
+ }
82
+ }
83
+ }
84
+ },
85
+ "revisionLog": {
86
+ "type": "array",
87
+ "description": "Append-only log of substantive edits; add an entry whenever this pass changes rows, merges, or refines the coordination file.",
88
+ "items": {
89
+ "type": "object",
90
+ "additionalProperties": false,
91
+ "required": ["summary"],
92
+ "properties": {
93
+ "at": {
94
+ "type": "string",
95
+ "description": "ISO-8601 timestamp when known."
96
+ },
97
+ "summary": {
98
+ "type": "string",
99
+ "minLength": 1,
100
+ "maxLength": 2000,
101
+ "description": "What was added, changed, or refined in this write."
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
@@ -0,0 +1,132 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/services-list.schema.json",
4
+ "title": "services-list",
5
+ "$defs": {
6
+ "sourceReference": {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": ["path", "startLine", "endLine"],
10
+ "properties": {
11
+ "path": {
12
+ "type": "string",
13
+ "minLength": 1,
14
+ "pattern": "^[^/]+(/[^/]+)*$",
15
+ "description": "Repo-relative path to a single file (forward slashes). Not a directory: no trailing slash; list each file in a folder as its own sourceReferences entry."
16
+ },
17
+ "startLine": {
18
+ "type": "integer",
19
+ "minimum": 1,
20
+ "description": "1-based inclusive start line."
21
+ },
22
+ "endLine": {
23
+ "type": "integer",
24
+ "minimum": 1,
25
+ "description": "1-based inclusive end line; should be >= startLine."
26
+ },
27
+ "note": {
28
+ "type": "string",
29
+ "description": "Optional short label for this evidence span."
30
+ }
31
+ }
32
+ },
33
+ "sourceReferenceList": {
34
+ "type": "array",
35
+ "description": "Evidence spans: each item references one file + line range, never a folder path.",
36
+ "items": { "$ref": "#/$defs/sourceReference" }
37
+ },
38
+ "methodItem": {
39
+ "type": "object",
40
+ "additionalProperties": true,
41
+ "required": ["code", "name", "sourceReferences"],
42
+ "properties": {
43
+ "code": {
44
+ "type": "string",
45
+ "pattern": "^ME-[0-9]+$"
46
+ },
47
+ "name": { "type": "string", "minLength": 1 },
48
+ "slug": {
49
+ "type": "string",
50
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
51
+ "description": "Recommended for SV-<nn>_ME-<mm>-<slug>.md detail basenames."
52
+ },
53
+ "description": { "type": "string" },
54
+ "order": { "type": "integer" },
55
+ "sourceReferences": {
56
+ "type": "array",
57
+ "minItems": 1,
58
+ "description": "Required: at least one file + line range per method row.",
59
+ "items": { "$ref": "#/$defs/sourceReference" }
60
+ }
61
+ }
62
+ }
63
+ },
64
+ "type": "object",
65
+ "additionalProperties": false,
66
+ "required": ["services"],
67
+ "properties": {
68
+ "kind": {
69
+ "type": "string",
70
+ "const": "easyspecs.services-list",
71
+ "description": "Optional coordination document id; when present must be this value."
72
+ },
73
+ "version": {
74
+ "type": "integer",
75
+ "minimum": 1,
76
+ "description": "Optional coordination format version when present."
77
+ },
78
+ "services": {
79
+ "type": "array",
80
+ "items": {
81
+ "type": "object",
82
+ "additionalProperties": true,
83
+ "required": ["code", "name", "sourceReferences"],
84
+ "properties": {
85
+ "code": {
86
+ "type": "string",
87
+ "pattern": "^SV-[0-9]+$"
88
+ },
89
+ "name": { "type": "string", "minLength": 1 },
90
+ "slug": {
91
+ "type": "string",
92
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
93
+ "description": "Recommended for SV-<nn>-<slug>.md detail basenames."
94
+ },
95
+ "description": { "type": "string" },
96
+ "order": { "type": "integer" },
97
+ "sourceReferences": {
98
+ "type": "array",
99
+ "minItems": 1,
100
+ "description": "Required: at least one file + line range per service row.",
101
+ "items": { "$ref": "#/$defs/sourceReference" }
102
+ },
103
+ "methods": {
104
+ "type": "array",
105
+ "items": { "$ref": "#/$defs/methodItem" }
106
+ }
107
+ }
108
+ }
109
+ },
110
+ "revisionLog": {
111
+ "type": "array",
112
+ "description": "Append-only log of substantive edits; add an entry whenever this pass changes rows, merges, or refines the coordination file.",
113
+ "items": {
114
+ "type": "object",
115
+ "additionalProperties": false,
116
+ "required": ["summary"],
117
+ "properties": {
118
+ "at": {
119
+ "type": "string",
120
+ "description": "ISO-8601 timestamp when known."
121
+ },
122
+ "summary": {
123
+ "type": "string",
124
+ "minLength": 1,
125
+ "maxLength": 2000,
126
+ "description": "What was added, changed, or refined in this write."
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/tech-stack-list.schema.json",
4
+ "title": "tech-stack-list",
5
+ "$defs": {
6
+ "sourceReference": {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": ["path", "startLine", "endLine"],
10
+ "properties": {
11
+ "path": {
12
+ "type": "string",
13
+ "minLength": 1,
14
+ "pattern": "^[^/]+(/[^/]+)*$",
15
+ "description": "Repo-relative path to a single file (forward slashes). Not a directory: no trailing slash; list each file in a folder as its own sourceReferences entry."
16
+ },
17
+ "startLine": {
18
+ "type": "integer",
19
+ "minimum": 1,
20
+ "description": "1-based inclusive start line."
21
+ },
22
+ "endLine": {
23
+ "type": "integer",
24
+ "minimum": 1,
25
+ "description": "1-based inclusive end line; should be >= startLine."
26
+ },
27
+ "note": {
28
+ "type": "string",
29
+ "description": "Optional short label for this evidence span."
30
+ }
31
+ }
32
+ },
33
+ "sourceReferenceList": {
34
+ "type": "array",
35
+ "description": "Evidence spans: each item references one file + line range, never a folder path.",
36
+ "items": { "$ref": "#/$defs/sourceReference" }
37
+ }
38
+ },
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "required": ["tools"],
42
+ "properties": {
43
+ "kind": {
44
+ "type": "string",
45
+ "const": "easyspecs.tech-stack-list",
46
+ "description": "Optional coordination document id; when present must be this value."
47
+ },
48
+ "version": {
49
+ "type": "integer",
50
+ "minimum": 1,
51
+ "description": "Optional coordination format version when present."
52
+ },
53
+ "tools": {
54
+ "type": "array",
55
+ "items": {
56
+ "type": "object",
57
+ "additionalProperties": true,
58
+ "required": ["code", "name", "sourceReferences"],
59
+ "properties": {
60
+ "code": {
61
+ "type": "string",
62
+ "pattern": "^TS-[0-9]+$"
63
+ },
64
+ "name": { "type": "string", "minLength": 1 },
65
+ "slug": {
66
+ "type": "string",
67
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
68
+ "description": "Recommended for TS-<nn>-<slug>.md detail basenames."
69
+ },
70
+ "category": {
71
+ "type": "string",
72
+ "description": "e.g. runtime, framework, infra, library"
73
+ },
74
+ "version": { "type": "string", "description": "Tool or library version string (not coordination `version`)." },
75
+ "description": { "type": "string" },
76
+ "order": { "type": "integer" },
77
+ "sourceReferences": {
78
+ "type": "array",
79
+ "minItems": 1,
80
+ "description": "Required: at least one repo file + line range grounding this tool (e.g. package.json, lockfile, tsconfig).",
81
+ "items": { "$ref": "#/$defs/sourceReference" }
82
+ }
83
+ }
84
+ }
85
+ },
86
+ "revisionLog": {
87
+ "type": "array",
88
+ "description": "Append-only log of substantive edits; add an entry whenever this pass changes rows, merges, or refines the coordination file.",
89
+ "items": {
90
+ "type": "object",
91
+ "additionalProperties": false,
92
+ "required": ["summary"],
93
+ "properties": {
94
+ "at": {
95
+ "type": "string",
96
+ "description": "ISO-8601 timestamp when known."
97
+ },
98
+ "summary": {
99
+ "type": "string",
100
+ "minLength": 1,
101
+ "maxLength": 2000,
102
+ "description": "What was added, changed, or refined in this write."
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }