@a-company/paradigm 3.18.0 → 3.19.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.
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  deleteLoreEntry,
4
4
  loadLoreEntry
5
- } from "./chunk-YHRRJM6J.js";
5
+ } from "./chunk-BRILIG7Z.js";
6
6
  import "./chunk-ZXMDA7VB.js";
7
7
 
8
8
  // src/commands/lore/delete.ts
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  loadLoreEntry,
4
4
  updateLoreEntry
5
- } from "./chunk-YHRRJM6J.js";
5
+ } from "./chunk-BRILIG7Z.js";
6
6
  import "./chunk-ZXMDA7VB.js";
7
7
 
8
8
  // src/commands/lore/edit.ts
package/dist/index.js CHANGED
@@ -620,36 +620,44 @@ triageCmd.option("-l, --limit <number>", "Maximum incidents to show", "10").opti
620
620
  await triageListCommand(options);
621
621
  });
622
622
  var loreCmd = program.command("lore").description("Project lore - timeline of everything that happened to this project");
623
- loreCmd.command("list").alias("ls").description("List recent lore entries").option("--author <author>", "Filter by author").option("--type <type>", "Filter by type: agent-session, human-note, decision, review, incident, milestone").option("--symbol <symbol>", "Filter by symbol").option("--tags <tags>", "Filter by tags (comma-separated)").option("--from <date>", "Filter from date (ISO format, e.g., 2026-02-20)").option("--to <date>", "Filter to date (ISO format)").option("-l, --limit <number>", "Number of entries", "20").option("--json", "Output as JSON").action(async (options) => {
624
- const { loreListCommand } = await import("./list-RHYZPKG3.js");
623
+ loreCmd.command("list").alias("ls").description("List recent lore entries").option("--author <author>", "Filter by author").option("--type <type>", "Filter by type: agent-session, human-note, decision, review, incident, milestone, retro, insight").option("--symbol <symbol>", "Filter by symbol").option("--tags <tags>", "Filter by tags (comma-separated)").option("--from <date>", "Filter from date (ISO format, e.g., 2026-02-20)").option("--to <date>", "Filter to date (ISO format)").option("-l, --limit <number>", "Number of entries", "20").option("--json", "Output as JSON").action(async (options) => {
624
+ const { loreListCommand } = await import("./list-CAL7KS7B.js");
625
625
  await loreListCommand(options);
626
626
  });
627
627
  loreCmd.command("show <id>").description("Show full detail for a lore entry").option("--json", "Output as JSON").action(async (id, options) => {
628
- const { loreShowCommand } = await import("./show-6CHTSR33.js");
628
+ const { loreShowCommand } = await import("./show-GEVVQWWG.js");
629
629
  await loreShowCommand(id, options);
630
630
  });
631
- loreCmd.command("record").description("Record a new lore entry (human note, milestone, etc.)").option("--type <type>", "Entry type: human-note, decision, milestone", "human-note").option("--author <author>", "Author name").option("--title <title>", "Entry title").option("--summary <summary>", "Entry summary").option("--symbols <symbols>", "Comma-separated symbols").option("--tags <tags>", "Comma-separated tags").option("--files-modified <files>", "Comma-separated files modified").option("--files-created <files>", "Comma-separated files created").option("--commit <hash>", "Git commit hash").option("--learnings <items>", "Comma-separated learnings").option("--duration <minutes>", "Duration in minutes").option("--meta <json>", `Project-defined metadata as JSON (e.g., '{"sprint": 12}')`).action(async (options) => {
632
- const { loreRecordCommand } = await import("./record-PGVYYZFU.js");
631
+ loreCmd.command("record").description("Record a new lore entry (human note, milestone, etc.)").option("--type <type>", "Entry type: human-note, decision, milestone, retro, insight", "human-note").option("--author <author>", "Author name").option("--title <title>", "Entry title").option("--summary <summary>", "Entry summary").option("--symbols <symbols>", "Comma-separated symbols").option("--tags <tags>", "Comma-separated tags").option("--files-modified <files>", "Comma-separated files modified").option("--files-created <files>", "Comma-separated files created").option("--commit <hash>", "Git commit hash").option("--learnings <items>", "Comma-separated learnings").option("--duration <minutes>", "Duration in minutes").option("--meta <json>", `Project-defined metadata as JSON (e.g., '{"sprint": 12}')`).option("--body <text>", "Long-form content (detailed notes, rationale, etc.)").option("--link-lore <ids>", "Comma-separated lore entry IDs to link").option("--link-commits <shas>", "Comma-separated git commit SHAs to link").action(async (options) => {
632
+ const { loreRecordCommand } = await import("./record-UGN75GTB.js");
633
633
  await loreRecordCommand(options);
634
634
  });
635
635
  loreCmd.command("review <id>").description("Add a review to a lore entry").option("--reviewer <name>", "Reviewer name").option("--completeness <n>", "Completeness score (1-5)", "3").option("--quality <n>", "Quality score (1-5)", "3").option("--notes <text>", "Review notes").action(async (id, options) => {
636
- const { loreReviewCommand } = await import("./review-BRY5R45L.js");
636
+ const { loreReviewCommand } = await import("./review-725ZKA7U.js");
637
637
  await loreReviewCommand(id, options);
638
638
  });
639
639
  loreCmd.command("edit <id>").description("Edit an existing lore entry").option("--title <title>", "New title").option("--summary <summary>", "New summary").option("--type <type>", "New type: agent-session, human-note, decision, review, incident, milestone").option("--symbols <symbols>", "Comma-separated symbols").option("--tags <tags>", "Comma-separated tags").option("--learnings <items>", "Comma-separated learnings").action(async (id, options) => {
640
- const { loreEditCommand } = await import("./edit-GJYLJYDU.js");
640
+ const { loreEditCommand } = await import("./edit-S7NZD7H7.js");
641
641
  await loreEditCommand(id, options);
642
642
  });
643
643
  loreCmd.command("delete <id>").description("Delete a lore entry").option("-y, --yes", "Skip confirmation").option("--dry-run", "Show what would be deleted without making changes").action(async (id, options) => {
644
- const { loreDeleteCommand } = await import("./delete-2PX6DDAY.js");
644
+ const { loreDeleteCommand } = await import("./delete-YTASL4SM.js");
645
645
  await loreDeleteCommand(id, options);
646
646
  });
647
+ loreCmd.command("migrate-assessments").description("Migrate assessment entries to lore with arc: tags").option("--dry-run", "Show what would be migrated without making changes").action(async (options) => {
648
+ const { loreMigrateAssessmentsCommand } = await import("./migrate-assessments-FPR6C35Z.js");
649
+ await loreMigrateAssessmentsCommand(options);
650
+ });
651
+ loreCmd.command("retag").description("Add or remove tags from matching lore entries").option("--add <tag>", "Tag to add").option("--remove <tag>", "Tag to remove").option("--type <type>", "Filter by entry type").option("--symbol <symbol>", "Filter by symbol").option("--author <author>", "Filter by author").option("--from <date>", "Filter from date").option("--to <date>", "Filter to date").option("--tags <tags>", "Filter by existing tags (comma-separated)").option("--dry-run", "Show what would change without making changes").action(async (options) => {
652
+ const { loreRetagCommand } = await import("./retag-URLJLMSK.js");
653
+ await loreRetagCommand(options);
654
+ });
647
655
  loreCmd.command("timeline").description("Show lore timeline grouped by date with hot symbols and authors").option("-l, --limit <number>", "Number of entries", "20").option("--json", "Output as JSON").action(async (options) => {
648
- const { loreTimelineCommand } = await import("./timeline-HC527YXE.js");
656
+ const { loreTimelineCommand } = await import("./timeline-B6TMGWRU.js");
649
657
  await loreTimelineCommand(options);
650
658
  });
651
659
  loreCmd.option("-p, --port <port>", "Port to run on", "3840").option("--no-open", "Don't open browser automatically").action(async (options) => {
652
- const { loreServeCommand } = await import("./serve-KBMKF4KG.js");
660
+ const { loreServeCommand } = await import("./serve-GUJ3L3IG.js");
653
661
  await loreServeCommand(void 0, options);
654
662
  });
655
663
  var habitsCmd = program.command("habits").description("Behavioral habits - practice tracking and compliance");
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  loadLoreEntries
4
- } from "./chunk-YHRRJM6J.js";
4
+ } from "./chunk-BRILIG7Z.js";
5
5
  import "./chunk-ZXMDA7VB.js";
6
6
 
7
7
  // src/commands/lore/list.ts
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ addLoreReview,
4
+ deleteLoreEntry,
5
+ loadLoreEntries,
6
+ loadLoreEntry,
7
+ loadLoreTimeline,
8
+ rebuildTimeline,
9
+ recordLoreEntry,
10
+ updateLoreEntry
11
+ } from "./chunk-3DYYXGDC.js";
12
+ export {
13
+ addLoreReview,
14
+ deleteLoreEntry,
15
+ loadLoreEntries,
16
+ loadLoreEntry,
17
+ loadLoreTimeline,
18
+ rebuildTimeline,
19
+ recordLoreEntry,
20
+ updateLoreEntry
21
+ };
@@ -70,7 +70,7 @@ function createLoreRouter(projectDir) {
70
70
  const router = Router();
71
71
  router.get("/", (req, res) => {
72
72
  let entries = loadAllEntries(projectDir);
73
- const { author, authorType, hasAgent, symbol, type, from, to, tags, hasReview, limit, offset } = req.query;
73
+ const { author, authorType, hasAgent, symbol, type, tag, from, to, tags, hasReview, hasBody, limit, offset } = req.query;
74
74
  if (author) {
75
75
  entries = entries.filter((e) => e.author === author);
76
76
  }
@@ -91,6 +91,17 @@ function createLoreRouter(projectDir) {
91
91
  if (type) {
92
92
  entries = entries.filter((e) => e.type === type);
93
93
  }
94
+ if (tag) {
95
+ const prefix = tag;
96
+ entries = entries.filter(
97
+ (e) => e.tags?.some((t) => t === prefix || t.startsWith(prefix + ":") || prefix.includes(":") && t === prefix)
98
+ );
99
+ }
100
+ if (hasBody === "true") {
101
+ entries = entries.filter((e) => e.body != null && e.body.length > 0);
102
+ } else if (hasBody === "false") {
103
+ entries = entries.filter((e) => !e.body || e.body.length === 0);
104
+ }
94
105
  if (from) {
95
106
  const fromDate = new Date(from).getTime();
96
107
  entries = entries.filter((e) => new Date(e.timestamp).getTime() >= fromDate);
@@ -146,6 +157,19 @@ function createLoreRouter(projectDir) {
146
157
  const symbols = Object.entries(symbolCounts).map(([symbol, count]) => ({ symbol, count })).sort((a, b) => b.count - a.count);
147
158
  res.json({ symbols });
148
159
  });
160
+ router.get("/tags", (_req, res) => {
161
+ const entries = loadAllEntries(projectDir);
162
+ const tagCounts = {};
163
+ for (const entry of entries) {
164
+ if (entry.tags) {
165
+ for (const tag of entry.tags) {
166
+ tagCounts[tag] = (tagCounts[tag] || 0) + 1;
167
+ }
168
+ }
169
+ }
170
+ const tags = Object.entries(tagCounts).map(([tag, count]) => ({ tag, count })).sort((a, b) => b.count - a.count);
171
+ res.json({ tags });
172
+ });
149
173
  router.get("/authors", (_req, res) => {
150
174
  const entries = loadAllEntries(projectDir);
151
175
  const authorMap = {};