pi-harness-runtime 0.10.26 → 0.10.27

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 (92) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/package.json +1 -1
  3. package/packages/architecture-generator/dist/adr.d.ts +15 -0
  4. package/packages/architecture-generator/dist/adr.d.ts.map +1 -0
  5. package/packages/architecture-generator/dist/adr.js +42 -0
  6. package/packages/architecture-generator/dist/adr.js.map +1 -0
  7. package/packages/architecture-generator/dist/index.d.ts +9 -0
  8. package/packages/architecture-generator/dist/index.d.ts.map +1 -0
  9. package/packages/architecture-generator/dist/index.js +9 -0
  10. package/packages/architecture-generator/dist/index.js.map +1 -0
  11. package/packages/architecture-generator/dist/mermaid.d.ts +30 -0
  12. package/packages/architecture-generator/dist/mermaid.d.ts.map +1 -0
  13. package/packages/architecture-generator/dist/mermaid.js +58 -0
  14. package/packages/architecture-generator/dist/mermaid.js.map +1 -0
  15. package/packages/architecture-generator/dist/types.d.ts +30 -0
  16. package/packages/architecture-generator/dist/types.d.ts.map +1 -0
  17. package/packages/architecture-generator/dist/types.js +7 -0
  18. package/packages/architecture-generator/dist/types.js.map +1 -0
  19. package/packages/architecture-generator/src/adr.ts +51 -0
  20. package/packages/architecture-generator/src/index.ts +9 -0
  21. package/packages/architecture-generator/src/mermaid.ts +82 -0
  22. package/packages/architecture-generator/src/types.ts +30 -0
  23. package/packages/knowledge-graph/dist/graph-extractor.d.ts +27 -0
  24. package/packages/knowledge-graph/dist/graph-extractor.d.ts.map +1 -0
  25. package/packages/knowledge-graph/dist/graph-extractor.js +285 -0
  26. package/packages/knowledge-graph/dist/graph-extractor.js.map +1 -0
  27. package/packages/knowledge-graph/dist/index.d.ts +27 -0
  28. package/packages/knowledge-graph/dist/index.d.ts.map +1 -0
  29. package/packages/knowledge-graph/dist/index.js +27 -0
  30. package/packages/knowledge-graph/dist/index.js.map +1 -0
  31. package/packages/knowledge-graph/dist/mcp-client.d.ts +38 -0
  32. package/packages/knowledge-graph/dist/mcp-client.d.ts.map +1 -0
  33. package/packages/knowledge-graph/dist/mcp-client.js +157 -0
  34. package/packages/knowledge-graph/dist/mcp-client.js.map +1 -0
  35. package/packages/knowledge-graph/dist/provenance-linker.d.ts +19 -0
  36. package/packages/knowledge-graph/dist/provenance-linker.d.ts.map +1 -0
  37. package/packages/knowledge-graph/dist/provenance-linker.js +92 -0
  38. package/packages/knowledge-graph/dist/provenance-linker.js.map +1 -0
  39. package/packages/knowledge-graph/dist/types.d.ts +53 -0
  40. package/packages/knowledge-graph/dist/types.d.ts.map +1 -0
  41. package/packages/knowledge-graph/dist/types.js +7 -0
  42. package/packages/knowledge-graph/dist/types.js.map +1 -0
  43. package/packages/knowledge-graph/src/graph-extractor.ts +355 -0
  44. package/packages/knowledge-graph/src/index.ts +27 -0
  45. package/packages/knowledge-graph/src/mcp-client.ts +246 -0
  46. package/packages/knowledge-graph/src/provenance-linker.ts +105 -0
  47. package/packages/knowledge-graph/src/types.ts +86 -0
  48. package/packages/milestone-manager/dist/engine.d.ts +27 -0
  49. package/packages/milestone-manager/dist/engine.d.ts.map +1 -0
  50. package/packages/milestone-manager/dist/engine.js +80 -0
  51. package/packages/milestone-manager/dist/engine.js.map +1 -0
  52. package/packages/milestone-manager/dist/index.d.ts +6 -0
  53. package/packages/milestone-manager/dist/index.d.ts.map +1 -0
  54. package/packages/milestone-manager/dist/index.js +6 -0
  55. package/packages/milestone-manager/dist/index.js.map +1 -0
  56. package/packages/milestone-manager/dist/types.d.ts +25 -0
  57. package/packages/milestone-manager/dist/types.d.ts.map +1 -0
  58. package/packages/milestone-manager/dist/types.js +7 -0
  59. package/packages/milestone-manager/dist/types.js.map +1 -0
  60. package/packages/milestone-manager/src/engine.ts +113 -0
  61. package/packages/milestone-manager/src/index.ts +6 -0
  62. package/packages/milestone-manager/src/types.ts +28 -0
  63. package/packages/project-bootstrap/dist/bootstrap.d.ts +23 -0
  64. package/packages/project-bootstrap/dist/bootstrap.d.ts.map +1 -0
  65. package/packages/project-bootstrap/dist/bootstrap.js +136 -0
  66. package/packages/project-bootstrap/dist/bootstrap.js.map +1 -0
  67. package/packages/project-bootstrap/dist/frappe.d.ts +8 -0
  68. package/packages/project-bootstrap/dist/frappe.d.ts.map +1 -0
  69. package/packages/project-bootstrap/dist/frappe.js +82 -0
  70. package/packages/project-bootstrap/dist/frappe.js.map +1 -0
  71. package/packages/project-bootstrap/dist/index.d.ts +27 -0
  72. package/packages/project-bootstrap/dist/index.d.ts.map +1 -0
  73. package/packages/project-bootstrap/dist/index.js +27 -0
  74. package/packages/project-bootstrap/dist/index.js.map +1 -0
  75. package/packages/project-bootstrap/dist/minimal.d.ts +8 -0
  76. package/packages/project-bootstrap/dist/minimal.d.ts.map +1 -0
  77. package/packages/project-bootstrap/dist/minimal.js +35 -0
  78. package/packages/project-bootstrap/dist/minimal.js.map +1 -0
  79. package/packages/project-bootstrap/dist/types.d.ts +61 -0
  80. package/packages/project-bootstrap/dist/types.d.ts.map +1 -0
  81. package/packages/project-bootstrap/dist/types.js +7 -0
  82. package/packages/project-bootstrap/dist/types.js.map +1 -0
  83. package/packages/project-bootstrap/dist/typescript.d.ts +8 -0
  84. package/packages/project-bootstrap/dist/typescript.d.ts.map +1 -0
  85. package/packages/project-bootstrap/dist/typescript.js +103 -0
  86. package/packages/project-bootstrap/dist/typescript.js.map +1 -0
  87. package/packages/project-bootstrap/src/bootstrap.ts +181 -0
  88. package/packages/project-bootstrap/src/frappe.ts +103 -0
  89. package/packages/project-bootstrap/src/index.ts +27 -0
  90. package/packages/project-bootstrap/src/minimal.ts +45 -0
  91. package/packages/project-bootstrap/src/types.ts +66 -0
  92. package/packages/project-bootstrap/src/typescript.ts +123 -0
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Milestone Manager - RFC-0075
3
+ *
4
+ * Track milestones and calculate status.
5
+ */
6
+
7
+ import type {
8
+ Milestone,
9
+ MilestoneStatus,
10
+ MilestoneManagerOptions,
11
+ } from "./types.js";
12
+
13
+ const DEFAULT_OPTIONS: MilestoneManagerOptions = {
14
+ atRiskThreshold: 80,
15
+ missedThreshold: 0,
16
+ };
17
+
18
+ /**
19
+ * Calculate milestone status based on progress and time
20
+ */
21
+ export function calculateMilestoneStatus(
22
+ milestone: Milestone,
23
+ options: MilestoneManagerOptions = {},
24
+ ): MilestoneStatus {
25
+ const opts = { ...DEFAULT_OPTIONS, ...options };
26
+ const totalItems = milestone.items.length;
27
+ const completedItems = milestone.completedItems;
28
+
29
+ if (completedItems >= totalItems) {
30
+ return "completed";
31
+ }
32
+
33
+ // Check if past target date
34
+ const targetDate = new Date(milestone.targetDate);
35
+ const today = new Date();
36
+ const daysPast = Math.floor(
37
+ (today.getTime() - targetDate.getTime()) / (1000 * 60 * 60 * 24),
38
+ );
39
+
40
+ if (opts.missedThreshold && daysPast > opts.missedThreshold) {
41
+ return "missed";
42
+ }
43
+
44
+ // Check progress percentage
45
+ const progressPct = totalItems > 0 ? (completedItems / totalItems) * 100 : 0;
46
+
47
+ // Calculate expected progress based on time
48
+ const startDate = new Date(milestone.targetDate);
49
+ startDate.setDate(startDate.getDate() - 14); // Assume 2-week sprints
50
+ const totalDays = 14;
51
+ const daysElapsed = Math.max(0, Math.min(totalDays, totalDays - daysPast));
52
+ const expectedPct = (daysElapsed / totalDays) * 100;
53
+
54
+ if (progressPct < expectedPct * (1 - opts.atRiskThreshold! / 100)) {
55
+ return "at-risk";
56
+ }
57
+
58
+ return "on-track";
59
+ }
60
+
61
+ /**
62
+ * Milestone Manager
63
+ */
64
+ export class MilestoneManager {
65
+ private milestones: Map<string, Milestone> = new Map();
66
+ private options: MilestoneManagerOptions;
67
+
68
+ constructor(options: MilestoneManagerOptions = {}) {
69
+ this.options = { ...DEFAULT_OPTIONS, ...options };
70
+ }
71
+
72
+ addMilestone(milestone: Milestone): void {
73
+ this.milestones.set(milestone.id, milestone);
74
+ }
75
+
76
+ removeMilestone(id: string): void {
77
+ this.milestones.delete(id);
78
+ }
79
+
80
+ getMilestone(id: string): Milestone | undefined {
81
+ return this.milestones.get(id);
82
+ }
83
+
84
+ listMilestones(): Milestone[] {
85
+ return [...this.milestones.values()];
86
+ }
87
+
88
+ updateMilestone(id: string, update: Partial<Milestone>): void {
89
+ const milestone = this.milestones.get(id);
90
+ if (milestone) {
91
+ this.milestones.set(id, { ...milestone, ...update });
92
+ }
93
+ }
94
+
95
+ getStatus(id: string): MilestoneStatus | undefined {
96
+ const milestone = this.milestones.get(id);
97
+ return milestone
98
+ ? calculateMilestoneStatus(milestone, this.options)
99
+ : undefined;
100
+ }
101
+
102
+ getAtRiskMilestones(): Milestone[] {
103
+ return this.listMilestones().filter(
104
+ (m) => calculateMilestoneStatus(m, this.options) === "at-risk",
105
+ );
106
+ }
107
+
108
+ getMissedMilestones(): Milestone[] {
109
+ return this.listMilestones().filter(
110
+ (m) => calculateMilestoneStatus(m, this.options) === "missed",
111
+ );
112
+ }
113
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Milestone Manager - RFC-0075
3
+ */
4
+
5
+ export * from "./types.js";
6
+ export * from "./engine.js";
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Milestone Manager - RFC-0075
3
+ *
4
+ * Track milestones against progress and alert when items are at risk.
5
+ */
6
+
7
+ export type MilestoneStatus = "on-track" | "at-risk" | "missed" | "completed";
8
+
9
+ export interface Milestone {
10
+ id: string;
11
+ title: string;
12
+ targetDate: string;
13
+ description?: string;
14
+ items: string[]; // Item IDs (e.g., task IDs, issue IDs)
15
+ status: MilestoneStatus;
16
+ completedItems: number;
17
+ }
18
+
19
+ export interface MilestoneManagerOptions {
20
+ atRiskThreshold?: number; // Percentage (default: 80%)
21
+ missedThreshold?: number; // Days past target (default: 0)
22
+ }
23
+
24
+ export interface MilestoneUpdate {
25
+ itemId: string;
26
+ status: "added" | "completed" | "removed";
27
+ milestoneId: string;
28
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Main bootstrap orchestration.
5
+ */
6
+ import type { ProjectSpec, BootstrapOptions, BootstrapResult, ValidationError, Template } from "./types.js";
7
+ /**
8
+ * Validate a project spec
9
+ */
10
+ export declare function validateSpec(spec: ProjectSpec): ValidationError[];
11
+ /**
12
+ * Get template for a spec
13
+ */
14
+ export declare function getTemplateForSpec(spec: ProjectSpec, override?: string): Template;
15
+ /**
16
+ * Bootstrap a project from a spec
17
+ */
18
+ export declare function bootstrap(spec: ProjectSpec, targetDir: string, options?: BootstrapOptions): Promise<BootstrapResult>;
19
+ /**
20
+ * Detect framework and suggest a spec
21
+ */
22
+ export declare function detectAndSuggest(projectRoot: string): Promise<ProjectSpec | null>;
23
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,QAAQ,EACR,MAAM,YAAY,CAAC;AAYpB;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,EAAE,CAyBjE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,WAAW,EACjB,QAAQ,CAAC,EAAE,MAAM,GACf,QAAQ,CAkBV;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC9B,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAwC1B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACrC,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA8C7B"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Main bootstrap orchestration.
5
+ */
6
+ import { minimalTemplate } from "./minimal.js";
7
+ import { nodeTypescriptTemplate } from "./typescript.js";
8
+ import { frappeTemplate } from "./frappe.js";
9
+ // Built-in templates
10
+ const TEMPLATES = {
11
+ minimal: minimalTemplate,
12
+ "node-typescript": nodeTypescriptTemplate,
13
+ "frappe-app": frappeTemplate,
14
+ };
15
+ /**
16
+ * Validate a project spec
17
+ */
18
+ export function validateSpec(spec) {
19
+ const errors = [];
20
+ if (!spec.name || spec.name.trim() === "") {
21
+ errors.push({ field: "name", message: "Name is required" });
22
+ }
23
+ if (!spec.type ||
24
+ !["monorepo", "single-package", "multi-package"].includes(spec.type)) {
25
+ errors.push({
26
+ field: "type",
27
+ message: "Type must be monorepo, single-package, or multi-package",
28
+ });
29
+ }
30
+ if (!spec.frameworks || spec.frameworks.length === 0) {
31
+ errors.push({
32
+ field: "frameworks",
33
+ message: "At least one framework is required",
34
+ });
35
+ }
36
+ return errors;
37
+ }
38
+ /**
39
+ * Get template for a spec
40
+ */
41
+ export function getTemplateForSpec(spec, override) {
42
+ if (override && TEMPLATES[override]) {
43
+ return TEMPLATES[override];
44
+ }
45
+ // Auto-detect based on frameworks
46
+ if (spec.frameworks.includes("frappe")) {
47
+ return TEMPLATES["frappe-app"];
48
+ }
49
+ if (spec.frameworks.includes("node") ||
50
+ spec.frameworks.includes("typescript")) {
51
+ return TEMPLATES["node-typescript"];
52
+ }
53
+ return TEMPLATES["minimal"];
54
+ }
55
+ /**
56
+ * Bootstrap a project from a spec
57
+ */
58
+ export async function bootstrap(spec, targetDir, options = {}) {
59
+ const startTime = Date.now();
60
+ const errors = validateSpec(spec);
61
+ if (errors.length > 0) {
62
+ throw new Error(`Invalid spec: ${errors.map((e) => e.message).join(", ")}`);
63
+ }
64
+ const { mkdir, writeFile } = await import("fs/promises");
65
+ const { join } = await import("path");
66
+ // Create target directory
67
+ await mkdir(targetDir, { recursive: true });
68
+ // Get template
69
+ const template = getTemplateForSpec(spec, options.template);
70
+ // Emit started event
71
+ if (options.verbose) {
72
+ console.log(`Bootstrap: ${spec.name} using template: ${template.name}`);
73
+ }
74
+ // Apply template
75
+ const files = await template.apply(spec, targetDir);
76
+ // Create gitignore if gitInit
77
+ if (spec.gitInit) {
78
+ const gitignore = `node_modules/\ndist/\n.env\n*.log\n`;
79
+ await writeFile(join(targetDir, ".gitignore"), gitignore);
80
+ files.push(".gitignore");
81
+ }
82
+ const result = {
83
+ root: targetDir,
84
+ files,
85
+ packages: spec.packages?.map((p) => p.name) || [],
86
+ duration: Date.now() - startTime,
87
+ };
88
+ return result;
89
+ }
90
+ /**
91
+ * Detect framework and suggest a spec
92
+ */
93
+ export async function detectAndSuggest(projectRoot) {
94
+ const { readdir } = await import("fs/promises");
95
+ const { join } = await import("path");
96
+ try {
97
+ const entries = await readdir(projectRoot, { withFileTypes: true });
98
+ const files = entries.filter((e) => e.isFile()).map((e) => e.name);
99
+ const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
100
+ // Detect Frappe
101
+ if (dirs.includes("sites") && dirs.includes("apps")) {
102
+ const appName = join(projectRoot).split("/").pop() || "frappe-app";
103
+ return {
104
+ name: appName,
105
+ type: "single-package",
106
+ frameworks: ["frappe"],
107
+ gitInit: true,
108
+ };
109
+ }
110
+ // Detect Next.js
111
+ if (files.includes("next.config.js") || files.includes("next.config.mjs")) {
112
+ return {
113
+ name: "nextjs-app",
114
+ type: "single-package",
115
+ frameworks: ["nextjs"],
116
+ features: { typescript: true, testing: true },
117
+ gitInit: true,
118
+ };
119
+ }
120
+ // Detect Node TypeScript
121
+ if (files.includes("package.json") && files.includes("tsconfig.json")) {
122
+ return {
123
+ name: "node-app",
124
+ type: "single-package",
125
+ frameworks: ["node", "typescript"],
126
+ features: { typescript: true, testing: true, eslint: true },
127
+ gitInit: true,
128
+ };
129
+ }
130
+ return null;
131
+ }
132
+ catch {
133
+ return null;
134
+ }
135
+ }
136
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Frappe app template
5
+ */
6
+ import type { Template } from "./types.js";
7
+ export declare const frappeTemplate: Template;
8
+ //# sourceMappingURL=frappe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frappe.d.ts","sourceRoot":"","sources":["../src/frappe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,cAAc,EAAE,QA8F5B,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Frappe app template
5
+ */
6
+ export const frappeTemplate = {
7
+ name: "frappe-app",
8
+ description: "Frappe app with modules, doctypes, web pages",
9
+ async apply(spec, root) {
10
+ const { writeFile, mkdir } = await import("fs/promises");
11
+ const { join } = await import("path");
12
+ const files = [];
13
+ const appName = spec.name.replace(/[^a-zA-Z0-9_]/g, "_");
14
+ // MANIFEST.json
15
+ const manifest = {
16
+ name: appName,
17
+ app_name: appName,
18
+ app_title: spec.description || spec.name,
19
+ app_publisher: spec.author || "Author",
20
+ app_email: "author@example.com",
21
+ app_description: spec.description || "",
22
+ app_version: "0.0.1",
23
+ app_license: spec.license || "MIT",
24
+ hooks: {},
25
+ doctypes: [],
26
+ fixtures: [],
27
+ };
28
+ await writeFile(join(root, "MANIFEST.json"), JSON.stringify(manifest, null, 2));
29
+ files.push("MANIFEST.json");
30
+ // pyproject.toml
31
+ const pyproject = `[build-system]
32
+ requires = ["flit_core >=3.2,<4"]
33
+ build-backend = "flit_core.buildapi"
34
+
35
+ [project]
36
+ name = "${appName}"
37
+ version = "0.0.1"
38
+ description = "${spec.description || ""}"
39
+ authors = [{name = "${spec.author || "Author"}", email = "author@example.com"}]
40
+ license = {text = "${spec.license || "MIT"}"}
41
+
42
+ [tool.frappe]
43
+ app_title = "${spec.name}"
44
+ app_publisher = "${spec.author || "Author"}"
45
+ app_email = "author@example.com"
46
+ app_description = "${spec.description || ""}"
47
+ app_version = "0.0.1"
48
+ app_license = "${spec.license || "MIT"}"
49
+ app_modules = []
50
+ `;
51
+ await writeFile(join(root, "pyproject.toml"), pyproject);
52
+ files.push("pyproject.toml");
53
+ // app/__init__.py
54
+ await mkdir(join(root, appName), { recursive: true });
55
+ await writeFile(join(root, appName, "__init__.py"), `__version__ = "0.0.1"\n`);
56
+ files.push(`${appName}/__init__.py`);
57
+ // hooks.py
58
+ const hooksPy = [
59
+ "# App hooks",
60
+ `app_name = "${appName}"`,
61
+ `app_title = "${spec.name}"`,
62
+ `app_publisher = "${spec.author || "Author"}"`,
63
+ 'app_email = "author@example.com"',
64
+ `app_description = "${spec.description || ""}"`,
65
+ 'app_version = "0.0.1"',
66
+ `app_license = "${spec.license || "MIT"}"`,
67
+ "",
68
+ "# hooks",
69
+ "doc_events = {}",
70
+ ].join("\n");
71
+ await writeFile(join(root, appName, "hooks.py"), hooksPy);
72
+ files.push(`${appName}/hooks.py`);
73
+ // modules.txt (required for Frappe)
74
+ await writeFile(join(root, "modules.txt"), "");
75
+ files.push("modules.txt");
76
+ // README
77
+ await writeFile(join(root, "README.md"), `# ${spec.name}\n\n${spec.description || "A Frappe app."}\n`);
78
+ files.push("README.md");
79
+ return files;
80
+ },
81
+ };
82
+ //# sourceMappingURL=frappe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frappe.js","sourceRoot":"","sources":["../src/frappe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Create project scaffolds from typed ProjectSpec.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { bootstrap, detectAndSuggest } from '@pi-harness/project-bootstrap';
9
+ *
10
+ * // Bootstrap a new project
11
+ * const result = await bootstrap({
12
+ * name: 'my-app',
13
+ * type: 'single-package',
14
+ * frameworks: ['nextjs'],
15
+ * features: { typescript: true, testing: true }
16
+ * }, '/path/to/create');
17
+ *
18
+ * // Auto-detect framework and suggest spec
19
+ * const spec = await detectAndSuggest('/path/to/existing');
20
+ * ```
21
+ */
22
+ export * from "./types.js";
23
+ export * from "./bootstrap.js";
24
+ export { minimalTemplate } from "./minimal.js";
25
+ export { nodeTypescriptTemplate } from "./typescript.js";
26
+ export { frappeTemplate } from "./frappe.js";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Create project scaffolds from typed ProjectSpec.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { bootstrap, detectAndSuggest } from '@pi-harness/project-bootstrap';
9
+ *
10
+ * // Bootstrap a new project
11
+ * const result = await bootstrap({
12
+ * name: 'my-app',
13
+ * type: 'single-package',
14
+ * frameworks: ['nextjs'],
15
+ * features: { typescript: true, testing: true }
16
+ * }, '/path/to/create');
17
+ *
18
+ * // Auto-detect framework and suggest spec
19
+ * const spec = await detectAndSuggest('/path/to/existing');
20
+ * ```
21
+ */
22
+ export * from "./types.js";
23
+ export * from "./bootstrap.js";
24
+ export { minimalTemplate } from "./minimal.js";
25
+ export { nodeTypescriptTemplate } from "./typescript.js";
26
+ export { frappeTemplate } from "./frappe.js";
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Minimal template - bare project with package.json
5
+ */
6
+ import type { Template } from "./types.js";
7
+ export declare const minimalTemplate: Template;
8
+ //# sourceMappingURL=minimal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimal.d.ts","sourceRoot":"","sources":["../src/minimal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,eAAe,EAAE,QAoC7B,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Minimal template - bare project with package.json
5
+ */
6
+ export const minimalTemplate = {
7
+ name: "minimal",
8
+ description: "Bare project with package.json",
9
+ async apply(spec, root) {
10
+ const { writeFile, mkdir } = await import("fs/promises");
11
+ const { join } = await import("path");
12
+ const files = [];
13
+ // package.json
14
+ const packageJson = {
15
+ name: spec.name,
16
+ version: "0.1.0",
17
+ description: spec.description || "",
18
+ author: spec.author,
19
+ license: spec.license || "MIT",
20
+ private: spec.type === "monorepo",
21
+ scripts: {
22
+ build: 'echo "No build script"',
23
+ test: 'echo "No tests"',
24
+ },
25
+ };
26
+ await writeFile(join(root, "package.json"), JSON.stringify(packageJson, null, 2) + "\n");
27
+ files.push("package.json");
28
+ // README.md
29
+ const readme = `# ${spec.name}\n\n${spec.description || "A project."}\n`;
30
+ await writeFile(join(root, "README.md"), readme);
31
+ files.push("README.md");
32
+ return files;
33
+ },
34
+ };
35
+ //# sourceMappingURL=minimal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimal.js","sourceRoot":"","sources":["../src/minimal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,eAAe,GAAa;IACxC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,gCAAgC;IAC7C,KAAK,CAAC,KAAK,CAAC,IAAiB,EAAE,IAAY;QAC1C,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAEtC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,eAAe;QACf,MAAM,WAAW,GAAG;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;YAC9B,OAAO,EAAE,IAAI,CAAC,IAAI,KAAK,UAAU;YACjC,OAAO,EAAE;gBACR,KAAK,EAAE,wBAAwB;gBAC/B,IAAI,EAAE,iBAAiB;aACvB;SACD,CAAC;QAEF,MAAM,SAAS,CACd,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAC1B,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAC3C,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3B,YAAY;QACZ,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,WAAW,IAAI,YAAY,IAAI,CAAC;QACzE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAExB,OAAO,KAAK,CAAC;IACd,CAAC;CACD,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Typed definitions for project scaffolding.
5
+ */
6
+ export type ProjectType = "monorepo" | "single-package" | "multi-package";
7
+ export interface ProjectSpec {
8
+ name: string;
9
+ type: ProjectType;
10
+ description?: string;
11
+ author?: string;
12
+ license?: string;
13
+ frameworks: string[];
14
+ packages?: {
15
+ name: string;
16
+ type: string;
17
+ }[];
18
+ features?: {
19
+ ci?: boolean;
20
+ cd?: boolean;
21
+ testing?: boolean;
22
+ typescript?: boolean;
23
+ eslint?: boolean;
24
+ prettier?: boolean;
25
+ docs?: boolean;
26
+ };
27
+ gitInit?: boolean;
28
+ }
29
+ export interface BootstrapOptions {
30
+ dryRun?: boolean;
31
+ force?: boolean;
32
+ targetDir?: string;
33
+ template?: string;
34
+ verbose?: boolean;
35
+ }
36
+ export interface BootstrapResult {
37
+ root: string;
38
+ files: string[];
39
+ packages: string[];
40
+ duration: number;
41
+ }
42
+ export interface ValidationError {
43
+ field: string;
44
+ message: string;
45
+ }
46
+ export interface Template {
47
+ name: string;
48
+ description: string;
49
+ apply: (spec: ProjectSpec, root: string) => Promise<string[]>;
50
+ }
51
+ export interface BootstrapContext {
52
+ spec: ProjectSpec;
53
+ root: string;
54
+ files: string[];
55
+ events: EventEmitter;
56
+ }
57
+ export interface EventEmitter {
58
+ emit(event: string, data: unknown): void;
59
+ on(event: string, handler: (data: unknown) => void): void;
60
+ }
61
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAE1E,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE;QACV,EAAE,CAAC,EAAE,OAAO,CAAC;QACb,EAAE,CAAC,EAAE,OAAO,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,IAAI,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACzC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CAC1D"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Typed definitions for project scaffolding.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Project Bootstrap - RFC-0072
3
+ *
4
+ * Node.js + TypeScript template
5
+ */
6
+ import type { Template } from "./types.js";
7
+ export declare const nodeTypescriptTemplate: Template;
8
+ //# sourceMappingURL=typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,sBAAsB,EAAE,QAkHpC,CAAC"}