@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.
- package/assets/dashboard/style.css +8 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +40 -17
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +0 -9
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dashboard.d.ts +95 -8
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +253 -32
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +1 -13
- package/dist/commands/decision.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +36 -41
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/workflow/instructions.d.ts +0 -2
- package/dist/commands/workflow/instructions.d.ts.map +1 -1
- package/dist/commands/workflow/instructions.js +2 -37
- package/dist/commands/workflow/instructions.js.map +1 -1
- package/dist/commands/workflow/shared.d.ts +0 -3
- package/dist/commands/workflow/shared.d.ts.map +1 -1
- package/dist/commands/workflow/shared.js.map +1 -1
- package/dist/core/archive.d.ts +13 -4
- package/dist/core/archive.d.ts.map +1 -1
- package/dist/core/archive.js +89 -117
- package/dist/core/archive.js.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.d.ts +0 -5
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +31 -37
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
- package/dist/core/artifact-graph/resolver.d.ts +6 -0
- package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
- package/dist/core/artifact-graph/resolver.js +79 -124
- package/dist/core/artifact-graph/resolver.js.map +1 -1
- package/dist/core/change-presenter.d.ts +0 -1
- package/dist/core/change-presenter.d.ts.map +1 -1
- package/dist/core/change-presenter.js +3 -20
- package/dist/core/change-presenter.js.map +1 -1
- package/dist/core/command-generation/adapters/index.d.ts +9 -1
- package/dist/core/command-generation/adapters/index.d.ts.map +1 -1
- package/dist/core/command-generation/adapters/index.js +10 -1
- package/dist/core/command-generation/adapters/index.js.map +1 -1
- package/dist/core/command-generation/index.d.ts +2 -2
- package/dist/core/command-generation/index.d.ts.map +1 -1
- package/dist/core/command-generation/index.js +2 -2
- package/dist/core/command-generation/index.js.map +1 -1
- package/dist/core/config.d.ts +0 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +0 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/converters/json-converter.d.ts +0 -1
- package/dist/core/converters/json-converter.d.ts.map +1 -1
- package/dist/core/converters/json-converter.js +3 -17
- package/dist/core/converters/json-converter.js.map +1 -1
- package/dist/core/dashboard-activity.d.ts.map +1 -1
- package/dist/core/dashboard-activity.js +2 -8
- package/dist/core/dashboard-activity.js.map +1 -1
- package/dist/core/dashboard-data.d.ts +7 -7
- package/dist/core/dashboard-data.d.ts.map +1 -1
- package/dist/core/dashboard-data.js +15 -54
- package/dist/core/dashboard-data.js.map +1 -1
- package/dist/core/id.d.ts +0 -8
- package/dist/core/id.d.ts.map +1 -1
- package/dist/core/id.js +0 -19
- package/dist/core/id.js.map +1 -1
- package/dist/core/init.d.ts +0 -1
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +9 -23
- package/dist/core/init.js.map +1 -1
- package/dist/core/list.d.ts.map +1 -1
- package/dist/core/list.js +3 -34
- package/dist/core/list.js.map +1 -1
- package/dist/core/migrate.js +9 -15
- package/dist/core/migrate.js.map +1 -1
- package/dist/core/parsers/markdown-parser.d.ts +11 -1
- package/dist/core/parsers/markdown-parser.d.ts.map +1 -1
- package/dist/core/parsers/markdown-parser.js +25 -13
- package/dist/core/parsers/markdown-parser.js.map +1 -1
- package/dist/core/planning-home.d.ts +6 -0
- package/dist/core/planning-home.d.ts.map +1 -1
- package/dist/core/planning-home.js +6 -1
- package/dist/core/planning-home.js.map +1 -1
- package/dist/core/project-config.d.ts +5 -19
- package/dist/core/project-config.d.ts.map +1 -1
- package/dist/core/project-config.js +11 -130
- package/dist/core/project-config.js.map +1 -1
- package/dist/core/root-selection.d.ts.map +1 -1
- package/dist/core/root-selection.js +2 -15
- package/dist/core/root-selection.js.map +1 -1
- package/dist/core/shared/index.d.ts +1 -1
- package/dist/core/shared/index.d.ts.map +1 -1
- package/dist/core/shared/index.js +1 -1
- package/dist/core/shared/index.js.map +1 -1
- package/dist/core/shared/skill-generation.d.ts +4 -4
- package/dist/core/shared/skill-generation.d.ts.map +1 -1
- package/dist/core/shared/skill-generation.js +5 -5
- package/dist/core/shared/skill-generation.js.map +1 -1
- package/dist/core/shared/tool-detection.d.ts +3 -6
- package/dist/core/shared/tool-detection.d.ts.map +1 -1
- package/dist/core/shared/tool-detection.js +3 -9
- package/dist/core/shared/tool-detection.js.map +1 -1
- package/dist/core/spec-presenter.d.ts.map +1 -1
- package/dist/core/spec-presenter.js.map +1 -1
- package/dist/core/specs-apply.d.ts +0 -31
- package/dist/core/specs-apply.d.ts.map +1 -1
- package/dist/core/specs-apply.js +0 -102
- package/dist/core/specs-apply.js.map +1 -1
- package/dist/core/templates/fragments/verify.d.ts +12 -11
- package/dist/core/templates/fragments/verify.d.ts.map +1 -1
- package/dist/core/templates/fragments/verify.js +22 -15
- package/dist/core/templates/fragments/verify.js.map +1 -1
- package/dist/core/templates/skill-templates.d.ts +1 -1
- package/dist/core/templates/skill-templates.d.ts.map +1 -1
- package/dist/core/templates/skill-templates.js +1 -1
- package/dist/core/templates/skill-templates.js.map +1 -1
- package/dist/core/templates/workflows/apply.d.ts +2 -2
- package/dist/core/templates/workflows/apply.js +10 -10
- package/dist/core/templates/workflows/apply.js.map +1 -1
- package/dist/core/templates/workflows/archive.d.ts.map +1 -1
- package/dist/core/templates/workflows/archive.js +21 -25
- package/dist/core/templates/workflows/archive.js.map +1 -1
- package/dist/core/templates/workflows/reconcile.d.ts +14 -0
- package/dist/core/templates/workflows/reconcile.d.ts.map +1 -0
- package/dist/core/templates/workflows/{sync.js → reconcile.js} +28 -21
- package/dist/core/templates/workflows/reconcile.js.map +1 -0
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +6 -15
- package/dist/core/update.js.map +1 -1
- package/dist/core/validation/section-validator.d.ts.map +1 -1
- package/dist/core/validation/section-validator.js +3 -16
- package/dist/core/validation/section-validator.js.map +1 -1
- package/dist/core/validation/validator.d.ts +0 -2
- package/dist/core/validation/validator.d.ts.map +1 -1
- package/dist/core/validation/validator.js +36 -74
- package/dist/core/validation/validator.js.map +1 -1
- package/dist/utils/change-utils.d.ts.map +1 -1
- package/dist/utils/change-utils.js +3 -6
- package/dist/utils/change-utils.js.map +1 -1
- package/dist/utils/file-system.d.ts +17 -19
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +41 -189
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +22 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +39 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/item-discovery.d.ts +7 -0
- package/dist/utils/item-discovery.d.ts.map +1 -1
- package/dist/utils/item-discovery.js +13 -23
- package/dist/utils/item-discovery.js.map +1 -1
- package/dist/utils/link.d.ts +3 -1
- package/dist/utils/link.d.ts.map +1 -1
- package/dist/utils/link.js +4 -14
- package/dist/utils/link.js.map +1 -1
- package/dist/utils/task-progress.d.ts +0 -1
- package/dist/utils/task-progress.d.ts.map +1 -1
- package/dist/utils/task-progress.js +5 -6
- package/dist/utils/task-progress.js.map +1 -1
- package/package.json +1 -1
- package/dist/core/references.d.ts +0 -40
- package/dist/core/references.d.ts.map +0 -1
- package/dist/core/references.js +0 -11
- package/dist/core/references.js.map +0 -1
- package/dist/core/templates/workflows/sync.d.ts +0 -14
- package/dist/core/templates/workflows/sync.d.ts.map +0 -1
- package/dist/core/templates/workflows/sync.js.map +0 -1
- package/dist/utils/command-references.d.ts +0 -18
- package/dist/utils/command-references.d.ts.map +0 -1
- package/dist/utils/command-references.js +0 -20
- package/dist/utils/command-references.js.map +0 -1
- package/dist/utils/index.d.ts +0 -6
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -9
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/shell-detection.d.ts +0 -20
- package/dist/utils/shell-detection.d.ts.map +0 -1
- package/dist/utils/shell-detection.js +0 -41
- package/dist/utils/shell-detection.js.map +0 -1
|
@@ -76,26 +76,52 @@ export function isSchemaDir(parentDir, entry) {
|
|
|
76
76
|
* @param projectRoot - Optional project root directory for project-local schema resolution
|
|
77
77
|
* @returns The path to the schema directory, or null if not found
|
|
78
78
|
*/
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
79
|
+
/**
|
|
80
|
+
* Identity of a file's current contents, for cache invalidation. Null when the
|
|
81
|
+
* file cannot be stat'd, which disables caching for that path rather than
|
|
82
|
+
* risking a stale hit.
|
|
83
|
+
*/
|
|
84
|
+
export function fileStamp(filePath) {
|
|
85
|
+
try {
|
|
86
|
+
const { mtimeMs, size } = fs.statSync(filePath);
|
|
87
|
+
return `${mtimeMs}:${size}`;
|
|
87
88
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const userSchemaPath = path.join(userDir, 'schema.yaml');
|
|
91
|
-
if (fs.existsSync(userSchemaPath)) {
|
|
92
|
-
return userDir;
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
93
91
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
92
|
+
}
|
|
93
|
+
/** Parsed schemas keyed by path, invalidated when the file's stamp changes. */
|
|
94
|
+
const schemaCache = new Map();
|
|
95
|
+
/**
|
|
96
|
+
* The schema search path, **lowest precedence first** (package → user →
|
|
97
|
+
* project). Every lookup and listing walks this one list, so adding a source
|
|
98
|
+
* is a single edit rather than one per function.
|
|
99
|
+
*/
|
|
100
|
+
function schemaSources(projectRoot) {
|
|
101
|
+
return [
|
|
102
|
+
{ dir: getPackageSchemasDir(), source: 'package' },
|
|
103
|
+
{ dir: getUserSchemasDir(), source: 'user' },
|
|
104
|
+
...(projectRoot
|
|
105
|
+
? [{ dir: getProjectSchemasDir(projectRoot), source: 'project' }]
|
|
106
|
+
: []),
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
/** Names of the directories under `dir` that actually contain a schema.yaml. */
|
|
110
|
+
function scanSchemaDir(dir) {
|
|
111
|
+
if (!fs.existsSync(dir))
|
|
112
|
+
return [];
|
|
113
|
+
return fs
|
|
114
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
115
|
+
.filter((entry) => isSchemaDir(dir, entry) && fs.existsSync(path.join(dir, entry.name, 'schema.yaml')))
|
|
116
|
+
.map((entry) => entry.name);
|
|
117
|
+
}
|
|
118
|
+
export function getSchemaDir(name, projectRoot) {
|
|
119
|
+
// Highest precedence first: project overrides user overrides package.
|
|
120
|
+
for (const { dir } of schemaSources(projectRoot).reverse()) {
|
|
121
|
+
const candidate = path.join(dir, name);
|
|
122
|
+
if (fs.existsSync(path.join(candidate, 'schema.yaml'))) {
|
|
123
|
+
return candidate;
|
|
124
|
+
}
|
|
99
125
|
}
|
|
100
126
|
return null;
|
|
101
127
|
}
|
|
@@ -124,6 +150,15 @@ export function resolveSchema(name, projectRoot) {
|
|
|
124
150
|
throw new Error(`Schema '${normalizedName}' not found. Available schemas: ${availableSchemas.join(', ')}`);
|
|
125
151
|
}
|
|
126
152
|
const schemaPath = path.join(schemaDir, 'schema.yaml');
|
|
153
|
+
// A single status/list run resolves the same schema once per change, and the
|
|
154
|
+
// dashboard re-resolves on every refresh; the yaml + Zod + cycle-check parse
|
|
155
|
+
// dominates that cost. One statSync decides whether it can be skipped.
|
|
156
|
+
const stamp = fileStamp(schemaPath);
|
|
157
|
+
const cached = stamp === null ? undefined : schemaCache.get(schemaPath);
|
|
158
|
+
if (cached && cached.stamp === stamp) {
|
|
159
|
+
// Cloned so a caller mutating its schema cannot corrupt later resolutions.
|
|
160
|
+
return structuredClone(cached.schema);
|
|
161
|
+
}
|
|
127
162
|
// Load and parse the schema
|
|
128
163
|
let content;
|
|
129
164
|
try {
|
|
@@ -134,7 +169,11 @@ export function resolveSchema(name, projectRoot) {
|
|
|
134
169
|
throw new SchemaLoadError(`Failed to read schema at '${schemaPath}': ${ioError.message}`, schemaPath, ioError);
|
|
135
170
|
}
|
|
136
171
|
try {
|
|
137
|
-
|
|
172
|
+
const schema = parseSchema(content);
|
|
173
|
+
if (stamp !== null) {
|
|
174
|
+
schemaCache.set(schemaPath, { stamp, schema: structuredClone(schema) });
|
|
175
|
+
}
|
|
176
|
+
return schema;
|
|
138
177
|
}
|
|
139
178
|
catch (err) {
|
|
140
179
|
if (err instanceof SchemaValidationError) {
|
|
@@ -152,42 +191,9 @@ export function resolveSchema(name, projectRoot) {
|
|
|
152
191
|
*/
|
|
153
192
|
export function listSchemas(projectRoot) {
|
|
154
193
|
const schemas = new Set();
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
for (const entry of fs.readdirSync(packageDir, { withFileTypes: true })) {
|
|
159
|
-
if (isSchemaDir(packageDir, entry)) {
|
|
160
|
-
const schemaPath = path.join(packageDir, entry.name, 'schema.yaml');
|
|
161
|
-
if (fs.existsSync(schemaPath)) {
|
|
162
|
-
schemas.add(entry.name);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// Add user override schemas (may override package schemas)
|
|
168
|
-
const userDir = getUserSchemasDir();
|
|
169
|
-
if (fs.existsSync(userDir)) {
|
|
170
|
-
for (const entry of fs.readdirSync(userDir, { withFileTypes: true })) {
|
|
171
|
-
if (isSchemaDir(userDir, entry)) {
|
|
172
|
-
const schemaPath = path.join(userDir, entry.name, 'schema.yaml');
|
|
173
|
-
if (fs.existsSync(schemaPath)) {
|
|
174
|
-
schemas.add(entry.name);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
// Add project-local schemas (if projectRoot provided)
|
|
180
|
-
if (projectRoot) {
|
|
181
|
-
const projectDir = getProjectSchemasDir(projectRoot);
|
|
182
|
-
if (fs.existsSync(projectDir)) {
|
|
183
|
-
for (const entry of fs.readdirSync(projectDir, { withFileTypes: true })) {
|
|
184
|
-
if (isSchemaDir(projectDir, entry)) {
|
|
185
|
-
const schemaPath = path.join(projectDir, entry.name, 'schema.yaml');
|
|
186
|
-
if (fs.existsSync(schemaPath)) {
|
|
187
|
-
schemas.add(entry.name);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
194
|
+
for (const { dir } of schemaSources(projectRoot)) {
|
|
195
|
+
for (const name of scanSchemaDir(dir)) {
|
|
196
|
+
schemas.add(name);
|
|
191
197
|
}
|
|
192
198
|
}
|
|
193
199
|
return Array.from(schemas).sort();
|
|
@@ -201,76 +207,25 @@ export function listSchemas(projectRoot) {
|
|
|
201
207
|
export function listSchemasWithInfo(projectRoot) {
|
|
202
208
|
const schemas = [];
|
|
203
209
|
const seenNames = new Set();
|
|
204
|
-
//
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
seenNames.add(entry.name);
|
|
221
|
-
}
|
|
222
|
-
catch {
|
|
223
|
-
// Skip invalid schemas
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
// Add user override schemas (if not overridden by project)
|
|
231
|
-
const userDir = getUserSchemasDir();
|
|
232
|
-
if (fs.existsSync(userDir)) {
|
|
233
|
-
for (const entry of fs.readdirSync(userDir, { withFileTypes: true })) {
|
|
234
|
-
if (isSchemaDir(userDir, entry) && !seenNames.has(entry.name)) {
|
|
235
|
-
const schemaPath = path.join(userDir, entry.name, 'schema.yaml');
|
|
236
|
-
if (fs.existsSync(schemaPath)) {
|
|
237
|
-
try {
|
|
238
|
-
const schema = parseSchema(fs.readFileSync(schemaPath, 'utf-8'));
|
|
239
|
-
schemas.push({
|
|
240
|
-
name: entry.name,
|
|
241
|
-
description: schema.description || '',
|
|
242
|
-
artifacts: schema.artifacts.map((a) => a.id),
|
|
243
|
-
source: 'user',
|
|
244
|
-
});
|
|
245
|
-
seenNames.add(entry.name);
|
|
246
|
-
}
|
|
247
|
-
catch {
|
|
248
|
-
// Skip invalid schemas
|
|
249
|
-
}
|
|
250
|
-
}
|
|
210
|
+
// Highest precedence first, so an overridden schema is skipped rather than
|
|
211
|
+
// replaced. A schema that fails to parse is not marked seen — the next
|
|
212
|
+
// source down still gets a chance to supply it.
|
|
213
|
+
for (const { dir, source } of schemaSources(projectRoot).reverse()) {
|
|
214
|
+
for (const name of scanSchemaDir(dir)) {
|
|
215
|
+
if (seenNames.has(name))
|
|
216
|
+
continue;
|
|
217
|
+
try {
|
|
218
|
+
const schema = parseSchema(fs.readFileSync(path.join(dir, name, 'schema.yaml'), 'utf-8'));
|
|
219
|
+
schemas.push({
|
|
220
|
+
name,
|
|
221
|
+
description: schema.description || '',
|
|
222
|
+
artifacts: schema.artifacts.map((a) => a.id),
|
|
223
|
+
source,
|
|
224
|
+
});
|
|
225
|
+
seenNames.add(name);
|
|
251
226
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
// Add package built-in schemas (if not overridden by project or user)
|
|
255
|
-
const packageDir = getPackageSchemasDir();
|
|
256
|
-
if (fs.existsSync(packageDir)) {
|
|
257
|
-
for (const entry of fs.readdirSync(packageDir, { withFileTypes: true })) {
|
|
258
|
-
if (isSchemaDir(packageDir, entry) && !seenNames.has(entry.name)) {
|
|
259
|
-
const schemaPath = path.join(packageDir, entry.name, 'schema.yaml');
|
|
260
|
-
if (fs.existsSync(schemaPath)) {
|
|
261
|
-
try {
|
|
262
|
-
const schema = parseSchema(fs.readFileSync(schemaPath, 'utf-8'));
|
|
263
|
-
schemas.push({
|
|
264
|
-
name: entry.name,
|
|
265
|
-
description: schema.description || '',
|
|
266
|
-
artifacts: schema.artifacts.map((a) => a.id),
|
|
267
|
-
source: 'package',
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
catch {
|
|
271
|
-
// Skip invalid schemas
|
|
272
|
-
}
|
|
273
|
-
}
|
|
227
|
+
catch {
|
|
228
|
+
// Skip invalid schemas
|
|
274
229
|
}
|
|
275
230
|
}
|
|
276
231
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/core/artifact-graph/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGjE;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAGtB;IACA;IAHlB,YACE,OAAe,EACC,UAAkB,EAClB,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAQ;QAClB,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,qEAAqE;IACrE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,KAAgB;IAC7D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/core/artifact-graph/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-presenter.d.ts","sourceRoot":"","sources":["../../src/core/change-presenter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAId,QAAQ,CAAC,EAAE,MAAM;IAK7B,OAAO,CAAC,cAAc;IAItB;;;;;OAKG;IACG,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YA0ElK,UAAU;IASxB,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"change-presenter.d.ts","sourceRoot":"","sources":["../../src/core/change-presenter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAId,QAAQ,CAAC,EAAE,MAAM;IAK7B,OAAO,CAAC,cAAc;IAItB;;;;;OAKG;IACG,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YA0ElK,UAAU;IASxB,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import {
|
|
3
|
+
import { frontmatterString } from '../utils/frontmatter.js';
|
|
4
4
|
import { JsonConverter } from './converters/json-converter.js';
|
|
5
5
|
import { ChangeParser } from './parsers/change-parser.js';
|
|
6
6
|
import { emitSuccess } from '../commands/shared-output.js';
|
|
@@ -101,29 +101,12 @@ export class ChangePresenter {
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
extractTitle(content, changeName) {
|
|
104
|
-
// Prefer the ticket/proposal yaml frontmatter `title
|
|
105
|
-
const fmTitle =
|
|
104
|
+
// Prefer the ticket/proposal yaml frontmatter `title:`, then the H1.
|
|
105
|
+
const fmTitle = frontmatterString(content, 'title')?.trim();
|
|
106
106
|
if (fmTitle)
|
|
107
107
|
return fmTitle;
|
|
108
108
|
const match = content.match(/^#\s+(?:Change:\s+)?(.+)$/im);
|
|
109
109
|
return match ? match[1].trim() : changeName;
|
|
110
110
|
}
|
|
111
|
-
extractFrontmatterTitle(content) {
|
|
112
|
-
if (!content.startsWith('---'))
|
|
113
|
-
return null;
|
|
114
|
-
const end = content.indexOf('\n---', 3);
|
|
115
|
-
if (end === -1)
|
|
116
|
-
return null;
|
|
117
|
-
try {
|
|
118
|
-
const parsed = parseYaml(content.slice(3, end));
|
|
119
|
-
if (parsed && typeof parsed === 'object' && typeof parsed.title === 'string' && parsed.title.trim()) {
|
|
120
|
-
return parsed.title.trim();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
// Malformed frontmatter — fall through to H1/changeName.
|
|
125
|
-
}
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
111
|
}
|
|
129
112
|
//# sourceMappingURL=change-presenter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-presenter.js","sourceRoot":"","sources":["../../src/core/change-presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"change-presenter.js","sourceRoot":"","sources":["../../src/core/change-presenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Re-exports the tool command adapters tospec ships (claude only).
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
import type { ToolCommandAdapter } from '../types.js';
|
|
7
|
+
import { claudeAdapter } from './claude.js';
|
|
8
|
+
export { claudeAdapter };
|
|
9
|
+
/**
|
|
10
|
+
* The adapter registry. Adding a tool means adding it here — callers resolve by
|
|
11
|
+
* `toolId` rather than testing the tool name, so no generation code changes.
|
|
12
|
+
*/
|
|
13
|
+
export declare const COMMAND_ADAPTERS: readonly ToolCommandAdapter[];
|
|
14
|
+
export declare function findCommandAdapter(toolId: string): ToolCommandAdapter | undefined;
|
|
7
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/command-generation/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/command-generation/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,kBAAkB,EAAoB,CAAC;AAE/E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEjF"}
|
|
@@ -3,5 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Re-exports the tool command adapters tospec ships (claude only).
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
import { claudeAdapter } from './claude.js';
|
|
7
|
+
export { claudeAdapter };
|
|
8
|
+
/**
|
|
9
|
+
* The adapter registry. Adding a tool means adding it here — callers resolve by
|
|
10
|
+
* `toolId` rather than testing the tool name, so no generation code changes.
|
|
11
|
+
*/
|
|
12
|
+
export const COMMAND_ADAPTERS = [claudeAdapter];
|
|
13
|
+
export function findCommandAdapter(toolId) {
|
|
14
|
+
return COMMAND_ADAPTERS.find((adapter) => adapter.toolId === toolId);
|
|
15
|
+
}
|
|
7
16
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/command-generation/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/command-generation/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAkC,CAAC,aAAa,CAAC,CAAC;AAE/E,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Generic command generation with a tool adapter. Claude Code is the only
|
|
5
5
|
* shipped adapter today; add a tool by writing an adapter in adapters/ and
|
|
6
|
-
*
|
|
6
|
+
* registering it in COMMAND_ADAPTERS — callers resolve it by toolId.
|
|
7
7
|
*/
|
|
8
8
|
export type { CommandContent, ToolCommandAdapter, GeneratedCommand, } from './types.js';
|
|
9
9
|
export { generateCommand, generateCommands } from './generator.js';
|
|
10
|
-
export { claudeAdapter } from './adapters/index.js';
|
|
10
|
+
export { claudeAdapter, COMMAND_ADAPTERS, findCommandAdapter } from './adapters/index.js';
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/command-generation/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/command-generation/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Generic command generation with a tool adapter. Claude Code is the only
|
|
5
5
|
* shipped adapter today; add a tool by writing an adapter in adapters/ and
|
|
6
|
-
*
|
|
6
|
+
* registering it in COMMAND_ADAPTERS — callers resolve it by toolId.
|
|
7
7
|
*/
|
|
8
8
|
// Generator functions
|
|
9
9
|
export { generateCommand, generateCommands } from './generator.js';
|
|
10
10
|
// Adapters
|
|
11
|
-
export { claudeAdapter } from './adapters/index.js';
|
|
11
|
+
export { claudeAdapter, COMMAND_ADAPTERS, findCommandAdapter } from './adapters/index.js';
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/command-generation/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEnE,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/command-generation/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEnE,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,QAAQ,EAAE,YAAY,EAGlC,CAAC"}
|
package/dist/core/config.js
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
export const TOSPEC_DIR_NAME = 'tospec';
|
|
2
|
-
export const TOSPEC_MARKERS = {
|
|
3
|
-
start: '<!-- TOSPEC:START -->',
|
|
4
|
-
end: '<!-- TOSPEC:END -->'
|
|
5
|
-
};
|
|
6
2
|
export const AI_TOOLS = [
|
|
7
3
|
{ name: 'Claude Code', value: 'claude', available: true, successLabel: 'Claude Code', skillsDir: '.claude' },
|
|
8
4
|
{ name: 'Codex', value: 'codex', available: true, successLabel: 'Codex', skillsDir: '.codex' }
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAexC,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE;IAC5G,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;CAC/F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-converter.d.ts","sourceRoot":"","sources":["../../../src/core/converters/json-converter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json-converter.d.ts","sourceRoot":"","sources":["../../../src/core/converters/json-converter.ts"],"names":[],"mappings":"AAMA,qBAAa,aAAa;IACxB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAkBrC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAmB7D"}
|
|
@@ -2,12 +2,12 @@ import { readFileSync } from 'fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { MarkdownParser } from '../parsers/markdown-parser.js';
|
|
4
4
|
import { ChangeParser } from '../parsers/change-parser.js';
|
|
5
|
-
import {
|
|
5
|
+
import { extractNameFromPath } from '../../utils/file-system.js';
|
|
6
6
|
export class JsonConverter {
|
|
7
7
|
convertSpecToJson(filePath) {
|
|
8
8
|
const content = readFileSync(filePath, 'utf-8');
|
|
9
9
|
const parser = new MarkdownParser(content);
|
|
10
|
-
const specName =
|
|
10
|
+
const specName = extractNameFromPath(filePath);
|
|
11
11
|
const spec = parser.parseSpec(specName);
|
|
12
12
|
const jsonSpec = {
|
|
13
13
|
...spec,
|
|
@@ -20,7 +20,7 @@ export class JsonConverter {
|
|
|
20
20
|
}
|
|
21
21
|
async convertChangeToJson(filePath) {
|
|
22
22
|
const content = readFileSync(filePath, 'utf-8');
|
|
23
|
-
const changeName =
|
|
23
|
+
const changeName = extractNameFromPath(filePath);
|
|
24
24
|
const changeDir = path.dirname(filePath);
|
|
25
25
|
const parser = new ChangeParser(content, changeDir);
|
|
26
26
|
const change = await parser.parseChangeWithDeltas(changeName);
|
|
@@ -33,19 +33,5 @@ export class JsonConverter {
|
|
|
33
33
|
};
|
|
34
34
|
return JSON.stringify(jsonChange, null, 2);
|
|
35
35
|
}
|
|
36
|
-
extractNameFromPath(filePath) {
|
|
37
|
-
const normalizedPath = FileSystemUtils.toPosixPath(filePath);
|
|
38
|
-
const parts = normalizedPath.split('/');
|
|
39
|
-
for (let i = parts.length - 1; i >= 0; i--) {
|
|
40
|
-
if (parts[i] === 'specs' || parts[i] === 'changes') {
|
|
41
|
-
if (i < parts.length - 1) {
|
|
42
|
-
return parts[i + 1];
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
const fileName = parts[parts.length - 1] ?? '';
|
|
47
|
-
const dotIndex = fileName.lastIndexOf('.');
|
|
48
|
-
return dotIndex > 0 ? fileName.slice(0, dotIndex) : fileName;
|
|
49
|
-
}
|
|
50
36
|
}
|
|
51
37
|
//# sourceMappingURL=json-converter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-converter.js","sourceRoot":"","sources":["../../../src/core/converters/json-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"json-converter.js","sourceRoot":"","sources":["../../../src/core/converters/json-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,OAAO,aAAa;IACxB,iBAAiB,CAAC,QAAgB;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAExC,MAAM,QAAQ,GAAG;YACf,GAAG,IAAI;YACP,QAAQ,EAAE;gBACR,GAAG,IAAI,CAAC,QAAQ;gBAChB,UAAU,EAAE,QAAQ;aACrB;SACF,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QACxC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAE9D,MAAM,UAAU,GAAG;YACjB,GAAG,MAAM;YACT,QAAQ,EAAE;gBACR,GAAG,MAAM,CAAC,QAAQ;gBAClB,UAAU,EAAE,QAAQ;aACrB;SACF,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;CAEF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-activity.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-activity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"dashboard-activity.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-activity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAIrC,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,GAAE,MAAsB,EAC5B,KAAK,GAAE,IAAiB,GACvB,WAAW,EAAE,CAaf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,EAAE,EACnB,iBAAiB,EAAE,MAAM,EACzB,UAAU,GAAE,MAA0B,GACrC,OAAO,CAMT;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,MAAsB,EAC/B,KAAK,GAAE,IAAiB,GACvB,MAAM,CAWR;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM5D;AAgCD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,GAAE,cAA8B,GACrC,OAAO,CAAC,iBAAiB,CAAC,CAgC5B"}
|
|
@@ -10,6 +10,7 @@ import { execFile } from 'node:child_process';
|
|
|
10
10
|
import { promisify } from 'node:util';
|
|
11
11
|
import { readProjectConfig } from './project-config.js';
|
|
12
12
|
import { getActiveChangeIds } from '../utils/item-discovery.js';
|
|
13
|
+
import { formatLocalDate } from '../utils/timestamp.js';
|
|
13
14
|
const execFileAsync = promisify(execFile);
|
|
14
15
|
export const DEFAULT_STALE_DAYS = 14;
|
|
15
16
|
const ACTIVITY_DAYS = 30;
|
|
@@ -17,13 +18,6 @@ const DRIFT_WINDOW_DAYS = 7;
|
|
|
17
18
|
// -----------------------------------------------------------------------------
|
|
18
19
|
// Pure aggregation (unit-testable)
|
|
19
20
|
// -----------------------------------------------------------------------------
|
|
20
|
-
/** yyyy-mm-dd in local time. */
|
|
21
|
-
function isoDay(d) {
|
|
22
|
-
const y = d.getFullYear();
|
|
23
|
-
const m = String(d.getMonth() + 1).padStart(2, '0');
|
|
24
|
-
const day = String(d.getDate()).padStart(2, '0');
|
|
25
|
-
return `${y}-${m}-${day}`;
|
|
26
|
-
}
|
|
27
21
|
/**
|
|
28
22
|
* Buckets two lists of commit dates (yyyy-mm-dd, from `git log --date=short`)
|
|
29
23
|
* into a zero-filled daily series covering the last `days` days ending `today`.
|
|
@@ -38,7 +32,7 @@ export function aggregateDaily(repoDates, tospecDates, days = ACTIVITY_DAYS, tod
|
|
|
38
32
|
const out = [];
|
|
39
33
|
for (let i = days - 1; i >= 0; i--) {
|
|
40
34
|
const d = new Date(today.getFullYear(), today.getMonth(), today.getDate() - i);
|
|
41
|
-
const key =
|
|
35
|
+
const key = formatLocalDate(d);
|
|
42
36
|
out.push({ date: key, repo: repoCounts.get(key) ?? 0, tospec: tospecCounts.get(key) ?? 0 });
|
|
43
37
|
}
|
|
44
38
|
return out;
|