@wildorder/nightshift 0.1.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/agent-runner.d.ts +64 -0
  4. package/dist/agent-runner.d.ts.map +1 -0
  5. package/dist/agent-runner.js +128 -0
  6. package/dist/agent-runner.js.map +1 -0
  7. package/dist/agent-summary.d.ts +35 -0
  8. package/dist/agent-summary.d.ts.map +1 -0
  9. package/dist/agent-summary.js +95 -0
  10. package/dist/agent-summary.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +18 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +74 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +62 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/detect-package-manager.d.ts +15 -0
  20. package/dist/detect-package-manager.d.ts.map +1 -0
  21. package/dist/detect-package-manager.js +78 -0
  22. package/dist/detect-package-manager.js.map +1 -0
  23. package/dist/findings.d.ts +106 -0
  24. package/dist/findings.d.ts.map +1 -0
  25. package/dist/findings.js +107 -0
  26. package/dist/findings.js.map +1 -0
  27. package/dist/graph.d.ts +30 -0
  28. package/dist/graph.d.ts.map +1 -0
  29. package/dist/graph.js +87 -0
  30. package/dist/graph.js.map +1 -0
  31. package/dist/index.d.ts +10 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +10 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/program-memory.d.ts +252 -0
  36. package/dist/program-memory.d.ts.map +1 -0
  37. package/dist/program-memory.js +385 -0
  38. package/dist/program-memory.js.map +1 -0
  39. package/dist/project-manifest.d.ts +23 -0
  40. package/dist/project-manifest.d.ts.map +1 -0
  41. package/dist/project-manifest.js +78 -0
  42. package/dist/project-manifest.js.map +1 -0
  43. package/dist/prompt.d.ts +70 -0
  44. package/dist/prompt.d.ts.map +1 -0
  45. package/dist/prompt.js +237 -0
  46. package/dist/prompt.js.map +1 -0
  47. package/dist/worktree-guard.d.ts +40 -0
  48. package/dist/worktree-guard.d.ts.map +1 -0
  49. package/dist/worktree-guard.js +91 -0
  50. package/dist/worktree-guard.js.map +1 -0
  51. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-package-manager.d.ts","sourceRoot":"","sources":["../src/detect-package-manager.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,yCAA0C,CAAC;AAExE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAU/D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAQjE;AA4BD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAShE;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,MAAM,CAYR"}
@@ -0,0 +1,78 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ export const PACKAGE_MANAGERS = ["npm", "pnpm", "yarn", "bun"];
4
+ const LOCKFILES = [
5
+ ["pnpm-lock.yaml", "pnpm"],
6
+ ["yarn.lock", "yarn"],
7
+ ["bun.lockb", "bun"],
8
+ ["bun.lock", "bun"],
9
+ ["package-lock.json", "npm"],
10
+ ];
11
+ export function parsePackageManager(value) {
12
+ const normalized = value.trim().toLowerCase();
13
+ if (PACKAGE_MANAGERS.includes(normalized)) {
14
+ return normalized;
15
+ }
16
+ throw new Error(`unknown package manager "${value}"; expected one of: ${PACKAGE_MANAGERS.join(", ")}`);
17
+ }
18
+ function fromPackageManagerField(directory) {
19
+ const manifestPath = join(directory, "package.json");
20
+ if (!existsSync(manifestPath))
21
+ return undefined;
22
+ let manifest;
23
+ try {
24
+ manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ if (typeof manifest.packageManager !== "string")
30
+ return undefined;
31
+ // Corepack convention: "<name>@<version>", e.g. "pnpm@9.1.0+sha256.…"
32
+ const name = manifest.packageManager.split("@", 1)[0]?.trim().toLowerCase();
33
+ return PACKAGE_MANAGERS.includes(name ?? "")
34
+ ? name
35
+ : undefined;
36
+ }
37
+ function fromLockfile(directory) {
38
+ for (const [lockfile, manager] of LOCKFILES) {
39
+ if (existsSync(join(directory, lockfile)))
40
+ return manager;
41
+ }
42
+ return undefined;
43
+ }
44
+ /**
45
+ * Detect the project's package manager, walking up from `cwd` because in
46
+ * workspaces the lockfile and `packageManager` field live at the repo root,
47
+ * not necessarily in the package directory. Falls back to npm.
48
+ */
49
+ export function detectPackageManager(cwd) {
50
+ let directory = resolve(cwd);
51
+ for (;;) {
52
+ const manager = fromPackageManagerField(directory) ?? fromLockfile(directory);
53
+ if (manager)
54
+ return manager;
55
+ const parent = dirname(directory);
56
+ if (parent === directory)
57
+ return "npm";
58
+ directory = parent;
59
+ }
60
+ }
61
+ /** pnpm workspaces are always declared by a pnpm-workspace.yaml at the root. */
62
+ export function isPnpmWorkspaceRoot(directory) {
63
+ return existsSync(join(directory, "pnpm-workspace.yaml"));
64
+ }
65
+ export function addDevDependencyCommand(manager, packageName, options = {}) {
66
+ switch (manager) {
67
+ case "npm":
68
+ return `npm install --save-dev ${packageName}`;
69
+ case "pnpm":
70
+ // pnpm refuses to add to a workspace root unless -w makes it explicit.
71
+ return `pnpm add -D${options.pnpmWorkspaceRoot ? " -w" : ""} ${packageName}`;
72
+ case "yarn":
73
+ return `yarn add -D ${packageName}`;
74
+ case "bun":
75
+ return `bun add -d ${packageName}`;
76
+ }
77
+ }
78
+ //# sourceMappingURL=detect-package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-package-manager.js","sourceRoot":"","sources":["../src/detect-package-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * `advisory` never fails a gate and never keeps the convergence loop running.
3
+ * It is where the severity policy puts observations that name no cause.
4
+ */
5
+ export type Severity = "blocker" | "major" | "minor" | "advisory";
6
+ export declare const SEVERITY_ORDER: readonly Severity[];
7
+ /**
8
+ * A closed set, because finding identity is built from the category and the
9
+ * subject rather than from the prose. A critic that rewords an objection must
10
+ * not thereby create a "new" finding — that is what prevents the loop from
11
+ * oscillating forever between rounds.
12
+ */
13
+ export declare const FINDING_CATEGORIES: readonly ["manifest", "coverage", "traceability", "dependency", "spec-format", "interface-contract", "test-quality", "acceptance-criteria", "redundancy", "scope-structure"];
14
+ export type FindingCategory = (typeof FINDING_CATEGORIES)[number];
15
+ /**
16
+ * Why a finding is true. The severity policy reads this and nothing else:
17
+ * a finding supported only by `measurement` is an observation, not a defect.
18
+ */
19
+ export type Evidence = {
20
+ kind: "location";
21
+ file: string;
22
+ startLine: number;
23
+ endLine?: number;
24
+ excerpt?: string;
25
+ } | {
26
+ kind: "concern";
27
+ named: string;
28
+ detail?: string;
29
+ } | {
30
+ kind: "measurement";
31
+ metric: "lineCount" | "fileCount";
32
+ value: number;
33
+ };
34
+ export interface Finding {
35
+ severity: Severity;
36
+ category: FindingCategory;
37
+ /** Machine code for deterministic checks; absent on model-authored findings. */
38
+ code?: string;
39
+ /**
40
+ * Short, normalized noun phrase naming what the finding is about — `SC-03`,
41
+ * `AuthToken interface`, `Tests case 4`. Identity comes from this, not from
42
+ * `message`, so wording may change freely between rounds.
43
+ */
44
+ subject: string;
45
+ message: string;
46
+ evidence: Evidence[];
47
+ workstreamId?: string;
48
+ file?: string;
49
+ /**
50
+ * The fix is not an edit to a spec — the workstream must be split, a
51
+ * workstream is missing, the manifest's ordering is itself wrong. Ends the
52
+ * convergence loop immediately rather than spending further rounds
53
+ * polishing a spec that should not exist in that shape.
54
+ */
55
+ requiresReplan?: boolean;
56
+ /** Set by the policy layer when it downgrades, explaining why. */
57
+ downgradedFrom?: Severity;
58
+ downgradeReason?: string;
59
+ }
60
+ /** A finding carrying its fingerprint, for briefs and ledger bookkeeping. */
61
+ export type IdentifiedFinding = Finding & {
62
+ id: string;
63
+ };
64
+ /** Proof that a model inspected a defect's whole equivalence class. */
65
+ export interface ClassAnalysis {
66
+ subject: string;
67
+ scope: "isolated" | "systemic";
68
+ rootCause: string;
69
+ affectedSubjects: string[];
70
+ checkedSubjects: string[];
71
+ completenessBasis: string;
72
+ }
73
+ export declare function identify(finding: Finding): IdentifiedFinding;
74
+ /**
75
+ * Critics recurrently merge criteria that share a root cause into one subject
76
+ * ("SC-05/SC-06"). The repair is a deterministic split — one subject per
77
+ * SC-id — so it happens here rather than by burning a correction retry on a
78
+ * transformation code can perform. A non-compound subject passes through as a
79
+ * one-element list.
80
+ */
81
+ export declare function splitCriterionSubjects(subject: string): string[];
82
+ /**
83
+ * Collapse incidental spelling differences without merging distinct subjects.
84
+ * Also the matching key wherever one model must reference subjects another
85
+ * model authored (e.g. replan resolution proofs against critic class
86
+ * analyses) — cross-model references must never fail on case or punctuation.
87
+ */
88
+ export declare function normalizeSubject(subject: string): string;
89
+ /**
90
+ * Stable identity across rounds: category + workstream + normalized subject.
91
+ * Deliberately excludes `message`, `severity`, and line numbers — a finding
92
+ * re-raised in different words, at a different severity, after the file has
93
+ * shifted by a few lines is the *same* finding, and the loop must see it that
94
+ * way to detect a round that produced nothing new.
95
+ */
96
+ export declare function fingerprint(finding: Finding): string;
97
+ export declare function isGateFailing(finding: Finding, strict: boolean): boolean;
98
+ /** Blockers and majors are what keep the loop running; minors never do. */
99
+ export declare function haltsConvergence(finding: Finding): boolean;
100
+ export declare function countBySeverity(findings: readonly Finding[]): Record<Severity, number>;
101
+ export declare function sortBySeverity(findings: readonly Finding[]): Finding[];
102
+ /** Convenience constructors keep deterministic call sites terse. */
103
+ export declare const at: (file: string, startLine: number, endLine?: number) => Evidence;
104
+ export declare const because: (named: string, detail?: string) => Evidence;
105
+ export declare const measured: (metric: "lineCount" | "fileCount", value: number) => Evidence;
106
+ //# sourceMappingURL=findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../src/findings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import { createHash } from "node:crypto";
2
+ export const SEVERITY_ORDER = [
3
+ "blocker",
4
+ "major",
5
+ "minor",
6
+ "advisory",
7
+ ];
8
+ /**
9
+ * A closed set, because finding identity is built from the category and the
10
+ * subject rather than from the prose. A critic that rewords an objection must
11
+ * not thereby create a "new" finding — that is what prevents the loop from
12
+ * oscillating forever between rounds.
13
+ */
14
+ export const FINDING_CATEGORIES = [
15
+ "manifest",
16
+ "coverage",
17
+ "traceability",
18
+ "dependency",
19
+ "spec-format",
20
+ "interface-contract",
21
+ "test-quality",
22
+ "acceptance-criteria",
23
+ "redundancy",
24
+ "scope-structure",
25
+ ];
26
+ export function identify(finding) {
27
+ return { ...finding, id: fingerprint(finding) };
28
+ }
29
+ const COMPOUND_CRITERION_SUBJECT = /^SC-\d+(?:\s*[/,+&]\s*SC-\d+)+$/u;
30
+ /**
31
+ * Critics recurrently merge criteria that share a root cause into one subject
32
+ * ("SC-05/SC-06"). The repair is a deterministic split — one subject per
33
+ * SC-id — so it happens here rather than by burning a correction retry on a
34
+ * transformation code can perform. A non-compound subject passes through as a
35
+ * one-element list.
36
+ */
37
+ export function splitCriterionSubjects(subject) {
38
+ const trimmed = subject.trim();
39
+ if (!COMPOUND_CRITERION_SUBJECT.test(trimmed))
40
+ return [trimmed];
41
+ return [...new Set(trimmed.split(/\s*[/,+&]\s*/u))];
42
+ }
43
+ /**
44
+ * Collapse incidental spelling differences without merging distinct subjects.
45
+ * Also the matching key wherever one model must reference subjects another
46
+ * model authored (e.g. replan resolution proofs against critic class
47
+ * analyses) — cross-model references must never fail on case or punctuation.
48
+ */
49
+ export function normalizeSubject(subject) {
50
+ return subject
51
+ .toLowerCase()
52
+ .normalize("NFKD")
53
+ .replace(/[̀-ͯ]/gu, "")
54
+ .replace(/[`"'*_]/gu, "")
55
+ .replace(/[^a-z0-9]+/gu, " ")
56
+ .trim();
57
+ }
58
+ /**
59
+ * Stable identity across rounds: category + workstream + normalized subject.
60
+ * Deliberately excludes `message`, `severity`, and line numbers — a finding
61
+ * re-raised in different words, at a different severity, after the file has
62
+ * shifted by a few lines is the *same* finding, and the loop must see it that
63
+ * way to detect a round that produced nothing new.
64
+ */
65
+ export function fingerprint(finding) {
66
+ const parts = [
67
+ finding.category,
68
+ finding.workstreamId ?? "",
69
+ normalizeSubject(finding.subject),
70
+ ];
71
+ return createHash("sha256").update(parts.join("|")).digest("hex").slice(0, 16);
72
+ }
73
+ export function isGateFailing(finding, strict) {
74
+ return (finding.severity === "blocker" || (strict && finding.severity === "major"));
75
+ }
76
+ /** Blockers and majors are what keep the loop running; minors never do. */
77
+ export function haltsConvergence(finding) {
78
+ return finding.severity === "blocker" || finding.severity === "major";
79
+ }
80
+ export function countBySeverity(findings) {
81
+ const counts = {
82
+ blocker: 0,
83
+ major: 0,
84
+ minor: 0,
85
+ advisory: 0,
86
+ };
87
+ for (const finding of findings)
88
+ counts[finding.severity] += 1;
89
+ return counts;
90
+ }
91
+ export function sortBySeverity(findings) {
92
+ return [...findings].sort((a, b) => SEVERITY_ORDER.indexOf(a.severity) - SEVERITY_ORDER.indexOf(b.severity));
93
+ }
94
+ /** Convenience constructors keep deterministic call sites terse. */
95
+ export const at = (file, startLine, endLine) => ({
96
+ kind: "location",
97
+ file,
98
+ startLine,
99
+ ...(endLine === undefined ? {} : { endLine }),
100
+ });
101
+ export const because = (named, detail) => ({
102
+ kind: "concern",
103
+ named,
104
+ ...(detail === undefined ? {} : { detail }),
105
+ });
106
+ export const measured = (metric, value) => ({ kind: "measurement", metric, value });
107
+ //# sourceMappingURL=findings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.js","sourceRoot":"","sources":["../src/findings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface GraphNode {
2
+ id: string;
3
+ dependencies: string[];
4
+ }
5
+ /**
6
+ * Dependency-first order that preserves input order whenever multiple nodes
7
+ * are ready. Dependencies that do not exist in the graph are ignored here;
8
+ * validation reports them separately as blockers.
9
+ */
10
+ export declare function stableTopologicalOrder<T extends GraphNode>(nodes: T[]): T[];
11
+ /**
12
+ * The same dependency-first ordering as {@link stableTopologicalOrder}, but
13
+ * grouped into levels: every node in a level has all of its known
14
+ * dependencies satisfied by an earlier level, so a whole level can be
15
+ * processed concurrently.
16
+ *
17
+ * Authoring uses this instead of the flat order because a flat fan-out
18
+ * authors dependent workstreams in isolation from each other, and two
19
+ * specs written that way disagree about the interface between them. Walking
20
+ * levels lets each author read the finished specs of what it depends on,
21
+ * while independent workstreams still run at the same time — only genuine
22
+ * dependency chains serialize.
23
+ *
24
+ * Input order is preserved within each level, matching the stable ordering's
25
+ * behavior. Dependencies outside the graph are ignored here; validation
26
+ * reports them separately as blockers.
27
+ */
28
+ export declare function topologicalLevels<T extends GraphNode>(nodes: T[]): T[][];
29
+ export declare function findCycles(nodes: GraphNode[]): string[][];
30
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAyB3E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CA2BxE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,EAAE,CAwBzD"}
package/dist/graph.js ADDED
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Dependency-first order that preserves input order whenever multiple nodes
3
+ * are ready. Dependencies that do not exist in the graph are ignored here;
4
+ * validation reports them separately as blockers.
5
+ */
6
+ export function stableTopologicalOrder(nodes) {
7
+ const known = new Set(nodes.map(({ id }) => id));
8
+ const done = new Set();
9
+ const remaining = [...nodes];
10
+ const ordered = [];
11
+ while (remaining.length > 0) {
12
+ const index = remaining.findIndex((node) => node.dependencies.every((dependency) => done.has(dependency) || !known.has(dependency)));
13
+ if (index < 0) {
14
+ const blocked = remaining.map(({ id }) => id).join(", ");
15
+ throw new Error(`Cannot resolve dependency order; check for cycles among: ${blocked}`);
16
+ }
17
+ const next = remaining[index];
18
+ remaining.splice(index, 1);
19
+ ordered.push(next);
20
+ done.add(next.id);
21
+ }
22
+ return ordered;
23
+ }
24
+ /**
25
+ * The same dependency-first ordering as {@link stableTopologicalOrder}, but
26
+ * grouped into levels: every node in a level has all of its known
27
+ * dependencies satisfied by an earlier level, so a whole level can be
28
+ * processed concurrently.
29
+ *
30
+ * Authoring uses this instead of the flat order because a flat fan-out
31
+ * authors dependent workstreams in isolation from each other, and two
32
+ * specs written that way disagree about the interface between them. Walking
33
+ * levels lets each author read the finished specs of what it depends on,
34
+ * while independent workstreams still run at the same time — only genuine
35
+ * dependency chains serialize.
36
+ *
37
+ * Input order is preserved within each level, matching the stable ordering's
38
+ * behavior. Dependencies outside the graph are ignored here; validation
39
+ * reports them separately as blockers.
40
+ */
41
+ export function topologicalLevels(nodes) {
42
+ const known = new Set(nodes.map(({ id }) => id));
43
+ const done = new Set();
44
+ let remaining = [...nodes];
45
+ const levels = [];
46
+ while (remaining.length > 0) {
47
+ // Computed against `done` as it stood before this level, so a node can
48
+ // never land in the same level as something it depends on.
49
+ const ready = remaining.filter((node) => node.dependencies.every((dependency) => done.has(dependency) || !known.has(dependency)));
50
+ if (ready.length === 0) {
51
+ const blocked = remaining.map(({ id }) => id).join(", ");
52
+ throw new Error(`Cannot resolve dependency order; check for cycles among: ${blocked}`);
53
+ }
54
+ levels.push(ready);
55
+ const placed = new Set(ready.map(({ id }) => id));
56
+ for (const id of placed)
57
+ done.add(id);
58
+ remaining = remaining.filter(({ id }) => !placed.has(id));
59
+ }
60
+ return levels;
61
+ }
62
+ export function findCycles(nodes) {
63
+ const graph = new Map(nodes.map((node) => [node.id, node.dependencies]));
64
+ const visiting = new Set();
65
+ const visited = new Set();
66
+ const cycles = [];
67
+ function visit(id, path) {
68
+ if (visiting.has(id)) {
69
+ const start = path.indexOf(id);
70
+ cycles.push([...path.slice(start), id]);
71
+ return;
72
+ }
73
+ if (visited.has(id))
74
+ return;
75
+ visiting.add(id);
76
+ for (const dependency of graph.get(id) ?? []) {
77
+ if (graph.has(dependency))
78
+ visit(dependency, [...path, id]);
79
+ }
80
+ visiting.delete(id);
81
+ visited.add(id);
82
+ }
83
+ for (const id of graph.keys())
84
+ visit(id, []);
85
+ return cycles;
86
+ }
87
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export * from "./config.js";
2
+ export * from "./agent-runner.js";
3
+ export * from "./agent-summary.js";
4
+ export * from "./graph.js";
5
+ export * from "./findings.js";
6
+ export * from "./project-manifest.js";
7
+ export * from "./program-memory.js";
8
+ export * from "./worktree-guard.js";
9
+ export * from "./detect-package-manager.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export * from "./config.js";
2
+ export * from "./agent-runner.js";
3
+ export * from "./agent-summary.js";
4
+ export * from "./graph.js";
5
+ export * from "./findings.js";
6
+ export * from "./project-manifest.js";
7
+ export * from "./program-memory.js";
8
+ export * from "./worktree-guard.js";
9
+ export * from "./detect-package-manager.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC"}