@hasna/prompts 0.2.1 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;eAmCmB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;;AAF9C,wBA+KC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;eAsCmB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;;AAF9C,wBAkOC"}
@@ -115,6 +115,41 @@ function runMigrations(db) {
115
115
  name: "003_pinned",
116
116
  sql: `ALTER TABLE prompts ADD COLUMN pinned INTEGER NOT NULL DEFAULT 0;`
117
117
  },
118
+ {
119
+ name: "004_projects",
120
+ sql: `
121
+ CREATE TABLE IF NOT EXISTS projects (
122
+ id TEXT PRIMARY KEY,
123
+ name TEXT NOT NULL UNIQUE,
124
+ slug TEXT NOT NULL UNIQUE,
125
+ description TEXT,
126
+ path TEXT,
127
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
128
+ );
129
+ ALTER TABLE prompts ADD COLUMN project_id TEXT REFERENCES projects(id) ON DELETE SET NULL;
130
+ CREATE INDEX IF NOT EXISTS idx_prompts_project_id ON prompts(project_id);
131
+ `
132
+ },
133
+ {
134
+ name: "005_chaining",
135
+ sql: `ALTER TABLE prompts ADD COLUMN next_prompt TEXT;`
136
+ },
137
+ {
138
+ name: "006_expiry",
139
+ sql: `ALTER TABLE prompts ADD COLUMN expires_at TEXT;`
140
+ },
141
+ {
142
+ name: "007_usage_log",
143
+ sql: `
144
+ CREATE TABLE IF NOT EXISTS usage_log (
145
+ id TEXT PRIMARY KEY,
146
+ prompt_id TEXT NOT NULL REFERENCES prompts(id) ON DELETE CASCADE,
147
+ used_at TEXT NOT NULL DEFAULT (datetime('now'))
148
+ );
149
+ CREATE INDEX IF NOT EXISTS idx_usage_log_prompt_id ON usage_log(prompt_id);
150
+ CREATE INDEX IF NOT EXISTS idx_usage_log_used_at ON usage_log(used_at);
151
+ `
152
+ },
118
153
  {
119
154
  name: "002_fts5",
120
155
  sql: `
@@ -155,6 +190,24 @@ function runMigrations(db) {
155
190
  db.run("INSERT INTO _migrations (name) VALUES (?)", [migration.name]);
156
191
  }
157
192
  }
193
+ function resolveProject(db, idOrSlug) {
194
+ const byId = db.query("SELECT id FROM projects WHERE id = ?").get(idOrSlug);
195
+ if (byId)
196
+ return byId.id;
197
+ const bySlug = db.query("SELECT id FROM projects WHERE slug = ?").get(idOrSlug);
198
+ if (bySlug)
199
+ return bySlug.id;
200
+ const byName = db.query("SELECT id FROM projects WHERE lower(name) = ?").get(idOrSlug.toLowerCase());
201
+ if (byName)
202
+ return byName.id;
203
+ const byPrefix = db.query("SELECT id FROM projects WHERE id LIKE ? LIMIT 2").all(`${idOrSlug}%`);
204
+ if (byPrefix.length === 1 && byPrefix[0])
205
+ return byPrefix[0].id;
206
+ const bySlugPrefix = db.query("SELECT id FROM projects WHERE slug LIKE ? LIMIT 2").all(`${idOrSlug}%`);
207
+ if (bySlugPrefix.length === 1 && bySlugPrefix[0])
208
+ return bySlugPrefix[0].id;
209
+ return null;
210
+ }
158
211
  function hasFts(db) {
159
212
  return db.query("SELECT 1 FROM sqlite_master WHERE type='table' AND name='prompts_fts'").get() !== null;
160
213
  }
@@ -363,6 +416,12 @@ class DuplicateSlugError extends Error {
363
416
  this.name = "DuplicateSlugError";
364
417
  }
365
418
  }
419
+ class ProjectNotFoundError extends Error {
420
+ constructor(id) {
421
+ super(`Project not found: ${id}`);
422
+ this.name = "ProjectNotFoundError";
423
+ }
424
+ }
366
425
 
367
426
  // src/db/prompts.ts
368
427
  function rowToPrompt(row) {
@@ -377,6 +436,9 @@ function rowToPrompt(row) {
377
436
  tags: JSON.parse(row["tags"] || "[]"),
378
437
  variables: JSON.parse(row["variables"] || "[]"),
379
438
  pinned: Boolean(row["pinned"]),
439
+ next_prompt: row["next_prompt"] ?? null,
440
+ expires_at: row["expires_at"] ?? null,
441
+ project_id: row["project_id"] ?? null,
380
442
  is_template: Boolean(row["is_template"]),
381
443
  source: row["source"],
382
444
  version: row["version"],
@@ -400,11 +462,12 @@ function createPrompt(input) {
400
462
  ensureCollection(collection);
401
463
  const tags = JSON.stringify(input.tags || []);
402
464
  const source = input.source || "manual";
465
+ const project_id = input.project_id ?? null;
403
466
  const vars = extractVariables(input.body);
404
467
  const variables = JSON.stringify(vars.map((v) => ({ name: v, required: true })));
405
468
  const is_template = vars.length > 0 ? 1 : 0;
406
- db.run(`INSERT INTO prompts (id, name, slug, title, body, description, collection, tags, variables, is_template, source)
407
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [id, name, slug, input.title, input.body, input.description ?? null, collection, tags, variables, is_template, source]);
469
+ db.run(`INSERT INTO prompts (id, name, slug, title, body, description, collection, tags, variables, is_template, source, project_id)
470
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [id, name, slug, input.title, input.body, input.description ?? null, collection, tags, variables, is_template, source, project_id]);
408
471
  db.run(`INSERT INTO prompt_versions (id, prompt_id, body, version, changed_by)
409
472
  VALUES (?, ?, ?, 1, ?)`, [generateId("VER"), id, input.body, input.changed_by ?? null]);
410
473
  return getPrompt(id);
@@ -448,10 +511,16 @@ function listPrompts(filter = {}) {
448
511
  params.push(`%"${tag}"%`);
449
512
  }
450
513
  }
514
+ let orderBy = "pinned DESC, use_count DESC, updated_at DESC";
515
+ if (filter.project_id !== undefined && filter.project_id !== null) {
516
+ conditions.push("(project_id = ? OR project_id IS NULL)");
517
+ params.push(filter.project_id);
518
+ orderBy = `(CASE WHEN project_id = '${filter.project_id}' THEN 0 ELSE 1 END), pinned DESC, use_count DESC, updated_at DESC`;
519
+ }
451
520
  const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
452
521
  const limit = filter.limit ?? 100;
453
522
  const offset = filter.offset ?? 0;
454
- const rows = db.query(`SELECT * FROM prompts ${where} ORDER BY pinned DESC, use_count DESC, updated_at DESC LIMIT ? OFFSET ?`).all(...params, limit, offset);
523
+ const rows = db.query(`SELECT * FROM prompts ${where} ORDER BY ${orderBy} LIMIT ? OFFSET ?`).all(...params, limit, offset);
455
524
  return rows.map(rowToPrompt);
456
525
  }
457
526
  function updatePrompt(idOrSlug, input) {
@@ -467,6 +536,7 @@ function updatePrompt(idOrSlug, input) {
467
536
  description = COALESCE(?, description),
468
537
  collection = COALESCE(?, collection),
469
538
  tags = COALESCE(?, tags),
539
+ next_prompt = CASE WHEN ? IS NOT NULL THEN ? ELSE next_prompt END,
470
540
  variables = ?,
471
541
  is_template = ?,
472
542
  version = version + 1,
@@ -477,6 +547,8 @@ function updatePrompt(idOrSlug, input) {
477
547
  input.description ?? null,
478
548
  input.collection ?? null,
479
549
  input.tags ? JSON.stringify(input.tags) : null,
550
+ "next_prompt" in input ? input.next_prompt ?? "" : null,
551
+ "next_prompt" in input ? input.next_prompt ?? null : null,
480
552
  variables,
481
553
  is_template,
482
554
  prompt.id,
@@ -499,6 +571,7 @@ function usePrompt(idOrSlug) {
499
571
  const db = getDatabase();
500
572
  const prompt = requirePrompt(idOrSlug);
501
573
  db.run("UPDATE prompts SET use_count = use_count + 1, last_used_at = datetime('now') WHERE id = ?", [prompt.id]);
574
+ db.run("INSERT INTO usage_log (id, prompt_id) VALUES (?, ?)", [generateId("UL"), prompt.id]);
502
575
  return requirePrompt(prompt.id);
503
576
  }
504
577
  function upsertPrompt(input, force = false) {
@@ -578,6 +651,52 @@ function restoreVersion(promptId, version, changedBy) {
578
651
  VALUES (?, ?, ?, ?, ?)`, [generateId("VER"), promptId, ver.body, newVersion, changedBy ?? null]);
579
652
  }
580
653
 
654
+ // src/db/projects.ts
655
+ function rowToProject(row, promptCount) {
656
+ return {
657
+ id: row["id"],
658
+ name: row["name"],
659
+ slug: row["slug"],
660
+ description: row["description"] ?? null,
661
+ path: row["path"] ?? null,
662
+ prompt_count: promptCount,
663
+ created_at: row["created_at"]
664
+ };
665
+ }
666
+ function createProject(input) {
667
+ const db = getDatabase();
668
+ const id = generateId("proj");
669
+ const slug = generateSlug(input.name);
670
+ db.run(`INSERT INTO projects (id, name, slug, description, path) VALUES (?, ?, ?, ?, ?)`, [id, input.name, slug, input.description ?? null, input.path ?? null]);
671
+ return getProject(id);
672
+ }
673
+ function getProject(idOrSlug) {
674
+ const db = getDatabase();
675
+ const id = resolveProject(db, idOrSlug);
676
+ if (!id)
677
+ return null;
678
+ const row = db.query("SELECT * FROM projects WHERE id = ?").get(id);
679
+ if (!row)
680
+ return null;
681
+ const countRow = db.query("SELECT COUNT(*) as n FROM prompts WHERE project_id = ?").get(id);
682
+ return rowToProject(row, countRow.n);
683
+ }
684
+ function listProjects() {
685
+ const db = getDatabase();
686
+ const rows = db.query("SELECT * FROM projects ORDER BY name ASC").all();
687
+ return rows.map((row) => {
688
+ const countRow = db.query("SELECT COUNT(*) as n FROM prompts WHERE project_id = ?").get(row["id"]);
689
+ return rowToProject(row, countRow.n);
690
+ });
691
+ }
692
+ function deleteProject(idOrSlug) {
693
+ const db = getDatabase();
694
+ const id = resolveProject(db, idOrSlug);
695
+ if (!id)
696
+ throw new ProjectNotFoundError(idOrSlug);
697
+ db.run("DELETE FROM projects WHERE id = ?", [id]);
698
+ }
699
+
581
700
  // src/lib/search.ts
582
701
  function rowToSearchResult(row, snippet) {
583
702
  return {
@@ -592,6 +711,9 @@ function rowToSearchResult(row, snippet) {
592
711
  tags: JSON.parse(row["tags"] || "[]"),
593
712
  variables: JSON.parse(row["variables"] || "[]"),
594
713
  pinned: Boolean(row["pinned"]),
714
+ next_prompt: row["next_prompt"] ?? null,
715
+ expires_at: row["expires_at"] ?? null,
716
+ project_id: row["project_id"] ?? null,
595
717
  is_template: Boolean(row["is_template"]),
596
718
  source: row["source"],
597
719
  version: row["version"],
@@ -635,6 +757,10 @@ function searchPrompts(query, filter = {}) {
635
757
  for (const tag of filter.tags)
636
758
  params.push(`%"${tag}"%`);
637
759
  }
760
+ if (filter.project_id !== undefined && filter.project_id !== null) {
761
+ conditions.push("(p.project_id = ? OR p.project_id IS NULL)");
762
+ params.push(filter.project_id);
763
+ }
638
764
  const where = conditions.length > 0 ? `AND ${conditions.join(" AND ")}` : "";
639
765
  const limit = filter.limit ?? 50;
640
766
  const offset = filter.offset ?? 0;
@@ -755,7 +881,15 @@ var server_default = {
755
881
  const source = url.searchParams.get("source") ?? undefined;
756
882
  const limit = parseInt(url.searchParams.get("limit") ?? "100");
757
883
  const offset = parseInt(url.searchParams.get("offset") ?? "0");
758
- return json(listPrompts({ collection, tags, is_template, source, limit, offset }));
884
+ const projectParam = url.searchParams.get("project") ?? undefined;
885
+ let project_id;
886
+ if (projectParam) {
887
+ const pid = resolveProject(getDatabase(), projectParam);
888
+ if (!pid)
889
+ return notFound(`Project not found: ${projectParam}`);
890
+ project_id = pid;
891
+ }
892
+ return json(listPrompts({ collection, tags, is_template, source, limit, offset, project_id }));
759
893
  }
760
894
  if (path === "/api/prompts" && method === "POST") {
761
895
  const body = await parseBody(req);
@@ -864,6 +998,43 @@ var server_default = {
864
998
  const collection = url.searchParams.get("collection") ?? undefined;
865
999
  return json(exportToJson(collection));
866
1000
  }
1001
+ if (path === "/api/projects" && method === "GET") {
1002
+ return json(listProjects());
1003
+ }
1004
+ if (path === "/api/projects" && method === "POST") {
1005
+ const { name, description, path: projPath } = await parseBody(req);
1006
+ if (!name)
1007
+ return badRequest("name is required");
1008
+ return json(createProject({ name, description, path: projPath }), 201);
1009
+ }
1010
+ const projectMatch = path.match(/^\/api\/projects\/([^/]+)$/);
1011
+ if (projectMatch) {
1012
+ const projId = projectMatch[1];
1013
+ if (method === "GET") {
1014
+ const project = getProject(projId);
1015
+ if (!project)
1016
+ return notFound(`Project not found: ${projId}`);
1017
+ return json(project);
1018
+ }
1019
+ if (method === "DELETE") {
1020
+ try {
1021
+ deleteProject(projId);
1022
+ return json({ deleted: true, id: projId });
1023
+ } catch (e) {
1024
+ return notFound(e instanceof Error ? e.message : String(e));
1025
+ }
1026
+ }
1027
+ }
1028
+ const projectPromptsMatch = path.match(/^\/api\/projects\/([^/]+)\/prompts$/);
1029
+ if (projectPromptsMatch && method === "GET") {
1030
+ const projId = projectPromptsMatch[1];
1031
+ const project = getProject(projId);
1032
+ if (!project)
1033
+ return notFound(`Project not found: ${projId}`);
1034
+ const limit = parseInt(url.searchParams.get("limit") ?? "100");
1035
+ const offset = parseInt(url.searchParams.get("offset") ?? "0");
1036
+ return json(listPrompts({ project_id: project.id, limit, offset }));
1037
+ }
867
1038
  if (path === "/health") {
868
1039
  return json({ status: "ok", port: PORT });
869
1040
  }
@@ -11,12 +11,24 @@ export interface Prompt {
11
11
  is_template: boolean;
12
12
  source: PromptSource;
13
13
  pinned: boolean;
14
+ next_prompt: string | null;
15
+ expires_at: string | null;
16
+ project_id: string | null;
14
17
  version: number;
15
18
  use_count: number;
16
19
  last_used_at: string | null;
17
20
  created_at: string;
18
21
  updated_at: string;
19
22
  }
23
+ export interface Project {
24
+ id: string;
25
+ name: string;
26
+ slug: string;
27
+ description: string | null;
28
+ path: string | null;
29
+ prompt_count: number;
30
+ created_at: string;
31
+ }
20
32
  export interface TemplateVariable {
21
33
  name: string;
22
34
  description?: string;
@@ -56,6 +68,7 @@ export interface CreatePromptInput {
56
68
  tags?: string[];
57
69
  source?: PromptSource;
58
70
  changed_by?: string;
71
+ project_id?: string | null;
59
72
  }
60
73
  export interface UpdatePromptInput {
61
74
  title?: string;
@@ -63,6 +76,7 @@ export interface UpdatePromptInput {
63
76
  description?: string;
64
77
  collection?: string;
65
78
  tags?: string[];
79
+ next_prompt?: string | null;
66
80
  changed_by?: string;
67
81
  }
68
82
  export interface ListPromptsFilter {
@@ -73,6 +87,7 @@ export interface ListPromptsFilter {
73
87
  q?: string;
74
88
  limit?: number;
75
89
  offset?: number;
90
+ project_id?: string | null;
76
91
  }
77
92
  export interface SearchResult {
78
93
  prompt: Prompt;
@@ -123,4 +138,7 @@ export declare class DuplicateSlugError extends Error {
123
138
  export declare class TemplateRenderError extends Error {
124
139
  constructor(message: string);
125
140
  }
141
+ export declare class ProjectNotFoundError extends Error {
142
+ constructor(id: string);
143
+ }
126
144
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/prompts",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Reusable prompt library for AI agents — CLI + MCP server + REST API + web dashboard",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",