@seanmars/tospec 0.12.0 → 0.13.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 (180) hide show
  1. package/assets/dashboard/style.css +8 -3
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +40 -17
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/commands/config.d.ts.map +1 -1
  6. package/dist/commands/config.js +0 -9
  7. package/dist/commands/config.js.map +1 -1
  8. package/dist/commands/dashboard.d.ts +95 -8
  9. package/dist/commands/dashboard.d.ts.map +1 -1
  10. package/dist/commands/dashboard.js +253 -32
  11. package/dist/commands/dashboard.js.map +1 -1
  12. package/dist/commands/decision.d.ts.map +1 -1
  13. package/dist/commands/decision.js +1 -13
  14. package/dist/commands/decision.js.map +1 -1
  15. package/dist/commands/validate.d.ts.map +1 -1
  16. package/dist/commands/validate.js +36 -41
  17. package/dist/commands/validate.js.map +1 -1
  18. package/dist/commands/workflow/instructions.d.ts +0 -2
  19. package/dist/commands/workflow/instructions.d.ts.map +1 -1
  20. package/dist/commands/workflow/instructions.js +2 -37
  21. package/dist/commands/workflow/instructions.js.map +1 -1
  22. package/dist/commands/workflow/shared.d.ts +0 -3
  23. package/dist/commands/workflow/shared.d.ts.map +1 -1
  24. package/dist/commands/workflow/shared.js.map +1 -1
  25. package/dist/core/archive.d.ts +13 -4
  26. package/dist/core/archive.d.ts.map +1 -1
  27. package/dist/core/archive.js +89 -117
  28. package/dist/core/archive.js.map +1 -1
  29. package/dist/core/artifact-graph/instruction-loader.d.ts +0 -5
  30. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
  31. package/dist/core/artifact-graph/instruction-loader.js +31 -37
  32. package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
  33. package/dist/core/artifact-graph/resolver.d.ts +6 -0
  34. package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
  35. package/dist/core/artifact-graph/resolver.js +79 -124
  36. package/dist/core/artifact-graph/resolver.js.map +1 -1
  37. package/dist/core/change-presenter.d.ts +0 -1
  38. package/dist/core/change-presenter.d.ts.map +1 -1
  39. package/dist/core/change-presenter.js +3 -20
  40. package/dist/core/change-presenter.js.map +1 -1
  41. package/dist/core/command-generation/adapters/index.d.ts +9 -1
  42. package/dist/core/command-generation/adapters/index.d.ts.map +1 -1
  43. package/dist/core/command-generation/adapters/index.js +10 -1
  44. package/dist/core/command-generation/adapters/index.js.map +1 -1
  45. package/dist/core/command-generation/index.d.ts +2 -2
  46. package/dist/core/command-generation/index.d.ts.map +1 -1
  47. package/dist/core/command-generation/index.js +2 -2
  48. package/dist/core/command-generation/index.js.map +1 -1
  49. package/dist/core/config.d.ts +0 -4
  50. package/dist/core/config.d.ts.map +1 -1
  51. package/dist/core/config.js +0 -4
  52. package/dist/core/config.js.map +1 -1
  53. package/dist/core/converters/json-converter.d.ts +0 -1
  54. package/dist/core/converters/json-converter.d.ts.map +1 -1
  55. package/dist/core/converters/json-converter.js +3 -17
  56. package/dist/core/converters/json-converter.js.map +1 -1
  57. package/dist/core/dashboard-activity.d.ts.map +1 -1
  58. package/dist/core/dashboard-activity.js +2 -8
  59. package/dist/core/dashboard-activity.js.map +1 -1
  60. package/dist/core/dashboard-data.d.ts +7 -7
  61. package/dist/core/dashboard-data.d.ts.map +1 -1
  62. package/dist/core/dashboard-data.js +15 -54
  63. package/dist/core/dashboard-data.js.map +1 -1
  64. package/dist/core/id.d.ts +0 -8
  65. package/dist/core/id.d.ts.map +1 -1
  66. package/dist/core/id.js +0 -19
  67. package/dist/core/id.js.map +1 -1
  68. package/dist/core/init.d.ts +0 -1
  69. package/dist/core/init.d.ts.map +1 -1
  70. package/dist/core/init.js +9 -23
  71. package/dist/core/init.js.map +1 -1
  72. package/dist/core/list.d.ts.map +1 -1
  73. package/dist/core/list.js +3 -34
  74. package/dist/core/list.js.map +1 -1
  75. package/dist/core/migrate.js +9 -15
  76. package/dist/core/migrate.js.map +1 -1
  77. package/dist/core/parsers/markdown-parser.d.ts +11 -1
  78. package/dist/core/parsers/markdown-parser.d.ts.map +1 -1
  79. package/dist/core/parsers/markdown-parser.js +25 -13
  80. package/dist/core/parsers/markdown-parser.js.map +1 -1
  81. package/dist/core/planning-home.d.ts +6 -0
  82. package/dist/core/planning-home.d.ts.map +1 -1
  83. package/dist/core/planning-home.js +6 -1
  84. package/dist/core/planning-home.js.map +1 -1
  85. package/dist/core/project-config.d.ts +5 -19
  86. package/dist/core/project-config.d.ts.map +1 -1
  87. package/dist/core/project-config.js +11 -130
  88. package/dist/core/project-config.js.map +1 -1
  89. package/dist/core/root-selection.d.ts.map +1 -1
  90. package/dist/core/root-selection.js +2 -15
  91. package/dist/core/root-selection.js.map +1 -1
  92. package/dist/core/shared/index.d.ts +1 -1
  93. package/dist/core/shared/index.d.ts.map +1 -1
  94. package/dist/core/shared/index.js +1 -1
  95. package/dist/core/shared/index.js.map +1 -1
  96. package/dist/core/shared/skill-generation.d.ts +4 -4
  97. package/dist/core/shared/skill-generation.d.ts.map +1 -1
  98. package/dist/core/shared/skill-generation.js +5 -5
  99. package/dist/core/shared/skill-generation.js.map +1 -1
  100. package/dist/core/shared/tool-detection.d.ts +3 -6
  101. package/dist/core/shared/tool-detection.d.ts.map +1 -1
  102. package/dist/core/shared/tool-detection.js +3 -9
  103. package/dist/core/shared/tool-detection.js.map +1 -1
  104. package/dist/core/spec-presenter.d.ts.map +1 -1
  105. package/dist/core/spec-presenter.js.map +1 -1
  106. package/dist/core/specs-apply.d.ts +0 -31
  107. package/dist/core/specs-apply.d.ts.map +1 -1
  108. package/dist/core/specs-apply.js +0 -102
  109. package/dist/core/specs-apply.js.map +1 -1
  110. package/dist/core/templates/fragments/verify.d.ts +12 -11
  111. package/dist/core/templates/fragments/verify.d.ts.map +1 -1
  112. package/dist/core/templates/fragments/verify.js +22 -15
  113. package/dist/core/templates/fragments/verify.js.map +1 -1
  114. package/dist/core/templates/skill-templates.d.ts +1 -1
  115. package/dist/core/templates/skill-templates.d.ts.map +1 -1
  116. package/dist/core/templates/skill-templates.js +1 -1
  117. package/dist/core/templates/skill-templates.js.map +1 -1
  118. package/dist/core/templates/workflows/apply.d.ts +2 -2
  119. package/dist/core/templates/workflows/apply.js +10 -10
  120. package/dist/core/templates/workflows/apply.js.map +1 -1
  121. package/dist/core/templates/workflows/archive.d.ts.map +1 -1
  122. package/dist/core/templates/workflows/archive.js +21 -25
  123. package/dist/core/templates/workflows/archive.js.map +1 -1
  124. package/dist/core/templates/workflows/reconcile.d.ts +14 -0
  125. package/dist/core/templates/workflows/reconcile.d.ts.map +1 -0
  126. package/dist/core/templates/workflows/{sync.js → reconcile.js} +28 -21
  127. package/dist/core/templates/workflows/reconcile.js.map +1 -0
  128. package/dist/core/update.d.ts.map +1 -1
  129. package/dist/core/update.js +6 -15
  130. package/dist/core/update.js.map +1 -1
  131. package/dist/core/validation/section-validator.d.ts.map +1 -1
  132. package/dist/core/validation/section-validator.js +3 -16
  133. package/dist/core/validation/section-validator.js.map +1 -1
  134. package/dist/core/validation/validator.d.ts +0 -2
  135. package/dist/core/validation/validator.d.ts.map +1 -1
  136. package/dist/core/validation/validator.js +36 -74
  137. package/dist/core/validation/validator.js.map +1 -1
  138. package/dist/utils/change-utils.d.ts.map +1 -1
  139. package/dist/utils/change-utils.js +3 -6
  140. package/dist/utils/change-utils.js.map +1 -1
  141. package/dist/utils/file-system.d.ts +17 -19
  142. package/dist/utils/file-system.d.ts.map +1 -1
  143. package/dist/utils/file-system.js +41 -189
  144. package/dist/utils/file-system.js.map +1 -1
  145. package/dist/utils/frontmatter.d.ts +22 -0
  146. package/dist/utils/frontmatter.d.ts.map +1 -0
  147. package/dist/utils/frontmatter.js +39 -0
  148. package/dist/utils/frontmatter.js.map +1 -0
  149. package/dist/utils/item-discovery.d.ts +7 -0
  150. package/dist/utils/item-discovery.d.ts.map +1 -1
  151. package/dist/utils/item-discovery.js +13 -23
  152. package/dist/utils/item-discovery.js.map +1 -1
  153. package/dist/utils/link.d.ts +3 -1
  154. package/dist/utils/link.d.ts.map +1 -1
  155. package/dist/utils/link.js +4 -14
  156. package/dist/utils/link.js.map +1 -1
  157. package/dist/utils/task-progress.d.ts +0 -1
  158. package/dist/utils/task-progress.d.ts.map +1 -1
  159. package/dist/utils/task-progress.js +5 -6
  160. package/dist/utils/task-progress.js.map +1 -1
  161. package/package.json +1 -1
  162. package/dist/core/references.d.ts +0 -40
  163. package/dist/core/references.d.ts.map +0 -1
  164. package/dist/core/references.js +0 -11
  165. package/dist/core/references.js.map +0 -1
  166. package/dist/core/templates/workflows/sync.d.ts +0 -14
  167. package/dist/core/templates/workflows/sync.d.ts.map +0 -1
  168. package/dist/core/templates/workflows/sync.js.map +0 -1
  169. package/dist/utils/command-references.d.ts +0 -18
  170. package/dist/utils/command-references.d.ts.map +0 -1
  171. package/dist/utils/command-references.js +0 -20
  172. package/dist/utils/command-references.js.map +0 -1
  173. package/dist/utils/index.d.ts +0 -6
  174. package/dist/utils/index.d.ts.map +0 -1
  175. package/dist/utils/index.js +0 -9
  176. package/dist/utils/index.js.map +0 -1
  177. package/dist/utils/shell-detection.d.ts +0 -20
  178. package/dist/utils/shell-detection.d.ts.map +0 -1
  179. package/dist/utils/shell-detection.js +0 -41
  180. package/dist/utils/shell-detection.js.map +0 -1
@@ -1,65 +1,51 @@
1
1
  import * as nodeFs from 'fs';
2
2
  import path from 'path';
3
3
  const fs = nodeFs.promises;
4
- const { constants: fsConstants } = nodeFs;
5
- function hasOwnerGroupOrOtherWriteBit(stats) {
6
- return (stats.mode & 0o222) !== 0;
7
- }
8
- function hasOwnerGroupOrOtherExecuteBit(stats) {
9
- return (stats.mode & 0o111) !== 0;
10
- }
11
- async function hasWritableModeAndAccess(targetPath) {
12
- try {
13
- const stats = await fs.stat(targetPath);
14
- // POSIX root can often write despite mode bits, but Tospec should respect
15
- // explicit read-only file/directory modes when deciding whether an install
16
- // path is user-writable. This also keeps permission checks deterministic in
17
- // root-run CI containers. On Windows, chmod mode bits are not authoritative,
18
- // so rely on fs.access below.
19
- if (process.platform !== 'win32' && !hasOwnerGroupOrOtherWriteBit(stats)) {
20
- return false;
21
- }
22
- if (process.platform !== 'win32' && stats.isDirectory() && !hasOwnerGroupOrOtherExecuteBit(stats)) {
23
- return false;
24
- }
25
- const accessMode = stats.isDirectory()
26
- ? fsConstants.W_OK | fsConstants.X_OK
27
- : fsConstants.W_OK;
28
- await fs.access(targetPath, accessMode);
29
- return true;
30
- }
31
- catch {
32
- return false;
33
- }
34
- }
35
- function isMarkerOnOwnLine(content, markerIndex, markerLength) {
36
- let leftIndex = markerIndex - 1;
37
- while (leftIndex >= 0 && content[leftIndex] !== '\n') {
38
- const char = content[leftIndex];
39
- if (char !== ' ' && char !== '\t' && char !== '\r') {
40
- return false;
41
- }
42
- leftIndex--;
43
- }
44
- let rightIndex = markerIndex + markerLength;
45
- while (rightIndex < content.length && content[rightIndex] !== '\n') {
46
- const char = content[rightIndex];
47
- if (char !== ' ' && char !== '\t' && char !== '\r') {
48
- return false;
49
- }
50
- rightIndex++;
4
+ /**
5
+ * Most-recent mtime of any file under `dirPath` (recursive), falling back to
6
+ * the directory's own mtime when it holds no files.
7
+ *
8
+ * Shared by `tospec list --sort recent` and the dashboard so both rank changes
9
+ * by the same clock; they used to walk separately and could disagree.
10
+ * ponytail: recursive walk; fine at repo scale (dozens of changes).
11
+ */
12
+ export async function getLastModified(dirPath) {
13
+ let latest = null;
14
+ async function walk(dir) {
15
+ const entries = await fs.readdir(dir, { withFileTypes: true });
16
+ // Entries are independent and `latest` is an order-insensitive max, so the
17
+ // stats fan out instead of running one await at a time.
18
+ await Promise.all(entries.map(async (entry) => {
19
+ const full = path.join(dir, entry.name);
20
+ if (entry.isDirectory()) {
21
+ await walk(full);
22
+ return;
23
+ }
24
+ const { mtimeMs } = await fs.stat(full);
25
+ if (latest === null || mtimeMs > latest)
26
+ latest = mtimeMs;
27
+ }));
51
28
  }
52
- return true;
29
+ await walk(dirPath);
30
+ return latest === null ? (await fs.stat(dirPath)).mtime : new Date(latest);
53
31
  }
54
- function findMarkerIndex(content, marker, fromIndex = 0) {
55
- let currentIndex = content.indexOf(marker, fromIndex);
56
- while (currentIndex !== -1) {
57
- if (isMarkerOnOwnLine(content, currentIndex, marker.length)) {
58
- return currentIndex;
32
+ /**
33
+ * The artifact identity rule: the directory name following a `specs` or
34
+ * `changes` segment, falling back to the filename without its extension.
35
+ *
36
+ * Shared by the validator and the JSON converter so a report's `path` and the
37
+ * JSON `name` always agree on what a given file is called.
38
+ */
39
+ export function extractNameFromPath(filePath) {
40
+ const parts = FileSystemUtils.toPosixPath(filePath).split('/');
41
+ for (let i = parts.length - 1; i >= 0; i--) {
42
+ if ((parts[i] === 'specs' || parts[i] === 'changes') && i < parts.length - 1) {
43
+ return parts[i + 1];
59
44
  }
60
- currentIndex = content.indexOf(marker, currentIndex + marker.length);
61
45
  }
62
- return -1;
46
+ const fileName = parts[parts.length - 1] ?? '';
47
+ const dotIndex = fileName.lastIndexOf('.');
48
+ return dotIndex > 0 ? fileName.slice(0, dotIndex) : fileName;
63
49
  }
64
50
  export class FileSystemUtils {
65
51
  /**
@@ -123,68 +109,6 @@ export class FileSystemUtils {
123
109
  return false;
124
110
  }
125
111
  }
126
- /**
127
- * Finds the first existing parent directory by walking up the directory tree.
128
- * @param dirPath Starting directory path
129
- * @returns The first existing directory path, or null if root is reached without finding one
130
- */
131
- static async findFirstExistingDirectory(dirPath) {
132
- let currentDir = dirPath;
133
- while (true) {
134
- try {
135
- const stats = await fs.stat(currentDir);
136
- if (stats.isDirectory()) {
137
- return currentDir;
138
- }
139
- // Path component exists but is not a directory (edge case)
140
- console.debug(`Path component ${currentDir} exists but is not a directory`);
141
- return null;
142
- }
143
- catch (error) {
144
- if (error.code === 'ENOENT') {
145
- // Directory doesn't exist, move up one level
146
- const parentDir = path.dirname(currentDir);
147
- if (parentDir === currentDir) {
148
- // Reached filesystem root without finding existing directory
149
- return null;
150
- }
151
- currentDir = parentDir;
152
- }
153
- else {
154
- // Unexpected error (permissions, I/O error, etc.)
155
- console.debug(`Error checking directory ${currentDir}: ${error.message}`);
156
- return null;
157
- }
158
- }
159
- }
160
- }
161
- static async canWriteFile(filePath) {
162
- try {
163
- const stats = await fs.stat(filePath);
164
- if (stats.isDirectory()) {
165
- return hasWritableModeAndAccess(filePath);
166
- }
167
- if (!stats.isFile()) {
168
- return true;
169
- }
170
- return hasWritableModeAndAccess(filePath);
171
- }
172
- catch (error) {
173
- if (error.code === 'ENOENT') {
174
- // File doesn't exist - find first existing parent directory and check its permissions
175
- const parentDir = path.dirname(filePath);
176
- const existingDir = await this.findFirstExistingDirectory(parentDir);
177
- if (existingDir === null) {
178
- // No existing parent directory found (edge case)
179
- return false;
180
- }
181
- // Check if the existing parent directory is writable.
182
- return hasWritableModeAndAccess(existingDir);
183
- }
184
- console.debug(`Unable to determine write permissions for ${filePath}: ${error.message}`);
185
- return false;
186
- }
187
- }
188
112
  static async directoryExists(dirPath) {
189
113
  try {
190
114
  const stats = await fs.stat(dirPath);
@@ -205,34 +129,6 @@ export class FileSystemUtils {
205
129
  static async readFile(filePath) {
206
130
  return await fs.readFile(filePath, 'utf-8');
207
131
  }
208
- static async updateFileWithMarkers(filePath, content, startMarker, endMarker) {
209
- let existingContent = '';
210
- if (await this.fileExists(filePath)) {
211
- existingContent = await this.readFile(filePath);
212
- const startIndex = findMarkerIndex(existingContent, startMarker);
213
- const endIndex = startIndex !== -1
214
- ? findMarkerIndex(existingContent, endMarker, startIndex + startMarker.length)
215
- : findMarkerIndex(existingContent, endMarker);
216
- if (startIndex !== -1 && endIndex !== -1) {
217
- if (endIndex < startIndex) {
218
- throw new Error(`Invalid marker state in ${filePath}. End marker appears before start marker.`);
219
- }
220
- const before = existingContent.substring(0, startIndex);
221
- const after = existingContent.substring(endIndex + endMarker.length);
222
- existingContent = before + startMarker + '\n' + content + '\n' + endMarker + after;
223
- }
224
- else if (startIndex === -1 && endIndex === -1) {
225
- existingContent = startMarker + '\n' + content + '\n' + endMarker + '\n\n' + existingContent;
226
- }
227
- else {
228
- throw new Error(`Invalid marker state in ${filePath}. Found start: ${startIndex !== -1}, Found end: ${endIndex !== -1}`);
229
- }
230
- }
231
- else {
232
- existingContent = startMarker + '\n' + content + '\n' + endMarker;
233
- }
234
- await this.writeFile(filePath, existingContent);
235
- }
236
132
  static async ensureWritePermissions(dirPath) {
237
133
  try {
238
134
  // If directory doesn't exist, check parent directory permissions
@@ -273,48 +169,4 @@ export class FileSystemUtils {
273
169
  }
274
170
  }
275
171
  }
276
- /**
277
- * Removes a marker block from file content.
278
- * Only removes markers that are on their own lines (ignores inline mentions).
279
- * Cleans up double blank lines that may result from removal.
280
- *
281
- * @param content - File content with markers
282
- * @param startMarker - The start marker string
283
- * @param endMarker - The end marker string
284
- * @returns Content with marker block removed, or original content if markers not found/invalid
285
- */
286
- export function removeMarkerBlock(content, startMarker, endMarker) {
287
- const startIndex = findMarkerIndex(content, startMarker);
288
- const endIndex = startIndex !== -1
289
- ? findMarkerIndex(content, endMarker, startIndex + startMarker.length)
290
- : findMarkerIndex(content, endMarker);
291
- if (startIndex === -1 || endIndex === -1 || endIndex <= startIndex) {
292
- return content;
293
- }
294
- // Find the start of the line containing the start marker
295
- let lineStart = startIndex;
296
- while (lineStart > 0 && content[lineStart - 1] !== '\n') {
297
- lineStart--;
298
- }
299
- // Find the end of the line containing the end marker
300
- let lineEnd = endIndex + endMarker.length;
301
- while (lineEnd < content.length && content[lineEnd] !== '\n') {
302
- lineEnd++;
303
- }
304
- // Include the trailing newline if present
305
- if (lineEnd < content.length && content[lineEnd] === '\n') {
306
- lineEnd++;
307
- }
308
- const before = content.substring(0, lineStart);
309
- const after = content.substring(lineEnd);
310
- // Clean up double blank lines (handle both Unix \n and Windows \r\n)
311
- let result = before + after;
312
- result = result.replace(/(\r?\n){3,}/g, '\n\n');
313
- // Trim trailing whitespace but preserve leading whitespace and original newline style
314
- if (result.trimEnd() === '') {
315
- return '';
316
- }
317
- const newline = content.includes('\r\n') ? '\r\n' : '\n';
318
- return result.trimEnd() + newline;
319
- }
320
172
  //# sourceMappingURL=file-system.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Splits `---`-delimited yaml frontmatter from the markdown body.
3
+ *
4
+ * The single reader for ticket/change frontmatter: the dashboard, `tospec show`
5
+ * and archive must agree on which ticket belongs to which change, so the
6
+ * delimiter scan lives in one place rather than once per caller.
7
+ *
8
+ * Malformed yaml *throws* — the dashboard reports it per ticket as a
9
+ * `parseError` rather than silently showing a ticket with no metadata. Callers
10
+ * that would rather degrade than fail should use `frontmatterString`.
11
+ */
12
+ export declare function splitFrontmatter(content: string): {
13
+ data: Record<string, unknown>;
14
+ body: string;
15
+ };
16
+ /**
17
+ * Reads a string field from a document's frontmatter, or null when the field is
18
+ * absent, non-string, or the frontmatter does not parse. For display and
19
+ * lookup paths, where a broken header should fall back rather than fail.
20
+ */
21
+ export declare function frontmatterString(content: string, field: string): string | null;
22
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd,CAUA;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO/E"}
@@ -0,0 +1,39 @@
1
+ import { parse as parseYaml } from 'yaml';
2
+ /**
3
+ * Splits `---`-delimited yaml frontmatter from the markdown body.
4
+ *
5
+ * The single reader for ticket/change frontmatter: the dashboard, `tospec show`
6
+ * and archive must agree on which ticket belongs to which change, so the
7
+ * delimiter scan lives in one place rather than once per caller.
8
+ *
9
+ * Malformed yaml *throws* — the dashboard reports it per ticket as a
10
+ * `parseError` rather than silently showing a ticket with no metadata. Callers
11
+ * that would rather degrade than fail should use `frontmatterString`.
12
+ */
13
+ export function splitFrontmatter(content) {
14
+ if (!content.startsWith('---'))
15
+ return { data: {}, body: content };
16
+ const end = content.indexOf('\n---', 3);
17
+ if (end === -1)
18
+ return { data: {}, body: content };
19
+ const parsed = parseYaml(content.slice(3, end));
20
+ const data = parsed && typeof parsed === 'object' ? parsed : {};
21
+ const afterClose = content.indexOf('\n', end + 1);
22
+ const body = afterClose === -1 ? '' : content.slice(afterClose + 1);
23
+ return { data, body };
24
+ }
25
+ /**
26
+ * Reads a string field from a document's frontmatter, or null when the field is
27
+ * absent, non-string, or the frontmatter does not parse. For display and
28
+ * lookup paths, where a broken header should fall back rather than fail.
29
+ */
30
+ export function frontmatterString(content, field) {
31
+ try {
32
+ const value = splitFrontmatter(content).data[field];
33
+ return typeof value === 'string' ? value : null;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAI9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACnE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAEnD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAkC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACpE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,KAAa;IAC9D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -8,6 +8,13 @@
8
8
  * Add an index if a project ever accumulates thousands of active changes.
9
9
  */
10
10
  export declare function findTicketPath(root: string, changeName: string): Promise<string | undefined>;
11
+ /**
12
+ * Active change directory names under `changesDir`, sorted, excluding `archive`
13
+ * and dot-directories. The one rule for "which changes exist": list, archive
14
+ * and status each filtered slightly differently, so a stray `.tmp/` showed up
15
+ * in some listings and not others.
16
+ */
17
+ export declare function listActiveChangeDirs(changesDir: string): Promise<string[]>;
11
18
  export declare function getActiveChangeIds(root?: string): Promise<string[]>;
12
19
  export declare function getSpecIds(root?: string): Promise<string[]>;
13
20
  export declare function getArchivedChangeIds(root?: string): Promise<string[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"item-discovery.d.ts","sourceRoot":"","sources":["../../src/utils/item-discovery.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmBlG;AAkBD,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWxF;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBhF;AAED,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW1F"}
1
+ {"version":3,"file":"item-discovery.d.ts","sourceRoot":"","sources":["../../src/utils/item-discovery.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmBlG;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUhF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAExF;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBhF;AAED,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW1F"}
@@ -1,6 +1,6 @@
1
1
  import { promises as fs } from 'fs';
2
2
  import path from 'path';
3
- import { parse as parseYaml } from 'yaml';
3
+ import { frontmatterString } from './frontmatter.js';
4
4
  /**
5
5
  * Finds a change's ticket in the global `tospec/tickets/` index by matching the
6
6
  * ticket frontmatter's `change:` field. Scans only the active folder
@@ -25,7 +25,7 @@ export async function findTicketPath(root, changeName) {
25
25
  const full = path.join(ticketsPath, entry.name);
26
26
  try {
27
27
  const content = await fs.readFile(full, 'utf-8');
28
- if (readTicketChange(content) === changeName)
28
+ if (frontmatterString(content, 'change') === changeName)
29
29
  return full;
30
30
  }
31
31
  catch {
@@ -34,28 +34,15 @@ export async function findTicketPath(root, changeName) {
34
34
  }
35
35
  return undefined;
36
36
  }
37
- /** Reads the `change:` field from a ticket's yaml frontmatter, or null. */
38
- function readTicketChange(content) {
39
- if (!content.startsWith('---'))
40
- return null;
41
- const end = content.indexOf('\n---', 3);
42
- if (end === -1)
43
- return null;
44
- try {
45
- const parsed = parseYaml(content.slice(3, end));
46
- if (parsed && typeof parsed === 'object' && typeof parsed.change === 'string') {
47
- return parsed.change;
48
- }
49
- }
50
- catch {
51
- // malformed frontmatter — no match
52
- }
53
- return null;
54
- }
55
- export async function getActiveChangeIds(root = process.cwd()) {
56
- const changesPath = path.join(root, 'tospec', 'changes');
37
+ /**
38
+ * Active change directory names under `changesDir`, sorted, excluding `archive`
39
+ * and dot-directories. The one rule for "which changes exist": list, archive
40
+ * and status each filtered slightly differently, so a stray `.tmp/` showed up
41
+ * in some listings and not others.
42
+ */
43
+ export async function listActiveChangeDirs(changesDir) {
57
44
  try {
58
- const entries = await fs.readdir(changesPath, { withFileTypes: true });
45
+ const entries = await fs.readdir(changesDir, { withFileTypes: true });
59
46
  return entries
60
47
  .filter((entry) => entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'archive')
61
48
  .map((entry) => entry.name)
@@ -65,6 +52,9 @@ export async function getActiveChangeIds(root = process.cwd()) {
65
52
  return [];
66
53
  }
67
54
  }
55
+ export async function getActiveChangeIds(root = process.cwd()) {
56
+ return listActiveChangeDirs(path.join(root, 'tospec', 'changes'));
57
+ }
68
58
  export async function getSpecIds(root = process.cwd()) {
69
59
  const specsPath = path.join(root, 'tospec', 'specs');
70
60
  const result = [];
@@ -1 +1 @@
1
- {"version":3,"file":"item-discovery.js","sourceRoot":"","sources":["../../src/utils/item-discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"item-discovery.js","sourceRoot":"","sources":["../../src/utils/item-discovery.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * Recursively copies a directory, replacing any existing dest. This is how
3
- * init/update deliver skill files into each tool's directory.
3
+ * init/update deliver skill files into each tool's directory. The `rm` first
4
+ * is what makes it a replace rather than a merge: `cp` alone would leave
5
+ * files that the source no longer generates.
4
6
  */
5
7
  export declare function copyDir(src: string, dest: string): Promise<void>;
6
8
  //# sourceMappingURL=link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/utils/link.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAatE"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/utils/link.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE"}
@@ -1,22 +1,12 @@
1
1
  import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
2
  /**
4
3
  * Recursively copies a directory, replacing any existing dest. This is how
5
- * init/update deliver skill files into each tool's directory.
4
+ * init/update deliver skill files into each tool's directory. The `rm` first
5
+ * is what makes it a replace rather than a merge: `cp` alone would leave
6
+ * files that the source no longer generates.
6
7
  */
7
8
  export async function copyDir(src, dest) {
8
9
  await fs.promises.rm(dest, { recursive: true, force: true });
9
- await fs.promises.mkdir(dest, { recursive: true });
10
- const entries = await fs.promises.readdir(src, { withFileTypes: true });
11
- for (const entry of entries) {
12
- const srcPath = path.join(src, entry.name);
13
- const destPath = path.join(dest, entry.name);
14
- if (entry.isDirectory()) {
15
- await copyDir(srcPath, destPath);
16
- }
17
- else {
18
- await fs.promises.copyFile(srcPath, destPath);
19
- }
20
- }
10
+ await fs.promises.cp(src, dest, { recursive: true, verbatimSymlinks: true });
21
11
  }
22
12
  //# sourceMappingURL=link.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/utils/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IACrD,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/utils/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IACrD,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC"}
@@ -12,7 +12,6 @@ export interface TaskItem extends ParsedTask {
12
12
  file: string;
13
13
  }
14
14
  export declare function parseTasksFromContent(content: string): ParsedTask[];
15
- export declare function countTasksFromContent(content: string): TaskProgress;
16
15
  /**
17
16
  * Lists every task of a change, in file order. Files that can't be read (absent
18
17
  * `tasks.md`, or vanished between glob and read) contribute nothing rather than
@@ -1 +1 @@
1
- {"version":3,"file":"task-progress.d.ts","sourceRoot":"","sources":["../../src/utils/task-progress.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAanE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAGnE;AAiDD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAarB;AAED,qFAAqF;AACrF,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAGvB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1F;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAI/D"}
1
+ {"version":3,"file":"task-progress.d.ts","sourceRoot":"","sources":["../../src/utils/task-progress.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAanE;AAiDD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAarB;AAED,qFAAqF;AACrF,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAGvB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAI/D"}
@@ -14,7 +14,7 @@ import { resolveSchemaForChange } from './change-metadata.js';
14
14
  const TASK_PATTERN = /^([ \t]*)[-*]\s+\[([\sxX])\]\s*(.*)$/;
15
15
  export function parseTasksFromContent(content) {
16
16
  const tasks = [];
17
- content.split('\n').forEach((raw, i) => {
17
+ content.split(/\r?\n/).forEach((raw, i) => {
18
18
  const match = TASK_PATTERN.exec(raw);
19
19
  if (!match)
20
20
  return;
@@ -27,10 +27,6 @@ export function parseTasksFromContent(content) {
27
27
  });
28
28
  return tasks;
29
29
  }
30
- export function countTasksFromContent(content) {
31
- const tasks = parseTasksFromContent(content);
32
- return { total: tasks.length, completed: tasks.filter((t) => t.done).length };
33
- }
34
30
  /**
35
31
  * Identifies the change's tracked-tasks artifact: the artifact whose `generates`
36
32
  * equals the schema's `apply.tracks` value, falling back to the artifact with id
@@ -113,7 +109,10 @@ export async function setTaskDone(file, line, done) {
113
109
  const content = await fs.readFile(file, 'utf-8');
114
110
  const lines = content.split('\n');
115
111
  const raw = lines[line - 1];
116
- if (raw === undefined || !TASK_PATTERN.test(raw)) {
112
+ // Splitting on '\n' is what preserves CRLF through the rejoin below, so the
113
+ // line still carries its '\r' here. Match without it — `TASK_PATTERN`'s tail
114
+ // cannot cross a line terminator — but keep writing `raw`, endings intact.
115
+ if (raw === undefined || !TASK_PATTERN.test(raw.replace(/\r$/, ''))) {
117
116
  throw new Error(`Line ${line} of ${path.basename(file)} is not a task`);
118
117
  }
119
118
  lines[line - 1] = raw.replace(/\[[\sxX]\]/, done ? '[x]' : '[ ]');
@@ -1 +1 @@
1
- {"version":3,"file":"task-progress.js","sourceRoot":"","sources":["../../src/utils/task-progress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-progress.js","sourceRoot":"","sources":["../../src/utils/task-progress.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seanmars/tospec",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Spec-driven development CLI for structured requirements and issue workflows",
5
5
  "license": "MIT",
6
6
  "publishConfig": {