reffy-cli 0.7.0 → 1.1.1
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/README.md +35 -24
- package/dist/cli.js +539 -36
- package/dist/diagram.js +2 -2
- package/dist/doctor.d.ts +1 -4
- package/dist/doctor.js +8 -12
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/manifest.js +13 -0
- package/dist/plan-archive.d.ts +8 -0
- package/dist/plan-archive.js +169 -0
- package/dist/plan-runtime.d.ts +35 -0
- package/dist/plan-runtime.js +218 -0
- package/dist/plan.d.ts +25 -0
- package/dist/plan.js +298 -0
- package/dist/planning-paths.d.ts +18 -0
- package/dist/planning-paths.js +56 -0
- package/dist/planning-workspace.d.ts +8 -0
- package/dist/planning-workspace.js +76 -0
- package/dist/refs-paths.d.ts +13 -0
- package/dist/refs-paths.js +34 -9
- package/dist/spec-runtime.d.ts +14 -0
- package/dist/spec-runtime.js +82 -0
- package/dist/storage.d.ts +6 -0
- package/dist/storage.js +50 -0
- package/dist/types.d.ts +3 -0
- package/dist/workspace.d.ts +8 -0
- package/dist/workspace.js +51 -0
- package/package.json +14 -2
package/dist/storage.js
CHANGED
|
@@ -198,6 +198,56 @@ export class ReferencesStore {
|
|
|
198
198
|
async validateManifest() {
|
|
199
199
|
return validateManifest(this.manifestPath, this.artifactsDir);
|
|
200
200
|
}
|
|
201
|
+
async linkPlanningOutputs(artifactFilenames, outputPaths, changeId) {
|
|
202
|
+
const manifest = await this.readManifest();
|
|
203
|
+
const targets = new Set(artifactFilenames);
|
|
204
|
+
let linked = 0;
|
|
205
|
+
for (const artifact of manifest.artifacts) {
|
|
206
|
+
if (!targets.has(artifact.filename))
|
|
207
|
+
continue;
|
|
208
|
+
artifact.related_changes = Array.from(new Set([...(artifact.related_changes ?? []), changeId]));
|
|
209
|
+
artifact.derived_outputs = Array.from(new Set([...(artifact.derived_outputs ?? []), ...outputPaths]));
|
|
210
|
+
artifact.updated_at = utcNow();
|
|
211
|
+
linked += 1;
|
|
212
|
+
}
|
|
213
|
+
if (linked > 0) {
|
|
214
|
+
manifest.updated_at = utcNow();
|
|
215
|
+
await this.writeManifest(manifest);
|
|
216
|
+
}
|
|
217
|
+
return { linked };
|
|
218
|
+
}
|
|
219
|
+
async rewriteDerivedOutputPaths(pathMap) {
|
|
220
|
+
const replacements = Object.entries(pathMap);
|
|
221
|
+
if (replacements.length === 0) {
|
|
222
|
+
return { updated: 0 };
|
|
223
|
+
}
|
|
224
|
+
const manifest = await this.readManifest();
|
|
225
|
+
let updated = 0;
|
|
226
|
+
for (const artifact of manifest.artifacts) {
|
|
227
|
+
const outputs = artifact.derived_outputs ?? [];
|
|
228
|
+
if (outputs.length === 0)
|
|
229
|
+
continue;
|
|
230
|
+
let changed = false;
|
|
231
|
+
const nextOutputs = outputs.map((outputPath) => {
|
|
232
|
+
const replacement = pathMap[outputPath];
|
|
233
|
+
if (!replacement || replacement === outputPath) {
|
|
234
|
+
return outputPath;
|
|
235
|
+
}
|
|
236
|
+
changed = true;
|
|
237
|
+
return replacement;
|
|
238
|
+
});
|
|
239
|
+
if (!changed)
|
|
240
|
+
continue;
|
|
241
|
+
artifact.derived_outputs = Array.from(new Set(nextOutputs));
|
|
242
|
+
artifact.updated_at = utcNow();
|
|
243
|
+
updated += 1;
|
|
244
|
+
}
|
|
245
|
+
if (updated > 0) {
|
|
246
|
+
manifest.updated_at = utcNow();
|
|
247
|
+
await this.writeManifest(manifest);
|
|
248
|
+
}
|
|
249
|
+
return { updated };
|
|
250
|
+
}
|
|
201
251
|
async updateArtifact(artifactId, input) {
|
|
202
252
|
const manifest = await this.readManifest();
|
|
203
253
|
const index = manifest.artifacts.findIndex((item) => item.id === artifactId);
|
package/dist/types.d.ts
CHANGED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type WorkspaceState } from "./refs-paths.js";
|
|
2
|
+
export interface WorkspacePreparationResult {
|
|
3
|
+
state: WorkspaceState;
|
|
4
|
+
migrated: boolean;
|
|
5
|
+
created: boolean;
|
|
6
|
+
message?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function prepareCanonicalWorkspace(repoRoot: string): Promise<WorkspacePreparationResult>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { DEFAULT_REFS_DIRNAME, LEGACY_REFS_DIRNAME, detectWorkspaceState, resolveCanonicalRefsDir, } from "./refs-paths.js";
|
|
4
|
+
async function pathExists(targetPath) {
|
|
5
|
+
try {
|
|
6
|
+
await fs.access(targetPath);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async function ensureCanonicalStructure(repoRoot) {
|
|
14
|
+
const refsDir = resolveCanonicalRefsDir(repoRoot);
|
|
15
|
+
const artifactsDir = path.join(refsDir, "artifacts");
|
|
16
|
+
const manifestPath = path.join(refsDir, "manifest.json");
|
|
17
|
+
let created = false;
|
|
18
|
+
if (!(await pathExists(refsDir))) {
|
|
19
|
+
created = true;
|
|
20
|
+
}
|
|
21
|
+
await fs.mkdir(artifactsDir, { recursive: true });
|
|
22
|
+
if (!(await pathExists(manifestPath))) {
|
|
23
|
+
const now = new Date().toISOString();
|
|
24
|
+
await fs.writeFile(manifestPath, JSON.stringify({
|
|
25
|
+
version: 1,
|
|
26
|
+
created_at: now,
|
|
27
|
+
updated_at: now,
|
|
28
|
+
artifacts: [],
|
|
29
|
+
}, null, 2), "utf8");
|
|
30
|
+
}
|
|
31
|
+
return created;
|
|
32
|
+
}
|
|
33
|
+
export async function prepareCanonicalWorkspace(repoRoot) {
|
|
34
|
+
const current = detectWorkspaceState(repoRoot);
|
|
35
|
+
if (current.mode === "legacy") {
|
|
36
|
+
await fs.rename(current.legacyDir, current.canonicalDir);
|
|
37
|
+
const state = detectWorkspaceState(repoRoot);
|
|
38
|
+
return {
|
|
39
|
+
state,
|
|
40
|
+
migrated: true,
|
|
41
|
+
created: false,
|
|
42
|
+
message: `Migrated ${LEGACY_REFS_DIRNAME}/ to ${DEFAULT_REFS_DIRNAME}/`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const created = await ensureCanonicalStructure(repoRoot);
|
|
46
|
+
return {
|
|
47
|
+
state: detectWorkspaceState(repoRoot),
|
|
48
|
+
migrated: false,
|
|
49
|
+
created,
|
|
50
|
+
};
|
|
51
|
+
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reffy-cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "CLI-first, framework-agnostic references workflow for any repo (TypeScript)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"reffy",
|
|
7
|
-
"
|
|
7
|
+
"reffyspec",
|
|
8
8
|
"specs",
|
|
9
9
|
"cli",
|
|
10
10
|
"ai",
|
|
@@ -12,6 +12,14 @@
|
|
|
12
12
|
"sdd"
|
|
13
13
|
],
|
|
14
14
|
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/RoskiDeluge/reffy.git"
|
|
18
|
+
},
|
|
19
|
+
"homepage": "https://github.com/RoskiDeluge/reffy",
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/RoskiDeluge/reffy/issues"
|
|
22
|
+
},
|
|
15
23
|
"type": "module",
|
|
16
24
|
"main": "dist/index.js",
|
|
17
25
|
"files": [
|
|
@@ -33,6 +41,10 @@
|
|
|
33
41
|
"engines": {
|
|
34
42
|
"node": ">=20"
|
|
35
43
|
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"provenance": true,
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
36
48
|
"dependencies": {
|
|
37
49
|
"beautiful-mermaid": "^0.1.3",
|
|
38
50
|
"mime-types": "^2.1.35",
|