youmd 0.3.3 → 0.4.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.
@@ -42,6 +42,15 @@ exports.readLocalConfig = readLocalConfig;
42
42
  exports.writeLocalConfig = writeLocalConfig;
43
43
  exports.localBundleExists = localBundleExists;
44
44
  exports.isAuthenticated = isAuthenticated;
45
+ exports.detectProjectContext = detectProjectContext;
46
+ exports.getProjectBundleDir = getProjectBundleDir;
47
+ exports.getProjectPrivateDir = getProjectPrivateDir;
48
+ exports.ensureProjectDirs = ensureProjectDirs;
49
+ exports.readProjectPrivateNotes = readProjectPrivateNotes;
50
+ exports.writeProjectPrivateNotes = writeProjectPrivateNotes;
51
+ exports.readProjectContext = readProjectContext;
52
+ exports.writeProjectContext = writeProjectContext;
53
+ exports.listProjects = listProjects;
45
54
  const fs = __importStar(require("fs"));
46
55
  const path = __importStar(require("path"));
47
56
  const os = __importStar(require("os"));
@@ -99,4 +108,177 @@ function isAuthenticated() {
99
108
  const config = readGlobalConfig();
100
109
  return !!config.token;
101
110
  }
111
+ const PROJECT_MARKERS = [
112
+ ".youmd-project",
113
+ ".git",
114
+ "package.json",
115
+ "Cargo.toml",
116
+ "go.mod",
117
+ "pyproject.toml",
118
+ "Makefile",
119
+ ];
120
+ /**
121
+ * Walk up from cwd looking for project markers.
122
+ * Returns project context if found, null otherwise.
123
+ */
124
+ function detectProjectContext() {
125
+ let dir = process.cwd();
126
+ const root = path.parse(dir).root;
127
+ while (dir !== root) {
128
+ for (const marker of PROJECT_MARKERS) {
129
+ const markerPath = path.join(dir, marker);
130
+ const isDir = marker === ".git";
131
+ if (isDir) {
132
+ if (fs.existsSync(markerPath) && fs.statSync(markerPath).isDirectory()) {
133
+ return buildProjectContext(dir, marker);
134
+ }
135
+ }
136
+ else {
137
+ if (fs.existsSync(markerPath) && fs.statSync(markerPath).isFile()) {
138
+ return buildProjectContext(dir, marker);
139
+ }
140
+ }
141
+ }
142
+ dir = path.dirname(dir);
143
+ }
144
+ return null;
145
+ }
146
+ function buildProjectContext(projectRoot, marker) {
147
+ // Check for .youmd-project first (highest priority for name/description)
148
+ const youmdProjectPath = path.join(projectRoot, ".youmd-project");
149
+ let youmdProject;
150
+ if (fs.existsSync(youmdProjectPath)) {
151
+ try {
152
+ youmdProject = JSON.parse(fs.readFileSync(youmdProjectPath, "utf-8"));
153
+ }
154
+ catch {
155
+ // malformed — ignore
156
+ }
157
+ }
158
+ // Determine project name
159
+ let name = youmdProject?.name || "";
160
+ if (!name) {
161
+ // Try package.json
162
+ const pkgPath = path.join(projectRoot, "package.json");
163
+ if (fs.existsSync(pkgPath)) {
164
+ try {
165
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
166
+ if (pkg.name && typeof pkg.name === "string") {
167
+ name = pkg.name;
168
+ }
169
+ }
170
+ catch {
171
+ // skip
172
+ }
173
+ }
174
+ }
175
+ // Fallback to directory name
176
+ if (!name) {
177
+ name = path.basename(projectRoot);
178
+ }
179
+ return {
180
+ root: projectRoot,
181
+ name,
182
+ marker,
183
+ youmdProject,
184
+ };
185
+ }
186
+ /**
187
+ * Sanitize a project name for use as a directory name.
188
+ */
189
+ function sanitizeProjectName(name) {
190
+ return name
191
+ .toLowerCase()
192
+ .replace(/[^a-z0-9_-]/g, "-")
193
+ .replace(/-+/g, "-")
194
+ .replace(/^-|-$/g, "");
195
+ }
196
+ /**
197
+ * Get the global .youmd/projects/{project-name}/ directory for project-specific files.
198
+ */
199
+ function getProjectBundleDir(projectName) {
200
+ return path.join(GLOBAL_CONFIG_DIR, "projects", sanitizeProjectName(projectName));
201
+ }
202
+ /**
203
+ * Get the private context directory for a project.
204
+ */
205
+ function getProjectPrivateDir(projectName) {
206
+ return path.join(getProjectBundleDir(projectName), "private");
207
+ }
208
+ /**
209
+ * Ensure the project bundle directory structure exists.
210
+ */
211
+ function ensureProjectDirs(projectName) {
212
+ const projectDir = getProjectBundleDir(projectName);
213
+ const privateDir = path.join(projectDir, "private");
214
+ fs.mkdirSync(privateDir, { recursive: true });
215
+ return projectDir;
216
+ }
217
+ /**
218
+ * Read project-specific private notes from .youmd/projects/{name}/private/notes.md
219
+ */
220
+ function readProjectPrivateNotes(projectName) {
221
+ const notesPath = path.join(getProjectPrivateDir(projectName), "notes.md");
222
+ if (!fs.existsSync(notesPath))
223
+ return null;
224
+ try {
225
+ return fs.readFileSync(notesPath, "utf-8");
226
+ }
227
+ catch {
228
+ return null;
229
+ }
230
+ }
231
+ /**
232
+ * Write project-specific private notes.
233
+ */
234
+ function writeProjectPrivateNotes(projectName, content) {
235
+ const privateDir = getProjectPrivateDir(projectName);
236
+ fs.mkdirSync(privateDir, { recursive: true });
237
+ fs.writeFileSync(path.join(privateDir, "notes.md"), content);
238
+ }
239
+ /**
240
+ * Read project-specific config/context from .youmd/projects/{name}/context.json
241
+ */
242
+ function readProjectContext(projectName) {
243
+ const contextPath = path.join(getProjectBundleDir(projectName), "context.json");
244
+ if (!fs.existsSync(contextPath))
245
+ return null;
246
+ try {
247
+ return JSON.parse(fs.readFileSync(contextPath, "utf-8"));
248
+ }
249
+ catch {
250
+ return null;
251
+ }
252
+ }
253
+ /**
254
+ * Write project-specific context.
255
+ */
256
+ function writeProjectContext(projectName, context) {
257
+ const projectDir = getProjectBundleDir(projectName);
258
+ fs.mkdirSync(projectDir, { recursive: true });
259
+ fs.writeFileSync(path.join(projectDir, "context.json"), JSON.stringify(context, null, 2) + "\n");
260
+ }
261
+ /**
262
+ * List all known projects from .youmd/projects/
263
+ */
264
+ function listProjects() {
265
+ const projectsDir = path.join(GLOBAL_CONFIG_DIR, "projects");
266
+ if (!fs.existsSync(projectsDir))
267
+ return [];
268
+ try {
269
+ return fs
270
+ .readdirSync(projectsDir)
271
+ .filter((entry) => {
272
+ const entryPath = path.join(projectsDir, entry);
273
+ return fs.statSync(entryPath).isDirectory();
274
+ })
275
+ .map((entry) => ({
276
+ name: entry,
277
+ dir: path.join(projectsDir, entry),
278
+ }));
279
+ }
280
+ catch {
281
+ return [];
282
+ }
283
+ }
102
284
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,gDAEC;AAED,kDAEC;AAED,8CAEC;AAED,4CAUC;AAED,8CAKC;AAED,0CAWC;AAED,4CAGC;AAED,8CAEC;AAED,0CAGC;AA7ED,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5D,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AACvE,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAelC,SAAgB,kBAAkB;IAChC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAgB,mBAAmB;IACjC,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,gBAAgB;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAoB;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAmB;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,CAAC,CAAC;IACjE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,EAAE,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ export interface ProjectMeta {
2
+ name: string;
3
+ description: string;
4
+ created_at: string;
5
+ updated_at: string;
6
+ }
7
+ export interface ProjectMemory {
8
+ category: string;
9
+ content: string;
10
+ created_at: string;
11
+ }
12
+ export interface ProjectPreferences {
13
+ tone: string;
14
+ stack: string;
15
+ focus: string;
16
+ [key: string]: string;
17
+ }
18
+ export interface ProjectContext {
19
+ meta: ProjectMeta;
20
+ instructions: string;
21
+ preferences: ProjectPreferences;
22
+ prd: string;
23
+ todo: string;
24
+ features: string;
25
+ changelog: string;
26
+ decisions: string;
27
+ memories: ProjectMemory[];
28
+ privateNotes: string;
29
+ }
30
+ /**
31
+ * Creates the full project directory structure with default template files.
32
+ */
33
+ export declare function initProjectFiles(projectDir: string, projectName: string, description?: string): void;
34
+ /**
35
+ * Reads all project context files and returns a structured object.
36
+ * Returns null if the project directory doesn't exist or has no project.json.
37
+ */
38
+ export declare function readProjectContext(projectDir: string): ProjectContext | null;
39
+ /**
40
+ * Writes content to a specific file within the project directory.
41
+ * Creates parent directories if needed.
42
+ */
43
+ export declare function updateProjectFile(projectDir: string, filePath: string, content: string): void;
44
+ /**
45
+ * Reads the project memory.json file.
46
+ */
47
+ export declare function getProjectMemories(projectDir: string): ProjectMemory[];
48
+ /**
49
+ * Appends a memory entry to the project's memory.json.
50
+ */
51
+ export declare function addProjectMemory(projectDir: string, memory: {
52
+ category: string;
53
+ content: string;
54
+ }): void;
55
+ /**
56
+ * Finds the .youmd/projects directory, searching upward from cwd.
57
+ * Returns the path to the projects dir, or null if not found.
58
+ */
59
+ export declare function findProjectsRoot(startDir?: string): string | null;
60
+ /**
61
+ * Lists all project names under .youmd/projects/.
62
+ */
63
+ export declare function listProjects(projectsRoot: string): string[];
64
+ /**
65
+ * Gets the project directory for a given project name.
66
+ */
67
+ export declare function getProjectDir(projectsRoot: string, projectName: string): string;
68
+ /**
69
+ * Detects current project based on cwd or git repo name.
70
+ */
71
+ export declare function detectCurrentProject(projectsRoot: string): string | null;
72
+ /**
73
+ * Builds the project context injection string for the LLM system prompt.
74
+ */
75
+ export declare function buildProjectContextInjection(projectDir: string): string | null;
76
+ /**
77
+ * Parses project_updates JSON blocks from LLM response text.
78
+ * Expected format in the response:
79
+ * ```json
80
+ * {"project_updates": [{"file": "context/todo.md", "content": "..."}]}
81
+ * ```
82
+ */
83
+ export declare function parseProjectUpdates(text: string): Array<{
84
+ file: string;
85
+ content: string;
86
+ }>;
87
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,kBAAkB,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AA4CD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,IAAI,CAoChG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAuB5E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAmB7F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CAEtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAexG;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAajE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAS3D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYxE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsC9E;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB1F"}
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.initProjectFiles = initProjectFiles;
37
+ exports.readProjectContext = readProjectContext;
38
+ exports.updateProjectFile = updateProjectFile;
39
+ exports.getProjectMemories = getProjectMemories;
40
+ exports.addProjectMemory = addProjectMemory;
41
+ exports.findProjectsRoot = findProjectsRoot;
42
+ exports.listProjects = listProjects;
43
+ exports.getProjectDir = getProjectDir;
44
+ exports.detectCurrentProject = detectCurrentProject;
45
+ exports.buildProjectContextInjection = buildProjectContextInjection;
46
+ exports.parseProjectUpdates = parseProjectUpdates;
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ // ─── Templates ────────────────────────────────────────────────────────
50
+ function prdTemplate(name) {
51
+ return `# ${name}\n\n## Overview\n\n## Goals\n\n## Requirements\n\n## Non-Goals\n`;
52
+ }
53
+ function todoTemplate() {
54
+ return `# TODO\n\n## In Progress\n\n## Backlog\n\n## Done\n`;
55
+ }
56
+ function featuresTemplate() {
57
+ return `# Features\n\n## Requested\n\n## In Progress\n\n## Shipped\n`;
58
+ }
59
+ function changelogTemplate() {
60
+ return `# Changelog\n\n`;
61
+ }
62
+ function decisionsTemplate() {
63
+ return `# Decisions\n\n`;
64
+ }
65
+ function instructionsTemplate() {
66
+ return `# Agent Instructions\n\nProject-specific instructions for AI agents working on this project.\n`;
67
+ }
68
+ function preferencesTemplate() {
69
+ return { tone: "direct", stack: "", focus: "" };
70
+ }
71
+ function projectMetaTemplate(name, description) {
72
+ const now = new Date().toISOString();
73
+ return {
74
+ name,
75
+ description,
76
+ created_at: now,
77
+ updated_at: now,
78
+ };
79
+ }
80
+ // ─── Core functions ───────────────────────────────────────────────────
81
+ /**
82
+ * Creates the full project directory structure with default template files.
83
+ */
84
+ function initProjectFiles(projectDir, projectName, description = "") {
85
+ const dirs = [
86
+ projectDir,
87
+ path.join(projectDir, "private"),
88
+ path.join(projectDir, "context"),
89
+ path.join(projectDir, "agent"),
90
+ ];
91
+ for (const dir of dirs) {
92
+ if (!fs.existsSync(dir)) {
93
+ fs.mkdirSync(dir, { recursive: true });
94
+ }
95
+ }
96
+ // project.json
97
+ const metaPath = path.join(projectDir, "project.json");
98
+ if (!fs.existsSync(metaPath)) {
99
+ fs.writeFileSync(metaPath, JSON.stringify(projectMetaTemplate(projectName, description), null, 2) + "\n");
100
+ }
101
+ // private/
102
+ writeIfMissing(path.join(projectDir, "private", "notes.md"), "# Private Notes\n\n");
103
+ writeIfMissing(path.join(projectDir, "private", "links.json"), JSON.stringify([], null, 2) + "\n");
104
+ writeIfMissing(path.join(projectDir, "private", "projects.json"), JSON.stringify([], null, 2) + "\n");
105
+ // context/
106
+ writeIfMissing(path.join(projectDir, "context", "prd.md"), prdTemplate(projectName));
107
+ writeIfMissing(path.join(projectDir, "context", "todo.md"), todoTemplate());
108
+ writeIfMissing(path.join(projectDir, "context", "features.md"), featuresTemplate());
109
+ writeIfMissing(path.join(projectDir, "context", "changelog.md"), changelogTemplate());
110
+ writeIfMissing(path.join(projectDir, "context", "decisions.md"), decisionsTemplate());
111
+ // agent/
112
+ writeIfMissing(path.join(projectDir, "agent", "instructions.md"), instructionsTemplate());
113
+ writeIfMissing(path.join(projectDir, "agent", "preferences.json"), JSON.stringify(preferencesTemplate(), null, 2) + "\n");
114
+ writeIfMissing(path.join(projectDir, "agent", "memory.json"), JSON.stringify([], null, 2) + "\n");
115
+ }
116
+ /**
117
+ * Reads all project context files and returns a structured object.
118
+ * Returns null if the project directory doesn't exist or has no project.json.
119
+ */
120
+ function readProjectContext(projectDir) {
121
+ const metaPath = path.join(projectDir, "project.json");
122
+ if (!fs.existsSync(metaPath))
123
+ return null;
124
+ let meta;
125
+ try {
126
+ meta = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
127
+ }
128
+ catch {
129
+ return null;
130
+ }
131
+ return {
132
+ meta,
133
+ instructions: readFileOrDefault(path.join(projectDir, "agent", "instructions.md"), ""),
134
+ preferences: readJsonOrDefault(path.join(projectDir, "agent", "preferences.json"), preferencesTemplate()),
135
+ prd: readFileOrDefault(path.join(projectDir, "context", "prd.md"), ""),
136
+ todo: readFileOrDefault(path.join(projectDir, "context", "todo.md"), ""),
137
+ features: readFileOrDefault(path.join(projectDir, "context", "features.md"), ""),
138
+ changelog: readFileOrDefault(path.join(projectDir, "context", "changelog.md"), ""),
139
+ decisions: readFileOrDefault(path.join(projectDir, "context", "decisions.md"), ""),
140
+ memories: readJsonOrDefault(path.join(projectDir, "agent", "memory.json"), []),
141
+ privateNotes: readFileOrDefault(path.join(projectDir, "private", "notes.md"), ""),
142
+ };
143
+ }
144
+ /**
145
+ * Writes content to a specific file within the project directory.
146
+ * Creates parent directories if needed.
147
+ */
148
+ function updateProjectFile(projectDir, filePath, content) {
149
+ const fullPath = path.join(projectDir, filePath);
150
+ const dir = path.dirname(fullPath);
151
+ if (!fs.existsSync(dir)) {
152
+ fs.mkdirSync(dir, { recursive: true });
153
+ }
154
+ fs.writeFileSync(fullPath, content);
155
+ // Touch updated_at in project.json
156
+ const metaPath = path.join(projectDir, "project.json");
157
+ if (fs.existsSync(metaPath)) {
158
+ try {
159
+ const meta = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
160
+ meta.updated_at = new Date().toISOString();
161
+ fs.writeFileSync(metaPath, JSON.stringify(meta, null, 2) + "\n");
162
+ }
163
+ catch {
164
+ // non-fatal
165
+ }
166
+ }
167
+ }
168
+ /**
169
+ * Reads the project memory.json file.
170
+ */
171
+ function getProjectMemories(projectDir) {
172
+ return readJsonOrDefault(path.join(projectDir, "agent", "memory.json"), []);
173
+ }
174
+ /**
175
+ * Appends a memory entry to the project's memory.json.
176
+ */
177
+ function addProjectMemory(projectDir, memory) {
178
+ const memPath = path.join(projectDir, "agent", "memory.json");
179
+ const existing = readJsonOrDefault(memPath, []);
180
+ existing.push({
181
+ category: memory.category,
182
+ content: memory.content,
183
+ created_at: new Date().toISOString(),
184
+ });
185
+ const dir = path.dirname(memPath);
186
+ if (!fs.existsSync(dir)) {
187
+ fs.mkdirSync(dir, { recursive: true });
188
+ }
189
+ fs.writeFileSync(memPath, JSON.stringify(existing, null, 2) + "\n");
190
+ }
191
+ // ─── Project detection ────────────────────────────────────────────────
192
+ /**
193
+ * Finds the .youmd/projects directory, searching upward from cwd.
194
+ * Returns the path to the projects dir, or null if not found.
195
+ */
196
+ function findProjectsRoot(startDir) {
197
+ let dir = startDir || process.cwd();
198
+ const root = path.parse(dir).root;
199
+ while (dir !== root) {
200
+ const candidate = path.join(dir, ".youmd", "projects");
201
+ if (fs.existsSync(candidate)) {
202
+ return candidate;
203
+ }
204
+ dir = path.dirname(dir);
205
+ }
206
+ return null;
207
+ }
208
+ /**
209
+ * Lists all project names under .youmd/projects/.
210
+ */
211
+ function listProjects(projectsRoot) {
212
+ if (!fs.existsSync(projectsRoot))
213
+ return [];
214
+ return fs
215
+ .readdirSync(projectsRoot)
216
+ .filter((name) => {
217
+ const projectJson = path.join(projectsRoot, name, "project.json");
218
+ return fs.existsSync(projectJson);
219
+ })
220
+ .sort();
221
+ }
222
+ /**
223
+ * Gets the project directory for a given project name.
224
+ */
225
+ function getProjectDir(projectsRoot, projectName) {
226
+ return path.join(projectsRoot, slugify(projectName));
227
+ }
228
+ /**
229
+ * Detects current project based on cwd or git repo name.
230
+ */
231
+ function detectCurrentProject(projectsRoot) {
232
+ const cwd = process.cwd();
233
+ const dirName = path.basename(cwd);
234
+ const slug = slugify(dirName);
235
+ // Check if a project matching the current directory name exists
236
+ const candidatePath = path.join(projectsRoot, slug, "project.json");
237
+ if (fs.existsSync(candidatePath)) {
238
+ return slug;
239
+ }
240
+ return null;
241
+ }
242
+ /**
243
+ * Builds the project context injection string for the LLM system prompt.
244
+ */
245
+ function buildProjectContextInjection(projectDir) {
246
+ const ctx = readProjectContext(projectDir);
247
+ if (!ctx)
248
+ return null;
249
+ const parts = [];
250
+ parts.push(`[PROJECT CONTEXT — the user is working in project "${ctx.meta.name}"]`);
251
+ if (ctx.meta.description) {
252
+ parts.push(`description: ${ctx.meta.description}`);
253
+ }
254
+ if (ctx.instructions.trim() && ctx.instructions !== instructionsTemplate()) {
255
+ parts.push(`agent instructions: ${ctx.instructions}`);
256
+ }
257
+ const prefs = ctx.preferences;
258
+ const prefParts = [];
259
+ if (prefs.tone)
260
+ prefParts.push(`tone=${prefs.tone}`);
261
+ if (prefs.stack)
262
+ prefParts.push(`stack=${prefs.stack}`);
263
+ if (prefs.focus)
264
+ prefParts.push(`focus=${prefs.focus}`);
265
+ if (prefParts.length > 0) {
266
+ parts.push(`preferences: ${prefParts.join(", ")}`);
267
+ }
268
+ if (ctx.prd.trim() && ctx.prd !== prdTemplate(ctx.meta.name)) {
269
+ parts.push(`current PRD summary: ${ctx.prd.slice(0, 500)}`);
270
+ }
271
+ if (ctx.todo.trim() && ctx.todo !== todoTemplate()) {
272
+ parts.push(`current tasks:\n${ctx.todo}`);
273
+ }
274
+ // Only return something if there's meaningful content beyond the name
275
+ if (parts.length <= 1) {
276
+ parts.push("(project context is mostly empty — help the user fill it in if relevant)");
277
+ }
278
+ return parts.join("\n");
279
+ }
280
+ /**
281
+ * Parses project_updates JSON blocks from LLM response text.
282
+ * Expected format in the response:
283
+ * ```json
284
+ * {"project_updates": [{"file": "context/todo.md", "content": "..."}]}
285
+ * ```
286
+ */
287
+ function parseProjectUpdates(text) {
288
+ const updates = [];
289
+ const blocks = text.matchAll(/```json\s*\n([\s\S]*?)\n```/g);
290
+ for (const match of blocks) {
291
+ try {
292
+ const parsed = JSON.parse(match[1]);
293
+ if (parsed.project_updates && Array.isArray(parsed.project_updates)) {
294
+ for (const pu of parsed.project_updates) {
295
+ if (pu?.file && typeof pu.file === "string" && pu?.content && typeof pu.content === "string") {
296
+ // Validate file path is within allowed directories
297
+ if (pu.file.startsWith("context/") || pu.file.startsWith("agent/") || pu.file.startsWith("private/")) {
298
+ updates.push({ file: pu.file, content: pu.content });
299
+ }
300
+ }
301
+ }
302
+ }
303
+ }
304
+ catch {
305
+ // skip malformed JSON blocks
306
+ }
307
+ }
308
+ return updates;
309
+ }
310
+ // ─── Utilities ────────────────────────────────────────────────────────
311
+ function slugify(name) {
312
+ return name
313
+ .toLowerCase()
314
+ .replace(/[^a-z0-9]+/g, "-")
315
+ .replace(/^-+|-+$/g, "")
316
+ .slice(0, 64);
317
+ }
318
+ function writeIfMissing(filePath, content) {
319
+ if (!fs.existsSync(filePath)) {
320
+ fs.writeFileSync(filePath, content);
321
+ }
322
+ }
323
+ function readFileOrDefault(filePath, fallback) {
324
+ try {
325
+ if (fs.existsSync(filePath)) {
326
+ return fs.readFileSync(filePath, "utf-8");
327
+ }
328
+ }
329
+ catch {
330
+ // fall through
331
+ }
332
+ return fallback;
333
+ }
334
+ function readJsonOrDefault(filePath, fallback) {
335
+ try {
336
+ if (fs.existsSync(filePath)) {
337
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
338
+ }
339
+ }
340
+ catch {
341
+ // fall through
342
+ }
343
+ return fallback;
344
+ }
345
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "youmd",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Your identity file for the agent internet. CLI for the You.md platform.",
5
5
  "bin": {
6
6
  "youmd": "./dist/index.js",