planfs-core 1.3.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 (54) hide show
  1. package/README.md +107 -0
  2. package/dist/entity-content.d.ts +6 -0
  3. package/dist/entity-content.d.ts.map +1 -0
  4. package/dist/entity-content.js +94 -0
  5. package/dist/entity-content.js.map +1 -0
  6. package/dist/entity-factory.d.ts +13 -0
  7. package/dist/entity-factory.d.ts.map +1 -0
  8. package/dist/entity-factory.js +109 -0
  9. package/dist/entity-factory.js.map +1 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +10 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/repository.d.ts +3 -31
  15. package/dist/repository.d.ts.map +1 -1
  16. package/dist/repository.js +14 -204
  17. package/dist/repository.js.map +1 -1
  18. package/dist/semantic-analyzer.d.ts +50 -0
  19. package/dist/semantic-analyzer.d.ts.map +1 -0
  20. package/dist/semantic-analyzer.js +315 -0
  21. package/dist/semantic-analyzer.js.map +1 -0
  22. package/dist/semantic-context.d.ts +67 -0
  23. package/dist/semantic-context.d.ts.map +1 -0
  24. package/dist/semantic-context.js +109 -0
  25. package/dist/semantic-context.js.map +1 -0
  26. package/dist/semantic-formatter.d.ts +52 -0
  27. package/dist/semantic-formatter.d.ts.map +1 -0
  28. package/dist/semantic-formatter.js +354 -0
  29. package/dist/semantic-formatter.js.map +1 -0
  30. package/dist/semantic-inspection.d.ts +119 -0
  31. package/dist/semantic-inspection.d.ts.map +1 -0
  32. package/dist/semantic-inspection.js +295 -0
  33. package/dist/semantic-inspection.js.map +1 -0
  34. package/dist/semantic-profiles.d.ts +5 -0
  35. package/dist/semantic-profiles.d.ts.map +1 -0
  36. package/dist/semantic-profiles.js +70 -0
  37. package/dist/semantic-profiles.js.map +1 -0
  38. package/dist/semantic-types.d.ts +199 -0
  39. package/dist/semantic-types.d.ts.map +1 -0
  40. package/dist/semantic-types.js +3 -0
  41. package/dist/semantic-types.js.map +1 -0
  42. package/dist/semantic-validator.d.ts +46 -0
  43. package/dist/semantic-validator.d.ts.map +1 -0
  44. package/dist/semantic-validator.js +313 -0
  45. package/dist/semantic-validator.js.map +1 -0
  46. package/dist/semantic.d.ts +4 -0
  47. package/dist/semantic.d.ts.map +1 -0
  48. package/dist/semantic.js +641 -0
  49. package/dist/semantic.js.map +1 -0
  50. package/dist/task-update.d.ts +2 -2
  51. package/dist/task-update.d.ts.map +1 -1
  52. package/dist/task-update.js +9 -0
  53. package/dist/task-update.js.map +1 -1
  54. package/package.json +3 -2
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalRuleSemanticAnalyzer = exports.LOCAL_RULE_ANALYZER_IDENTITY = void 0;
4
+ exports.runSemanticAnalysis = runSemanticAnalysis;
5
+ exports.LOCAL_RULE_ANALYZER_IDENTITY = Object.freeze({
6
+ id: 'planfs-local-english-rules',
7
+ version: '1.0.0'
8
+ });
9
+ const DEFAULT_CACHE_SIZE = 256;
10
+ const SUPPORTED_LANGUAGES = ['en'];
11
+ /**
12
+ * Local advisory prose analyzer containing only signals promoted by TASK-118.
13
+ * It never changes the semantic document or authoritative entity metadata.
14
+ */
15
+ class LocalRuleSemanticAnalyzer {
16
+ constructor(options = {}) {
17
+ this.identity = exports.LOCAL_RULE_ANALYZER_IDENTITY;
18
+ this.supportedLanguages = SUPPORTED_LANGUAGES;
19
+ this.cache = new Map();
20
+ this.hits = 0;
21
+ this.misses = 0;
22
+ this.evictions = 0;
23
+ const requestedCapacity = options.cacheSize ?? DEFAULT_CACHE_SIZE;
24
+ if (!Number.isSafeInteger(requestedCapacity) || requestedCapacity < 0) {
25
+ throw new Error('cacheSize must be a non-negative safe integer');
26
+ }
27
+ this.capacity = requestedCapacity;
28
+ }
29
+ get cacheStats() {
30
+ return {
31
+ size: this.cache.size,
32
+ capacity: this.capacity,
33
+ hits: this.hits,
34
+ misses: this.misses,
35
+ evictions: this.evictions
36
+ };
37
+ }
38
+ clearCache() {
39
+ this.cache.clear();
40
+ }
41
+ async analyze(request) {
42
+ const language = normalizeLanguage(request.language);
43
+ if (!this.supportedLanguages.includes(language)) {
44
+ return {
45
+ analyzer: { ...this.identity },
46
+ language,
47
+ signals: [],
48
+ diagnostics: [unsupportedLanguageDiagnostic(this.identity, language)]
49
+ };
50
+ }
51
+ const key = createCacheKey(request.document, language, this.identity);
52
+ const cached = this.cache.get(key);
53
+ if (cached) {
54
+ this.hits += 1;
55
+ this.cache.delete(key);
56
+ this.cache.set(key, cached);
57
+ return cloneAnalyzerResult(cached.value);
58
+ }
59
+ this.misses += 1;
60
+ const result = {
61
+ analyzer: { ...this.identity },
62
+ language,
63
+ signals: request.document.criteria
64
+ .flatMap(criterion => analyzeCriterion(request.document, criterion, language))
65
+ .sort(compareSignals),
66
+ diagnostics: []
67
+ };
68
+ if (this.capacity > 0) {
69
+ this.cache.set(key, { key, value: cloneAnalyzerResult(result) });
70
+ if (this.cache.size > this.capacity) {
71
+ const oldestKey = this.cache.keys().next().value;
72
+ if (oldestKey !== undefined)
73
+ this.cache.delete(oldestKey);
74
+ this.evictions += 1;
75
+ }
76
+ }
77
+ return cloneAnalyzerResult(result);
78
+ }
79
+ }
80
+ exports.LocalRuleSemanticAnalyzer = LocalRuleSemanticAnalyzer;
81
+ const defaultAnalyzer = new LocalRuleSemanticAnalyzer();
82
+ /**
83
+ * Explicit opt-in helper. A disabled request returns null and performs no analysis.
84
+ * Analyzer failures are converted into bounded advisory diagnostics.
85
+ */
86
+ async function runSemanticAnalysis(document, options = {}) {
87
+ if (options.enabled !== true)
88
+ return null;
89
+ const analyzer = options.analyzer ?? defaultAnalyzer;
90
+ const language = normalizeLanguage(options.language ?? 'en');
91
+ try {
92
+ return await analyzer.analyze({ document, language });
93
+ }
94
+ catch (error) {
95
+ return {
96
+ analyzer: { ...analyzer.identity },
97
+ language,
98
+ signals: [],
99
+ diagnostics: [analyzerFailureDiagnostic(analyzer.identity, error)]
100
+ };
101
+ }
102
+ }
103
+ function analyzeCriterion(document, criterion, language) {
104
+ let eligible = maskIneligibleMarkdown(criterion.markdown);
105
+ for (const child of document.criteria.filter(candidate => candidate.parentCriterionId === criterion.id)) {
106
+ const start = child.range.start.offset - criterion.range.start.offset;
107
+ const end = child.range.end.offset - criterion.range.start.offset;
108
+ eligible = maskRange(eligible, start, end);
109
+ }
110
+ const matches = [];
111
+ collect(matches, eligible, /\b(must|should|may)\b/gi, 'modality', 0.98, 'exact-modal-token');
112
+ collect(matches, eligible, /\b(not|never|no|without)\b/gi, 'negation', 0.98, 'exact-negation-token');
113
+ collect(matches, eligible, /\b(if|when|unless|until|after|before|once)\b/gi, 'condition', 0.95, 'bounded-condition-introducer');
114
+ collect(matches, eligible, /\b(?:\d+(?:\.\d+)?\s*(?:ms|milliseconds?|seconds?|minutes?|hours?|days?)|per second|tomorrow|\d{4}-\d{2}-\d{2})\b/gi, 'date-duration', 0.95, 'explicit-date-or-duration');
115
+ collectRelationships(matches, eligible);
116
+ return deduplicateMatches(matches).map(match => toSignal(document, criterion, match, language));
117
+ }
118
+ function collectRelationships(matches, eligible) {
119
+ const entities = [...eligible.matchAll(/\b(?:TASK-[0-9]{3,}|EPIC-[A-Za-z0-9-]+|MILESTONE-[A-Za-z0-9-]+|DECISION-[A-Za-z0-9-]+)\b/g)];
120
+ const phrases = [...eligible.matchAll(/\b(?:after|before|block(?:s|ed by)?|depend(?:s|ed)? on|belongs under|parent)\b/gi)];
121
+ if (entities.length === 0 || phrases.length === 0)
122
+ return;
123
+ for (const entity of entities) {
124
+ const phrase = nearestMatch(entity, phrases);
125
+ const entityStart = entity.index ?? 0;
126
+ const phraseStart = phrase.index ?? 0;
127
+ const entityEnd = entityStart + entity[0].length;
128
+ const phraseEnd = phraseStart + phrase[0].length;
129
+ const gapStart = Math.min(entityEnd, phraseEnd);
130
+ const gapEnd = Math.max(entityStart, phraseStart);
131
+ const gap = eligible.slice(gapStart, gapEnd);
132
+ if (gap.length > 80 || /[.!?\n]/.test(gap))
133
+ continue;
134
+ matches.push({
135
+ kind: 'relationship-mention',
136
+ start: Math.min(entityStart, phraseStart),
137
+ end: Math.max(entityEnd, phraseEnd),
138
+ confidence: 0.90,
139
+ basis: 'exact-planfs-id-with-bounded-relationship-phrase',
140
+ evidence: [
141
+ { start: phraseStart, end: phraseEnd },
142
+ { start: entityStart, end: entityEnd }
143
+ ],
144
+ data: {
145
+ targetId: entity[0],
146
+ relationshipPhrase: phrase[0].toLowerCase()
147
+ }
148
+ });
149
+ }
150
+ }
151
+ function maskIneligibleMarkdown(markdown) {
152
+ let value = markdown;
153
+ const patterns = [
154
+ /(^|\n)[ \t]*(```+|~~~+)[^\n]*(?:\n[\s\S]*?(?:\n[ \t]*\2[^\n]*)?(?=\n|$)|$)/g,
155
+ /`+[^`\n]*`+/g,
156
+ /<!--[\s\S]*?-->/g,
157
+ /<([A-Za-z][A-Za-z0-9-]*)\b[^>]*>[\s\S]*?<\/\1\s*>/g,
158
+ /<https?:\/\/[^>]+>/gi,
159
+ /<[^>]*>/g,
160
+ /\]\([^)]*\)/g,
161
+ /https?:\/\/[^\s)>]+/gi,
162
+ /(^|\n)[ \t]*(?:[-+*]|\d+[.)])[ \t]+(?:\[[ xX]\][ \t]+)?/g
163
+ ];
164
+ for (const pattern of patterns) {
165
+ value = value.replace(pattern, matched => ' '.repeat(matched.length));
166
+ }
167
+ return value.replace(/[_*~>#]/g, ' ').replace(/\[/g, ' ').replace(/\]/g, ' ');
168
+ }
169
+ function maskRange(value, start, end) {
170
+ const safeStart = Math.max(0, Math.min(value.length, start));
171
+ const safeEnd = Math.max(safeStart, Math.min(value.length, end));
172
+ return `${value.slice(0, safeStart)}${' '.repeat(safeEnd - safeStart)}${value.slice(safeEnd)}`;
173
+ }
174
+ function collect(target, text, pattern, kind, confidence, basis) {
175
+ for (const match of text.matchAll(pattern)) {
176
+ const start = match.index ?? 0;
177
+ target.push({
178
+ kind,
179
+ start,
180
+ end: start + match[0].length,
181
+ confidence,
182
+ basis,
183
+ evidence: [{ start, end: start + match[0].length }]
184
+ });
185
+ }
186
+ }
187
+ function nearestMatch(target, matches) {
188
+ const targetIndex = target.index ?? 0;
189
+ return matches.reduce((nearest, candidate) => (Math.abs((candidate.index ?? 0) - targetIndex) < Math.abs((nearest.index ?? 0) - targetIndex)
190
+ ? candidate
191
+ : nearest));
192
+ }
193
+ function deduplicateMatches(matches) {
194
+ const seen = new Set();
195
+ return matches.filter(match => {
196
+ const key = `${match.kind}:${match.start}:${match.end}`;
197
+ if (seen.has(key))
198
+ return false;
199
+ seen.add(key);
200
+ return true;
201
+ });
202
+ }
203
+ function toSignal(document, criterion, match, language) {
204
+ const criterionStart = criterion.range.start.offset;
205
+ const range = sourceRange(document.source.rawMarkdown, criterionStart + match.start, criterionStart + match.end);
206
+ const evidence = match.evidence.map(item => {
207
+ const evidenceRange = sourceRange(document.source.rawMarkdown, criterionStart + item.start, criterionStart + item.end);
208
+ return {
209
+ text: document.source.rawMarkdown.slice(evidenceRange.start.offset, evidenceRange.end.offset),
210
+ range: evidenceRange
211
+ };
212
+ });
213
+ return {
214
+ kind: match.kind,
215
+ message: messageFor(match.kind, evidence.map(item => item.text)),
216
+ language,
217
+ analyzer: { ...exports.LOCAL_RULE_ANALYZER_IDENTITY },
218
+ provenance: 'nlp-inferred',
219
+ range,
220
+ evidence,
221
+ confidence: match.confidence,
222
+ authoritative: false,
223
+ data: {
224
+ criterionId: criterion.id,
225
+ evidenceBasis: match.basis,
226
+ ...match.data
227
+ }
228
+ };
229
+ }
230
+ function messageFor(kind, evidence) {
231
+ switch (kind) {
232
+ case 'modality':
233
+ return `Modal wording detected: ${evidence[0] ?? ''}`;
234
+ case 'negation':
235
+ return `Negation detected: ${evidence[0] ?? ''}`;
236
+ case 'condition':
237
+ return `Conditional wording detected: ${evidence[0] ?? ''}`;
238
+ case 'date-duration':
239
+ return `Date or duration wording detected: ${evidence[0] ?? ''}`;
240
+ case 'relationship-mention':
241
+ return `Possible planning relationship mentioned in prose: ${evidence[1] ?? evidence[0] ?? ''}`;
242
+ }
243
+ }
244
+ function sourceRange(source, start, end) {
245
+ return { start: sourcePoint(source, start), end: sourcePoint(source, end) };
246
+ }
247
+ function sourcePoint(source, offset) {
248
+ const before = source.slice(0, offset);
249
+ const lastNewline = before.lastIndexOf('\n');
250
+ let line = 1;
251
+ for (let index = 0; index < before.length; index += 1) {
252
+ if (before.charCodeAt(index) === 10)
253
+ line += 1;
254
+ }
255
+ return {
256
+ offset,
257
+ line,
258
+ column: offset - lastNewline
259
+ };
260
+ }
261
+ function compareSignals(left, right) {
262
+ return left.range.start.offset - right.range.start.offset || left.kind.localeCompare(right.kind);
263
+ }
264
+ function createCacheKey(document, language, identity) {
265
+ return [
266
+ identity.id,
267
+ identity.version,
268
+ language,
269
+ document.profile.entityType,
270
+ document.profile.version,
271
+ document.source.rawMarkdown
272
+ ].join('\0');
273
+ }
274
+ function normalizeLanguage(language) {
275
+ return language.trim().toLowerCase().split('-')[0] ?? '';
276
+ }
277
+ function unsupportedLanguageDiagnostic(identity, language) {
278
+ return {
279
+ code: 'analysis.language.unsupported',
280
+ severity: 'info',
281
+ message: `Analyzer ${identity.id} does not support language: ${language || '(empty)'}`,
282
+ range: null,
283
+ sectionIndex: null,
284
+ provenance: 'nlp-inferred',
285
+ conformance: 'analysis',
286
+ repair: {
287
+ summary: 'Disable advisory analysis or select a supported language',
288
+ kind: 'none',
289
+ previewable: false
290
+ },
291
+ data: { language }
292
+ };
293
+ }
294
+ function analyzerFailureDiagnostic(identity, error) {
295
+ const errorName = error instanceof Error && error.name ? error.name : 'Error';
296
+ return {
297
+ code: 'analysis.analyzer.unavailable',
298
+ severity: 'warning',
299
+ message: `Advisory analyzer ${identity.id} could not run locally.`,
300
+ range: null,
301
+ sectionIndex: null,
302
+ provenance: 'nlp-inferred',
303
+ conformance: 'analysis',
304
+ repair: {
305
+ summary: 'Retry without advisory analysis or check the local analyzer configuration',
306
+ kind: 'none',
307
+ previewable: false
308
+ },
309
+ data: { analyzerId: identity.id, analyzerVersion: identity.version, errorName }
310
+ };
311
+ }
312
+ function cloneAnalyzerResult(result) {
313
+ return JSON.parse(JSON.stringify(result));
314
+ }
315
+ //# sourceMappingURL=semantic-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-analyzer.js","sourceRoot":"","sources":["../src/semantic-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /** Compact semantic planning context shared by agent and human workflows. */
2
+ import { TaskReadinessResult } from './next-work';
3
+ import { SemanticAdvisoryConclusion, SemanticInspectionOptions } from './semantic-inspection';
4
+ import { EntityMention, AnalyzerResult, SemanticCriterion, SemanticDecisionStatement, SemanticDiagnostic, SemanticFinding, SemanticQuestion, SemanticReference, SemanticProvenance, SourceRange } from './semantic-types';
5
+ import { Entity, Repository } from './types';
6
+ export type SemanticPlanningContextVersion = '1.0.0';
7
+ export type SemanticPlanningContextOptions = SemanticInspectionOptions;
8
+ export interface PlanningContextEntity {
9
+ id: string;
10
+ type: Entity['type'];
11
+ title: string;
12
+ status: Entity['status'];
13
+ filePath: string;
14
+ archived: boolean;
15
+ }
16
+ export interface PlanningContextText {
17
+ heading: string;
18
+ text: string;
19
+ markdown: string;
20
+ provenance: Exclude<SemanticProvenance, 'nlp-inferred'>;
21
+ range: SourceRange;
22
+ }
23
+ export interface PlanningContextReference {
24
+ id: string;
25
+ entity: PlanningContextEntity | null;
26
+ authoritative: true;
27
+ }
28
+ export interface PlanningContextRelationships {
29
+ dependsOn: PlanningContextReference[];
30
+ epic: PlanningContextReference | null;
31
+ milestone: PlanningContextReference | null;
32
+ supersedes: PlanningContextReference | null;
33
+ supersededBy: PlanningContextReference | null;
34
+ }
35
+ export interface PlanningContextReadiness extends TaskReadinessResult {
36
+ reasons: string[];
37
+ }
38
+ export interface SemanticPlanningContext {
39
+ contextVersion: SemanticPlanningContextVersion;
40
+ entity: PlanningContextEntity;
41
+ intent: {
42
+ text: string;
43
+ markdown: string;
44
+ range: SourceRange;
45
+ };
46
+ sections: Record<string, PlanningContextText[]>;
47
+ acceptanceCriteria: SemanticCriterion[];
48
+ findings: SemanticFinding[];
49
+ decisions: SemanticDecisionStatement[];
50
+ questions: SemanticQuestion[];
51
+ references: SemanticReference[];
52
+ relationships: PlanningContextRelationships;
53
+ readiness: PlanningContextReadiness | null;
54
+ advisory: {
55
+ enabled: boolean;
56
+ mentions: EntityMention[];
57
+ conclusions: SemanticAdvisoryConclusion[];
58
+ analysis: AnalyzerResult | null;
59
+ };
60
+ diagnostics: SemanticDiagnostic[];
61
+ }
62
+ /**
63
+ * Project one entity into bounded, traceable planning context. Frontmatter
64
+ * relationships remain authoritative; body interpretation stays read-only.
65
+ */
66
+ export declare function buildSemanticPlanningContext(repository: Repository, entityId: string, options?: SemanticPlanningContextOptions): Promise<SemanticPlanningContext>;
67
+ //# sourceMappingURL=semantic-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-context.d.ts","sourceRoot":"","sources":["../src/semantic-context.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EAAqC,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAErF,OAAO,EAEL,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAQ,MAAM,SAAS,CAAC;AAEnD,MAAM,MAAM,8BAA8B,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,8BAA8B,GAAG,yBAAyB,CAAC;AAEvE,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IACxD,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACrC,aAAa,EAAE,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC3C,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC5C,YAAY,EAAE,wBAAwB,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,8BAA8B,CAAC;IAC/C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,WAAW,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAChD,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,yBAAyB,EAAE,CAAC;IACvC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,aAAa,EAAE,4BAA4B,CAAC;IAC5C,SAAS,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC3C,QAAQ,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC1B,WAAW,EAAE,0BAA0B,EAAE,CAAC;QAC1C,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;KACjC,CAAC;IACF,WAAW,EAAE,kBAAkB,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,uBAAuB,CAAC,CAgElC"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /** Compact semantic planning context shared by agent and human workflows. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.buildSemanticPlanningContext = buildSemanticPlanningContext;
5
+ const next_work_1 = require("./next-work");
6
+ const repository_1 = require("./repository");
7
+ const semantic_inspection_1 = require("./semantic-inspection");
8
+ /**
9
+ * Project one entity into bounded, traceable planning context. Frontmatter
10
+ * relationships remain authoritative; body interpretation stays read-only.
11
+ */
12
+ async function buildSemanticPlanningContext(repository, entityId, options = {}) {
13
+ const entities = (0, repository_1.getAllEntities)(repository, { includeArchived: true });
14
+ const entity = entities.find(candidate => candidate.id === entityId);
15
+ if (!entity) {
16
+ throw new Error(`Entity not found: ${entityId}`);
17
+ }
18
+ const inspection = await (0, semantic_inspection_1.inspectSemanticEntity)(entity, {
19
+ tier: options.tier ?? 'automation-ready',
20
+ lifecycle: options.lifecycle,
21
+ criterionCheckState: options.criterionCheckState,
22
+ analysis: options.analysis === true,
23
+ language: options.language,
24
+ analyzer: options.analyzer
25
+ });
26
+ const entityIndex = new Map(entities.map(candidate => [candidate.id, candidate]));
27
+ const relationship = (id) => {
28
+ if (!id)
29
+ return null;
30
+ const resolved = entityIndex.get(id);
31
+ return {
32
+ id,
33
+ entity: resolved ? toContextEntity(resolved) : null,
34
+ authoritative: true
35
+ };
36
+ };
37
+ const requiredRelationship = (id) => {
38
+ const resolved = relationship(id);
39
+ if (!resolved)
40
+ throw new Error('Relationship ID must not be empty');
41
+ return resolved;
42
+ };
43
+ const readiness = entity.type === 'task'
44
+ ? taskReadiness(entity, repository)
45
+ : null;
46
+ return {
47
+ contextVersion: '1.0.0',
48
+ entity: toContextEntity(entity),
49
+ intent: {
50
+ text: inspection.semantic.preamble.text,
51
+ markdown: inspection.semantic.preamble.markdown,
52
+ range: inspection.semantic.preamble.range
53
+ },
54
+ sections: compactSections(inspection.semantic.sections),
55
+ acceptanceCriteria: inspection.semantic.criteria,
56
+ findings: inspection.semantic.findings,
57
+ decisions: inspection.semantic.decisions,
58
+ questions: inspection.semantic.questions,
59
+ references: inspection.semantic.references,
60
+ relationships: {
61
+ dependsOn: inspection.authoritative.relationships.dependsOn.map(requiredRelationship),
62
+ epic: relationship(inspection.authoritative.relationships.epic),
63
+ milestone: relationship(inspection.authoritative.relationships.milestone),
64
+ supersedes: relationship(inspection.authoritative.relationships.supersedes),
65
+ supersededBy: relationship(inspection.authoritative.relationships.supersededBy)
66
+ },
67
+ readiness,
68
+ advisory: {
69
+ enabled: inspection.analysis !== null,
70
+ mentions: inspection.advisory.mentions,
71
+ conclusions: inspection.advisory.conclusions,
72
+ analysis: inspection.analysis
73
+ },
74
+ diagnostics: inspection.diagnostics
75
+ };
76
+ }
77
+ function compactSections(sections) {
78
+ var _a;
79
+ const result = {};
80
+ for (const section of sections) {
81
+ if (!section.key)
82
+ continue;
83
+ (result[_a = section.key] ?? (result[_a] = [])).push({
84
+ heading: section.heading,
85
+ text: section.text,
86
+ markdown: section.contentMarkdown,
87
+ provenance: section.provenance,
88
+ range: section.contentRange
89
+ });
90
+ }
91
+ return result;
92
+ }
93
+ function taskReadiness(task, repository) {
94
+ return {
95
+ ...(0, next_work_1.getTaskReadiness)(task, repository),
96
+ reasons: (0, next_work_1.explainNextWork)(task, repository)
97
+ };
98
+ }
99
+ function toContextEntity(entity) {
100
+ return {
101
+ id: entity.id,
102
+ type: entity.type,
103
+ title: entity.title,
104
+ status: entity.status,
105
+ filePath: entity.filePath,
106
+ archived: Boolean(entity.archive)
107
+ };
108
+ }
109
+ //# sourceMappingURL=semantic-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-context.js","sourceRoot":"","sources":["../src/semantic-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { SourceRange } from './semantic-types';
2
+ import { Entity } from './types';
3
+ export declare const SEMANTIC_FORMAT_VERSION: "1.0.0";
4
+ export type SemanticFormatEditKind = 'canonicalize-heading' | 'canonicalize-task-marker' | 'add-task-marker';
5
+ export interface SemanticFormatEdit {
6
+ kind: SemanticFormatEditKind;
7
+ sectionKey: string;
8
+ range: SourceRange;
9
+ before: string;
10
+ after: string;
11
+ }
12
+ export interface SemanticFormatIssue {
13
+ code: string;
14
+ severity: 'info' | 'warning' | 'error';
15
+ message: string;
16
+ sectionKey: string | null;
17
+ range: SourceRange | null;
18
+ blocksApply: boolean;
19
+ }
20
+ export interface SemanticFormatEntityPreview {
21
+ formatVersion: typeof SEMANTIC_FORMAT_VERSION;
22
+ entityId: string;
23
+ entityType: Entity['type'];
24
+ filePath: string;
25
+ sourceFingerprint: string;
26
+ changed: boolean;
27
+ blocked: boolean;
28
+ edits: SemanticFormatEdit[];
29
+ issues: SemanticFormatIssue[];
30
+ diff: string;
31
+ formattedContent: string;
32
+ }
33
+ export interface SemanticFormatBatchPreview {
34
+ formatVersion: typeof SEMANTIC_FORMAT_VERSION;
35
+ entityIds: string[];
36
+ changedEntityIds: string[];
37
+ blockedEntityIds: string[];
38
+ expectedFingerprints: Record<string, string>;
39
+ previews: SemanticFormatEntityPreview[];
40
+ }
41
+ export interface SemanticFormatApplyResult extends SemanticFormatBatchPreview {
42
+ appliedEntityIds: string[];
43
+ }
44
+ /** Preview deterministic Markdown-only normalization for a bounded entity list. */
45
+ export declare function previewSemanticFormats(rootPath: string, entityIds: readonly string[]): Promise<SemanticFormatBatchPreview>;
46
+ /**
47
+ * Apply exactly the previously previewed source snapshots. Every proposed
48
+ * result is validated before the first bounded write occurs.
49
+ */
50
+ export declare function applySemanticFormats(rootPath: string, entityIds: readonly string[], expectedFingerprints: Readonly<Record<string, string>>): Promise<SemanticFormatApplyResult>;
51
+ export declare function previewSemanticEntityFormat(entity: Entity, sourceContent: string, rootPath?: string): SemanticFormatEntityPreview;
52
+ //# sourceMappingURL=semantic-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-formatter.d.ts","sourceRoot":"","sources":["../src/semantic-formatter.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAc,MAAM,SAAS,CAAC;AAE7C,eAAO,MAAM,uBAAuB,EAAG,OAAgB,CAAC;AAExD,MAAM,MAAM,sBAAsB,GAC9B,sBAAsB,GACtB,0BAA0B,GAC1B,iBAAiB,CAAC;AAEtB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,OAAO,uBAAuB,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,OAAO,uBAAuB,CAAC;IAC9C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,EAAE,2BAA2B,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,yBAA0B,SAAQ,0BAA0B;IAC3E,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAOD,mFAAmF;AACnF,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,0BAA0B,CAAC,CAOrC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACrD,OAAO,CAAC,yBAAyB,CAAC,CA2DpC;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAK,GACZ,2BAA2B,CA6H7B"}