@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,108 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/use-cases-list.schema.json",
4
+ "title": "FE-nn-use-cases-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", "useCases"],
42
+ "properties": {
43
+ "kind": {
44
+ "type": "string",
45
+ "const": "easyspecs.use-cases-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
+ "useCases": {
59
+ "type": "array",
60
+ "items": {
61
+ "type": "object",
62
+ "additionalProperties": true,
63
+ "required": ["code", "name", "sourceReferences"],
64
+ "properties": {
65
+ "code": {
66
+ "type": "string",
67
+ "pattern": "^UC-[0-9]+$"
68
+ },
69
+ "name": { "type": "string", "minLength": 1 },
70
+ "slug": {
71
+ "type": "string",
72
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
73
+ "description": "Optional; for FE-nn_UC-uu-<slug>.md if PLAN uses slugs on use cases."
74
+ },
75
+ "description": { "type": "string" },
76
+ "order": { "type": "integer" },
77
+ "sourceReferences": {
78
+ "type": "array",
79
+ "minItems": 1,
80
+ "description": "Required: at least one file + line range per use case row.",
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
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/zero-reference-classifier-record.schema.json",
4
+ "title": "zero-reference-classifier-record",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["filePath", "fileKind", "projectRelationSummary", "routing"],
8
+ "properties": {
9
+ "filePath": {
10
+ "type": "string",
11
+ "minLength": 1,
12
+ "description": "Repo-relative POSIX path (forward slashes), consistent with SRS-29."
13
+ },
14
+ "fileKind": {
15
+ "type": "string",
16
+ "enum": [
17
+ "source",
18
+ "test",
19
+ "config",
20
+ "script",
21
+ "data",
22
+ "documentation",
23
+ "asset_excluded_by_srs29",
24
+ "unknown"
25
+ ],
26
+ "description": "data = CSV/TSV/spreadsheets/dataset exports; documentation = standalone prose (.md/.txt) not yet cited."
27
+ },
28
+ "projectRelationSummary": {
29
+ "type": "string",
30
+ "minLength": 1,
31
+ "maxLength": 4000
32
+ },
33
+ "routing": {
34
+ "type": "string",
35
+ "enum": [
36
+ "project",
37
+ "architecture",
38
+ "feature",
39
+ "experiences",
40
+ "services",
41
+ "data_models",
42
+ "no_action"
43
+ ],
44
+ "description": "Top-level remediation bucket (SRS-30 v0.6). ORM/table units → data_models; product overview → project; system structure → architecture."
45
+ },
46
+ "rationale": {
47
+ "type": "string",
48
+ "minLength": 1,
49
+ "maxLength": 4000
50
+ }
51
+ },
52
+ "allOf": [
53
+ {
54
+ "if": {
55
+ "properties": { "routing": { "const": "no_action" } },
56
+ "required": ["routing"]
57
+ },
58
+ "then": { "required": ["rationale"] }
59
+ }
60
+ ]
61
+ }
@@ -0,0 +1,98 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/zero-reference-routing.schema.json",
4
+ "title": "zero-reference-routing",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "records"],
8
+ "properties": {
9
+ "schemaVersion": {
10
+ "type": "string",
11
+ "const": "1"
12
+ },
13
+ "coverageReferenceGeneratedAt": {
14
+ "type": "string",
15
+ "description": "ISO-8601 from coverage-reference-validation.json when last aligned."
16
+ },
17
+ "records": {
18
+ "type": "object",
19
+ "description": "Keys are repo-relative file paths; values are classifier records plus merge metadata.",
20
+ "additionalProperties": {
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": [
24
+ "filePath",
25
+ "fileKind",
26
+ "projectRelationSummary",
27
+ "routing",
28
+ "generatedAt",
29
+ "classifierAgentStem"
30
+ ],
31
+ "properties": {
32
+ "filePath": { "type": "string", "minLength": 1 },
33
+ "fileKind": {
34
+ "type": "string",
35
+ "enum": [
36
+ "source",
37
+ "test",
38
+ "config",
39
+ "script",
40
+ "data",
41
+ "documentation",
42
+ "asset_excluded_by_srs29",
43
+ "unknown"
44
+ ]
45
+ },
46
+ "projectRelationSummary": { "type": "string", "minLength": 1, "maxLength": 4000 },
47
+ "routing": {
48
+ "type": "string",
49
+ "enum": [
50
+ "project",
51
+ "architecture",
52
+ "feature",
53
+ "experiences",
54
+ "services",
55
+ "data_models",
56
+ "no_action",
57
+ "document_project_md",
58
+ "document_architecture_md",
59
+ "coordination_follow_up"
60
+ ]
61
+ },
62
+ "coordinationScope": {
63
+ "type": "string",
64
+ "enum": [
65
+ "feature",
66
+ "use_case",
67
+ "scenario",
68
+ "service",
69
+ "experience",
70
+ "behavior",
71
+ "data_model",
72
+ "field_domain"
73
+ ]
74
+ },
75
+ "rationale": { "type": "string", "minLength": 1, "maxLength": 4000 },
76
+ "generatedAt": { "type": "string", "minLength": 1 },
77
+ "classifierAgentStem": { "type": "string", "minLength": 1 }
78
+ },
79
+ "allOf": [
80
+ {
81
+ "if": {
82
+ "properties": { "routing": { "const": "no_action" } },
83
+ "required": ["routing"]
84
+ },
85
+ "then": { "required": ["rationale"] }
86
+ },
87
+ {
88
+ "if": {
89
+ "properties": { "routing": { "const": "coordination_follow_up" } },
90
+ "required": ["routing"]
91
+ },
92
+ "then": { "required": ["coordinationScope"] }
93
+ }
94
+ ]
95
+ }
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/zero-reference-triage-record.schema.json",
4
+ "title": "zero-reference-triage-record",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["filePath", "coordinationScope", "decision", "evidenceNotes"],
8
+ "properties": {
9
+ "filePath": { "type": "string", "minLength": 1 },
10
+ "coordinationScope": {
11
+ "type": "string",
12
+ "enum": ["feature", "experience", "service", "data_model"],
13
+ "description": "Must match stage-1 routing: feature | experiences | services | data_models → feature | experience | service | data_model."
14
+ },
15
+ "decision": {
16
+ "type": "string",
17
+ "enum": ["new_item", "enrich_existing", "defer", "no_action"]
18
+ },
19
+ "targetItemRef": {
20
+ "type": "string",
21
+ "minLength": 1,
22
+ "description": "Stable id e.g. FE-01 when decision is enrich_existing."
23
+ },
24
+ "proposedSummary": { "type": "string", "minLength": 1, "maxLength": 4000 },
25
+ "proposedCode": {
26
+ "type": "string",
27
+ "pattern": "^(FE|XP|SV|DM)-[0-9]+$",
28
+ "description": "Optional explicit list code for new_item (FE/XP/SV/DM prefix matches scope)."
29
+ },
30
+ "proposedSlug": {
31
+ "type": "string",
32
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
33
+ "description": "Kebab-case slug for new feature row."
34
+ },
35
+ "evidenceNotes": {
36
+ "type": "array",
37
+ "items": { "type": "string", "minLength": 1 },
38
+ "minItems": 0
39
+ }
40
+ },
41
+ "allOf": [
42
+ {
43
+ "if": {
44
+ "properties": { "decision": { "const": "enrich_existing" } },
45
+ "required": ["decision"]
46
+ },
47
+ "then": { "required": ["targetItemRef"] }
48
+ },
49
+ {
50
+ "if": {
51
+ "properties": { "decision": { "const": "new_item" } },
52
+ "required": ["decision"]
53
+ },
54
+ "then": { "required": ["proposedSummary"] }
55
+ }
56
+ ]
57
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/context-lists/zero-reference-triage.schema.json",
4
+ "title": "zero-reference-triage",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "records"],
8
+ "properties": {
9
+ "schemaVersion": {
10
+ "type": "string",
11
+ "const": "1"
12
+ },
13
+ "records": {
14
+ "type": "object",
15
+ "additionalProperties": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "required": [
19
+ "filePath",
20
+ "coordinationScope",
21
+ "decision",
22
+ "evidenceNotes",
23
+ "generatedAt",
24
+ "triageAgentStem"
25
+ ],
26
+ "properties": {
27
+ "filePath": { "type": "string", "minLength": 1 },
28
+ "coordinationScope": {
29
+ "type": "string",
30
+ "enum": ["feature", "experience", "service", "data_model"]
31
+ },
32
+ "decision": {
33
+ "type": "string",
34
+ "enum": ["new_item", "enrich_existing", "defer", "no_action"]
35
+ },
36
+ "targetItemRef": { "type": "string", "minLength": 1 },
37
+ "proposedSummary": { "type": "string", "minLength": 1, "maxLength": 4000 },
38
+ "proposedCode": { "type": "string", "pattern": "^(FE|XP|SV|DM)-[0-9]+$" },
39
+ "proposedSlug": {
40
+ "type": "string",
41
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
42
+ },
43
+ "evidenceNotes": {
44
+ "type": "array",
45
+ "items": { "type": "string", "minLength": 1 }
46
+ },
47
+ "generatedAt": { "type": "string", "minLength": 1 },
48
+ "triageAgentStem": { "type": "string", "minLength": 1 }
49
+ },
50
+ "allOf": [
51
+ {
52
+ "if": {
53
+ "properties": { "decision": { "const": "enrich_existing" } },
54
+ "required": ["decision"]
55
+ },
56
+ "then": { "required": ["targetItemRef"] }
57
+ },
58
+ {
59
+ "if": {
60
+ "properties": { "decision": { "const": "new_item" } },
61
+ "required": ["decision"]
62
+ },
63
+ "then": { "required": ["proposedSummary"] }
64
+ }
65
+ ]
66
+ }
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,202 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://easyspecs.ai/schemas/index-application-context.schema.json",
4
+ "title": "index-application-context",
5
+ "description": "Application-wide scope aggregate for `.gluecharm/context/index-application-context.json` (srs-4). Optional `detailMarkdownPaths` on nodes: srs-10. Optional root `repository` (Git provenance): srs-15. Optional `indexSrsDiscoveryId` / node `srsDiscoveryId`: srs-26.",
6
+ "$defs": {
7
+ "repositoryProvenance": {
8
+ "type": "object",
9
+ "additionalProperties": false,
10
+ "description": "Git / remote identity for the worktree that produced this index (srs-15).",
11
+ "required": ["localName", "remoteProvider", "remoteRepository", "commit"],
12
+ "properties": {
13
+ "localName": {
14
+ "type": "string",
15
+ "minLength": 1,
16
+ "description": "Basename of `git rev-parse --show-toplevel`."
17
+ },
18
+ "remoteProvider": {
19
+ "type": "string",
20
+ "enum": ["github", "gitlab", "bitbucket", "azure_devops", "other", "unknown"],
21
+ "description": "Derived from `origin` URL hostname; `unknown` when missing or unparseable."
22
+ },
23
+ "remoteRepository": {
24
+ "type": "string",
25
+ "minLength": 1,
26
+ "description": "Canonical path on host (e.g. org/repo), or the literal `unknown`."
27
+ },
28
+ "commit": {
29
+ "type": "string",
30
+ "pattern": "^[0-9a-f]{40}$",
31
+ "description": "Full SHA-1 of `HEAD` at index generation (lowercase hex)."
32
+ },
33
+ "branch": {
34
+ "type": "string",
35
+ "minLength": 1,
36
+ "description": "Primary repository branch short name when the analysis worktree was created (EasySpecs `git worktree add --detach` source); not the temp worktree’s later checkout. Omitted if primary `HEAD` was detached at creation or unknown."
37
+ },
38
+ "originUrl": {
39
+ "type": "string",
40
+ "minLength": 1,
41
+ "description": "Raw `git remote get-url origin` when available."
42
+ }
43
+ }
44
+ },
45
+ "contextRelativeMarkdownPath": {
46
+ "type": "string",
47
+ "minLength": 1,
48
+ "description": "Path relative to `.gluecharm/context/` (same folder as this index). Forward slashes only; must not contain `..` or backslashes; must end with `.md`.",
49
+ "pattern": "^(?!/)(?!.*\\.\\./)[^\\\\\\u0000-\\u001f]+\\.md$"
50
+ },
51
+ "impactNode": {
52
+ "type": "object",
53
+ "additionalProperties": false,
54
+ "required": ["type", "name"],
55
+ "properties": {
56
+ "type": {
57
+ "type": "string",
58
+ "minLength": 1,
59
+ "description": "Node kind in the five-scope tree (e.g. Feature, UseCase, Scenario, View, Interaction, Service, Method, Entity, Field, Relationship, Tool)."
60
+ },
61
+ "name": {
62
+ "type": "string",
63
+ "minLength": 1
64
+ },
65
+ "code": {
66
+ "type": "string",
67
+ "description": "Stable id prefix conventions: FE-*, UC-*, SC-*, XP-*, BH-*, SV-*, ME-*, DM-*, FD-*, RL-*, TS-*."
68
+ },
69
+ "drift": {
70
+ "type": "boolean",
71
+ "description": "When true, UI may show a drift tag (srs-3 / srs-4)."
72
+ },
73
+ "detailMarkdownPaths": {
74
+ "type": "array",
75
+ "description": "Optional pointers to detail markdown under `.gluecharm/context/` (srs-10). Omitted or empty when not used.",
76
+ "items": {
77
+ "$ref": "#/$defs/contextRelativeMarkdownPath"
78
+ }
79
+ },
80
+ "detailMarkdownFile": {
81
+ "description": "Single detail markdown reference (UI / tooling). Legacy: `filename` + `path`. SRS-26: `path` only with optional `srsDiscoveryId` after upload.",
82
+ "oneOf": [
83
+ {
84
+ "type": "object",
85
+ "additionalProperties": false,
86
+ "description": "Legacy srs-10 shape (basename duplicated from path).",
87
+ "required": ["filename", "path"],
88
+ "properties": {
89
+ "filename": {
90
+ "type": "string",
91
+ "minLength": 1,
92
+ "description": "Markdown filename (typically basename of `path`)."
93
+ },
94
+ "path": {
95
+ "$ref": "#/$defs/contextRelativeMarkdownPath",
96
+ "description": "Path relative to `.gluecharm/context/` (same folder as this index)."
97
+ }
98
+ }
99
+ },
100
+ {
101
+ "type": "object",
102
+ "additionalProperties": false,
103
+ "description": "SRS-26: one authoritative path; optional CMS id after srs_discovery upload.",
104
+ "required": ["path"],
105
+ "properties": {
106
+ "path": {
107
+ "$ref": "#/$defs/contextRelativeMarkdownPath",
108
+ "description": "Path relative to `.gluecharm/context/` (same folder as this index)."
109
+ },
110
+ "srsDiscoveryId": {
111
+ "type": "string",
112
+ "minLength": 1,
113
+ "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
114
+ "description": "`srs_discovery` row id (client-sent `item.id` on upload) for this detail file."
115
+ }
116
+ }
117
+ }
118
+ ]
119
+ },
120
+ "children": {
121
+ "type": "array",
122
+ "items": {
123
+ "$ref": "#/$defs/impactNode"
124
+ }
125
+ }
126
+ }
127
+ },
128
+ "scopeBlock": {
129
+ "type": "object",
130
+ "additionalProperties": false,
131
+ "required": ["nodes"],
132
+ "properties": {
133
+ "nodes": {
134
+ "type": "array",
135
+ "items": {
136
+ "$ref": "#/$defs/impactNode"
137
+ }
138
+ }
139
+ }
140
+ }
141
+ },
142
+ "type": "object",
143
+ "additionalProperties": false,
144
+ "required": ["kind", "version", "title", "driftCount", "scopes"],
145
+ "properties": {
146
+ "kind": {
147
+ "type": "string",
148
+ "const": "easyspecs.application-context"
149
+ },
150
+ "version": {
151
+ "type": "integer",
152
+ "minimum": 1,
153
+ "description": "Schema/document version. srs-10: use 2 when any node includes `detailMarkdownPaths` and/or `detailMarkdownFile`."
154
+ },
155
+ "title": {
156
+ "type": "string",
157
+ "minLength": 1,
158
+ "description": "Panel header title (e.g. Application context)."
159
+ },
160
+ "generatedAt": {
161
+ "type": "string",
162
+ "description": "ISO-8601 timestamp when the file was produced (recommended). srs-15: required when programmatic writer emits `repository` (same instant as assembly)."
163
+ },
164
+ "repository": {
165
+ "$ref": "#/$defs/repositoryProvenance",
166
+ "description": "Optional Git provenance for the analysis worktree (srs-15)."
167
+ },
168
+ "indexSrsDiscoveryId": {
169
+ "type": "string",
170
+ "minLength": 1,
171
+ "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
172
+ "description": "Optional `srs_discovery` id for this index file after upload (srs-26). Omitted in Phase A."
173
+ },
174
+ "driftCount": {
175
+ "type": "integer",
176
+ "minimum": 0,
177
+ "description": "Non-negative aggregate for row badge semantics (srs-4)."
178
+ },
179
+ "scopes": {
180
+ "type": "object",
181
+ "additionalProperties": false,
182
+ "description": "Five scope keys; each block may be omitted in minimal JSON but this object is required (may be empty object for edge cases — prefer omitting empty scopes in writers).",
183
+ "properties": {
184
+ "Feature": {
185
+ "$ref": "#/$defs/scopeBlock"
186
+ },
187
+ "Experience": {
188
+ "$ref": "#/$defs/scopeBlock"
189
+ },
190
+ "Service": {
191
+ "$ref": "#/$defs/scopeBlock"
192
+ },
193
+ "DataModel": {
194
+ "$ref": "#/$defs/scopeBlock"
195
+ },
196
+ "TechStack": {
197
+ "$ref": "#/$defs/scopeBlock"
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }