planfs-core 1.2.0 → 1.4.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 (78) hide show
  1. package/README.md +107 -0
  2. package/dist/ai.d.ts +1 -19
  3. package/dist/ai.d.ts.map +1 -1
  4. package/dist/ai.js +0 -124
  5. package/dist/ai.js.map +1 -1
  6. package/dist/entity-content.d.ts +6 -0
  7. package/dist/entity-content.d.ts.map +1 -0
  8. package/dist/entity-content.js +94 -0
  9. package/dist/entity-content.js.map +1 -0
  10. package/dist/entity-factory.d.ts +13 -0
  11. package/dist/entity-factory.d.ts.map +1 -0
  12. package/dist/entity-factory.js +109 -0
  13. package/dist/entity-factory.js.map +1 -0
  14. package/dist/files.d.ts.map +1 -1
  15. package/dist/files.js +7 -0
  16. package/dist/files.js.map +1 -1
  17. package/dist/format.d.ts +19 -0
  18. package/dist/format.d.ts.map +1 -0
  19. package/dist/format.js +73 -0
  20. package/dist/format.js.map +1 -0
  21. package/dist/history.d.ts +8 -0
  22. package/dist/history.d.ts.map +1 -0
  23. package/dist/history.js +59 -0
  24. package/dist/history.js.map +1 -0
  25. package/dist/index.d.ts +13 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +13 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/repository.d.ts +5 -29
  30. package/dist/repository.d.ts.map +1 -1
  31. package/dist/repository.js +20 -196
  32. package/dist/repository.js.map +1 -1
  33. package/dist/search.d.ts +3 -0
  34. package/dist/search.d.ts.map +1 -1
  35. package/dist/search.js +34 -1
  36. package/dist/search.js.map +1 -1
  37. package/dist/semantic-analyzer.d.ts +50 -0
  38. package/dist/semantic-analyzer.d.ts.map +1 -0
  39. package/dist/semantic-analyzer.js +315 -0
  40. package/dist/semantic-analyzer.js.map +1 -0
  41. package/dist/semantic-context.d.ts +67 -0
  42. package/dist/semantic-context.d.ts.map +1 -0
  43. package/dist/semantic-context.js +109 -0
  44. package/dist/semantic-context.js.map +1 -0
  45. package/dist/semantic-formatter.d.ts +52 -0
  46. package/dist/semantic-formatter.d.ts.map +1 -0
  47. package/dist/semantic-formatter.js +354 -0
  48. package/dist/semantic-formatter.js.map +1 -0
  49. package/dist/semantic-inspection.d.ts +119 -0
  50. package/dist/semantic-inspection.d.ts.map +1 -0
  51. package/dist/semantic-inspection.js +295 -0
  52. package/dist/semantic-inspection.js.map +1 -0
  53. package/dist/semantic-profiles.d.ts +5 -0
  54. package/dist/semantic-profiles.d.ts.map +1 -0
  55. package/dist/semantic-profiles.js +70 -0
  56. package/dist/semantic-profiles.js.map +1 -0
  57. package/dist/semantic-types.d.ts +199 -0
  58. package/dist/semantic-types.d.ts.map +1 -0
  59. package/dist/semantic-types.js +3 -0
  60. package/dist/semantic-types.js.map +1 -0
  61. package/dist/semantic-validator.d.ts +46 -0
  62. package/dist/semantic-validator.d.ts.map +1 -0
  63. package/dist/semantic-validator.js +313 -0
  64. package/dist/semantic-validator.js.map +1 -0
  65. package/dist/semantic.d.ts +4 -0
  66. package/dist/semantic.d.ts.map +1 -0
  67. package/dist/semantic.js +641 -0
  68. package/dist/semantic.js.map +1 -0
  69. package/dist/task-update.d.ts +26 -0
  70. package/dist/task-update.d.ts.map +1 -0
  71. package/dist/task-update.js +165 -0
  72. package/dist/task-update.js.map +1 -0
  73. package/dist/types.d.ts +2 -0
  74. package/dist/types.d.ts.map +1 -1
  75. package/dist/validator.d.ts.map +1 -1
  76. package/dist/validator.js +18 -1
  77. package/dist/validator.js.map +1 -1
  78. package/package.json +4 -3
@@ -0,0 +1,119 @@
1
+ import { AdvisorySignal, AnalyzerResult, EntityMention, SemanticAnalyzer, SemanticDocument, SemanticFinding, SemanticCriterion, OrderedSection, SourceRange } from './semantic-types';
2
+ import { CriterionCheckStatePolicy, SemanticValidationDiagnostic, SemanticValidationTier } from './semantic-validator';
3
+ import { Entity } from './types';
4
+ export type SemanticInspectionContractVersion = '1.0.0';
5
+ export type SemanticInspectionView = 'all' | 'acceptance-criteria' | 'findings' | 'sections' | 'mentions' | 'relationships' | 'raw';
6
+ export interface SemanticInspectionOptions {
7
+ tier?: SemanticValidationTier;
8
+ lifecycle?: boolean;
9
+ criterionCheckState?: CriterionCheckStatePolicy;
10
+ analysis?: boolean;
11
+ language?: string;
12
+ analyzer?: SemanticAnalyzer;
13
+ }
14
+ export interface SemanticInspectionEntity {
15
+ id: string;
16
+ type: Entity['type'];
17
+ title: string;
18
+ status: Entity['status'];
19
+ filePath: string;
20
+ }
21
+ export interface AuthoritativeRelationships {
22
+ dependsOn: string[];
23
+ epic: string | null;
24
+ milestone: string | null;
25
+ supersedes: string | null;
26
+ supersededBy: string | null;
27
+ }
28
+ export interface SemanticInspectionAuthoritative {
29
+ metadata: Record<string, unknown>;
30
+ relationships: AuthoritativeRelationships;
31
+ }
32
+ export interface SemanticAdvisoryConclusion {
33
+ code: string;
34
+ message: string;
35
+ range: SourceRange;
36
+ provenance: 'nlp-inferred';
37
+ authoritative: false;
38
+ signalKinds: string[];
39
+ repair: {
40
+ summary: string;
41
+ kind: 'edit-markdown' | 'edit-frontmatter';
42
+ previewable: boolean;
43
+ };
44
+ data: Record<string, string | number | boolean | null>;
45
+ }
46
+ export interface SemanticInspectionAdvisory {
47
+ mentions: EntityMention[];
48
+ conclusions: SemanticAdvisoryConclusion[];
49
+ }
50
+ export interface SemanticInspectionResult {
51
+ inspectionVersion: SemanticInspectionContractVersion;
52
+ entity: SemanticInspectionEntity;
53
+ authoritative: SemanticInspectionAuthoritative;
54
+ semantic: SemanticDocument;
55
+ advisory: SemanticInspectionAdvisory;
56
+ analysis: AnalyzerResult | null;
57
+ diagnostics: SemanticValidationDiagnostic[];
58
+ }
59
+ export type SemanticInspectionData = {
60
+ authoritative: SemanticInspectionAuthoritative;
61
+ semantic: SemanticDocument;
62
+ advisory: SemanticInspectionAdvisory;
63
+ analysis: AnalyzerResult | null;
64
+ } | {
65
+ criteria: SemanticCriterion[];
66
+ } | {
67
+ findings: SemanticFinding[];
68
+ } | {
69
+ sections: OrderedSection[];
70
+ } | {
71
+ mentions: EntityMention[];
72
+ } | {
73
+ authoritativeRelationships: AuthoritativeRelationships;
74
+ advisoryMentions: EntityMention[];
75
+ relationshipSignals: AdvisorySignal[];
76
+ } | {
77
+ rawMarkdown: string;
78
+ };
79
+ export interface SemanticInspectionViewResult {
80
+ inspectionVersion: SemanticInspectionContractVersion;
81
+ view: SemanticInspectionView;
82
+ entity: SemanticInspectionEntity;
83
+ data: SemanticInspectionData;
84
+ diagnostics: SemanticValidationDiagnostic[];
85
+ }
86
+ export interface SemanticInspectionCacheOptions {
87
+ capacity?: number;
88
+ }
89
+ export interface SemanticInspectionCacheStats {
90
+ size: number;
91
+ capacity: number;
92
+ hits: number;
93
+ misses: number;
94
+ evictions: number;
95
+ }
96
+ /**
97
+ * Bounded per-consumer cache for repeated inspection of unchanged entities.
98
+ * Callers opt in so one-shot CLI commands do not retain repository bodies.
99
+ */
100
+ export declare class SemanticInspectionCache {
101
+ private readonly entries;
102
+ private readonly capacity;
103
+ private hits;
104
+ private misses;
105
+ private evictions;
106
+ constructor(options?: SemanticInspectionCacheOptions);
107
+ get stats(): SemanticInspectionCacheStats;
108
+ clear(): void;
109
+ inspect(entity: Entity, options?: SemanticInspectionOptions): Promise<SemanticInspectionResult>;
110
+ }
111
+ /**
112
+ * Build a read-only semantic inspection result for one already loaded entity.
113
+ * Analysis is optional at the core boundary; interactive callers may enable it
114
+ * by default while deterministic automation can leave it disabled.
115
+ */
116
+ export declare function inspectSemanticEntity(entity: Entity, options?: SemanticInspectionOptions): Promise<SemanticInspectionResult>;
117
+ /** Select a deterministic, focused JSON-ready view without reparsing Markdown. */
118
+ export declare function selectSemanticInspectionView(inspection: SemanticInspectionResult, view?: SemanticInspectionView): SemanticInspectionViewResult;
119
+ //# sourceMappingURL=semantic-inspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-inspection.d.ts","sourceRoot":"","sources":["../src/semantic-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SemanticInspectionCache = void 0;
4
+ exports.inspectSemanticEntity = inspectSemanticEntity;
5
+ exports.selectSemanticInspectionView = selectSemanticInspectionView;
6
+ const semantic_analyzer_1 = require("./semantic-analyzer");
7
+ const semantic_1 = require("./semantic");
8
+ const semantic_validator_1 = require("./semantic-validator");
9
+ /**
10
+ * Bounded per-consumer cache for repeated inspection of unchanged entities.
11
+ * Callers opt in so one-shot CLI commands do not retain repository bodies.
12
+ */
13
+ class SemanticInspectionCache {
14
+ constructor(options = {}) {
15
+ this.entries = new Map();
16
+ this.hits = 0;
17
+ this.misses = 0;
18
+ this.evictions = 0;
19
+ const capacity = options.capacity ?? 256;
20
+ if (!Number.isSafeInteger(capacity) || capacity < 0) {
21
+ throw new Error('capacity must be a non-negative safe integer');
22
+ }
23
+ this.capacity = capacity;
24
+ }
25
+ get stats() {
26
+ return {
27
+ size: this.entries.size,
28
+ capacity: this.capacity,
29
+ hits: this.hits,
30
+ misses: this.misses,
31
+ evictions: this.evictions
32
+ };
33
+ }
34
+ clear() {
35
+ this.entries.clear();
36
+ }
37
+ async inspect(entity, options = {}) {
38
+ const key = semanticInspectionCacheKey(entity, options);
39
+ const cached = this.entries.get(key);
40
+ if (cached) {
41
+ this.hits += 1;
42
+ this.entries.delete(key);
43
+ this.entries.set(key, cached);
44
+ return cloneInspection(cached);
45
+ }
46
+ this.misses += 1;
47
+ const result = await inspectSemanticEntity(entity, options);
48
+ if (this.capacity > 0) {
49
+ this.entries.set(key, cloneInspection(result));
50
+ if (this.entries.size > this.capacity) {
51
+ const oldest = this.entries.keys().next().value;
52
+ if (oldest !== undefined)
53
+ this.entries.delete(oldest);
54
+ this.evictions += 1;
55
+ }
56
+ }
57
+ return cloneInspection(result);
58
+ }
59
+ }
60
+ exports.SemanticInspectionCache = SemanticInspectionCache;
61
+ /**
62
+ * Build a read-only semantic inspection result for one already loaded entity.
63
+ * Analysis is optional at the core boundary; interactive callers may enable it
64
+ * by default while deterministic automation can leave it disabled.
65
+ */
66
+ async function inspectSemanticEntity(entity, options = {}) {
67
+ const semantic = (0, semantic_1.parseSemanticDocument)(entity.type, entity.body, { filePath: entity.filePath });
68
+ const validation = (0, semantic_validator_1.validateSemanticDocument)(entity, semantic, {
69
+ tier: options.tier ?? 'automation-ready',
70
+ lifecycle: options.lifecycle,
71
+ criterionCheckState: options.criterionCheckState
72
+ });
73
+ const analysis = await (0, semantic_analyzer_1.runSemanticAnalysis)(semantic, {
74
+ enabled: options.analysis === true,
75
+ language: options.language ?? 'en',
76
+ analyzer: options.analyzer
77
+ });
78
+ const analysisDiagnostics = analysis?.diagnostics.map(diagnostic => (enrichAnalysisDiagnostic(entity, semantic, diagnostic))) ?? [];
79
+ const diagnostics = [...validation.diagnostics, ...analysisDiagnostics].sort(compareDiagnostics);
80
+ const relationships = authoritativeRelationships(entity);
81
+ return {
82
+ inspectionVersion: '1.0.0',
83
+ entity: {
84
+ id: entity.id,
85
+ type: entity.type,
86
+ title: entity.title,
87
+ status: entity.status,
88
+ filePath: entity.filePath
89
+ },
90
+ authoritative: {
91
+ metadata: sortRecord(entity.metadata),
92
+ relationships
93
+ },
94
+ semantic,
95
+ advisory: {
96
+ mentions: semantic.mentions,
97
+ conclusions: actionableConclusions(analysis, relationships)
98
+ },
99
+ analysis,
100
+ diagnostics
101
+ };
102
+ }
103
+ /** Select a deterministic, focused JSON-ready view without reparsing Markdown. */
104
+ function selectSemanticInspectionView(inspection, view = 'all') {
105
+ let data;
106
+ switch (view) {
107
+ case 'acceptance-criteria':
108
+ data = { criteria: inspection.semantic.criteria };
109
+ break;
110
+ case 'findings':
111
+ data = { findings: inspection.semantic.findings };
112
+ break;
113
+ case 'sections':
114
+ data = { sections: inspection.semantic.sections };
115
+ break;
116
+ case 'mentions':
117
+ data = { mentions: inspection.advisory.mentions };
118
+ break;
119
+ case 'relationships':
120
+ data = {
121
+ authoritativeRelationships: inspection.authoritative.relationships,
122
+ advisoryMentions: inspection.advisory.mentions,
123
+ relationshipSignals: inspection.analysis?.signals.filter(signal => (signal.kind === 'relationship-mention')) ?? []
124
+ };
125
+ break;
126
+ case 'raw':
127
+ data = { rawMarkdown: inspection.semantic.source.rawMarkdown };
128
+ break;
129
+ case 'all':
130
+ data = {
131
+ authoritative: inspection.authoritative,
132
+ semantic: inspection.semantic,
133
+ advisory: inspection.advisory,
134
+ analysis: inspection.analysis
135
+ };
136
+ break;
137
+ }
138
+ return {
139
+ inspectionVersion: inspection.inspectionVersion,
140
+ view,
141
+ entity: inspection.entity,
142
+ data,
143
+ diagnostics: inspection.diagnostics
144
+ };
145
+ }
146
+ function authoritativeRelationships(entity) {
147
+ return {
148
+ dependsOn: entity.type === 'task' ? [...(entity.dependsOn ?? [])] : [],
149
+ epic: entity.type === 'task' ? entity.epic ?? null : null,
150
+ milestone: entity.type === 'task' ? entity.milestone ?? null : null,
151
+ supersedes: entity.type === 'decision' ? entity.supersedes ?? null : null,
152
+ supersededBy: entity.type === 'decision' ? entity.supersededBy ?? null : null
153
+ };
154
+ }
155
+ function semanticInspectionCacheKey(entity, options) {
156
+ return JSON.stringify({
157
+ id: entity.id,
158
+ type: entity.type,
159
+ body: entity.body,
160
+ metadata: entity.metadata,
161
+ updatedAt: entity.updatedAt ?? null,
162
+ tier: options.tier ?? 'automation-ready',
163
+ lifecycle: options.lifecycle ?? false,
164
+ criterionCheckState: options.criterionCheckState ?? null,
165
+ analysis: options.analysis === true,
166
+ language: options.language ?? 'en',
167
+ analyzer: options.analyzer
168
+ ? `${options.analyzer.identity.id}@${options.analyzer.identity.version}`
169
+ : null
170
+ });
171
+ }
172
+ function cloneInspection(inspection) {
173
+ return JSON.parse(JSON.stringify(inspection));
174
+ }
175
+ function actionableConclusions(analysis, relationships) {
176
+ if (!analysis)
177
+ return [];
178
+ const conclusions = [];
179
+ const representedIds = new Set([
180
+ ...relationships.dependsOn,
181
+ relationships.epic,
182
+ relationships.milestone,
183
+ relationships.supersedes,
184
+ relationships.supersededBy
185
+ ].filter((value) => value !== null));
186
+ const relationshipSignals = analysis.signals.filter(signal => signal.kind === 'relationship-mention');
187
+ const seenRelationshipTargets = new Set();
188
+ for (const signal of relationshipSignals) {
189
+ const targetId = typeof signal.data.targetId === 'string' ? signal.data.targetId : null;
190
+ if (!targetId || representedIds.has(targetId) || seenRelationshipTargets.has(targetId))
191
+ continue;
192
+ seenRelationshipTargets.add(targetId);
193
+ const relationshipPhrase = typeof signal.data.relationshipPhrase === 'string'
194
+ ? signal.data.relationshipPhrase
195
+ : '';
196
+ const suggestedField = suggestedRelationshipField(targetId, relationshipPhrase);
197
+ conclusions.push({
198
+ code: 'analysis.relationship.metadata-missing',
199
+ message: `${targetId} is mentioned as a possible planning relationship but is not represented in authoritative metadata.`,
200
+ range: signal.range,
201
+ provenance: 'nlp-inferred',
202
+ authoritative: false,
203
+ signalKinds: ['relationship-mention'],
204
+ repair: {
205
+ summary: 'Review the prose and preview an appropriate frontmatter relationship update if intended.',
206
+ kind: 'edit-frontmatter',
207
+ previewable: suggestedField !== null
208
+ },
209
+ data: { targetId, relationshipPhrase, suggestedField }
210
+ });
211
+ }
212
+ const wordingByCriterion = new Map();
213
+ for (const signal of analysis.signals) {
214
+ const criterionId = typeof signal.data.criterionId === 'string' ? signal.data.criterionId : null;
215
+ if (!criterionId || !isAmbiguousWordingSignal(signal, analysis.signals))
216
+ continue;
217
+ const existing = wordingByCriterion.get(criterionId) ?? [];
218
+ existing.push(signal);
219
+ wordingByCriterion.set(criterionId, existing);
220
+ }
221
+ for (const [criterionId, signals] of wordingByCriterion) {
222
+ const first = signals[0];
223
+ if (!first)
224
+ continue;
225
+ const kinds = [...new Set(signals.map(signal => signal.kind))].sort();
226
+ conclusions.push({
227
+ code: 'analysis.criterion.wording-ambiguous',
228
+ message: 'Acceptance-criterion wording may need a clearer required outcome.',
229
+ range: first.range,
230
+ provenance: 'nlp-inferred',
231
+ authoritative: false,
232
+ signalKinds: kinds,
233
+ repair: {
234
+ summary: 'Clarify whether the behavior is required and make the conditional outcome objectively testable.',
235
+ kind: 'edit-markdown',
236
+ previewable: true
237
+ },
238
+ data: { criterionId }
239
+ });
240
+ }
241
+ return conclusions.sort((left, right) => (left.range.start.offset - right.range.start.offset || left.code.localeCompare(right.code)));
242
+ }
243
+ function suggestedRelationshipField(targetId, phrase) {
244
+ if (/^TASK-/.test(targetId) && /^(after|blocked by|depends? on|depended on)$/.test(phrase)) {
245
+ return 'dependsOn';
246
+ }
247
+ if (/^EPIC-/.test(targetId) && /^(belongs under|parent)$/.test(phrase))
248
+ return 'epic';
249
+ if (/^MILESTONE-/.test(targetId) && /^(belongs under|parent)$/.test(phrase))
250
+ return 'milestone';
251
+ return null;
252
+ }
253
+ function isAmbiguousWordingSignal(signal, allSignals) {
254
+ if (signal.kind === 'condition') {
255
+ const criterionId = signal.data.criterionId;
256
+ const representedByRelationship = allSignals.some(candidate => (candidate.kind === 'relationship-mention'
257
+ && candidate.data.criterionId === criterionId
258
+ && candidate.range.start.offset <= signal.range.start.offset
259
+ && candidate.range.end.offset >= signal.range.end.offset));
260
+ return !representedByRelationship;
261
+ }
262
+ if (signal.kind !== 'modality')
263
+ return false;
264
+ return signal.evidence.some(evidence => /^(should|may)$/i.test(evidence.text));
265
+ }
266
+ function enrichAnalysisDiagnostic(entity, document, diagnostic) {
267
+ const section = diagnostic.sectionIndex === null
268
+ ? null
269
+ : document.sections[diagnostic.sectionIndex] ?? null;
270
+ return {
271
+ ...diagnostic,
272
+ entityId: entity.id,
273
+ filePath: entity.filePath,
274
+ sectionKey: section?.key ?? null
275
+ };
276
+ }
277
+ function compareDiagnostics(left, right) {
278
+ const leftOffset = left.range?.start.offset ?? Number.MAX_SAFE_INTEGER;
279
+ const rightOffset = right.range?.start.offset ?? Number.MAX_SAFE_INTEGER;
280
+ return leftOffset - rightOffset || left.code.localeCompare(right.code);
281
+ }
282
+ function sortRecord(record) {
283
+ return Object.fromEntries(Object.entries(record)
284
+ .sort(([left], [right]) => left.localeCompare(right))
285
+ .map(([key, value]) => [key, sortValue(value)]));
286
+ }
287
+ function sortValue(value) {
288
+ if (Array.isArray(value))
289
+ return value.map(sortValue);
290
+ if (value !== null && typeof value === 'object') {
291
+ return sortRecord(value);
292
+ }
293
+ return value;
294
+ }
295
+ //# sourceMappingURL=semantic-inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-inspection.js","sourceRoot":"","sources":["../src/semantic-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { EntityType } from './types';
2
+ import { SemanticContentProfile } from './semantic-types';
3
+ export declare const semanticContentProfiles: Readonly<Record<EntityType, SemanticContentProfile>>;
4
+ export declare function getSemanticContentProfile(entityType: EntityType): SemanticContentProfile;
5
+ //# sourceMappingURL=semantic-profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-profiles.d.ts","sourceRoot":"","sources":["../src/semantic-profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAA6B,MAAM,kBAAkB,CAAC;AAWrF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC,CA0DxF,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,sBAAsB,CAExF"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.semanticContentProfiles = void 0;
4
+ exports.getSemanticContentProfile = getSemanticContentProfile;
5
+ function section(key, canonicalHeading, aliases, expectedContent) {
6
+ return { key, canonicalHeading, aliases, cardinality: '0..1', expectedContent };
7
+ }
8
+ exports.semanticContentProfiles = {
9
+ task: {
10
+ entityType: 'task',
11
+ version: '1.0.0',
12
+ sections: [
13
+ section('scope', 'Scope', ['In Scope'], 'prose-or-list'),
14
+ section('acceptanceCriteria', 'Acceptance Criteria', ['Acceptance', 'Success Criteria'], 'task-list'),
15
+ section('nonGoals', 'Non-Goals', ['Out of Scope'], 'prose-or-list'),
16
+ section('implementationNotes', 'Implementation Notes', ['Technical Notes'], 'mixed'),
17
+ section('testingStrategy', 'Testing Strategy', ['Test Plan'], 'prose-or-list'),
18
+ section('findings', 'Findings', [], 'prose-or-list'),
19
+ section('decisions', 'Decisions', ['Decision Log'], 'prose-or-list'),
20
+ section('references', 'References', ['Links'], 'list-or-references'),
21
+ section('questions', 'Questions', ['Open Questions'], 'prose-or-list')
22
+ ]
23
+ },
24
+ epic: {
25
+ entityType: 'epic',
26
+ version: '1.0.0',
27
+ sections: [
28
+ section('outcomes', 'Outcomes', ['Goals'], 'prose-or-list'),
29
+ section('scope', 'Scope', ['In Scope'], 'prose-or-list'),
30
+ section('nonGoals', 'Non-Goals', ['Out of Scope'], 'prose-or-list'),
31
+ section('childTasks', 'Child Tasks', ['Tasks'], 'list-or-references'),
32
+ section('findings', 'Findings', [], 'prose-or-list'),
33
+ section('decisions', 'Decisions', ['Decision Log'], 'prose-or-list'),
34
+ section('references', 'References', ['Links'], 'list-or-references'),
35
+ section('questions', 'Questions', ['Open Questions'], 'prose-or-list')
36
+ ]
37
+ },
38
+ milestone: {
39
+ entityType: 'milestone',
40
+ version: '1.0.0',
41
+ sections: [
42
+ section('outcomes', 'Outcomes', ['Goals'], 'prose-or-list'),
43
+ section('scope', 'Scope', ['In Scope'], 'prose-or-list'),
44
+ section('releaseCriteria', 'Release Criteria', ['Exit Criteria', 'Success Criteria'], 'task-list'),
45
+ section('childEpics', 'Child Epics', ['Epics'], 'list-or-references'),
46
+ section('risks', 'Risks', ['Known Risks'], 'prose-or-list'),
47
+ section('findings', 'Findings', [], 'prose-or-list'),
48
+ section('decisions', 'Decisions', ['Decision Log'], 'prose-or-list'),
49
+ section('references', 'References', ['Links'], 'list-or-references'),
50
+ section('questions', 'Questions', ['Open Questions'], 'prose-or-list')
51
+ ]
52
+ },
53
+ decision: {
54
+ entityType: 'decision',
55
+ version: '1.0.0',
56
+ sections: [
57
+ section('context', 'Context', ['Background'], 'prose'),
58
+ section('decision', 'Decision', ['Resolution'], 'prose'),
59
+ section('consequences', 'Consequences', ['Implications'], 'prose-or-list'),
60
+ section('alternatives', 'Alternatives', ['Options Considered'], 'prose-or-list'),
61
+ section('findings', 'Findings', [], 'prose-or-list'),
62
+ section('references', 'References', ['Links'], 'list-or-references'),
63
+ section('questions', 'Questions', ['Open Questions'], 'prose-or-list')
64
+ ]
65
+ }
66
+ };
67
+ function getSemanticContentProfile(entityType) {
68
+ return exports.semanticContentProfiles[entityType];
69
+ }
70
+ //# sourceMappingURL=semantic-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-profiles.js","sourceRoot":"","sources":["../src/semantic-profiles.ts"],"names":[],"mappings":"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"}