@rasensio/aidlc 1.12.0 → 1.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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +14 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +23 -37
- package/dist/commands/update.js.map +1 -1
- package/dist/compile/roadmap-skill.d.ts +76 -0
- package/dist/compile/roadmap-skill.d.ts.map +1 -0
- package/dist/compile/roadmap-skill.js +132 -0
- package/dist/compile/roadmap-skill.js.map +1 -0
- package/dist/core/version.d.ts +39 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +69 -0
- package/dist/core/version.js.map +1 -0
- package/dist/doctor/migrations/index.d.ts.map +1 -1
- package/dist/doctor/migrations/index.js +7 -0
- package/dist/doctor/migrations/index.js.map +1 -1
- package/dist/doctor/migrations/roadmap-layout.d.ts +73 -0
- package/dist/doctor/migrations/roadmap-layout.d.ts.map +1 -0
- package/dist/doctor/migrations/roadmap-layout.js +281 -0
- package/dist/doctor/migrations/roadmap-layout.js.map +1 -0
- package/dist/doctor/migrations/stale-idea-skill.d.ts +28 -0
- package/dist/doctor/migrations/stale-idea-skill.d.ts.map +1 -0
- package/dist/doctor/migrations/stale-idea-skill.js +111 -0
- package/dist/doctor/migrations/stale-idea-skill.js.map +1 -0
- package/dist/events/event-bus.d.ts.map +1 -1
- package/dist/events/event-bus.js +33 -0
- package/dist/events/event-bus.js.map +1 -1
- package/dist/events/shipped-actions.d.ts.map +1 -1
- package/dist/events/shipped-actions.js +10 -0
- package/dist/events/shipped-actions.js.map +1 -1
- package/dist/metrics/report.d.ts +30 -2
- package/dist/metrics/report.d.ts.map +1 -1
- package/dist/metrics/report.js +18 -2
- package/dist/metrics/report.js.map +1 -1
- package/dist/roadmap/paths.d.ts +96 -0
- package/dist/roadmap/paths.d.ts.map +1 -0
- package/dist/roadmap/paths.js +194 -0
- package/dist/roadmap/paths.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The package's own version and name — read once, from one place
|
|
3
|
+
* (roadmap-revamp/AC-18).
|
|
4
|
+
*
|
|
5
|
+
* Two call sites resolved `package.json` independently before this module
|
|
6
|
+
* existed, at *different* relative depths because each computed the path from
|
|
7
|
+
* its own compiled location: `cli.ts` builds to `dist/cli.js` so the package
|
|
8
|
+
* root is `..`, while `commands/update.ts` builds to `dist/commands/update.js`
|
|
9
|
+
* so it is `../..`. Both were correct and neither was copyable. A third reader
|
|
10
|
+
* at a third depth — roadmap-revamp added one — is a third chance to get it
|
|
11
|
+
* wrong, and the failure mode is silent: a bad path throws, the catch returns
|
|
12
|
+
* `0.0.0`, and the CLI reports a version it is not.
|
|
13
|
+
*
|
|
14
|
+
* Resolving here once removes the choice. This module compiles to
|
|
15
|
+
* `dist/core/version.js`, so the package root is `../..`.
|
|
16
|
+
*
|
|
17
|
+
* The values are module constants rather than functions because the manifest
|
|
18
|
+
* cannot change while the process runs, and a constant is what a template
|
|
19
|
+
* emitter can interpolate without threading a call through its signature.
|
|
20
|
+
*
|
|
21
|
+
* Deliberately NOT a literal: `scripts/check-docs-drift.mjs` fails the build on
|
|
22
|
+
* a hardcoded version in `cli.ts` because v1.1.0 shipped reporting `0.1.0`. The
|
|
23
|
+
* same check now covers the roadmap authoring skill's source template
|
|
24
|
+
* (roadmap-revamp/AC-17).
|
|
25
|
+
*
|
|
26
|
+
* @module
|
|
27
|
+
*/
|
|
28
|
+
import { readFileSync } from 'node:fs';
|
|
29
|
+
import { dirname, join } from 'node:path';
|
|
30
|
+
import { fileURLToPath } from 'node:url';
|
|
31
|
+
/** Fallbacks match the ones the previous private readers used. */
|
|
32
|
+
const FALLBACK_VERSION = '0.0.0';
|
|
33
|
+
const FALLBACK_NAME = '@rasensio/aidlc';
|
|
34
|
+
/**
|
|
35
|
+
* Absolute path to this package's root — the directory holding `package.json`.
|
|
36
|
+
*
|
|
37
|
+
* Exported because `commands/update.ts` needs the root itself, not only the
|
|
38
|
+
* two fields read from the manifest inside it.
|
|
39
|
+
*/
|
|
40
|
+
export function cliPackageRoot() {
|
|
41
|
+
return join(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Read the manifest once at module load.
|
|
45
|
+
*
|
|
46
|
+
* A throw here is not fatal: an unreadable manifest means a broken install, and
|
|
47
|
+
* every previous reader degraded to a placeholder rather than refusing to run.
|
|
48
|
+
* That behaviour is preserved so this refactor cannot change what a damaged
|
|
49
|
+
* install does.
|
|
50
|
+
*/
|
|
51
|
+
function readManifest() {
|
|
52
|
+
try {
|
|
53
|
+
const raw = readFileSync(join(cliPackageRoot(), 'package.json'), 'utf8');
|
|
54
|
+
const parsed = JSON.parse(raw);
|
|
55
|
+
return {
|
|
56
|
+
version: typeof parsed.version === 'string' ? parsed.version : FALLBACK_VERSION,
|
|
57
|
+
name: typeof parsed.name === 'string' ? parsed.name : FALLBACK_NAME,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return { version: FALLBACK_VERSION, name: FALLBACK_NAME };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const manifest = readManifest();
|
|
65
|
+
/** This package's version, e.g. `1.12.0`. */
|
|
66
|
+
export const VERSION = manifest.version;
|
|
67
|
+
/** This package's npm name, e.g. `@rasensio/aidlc`. */
|
|
68
|
+
export const PACKAGE_NAME = manifest.name;
|
|
69
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,kEAAkE;AAClE,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACjC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0C,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB;YAC/E,IAAI,EAAE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa;SACpE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;AAEhC,6CAA6C;AAC7C,MAAM,CAAC,MAAM,OAAO,GAAW,QAAQ,CAAC,OAAO,CAAC;AAEhD,uDAAuD;AACvD,MAAM,CAAC,MAAM,YAAY,GAAW,QAAQ,CAAC,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/doctor/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/doctor/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAiB7C,eAAO,MAAM,UAAU,EAAE,SAAS,EAsBjC,CAAC"}
|
|
@@ -18,12 +18,19 @@ import { unknownAgentClaims } from './unknown-agent-claims.js';
|
|
|
18
18
|
import { legacyCostHooks } from './legacy-cost-hooks.js';
|
|
19
19
|
import { missingCostShim } from './missing-cost-shim.js';
|
|
20
20
|
import { installGuidance } from './install-guidance.js';
|
|
21
|
+
import { staleIdeaSkill } from './stale-idea-skill.js';
|
|
22
|
+
import { roadmapLayout } from './roadmap-layout.js';
|
|
21
23
|
export const MIGRATIONS = [
|
|
22
24
|
costGitignore,
|
|
23
25
|
knowledgeGitignore,
|
|
24
26
|
gitattributes,
|
|
25
27
|
shippedActions,
|
|
26
28
|
installGuidance,
|
|
29
|
+
// Ordered before roadmap-layout: the orphaned skill still describes the old
|
|
30
|
+
// ideas directory, so clearing it first means a single run never leaves an
|
|
31
|
+
// instruction on disk that contradicts the layout the next migration creates.
|
|
32
|
+
staleIdeaSkill,
|
|
33
|
+
roadmapLayout,
|
|
27
34
|
untrackCostEphemera,
|
|
28
35
|
pruneSessionStash,
|
|
29
36
|
pruneCostLocks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/doctor/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/doctor/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC,aAAa;IACb,kBAAkB;IAClB,aAAa;IACb,cAAc;IACd,eAAe;IACf,4EAA4E;IAC5E,2EAA2E;IAC3E,8EAA8E;IAC9E,cAAc;IACd,aAAa;IACb,mBAAmB;IACnB,iBAAiB;IACjB,cAAc;IACd,wBAAwB;IACxB,aAAa;IACb,kBAAkB;IAClB,6EAA6E;IAC7E,6EAA6E;IAC7E,4EAA4E;IAC5E,eAAe;IACf,eAAe;CAChB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* roadmap-layout migration (roadmap-revamp/AC-23..AC-27, AC-38, confirm tier):
|
|
3
|
+
* move a legacy `.aidlc/ideas/` backlog into `.aidlc/roadmap/<status>/` and
|
|
4
|
+
* rewrite each item's frontmatter to the new schema.
|
|
5
|
+
*
|
|
6
|
+
* This is the first migration in this project that moves the *user's own*
|
|
7
|
+
* content rather than regenerating a framework artifact, which is why it is
|
|
8
|
+
* confirm tier and why every move goes through `git mv` when the file is
|
|
9
|
+
* tracked: a mistake stays one `git checkout` away from undone.
|
|
10
|
+
*
|
|
11
|
+
* `check` and `apply` both derive everything from `planRoadmapMoves` and nothing
|
|
12
|
+
* else computes pending-ness — the rule stated in `../types.ts`, so a dry run and
|
|
13
|
+
* a real run cannot disagree about what will happen.
|
|
14
|
+
*
|
|
15
|
+
* Old status maps to new directory: `raw` → `inbox`, `dropped` → `hold`,
|
|
16
|
+
* `promoted` → `done` or `in-progress` depending on whether the named instance
|
|
17
|
+
* actually finished. Raw items land in `inbox` rather than `backlog` because the
|
|
18
|
+
* old format has no field recording whether anything was ever triaged, and
|
|
19
|
+
* mapping to `backlog` would manufacture that signal (DD-8).
|
|
20
|
+
*
|
|
21
|
+
* Whether an instance finished is answered by `completionInfo` from the metrics
|
|
22
|
+
* module, not by a local "is the last phase complete?" test — that naive form is
|
|
23
|
+
* wrong for maintenance-terminal templates, which complete on maintenance entry.
|
|
24
|
+
*/
|
|
25
|
+
import type { Migration } from '../types.js';
|
|
26
|
+
import type { DoctorContext } from '../types.js';
|
|
27
|
+
import { type RoadmapStatus } from '../../roadmap/paths.js';
|
|
28
|
+
/** One planned relocation, with everything `apply` needs to carry it out. */
|
|
29
|
+
export interface RoadmapMove {
|
|
30
|
+
/** Absolute source path. */
|
|
31
|
+
from: string;
|
|
32
|
+
/** Absolute target path. */
|
|
33
|
+
to: string;
|
|
34
|
+
/** Repo-relative source, for the printed command list. */
|
|
35
|
+
fromRel: string;
|
|
36
|
+
/** Repo-relative target, for the printed command list. */
|
|
37
|
+
toRel: string;
|
|
38
|
+
status: RoadmapStatus;
|
|
39
|
+
/** Rewritten file contents. */
|
|
40
|
+
contents: string;
|
|
41
|
+
/** Tracked by git, so the move can preserve history. */
|
|
42
|
+
tracked: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface RoadmapPlan {
|
|
45
|
+
moves: RoadmapMove[];
|
|
46
|
+
/** Repo-relative paths the planner could not classify; left in place. */
|
|
47
|
+
unclassified: string[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Rewrite a legacy idea's frontmatter to the roadmap schema.
|
|
51
|
+
*
|
|
52
|
+
* Key order is fixed by AC-4, so the block is rebuilt rather than edited: the
|
|
53
|
+
* legacy shape shares only `promoted_to` and `depends_on` with the new one.
|
|
54
|
+
* The body below the frontmatter is copied through untouched apart from being
|
|
55
|
+
* read for its title.
|
|
56
|
+
*
|
|
57
|
+
* `author` is deliberately omitted rather than guessed. The legacy format never
|
|
58
|
+
* recorded one, and `created_by` from an unrelated instance is not the author of
|
|
59
|
+
* an idea.
|
|
60
|
+
*/
|
|
61
|
+
export declare function rewriteFrontmatter(raw: string, filename: string, status: RoadmapStatus): {
|
|
62
|
+
contents: string;
|
|
63
|
+
id: string;
|
|
64
|
+
} | null;
|
|
65
|
+
/**
|
|
66
|
+
* Everything the migration would do, computed without writing.
|
|
67
|
+
*
|
|
68
|
+
* The single source of pending-ness. Sorted by source path so the plan never
|
|
69
|
+
* depends on directory read order.
|
|
70
|
+
*/
|
|
71
|
+
export declare function planRoadmapMoves(ctx: DoctorContext): RoadmapPlan;
|
|
72
|
+
export declare const roadmapLayout: Migration;
|
|
73
|
+
//# sourceMappingURL=roadmap-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap-layout.d.ts","sourceRoot":"","sources":["../../../src/doctor/migrations/roadmap-layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAEhC,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,yEAAyE;IACzE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAsBD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,GACpB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA8CzC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,WAAW,CAmEhE;AASD,eAAO,MAAM,aAAa,EAAE,SA8G3B,CAAC"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* roadmap-layout migration (roadmap-revamp/AC-23..AC-27, AC-38, confirm tier):
|
|
3
|
+
* move a legacy `.aidlc/ideas/` backlog into `.aidlc/roadmap/<status>/` and
|
|
4
|
+
* rewrite each item's frontmatter to the new schema.
|
|
5
|
+
*
|
|
6
|
+
* This is the first migration in this project that moves the *user's own*
|
|
7
|
+
* content rather than regenerating a framework artifact, which is why it is
|
|
8
|
+
* confirm tier and why every move goes through `git mv` when the file is
|
|
9
|
+
* tracked: a mistake stays one `git checkout` away from undone.
|
|
10
|
+
*
|
|
11
|
+
* `check` and `apply` both derive everything from `planRoadmapMoves` and nothing
|
|
12
|
+
* else computes pending-ness — the rule stated in `../types.ts`, so a dry run and
|
|
13
|
+
* a real run cannot disagree about what will happen.
|
|
14
|
+
*
|
|
15
|
+
* Old status maps to new directory: `raw` → `inbox`, `dropped` → `hold`,
|
|
16
|
+
* `promoted` → `done` or `in-progress` depending on whether the named instance
|
|
17
|
+
* actually finished. Raw items land in `inbox` rather than `backlog` because the
|
|
18
|
+
* old format has no field recording whether anything was ever triaged, and
|
|
19
|
+
* mapping to `backlog` would manufacture that signal (DD-8).
|
|
20
|
+
*
|
|
21
|
+
* Whether an instance finished is answered by `completionInfo` from the metrics
|
|
22
|
+
* module, not by a local "is the last phase complete?" test — that naive form is
|
|
23
|
+
* wrong for maintenance-terminal templates, which complete on maintenance entry.
|
|
24
|
+
*/
|
|
25
|
+
import { execFileSync } from 'node:child_process';
|
|
26
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmdirSync, writeFileSync } from 'node:fs';
|
|
27
|
+
import { basename, dirname, join } from 'node:path';
|
|
28
|
+
import { parse as parseYaml } from 'yaml';
|
|
29
|
+
import { trackedFiles } from '../git.js';
|
|
30
|
+
import { completionInfo, loadAllTemplates, loadInstance } from '../../metrics/report.js';
|
|
31
|
+
import { ITEM_FILENAME_RE, LEGACY_IDEAS_DIR, ROADMAP_DIR, } from '../../roadmap/paths.js';
|
|
32
|
+
/** Map a legacy `status:` value onto a roadmap directory. */
|
|
33
|
+
function targetStatus(legacy, promotedTo, ctx, templates) {
|
|
34
|
+
if (legacy === 'raw')
|
|
35
|
+
return 'inbox';
|
|
36
|
+
if (legacy === 'dropped')
|
|
37
|
+
return 'hold';
|
|
38
|
+
if (legacy !== 'promoted')
|
|
39
|
+
return null;
|
|
40
|
+
// A promoted item with no instance name is a broken record, not a status we
|
|
41
|
+
// can derive. Treat it as in-flight rather than claiming it shipped.
|
|
42
|
+
if (promotedTo === null)
|
|
43
|
+
return 'in-progress';
|
|
44
|
+
const inst = loadInstance(ctx.projectRoot, promotedTo);
|
|
45
|
+
if (inst === null)
|
|
46
|
+
return 'in-progress';
|
|
47
|
+
return completionInfo(inst, templates).completed ? 'done' : 'in-progress';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Rewrite a legacy idea's frontmatter to the roadmap schema.
|
|
51
|
+
*
|
|
52
|
+
* Key order is fixed by AC-4, so the block is rebuilt rather than edited: the
|
|
53
|
+
* legacy shape shares only `promoted_to` and `depends_on` with the new one.
|
|
54
|
+
* The body below the frontmatter is copied through untouched apart from being
|
|
55
|
+
* read for its title.
|
|
56
|
+
*
|
|
57
|
+
* `author` is deliberately omitted rather than guessed. The legacy format never
|
|
58
|
+
* recorded one, and `created_by` from an unrelated instance is not the author of
|
|
59
|
+
* an idea.
|
|
60
|
+
*/
|
|
61
|
+
export function rewriteFrontmatter(raw, filename, status) {
|
|
62
|
+
const nameMatch = ITEM_FILENAME_RE.exec(filename);
|
|
63
|
+
if (!nameMatch)
|
|
64
|
+
return null;
|
|
65
|
+
const [, digits, slug] = nameMatch;
|
|
66
|
+
const createdAt = `${digits.slice(0, 4)}-${digits.slice(4, 6)}-${digits.slice(6, 8)}`;
|
|
67
|
+
const id = `item-${digits}-${slug}`;
|
|
68
|
+
if (!raw.startsWith('---\n'))
|
|
69
|
+
return null;
|
|
70
|
+
const close = raw.indexOf('\n---\n', 4);
|
|
71
|
+
if (close === -1)
|
|
72
|
+
return null;
|
|
73
|
+
let legacy = {};
|
|
74
|
+
try {
|
|
75
|
+
const parsed = parseYaml(raw.slice(4, close + 1));
|
|
76
|
+
if (typeof parsed === 'object' && parsed !== null)
|
|
77
|
+
legacy = parsed;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const body = raw.slice(close + '\n---\n'.length);
|
|
83
|
+
const titleMatch = /^#\s+(?:Idea:\s*)?(.+)$/m.exec(body);
|
|
84
|
+
const title = titleMatch ? titleMatch[1].trim() : slug.replaceAll('-', ' ');
|
|
85
|
+
const promotedTo = typeof legacy.promoted_to === 'string' ? legacy.promoted_to : null;
|
|
86
|
+
// Legacy `depends_on` names files; the new field names identifiers.
|
|
87
|
+
const deps = Array.isArray(legacy.depends_on)
|
|
88
|
+
? legacy.depends_on
|
|
89
|
+
.filter((d) => typeof d === 'string' && d.length > 0)
|
|
90
|
+
.map((d) => (d.startsWith('item-') ? d : `item-${d.replace(/\.md$/, '')}`))
|
|
91
|
+
: [];
|
|
92
|
+
const lines = [
|
|
93
|
+
'---',
|
|
94
|
+
`id: ${id}`,
|
|
95
|
+
`title: ${title.includes(': ') ? JSON.stringify(title) : title}`,
|
|
96
|
+
`created_at: ${createdAt}`,
|
|
97
|
+
'source: import',
|
|
98
|
+
`promoted_to: ${promotedTo === null ? 'null' : promotedTo}`,
|
|
99
|
+
`depends_on: [${deps.join(', ')}]`,
|
|
100
|
+
'history:',
|
|
101
|
+
` - { status: ${status}, at: ${createdAt} }`,
|
|
102
|
+
'---',
|
|
103
|
+
];
|
|
104
|
+
return { contents: `${lines.join('\n')}\n${body}`, id };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Everything the migration would do, computed without writing.
|
|
108
|
+
*
|
|
109
|
+
* The single source of pending-ness. Sorted by source path so the plan never
|
|
110
|
+
* depends on directory read order.
|
|
111
|
+
*/
|
|
112
|
+
export function planRoadmapMoves(ctx) {
|
|
113
|
+
const legacyDir = join(ctx.projectRoot, ...LEGACY_IDEAS_DIR.split('/'));
|
|
114
|
+
if (!existsSync(legacyDir))
|
|
115
|
+
return { moves: [], unclassified: [] };
|
|
116
|
+
const templates = loadAllTemplates(ctx.projectRoot);
|
|
117
|
+
const tracked = new Set(trackedFiles(ctx.projectRoot, [LEGACY_IDEAS_DIR]));
|
|
118
|
+
const moves = [];
|
|
119
|
+
const unclassified = [];
|
|
120
|
+
for (const name of readdirSync(legacyDir).sort()) {
|
|
121
|
+
if (!name.endsWith('.md'))
|
|
122
|
+
continue;
|
|
123
|
+
const from = join(legacyDir, name);
|
|
124
|
+
const fromRel = `${LEGACY_IDEAS_DIR}/${name}`;
|
|
125
|
+
let raw;
|
|
126
|
+
try {
|
|
127
|
+
raw = readFileSync(from, 'utf8');
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
unclassified.push(fromRel);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
let legacyStatus = null;
|
|
134
|
+
if (raw.startsWith('---\n')) {
|
|
135
|
+
const close = raw.indexOf('\n---\n', 4);
|
|
136
|
+
if (close !== -1) {
|
|
137
|
+
const m = /^status:\s*(\w+)/m.exec(raw.slice(4, close + 1));
|
|
138
|
+
if (m)
|
|
139
|
+
legacyStatus = m[1];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (legacyStatus === null) {
|
|
143
|
+
unclassified.push(fromRel);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const promotedTo = /^promoted_to:\s*(\S+)/m.exec(raw)?.[1] ?? null;
|
|
147
|
+
const status = targetStatus(legacyStatus, promotedTo === null || promotedTo === 'null' ? null : promotedTo, ctx, templates);
|
|
148
|
+
if (status === null) {
|
|
149
|
+
unclassified.push(fromRel);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const rewritten = rewriteFrontmatter(raw, name, status);
|
|
153
|
+
if (rewritten === null) {
|
|
154
|
+
unclassified.push(fromRel);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const toRel = `${ROADMAP_DIR}/${status}/${name}`;
|
|
158
|
+
moves.push({
|
|
159
|
+
from,
|
|
160
|
+
to: join(ctx.projectRoot, ...toRel.split('/')),
|
|
161
|
+
fromRel,
|
|
162
|
+
toRel,
|
|
163
|
+
status,
|
|
164
|
+
contents: rewritten.contents,
|
|
165
|
+
tracked: tracked.has(fromRel),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return { moves, unclassified };
|
|
169
|
+
}
|
|
170
|
+
/** Counts per status, for a one-line description. */
|
|
171
|
+
function byStatus(moves) {
|
|
172
|
+
const counts = new Map();
|
|
173
|
+
for (const m of moves)
|
|
174
|
+
counts.set(m.status, (counts.get(m.status) ?? 0) + 1);
|
|
175
|
+
return [...counts.entries()].map(([s, n]) => `${n} → ${s}`).join(', ');
|
|
176
|
+
}
|
|
177
|
+
export const roadmapLayout = {
|
|
178
|
+
id: 'roadmap-layout',
|
|
179
|
+
tier: 'confirm',
|
|
180
|
+
check(ctx) {
|
|
181
|
+
const legacyDir = join(ctx.projectRoot, ...LEGACY_IDEAS_DIR.split('/'));
|
|
182
|
+
if (!existsSync(legacyDir)) {
|
|
183
|
+
return { applicable: false, reason: `no legacy ${LEGACY_IDEAS_DIR} directory` };
|
|
184
|
+
}
|
|
185
|
+
const { moves, unclassified } = planRoadmapMoves(ctx);
|
|
186
|
+
if (moves.length === 0) {
|
|
187
|
+
// Files this migration cannot parse are reported as NOT APPLICABLE, not as
|
|
188
|
+
// pending work. `apply` will never fix them — only a human can — and
|
|
189
|
+
// `aidlc doctor` exits 1 on pending confirm work, so calling it pending
|
|
190
|
+
// would fail doctor forever on any repo holding one malformed file. That
|
|
191
|
+
// trains people to ignore doctor output, which costs more than the file
|
|
192
|
+
// does. `not-applicable` still prints the detail, and the files are sitting
|
|
193
|
+
// visibly in the legacy directory either way.
|
|
194
|
+
if (unclassified.length > 0) {
|
|
195
|
+
return {
|
|
196
|
+
applicable: false,
|
|
197
|
+
reason: `${unclassified.length} file(s) in ${LEGACY_IDEAS_DIR} have no readable status and need a human: ${unclassified.map((p) => basename(p)).join(', ')}`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// An already-drained directory still needs removing, and `apply` only runs
|
|
201
|
+
// when `check` says pending — so reporting clean here would leave it on
|
|
202
|
+
// disk for good (AC-26). A directory holding non-item files is not empty
|
|
203
|
+
// and is correctly left alone.
|
|
204
|
+
if (readdirSync(legacyDir).length === 0) {
|
|
205
|
+
return {
|
|
206
|
+
applicable: true,
|
|
207
|
+
pending: true,
|
|
208
|
+
description: `would remove the now-empty ${LEGACY_IDEAS_DIR} directory`,
|
|
209
|
+
commands: [],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
return { applicable: true, pending: false };
|
|
213
|
+
}
|
|
214
|
+
const existing = moves.filter((m) => existsSync(m.to));
|
|
215
|
+
if (existing.length > 0) {
|
|
216
|
+
return {
|
|
217
|
+
applicable: true,
|
|
218
|
+
pending: true,
|
|
219
|
+
description: `would move ${moves.length} roadmap item(s) (${byStatus(moves)})`,
|
|
220
|
+
commands: moves.map((m) => `git mv -- ${m.fromRel} ${m.toRel}`),
|
|
221
|
+
blocked: `${existing[0].toRel} already exists — resolve the collision, then re-run aidlc doctor`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
const suffix = unclassified.length > 0 ? `; ${unclassified.length} file(s) left in place` : '';
|
|
225
|
+
return {
|
|
226
|
+
applicable: true,
|
|
227
|
+
pending: true,
|
|
228
|
+
description: `would move ${moves.length} roadmap item(s) from ${LEGACY_IDEAS_DIR} (${byStatus(moves)})${suffix}`,
|
|
229
|
+
commands: moves.map((m) => `git mv -- ${m.fromRel} ${m.toRel}`),
|
|
230
|
+
};
|
|
231
|
+
},
|
|
232
|
+
apply(ctx) {
|
|
233
|
+
const { moves, unclassified } = planRoadmapMoves(ctx);
|
|
234
|
+
const legacyDir = join(ctx.projectRoot, ...LEGACY_IDEAS_DIR.split('/'));
|
|
235
|
+
for (const move of moves) {
|
|
236
|
+
mkdirSync(dirname(move.to), { recursive: true });
|
|
237
|
+
// Rewrite in place first, then move. A failure between the two leaves the
|
|
238
|
+
// item where it was with new frontmatter — recoverable — rather than moved
|
|
239
|
+
// with the old schema, which a second run would not detect.
|
|
240
|
+
writeFileSync(move.from, move.contents, 'utf8');
|
|
241
|
+
if (move.tracked) {
|
|
242
|
+
try {
|
|
243
|
+
execFileSync('git', ['mv', '--', move.fromRel, move.toRel], {
|
|
244
|
+
cwd: ctx.projectRoot,
|
|
245
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
246
|
+
});
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// Fall through to a plain rename: git refuses in states (unmerged
|
|
251
|
+
// index, unborn HEAD) where the move itself is still correct.
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
renameSync(move.from, move.to);
|
|
255
|
+
}
|
|
256
|
+
// Remove the legacy directory only when nothing is left in it (AC-26).
|
|
257
|
+
let removed = false;
|
|
258
|
+
if (existsSync(legacyDir) && readdirSync(legacyDir).length === 0) {
|
|
259
|
+
try {
|
|
260
|
+
rmdirSync(legacyDir);
|
|
261
|
+
removed = true;
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// A non-empty-by-race or permission-denied directory is not a failure.
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const parts = [];
|
|
268
|
+
if (moves.length > 0)
|
|
269
|
+
parts.push(`moved ${moves.length} roadmap item(s) (${byStatus(moves)})`);
|
|
270
|
+
if (unclassified.length > 0) {
|
|
271
|
+
parts.push(`left ${unclassified.length} unclassifiable file(s) in place: ${unclassified.map((p) => basename(p)).join(', ')}`);
|
|
272
|
+
}
|
|
273
|
+
if (removed)
|
|
274
|
+
parts.push(`removed empty ${LEGACY_IDEAS_DIR}`);
|
|
275
|
+
return {
|
|
276
|
+
changed: moves.length > 0 || removed,
|
|
277
|
+
summary: parts.length > 0 ? parts.join('; ') : 'nothing to move',
|
|
278
|
+
};
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
//# sourceMappingURL=roadmap-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap-layout.js","sourceRoot":"","sources":["../../../src/doctor/migrations/roadmap-layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stale-idea-skill migration (roadmap-revamp/AC-47, safe tier): remove the
|
|
3
|
+
* artifacts left behind when `aidlc-idea` was renamed to `aidlc-roadmap`.
|
|
4
|
+
*
|
|
5
|
+
* Renaming a framework skill leaves residue, because the emitters only ever
|
|
6
|
+
* *write* — `FileOp` has `create`, `replace` and `merge-block`, and no delete.
|
|
7
|
+
* So an existing project that updates gets the new skill and keeps the old one,
|
|
8
|
+
* and the old one is a live instruction pointing at a canonical body that no
|
|
9
|
+
* longer exists. An agent reading it follows a dangling path. That is a
|
|
10
|
+
* correctness problem, not untidiness, which is why this ships with the rename
|
|
11
|
+
* rather than after it.
|
|
12
|
+
*
|
|
13
|
+
* Safe tier, but narrowly: a file is deleted only when its content still points
|
|
14
|
+
* at the old canonical path. A user who edited their copy keeps it. Deleting on
|
|
15
|
+
* filename alone would be the destructive version of this migration, and the
|
|
16
|
+
* project has already learned that narrowing the blast radius to what you own is
|
|
17
|
+
* the precondition for repairing automatically.
|
|
18
|
+
*/
|
|
19
|
+
import type { Migration } from '../types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Orphaned artifact paths present and still pointing at the old canonical body.
|
|
22
|
+
*
|
|
23
|
+
* The canonical body itself is matched on its own heading instead, since it does
|
|
24
|
+
* not reference its own path.
|
|
25
|
+
*/
|
|
26
|
+
export declare function staleIdeaSkillPaths(projectRoot: string): string[];
|
|
27
|
+
export declare const staleIdeaSkill: Migration;
|
|
28
|
+
//# sourceMappingURL=stale-idea-skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-idea-skill.d.ts","sourceRoot":"","sources":["../../../src/doctor/migrations/stale-idea-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAsB7C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBjE;AAED,eAAO,MAAM,cAAc,EAAE,SA0C5B,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stale-idea-skill migration (roadmap-revamp/AC-47, safe tier): remove the
|
|
3
|
+
* artifacts left behind when `aidlc-idea` was renamed to `aidlc-roadmap`.
|
|
4
|
+
*
|
|
5
|
+
* Renaming a framework skill leaves residue, because the emitters only ever
|
|
6
|
+
* *write* — `FileOp` has `create`, `replace` and `merge-block`, and no delete.
|
|
7
|
+
* So an existing project that updates gets the new skill and keeps the old one,
|
|
8
|
+
* and the old one is a live instruction pointing at a canonical body that no
|
|
9
|
+
* longer exists. An agent reading it follows a dangling path. That is a
|
|
10
|
+
* correctness problem, not untidiness, which is why this ships with the rename
|
|
11
|
+
* rather than after it.
|
|
12
|
+
*
|
|
13
|
+
* Safe tier, but narrowly: a file is deleted only when its content still points
|
|
14
|
+
* at the old canonical path. A user who edited their copy keeps it. Deleting on
|
|
15
|
+
* filename alone would be the destructive version of this migration, and the
|
|
16
|
+
* project has already learned that narrowing the blast radius to what you own is
|
|
17
|
+
* the precondition for repairing automatically.
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, readFileSync, readdirSync, rmSync, rmdirSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
/** The canonical body path the orphaned artifacts still reference. */
|
|
22
|
+
const OLD_CANONICAL = '.aidlc/skills/aidlc-idea.md';
|
|
23
|
+
/**
|
|
24
|
+
* Every path the old skill name could have been emitted to, across all five
|
|
25
|
+
* supported platforms.
|
|
26
|
+
*
|
|
27
|
+
* Listed rather than derived from the platform config: a project that switched
|
|
28
|
+
* platforms still has the artifacts from the one it used before, and those are
|
|
29
|
+
* exactly the ones nothing else will ever clean up.
|
|
30
|
+
*/
|
|
31
|
+
const ORPHAN_PATHS = [
|
|
32
|
+
OLD_CANONICAL,
|
|
33
|
+
'.claude/skills/aidlc-idea/SKILL.md',
|
|
34
|
+
'.kiro/skills/aidlc-idea/SKILL.md',
|
|
35
|
+
'.cursor/rules/aidlc-idea.mdc',
|
|
36
|
+
'.windsurf/rules/aidlc-idea.md',
|
|
37
|
+
'.agents/skills/aidlc-idea/SKILL.md',
|
|
38
|
+
];
|
|
39
|
+
/**
|
|
40
|
+
* Orphaned artifact paths present and still pointing at the old canonical body.
|
|
41
|
+
*
|
|
42
|
+
* The canonical body itself is matched on its own heading instead, since it does
|
|
43
|
+
* not reference its own path.
|
|
44
|
+
*/
|
|
45
|
+
export function staleIdeaSkillPaths(projectRoot) {
|
|
46
|
+
const found = [];
|
|
47
|
+
for (const rel of ORPHAN_PATHS) {
|
|
48
|
+
const abs = join(projectRoot, ...rel.split('/'));
|
|
49
|
+
if (!existsSync(abs))
|
|
50
|
+
continue;
|
|
51
|
+
let body;
|
|
52
|
+
try {
|
|
53
|
+
body = readFileSync(abs, 'utf8');
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const isFrameworkOwned = rel === OLD_CANONICAL
|
|
59
|
+
? /^#\s+Idea Capture and Backlog\s*$/m.test(body)
|
|
60
|
+
: body.includes(OLD_CANONICAL);
|
|
61
|
+
if (isFrameworkOwned)
|
|
62
|
+
found.push(rel);
|
|
63
|
+
}
|
|
64
|
+
return found;
|
|
65
|
+
}
|
|
66
|
+
export const staleIdeaSkill = {
|
|
67
|
+
id: 'stale-idea-skill',
|
|
68
|
+
tier: 'safe',
|
|
69
|
+
check(ctx) {
|
|
70
|
+
const stale = staleIdeaSkillPaths(ctx.projectRoot);
|
|
71
|
+
if (stale.length === 0) {
|
|
72
|
+
return { applicable: true, pending: false };
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
applicable: true,
|
|
76
|
+
pending: true,
|
|
77
|
+
description: `would remove ${stale.length} orphaned aidlc-idea skill file(s) superseded by aidlc-roadmap: ${stale.join(', ')}`,
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
apply(ctx) {
|
|
81
|
+
const stale = staleIdeaSkillPaths(ctx.projectRoot);
|
|
82
|
+
if (stale.length === 0)
|
|
83
|
+
return { changed: false, summary: 'no orphaned files' };
|
|
84
|
+
const removed = [];
|
|
85
|
+
for (const rel of stale) {
|
|
86
|
+
try {
|
|
87
|
+
rmSync(join(ctx.projectRoot, ...rel.split('/')));
|
|
88
|
+
removed.push(rel);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// A per-skill directory left empty by the removal is itself residue.
|
|
94
|
+
const parent = join(ctx.projectRoot, ...rel.split('/').slice(0, -1));
|
|
95
|
+
if (parent.endsWith('aidlc-idea')) {
|
|
96
|
+
try {
|
|
97
|
+
if (readdirSync(parent).length === 0)
|
|
98
|
+
rmdirSync(parent);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// A non-empty or unremovable directory is not a failure.
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
changed: removed.length > 0,
|
|
107
|
+
summary: `removed ${removed.length} orphaned aidlc-idea file(s): ${removed.join(', ')}`,
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=stale-idea-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-idea-skill.js","sourceRoot":"","sources":["../../../src/doctor/migrations/stale-idea-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/events/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/events/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,KAAK,EACV,aAAa,EAEb,YAAY,EACZ,cAAc,EAEf,MAAM,kBAAkB,CAAC;AAM1B;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM9E;AAkDD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAyB3E;AAMD;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KACxC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAwG1C;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAE3E;AA0ED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,IAAI,CAClB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,cAAc,CA6ChB"}
|