@rashidee/co2 1.3.27 → 1.3.29

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 (70) hide show
  1. package/dist/.co2-dat/app.db +0 -0
  2. package/dist/.co2-dat/app.db-shm +0 -0
  3. package/dist/.co2-dat/app.db-wal +0 -0
  4. package/dist/index.js +80 -9
  5. package/package.json +2 -2
  6. package/plugin/.claude-plugin/plugin.json +22 -22
  7. package/plugin/skills/conductor-defect/SKILL.md +924 -905
  8. package/static/assets/{abnfDiagram-VRR7QNED-BqqVu83_.js → abnfDiagram-VRR7QNED-B1zOhOO1.js} +1 -1
  9. package/static/assets/{arc-D9zT1NvB.js → arc-B8GD8vjH.js} +1 -1
  10. package/static/assets/{architectureDiagram-ZJ3FMSHR-D-34OZne.js → architectureDiagram-ZJ3FMSHR-Dg86MCTB.js} +1 -1
  11. package/static/assets/{blockDiagram-677ZJIJ3-DzXrZXuu.js → blockDiagram-677ZJIJ3-CK3Tug1R.js} +1 -1
  12. package/static/assets/{c4Diagram-LMCZKHZV-CZWILWBU.js → c4Diagram-LMCZKHZV-qM1w9tnY.js} +1 -1
  13. package/static/assets/channel-Dnlq5moS.js +1 -0
  14. package/static/assets/{chunk-2Q5K7J3B-BnyVGcHp.js → chunk-2Q5K7J3B-isC3spex.js} +1 -1
  15. package/static/assets/{chunk-32BRIVSS-D6kWVoTq.js → chunk-32BRIVSS-BlKMW18Z.js} +1 -1
  16. package/static/assets/{chunk-5VM5RSS4-BDuQxGsi.js → chunk-5VM5RSS4-Dvcwsclh.js} +1 -1
  17. package/static/assets/{chunk-EX3LRPZG-CzemsC9C.js → chunk-EX3LRPZG-CxyFSCcZ.js} +1 -1
  18. package/static/assets/{chunk-JWPE2WC7-D9BTDnXt.js → chunk-JWPE2WC7-C1Gudu3M.js} +1 -1
  19. package/static/assets/{chunk-MOJQB5TN-DMVlpoSf.js → chunk-MOJQB5TN-CpZ6vY3L.js} +1 -1
  20. package/static/assets/{chunk-RYQCIY6F-Cr59tI34.js → chunk-RYQCIY6F-Bi7Lt98n.js} +1 -1
  21. package/static/assets/{chunk-V7JOEXUC-CItFH4TC.js → chunk-V7JOEXUC-ypRmRGpD.js} +1 -1
  22. package/static/assets/{chunk-VR4S4FIN-D-5bD2Rp.js → chunk-VR4S4FIN-CUmgHQ4J.js} +1 -1
  23. package/static/assets/{chunk-XXDRQBXY-BYTedp-b.js → chunk-XXDRQBXY-YKI0BxVa.js} +1 -1
  24. package/static/assets/classDiagram-OUVF2IWQ-CKr0oG9V.js +1 -0
  25. package/static/assets/classDiagram-v2-EOCWNBFH-CKr0oG9V.js +1 -0
  26. package/static/assets/{cose-bilkent-JH36ORCC-ph9z6Rag.js → cose-bilkent-JH36ORCC-Bvy5w26V.js} +1 -1
  27. package/static/assets/{cynefin-VYW2F7L2-DNym54iM.js → cynefin-VYW2F7L2-DmQsQ2TU.js} +1 -1
  28. package/static/assets/{cynefinDiagram-TSTJHNR4-BFhXROr4.js → cynefinDiagram-TSTJHNR4-D0-WC7kz.js} +1 -1
  29. package/static/assets/{dagre-VKFMJZFB-C8Bvbfep.js → dagre-VKFMJZFB-C1BlJBGv.js} +1 -1
  30. package/static/assets/{diagram-FQU43EPY-dou1k9fZ.js → diagram-FQU43EPY-Cg2hPqzw.js} +1 -1
  31. package/static/assets/{diagram-G47NLZAW-DTVkGSut.js → diagram-G47NLZAW-BP823BgP.js} +1 -1
  32. package/static/assets/{diagram-NH7WQ7WH-CLF_alfd.js → diagram-NH7WQ7WH-C_Zqnx2Q.js} +1 -1
  33. package/static/assets/{diagram-OA4YK3LP-CVQqfvRy.js → diagram-OA4YK3LP-V607Kbpj.js} +1 -1
  34. package/static/assets/{diagram-WEI45ONY-X6ugzDOD.js → diagram-WEI45ONY-DxUG6r0f.js} +1 -1
  35. package/static/assets/{ebnfDiagram-CCIWWBDH-PgskU8v_.js → ebnfDiagram-CCIWWBDH-Ba30Z15f.js} +1 -1
  36. package/static/assets/{erDiagram-Q63AITRT-CBW5aC2C.js → erDiagram-Q63AITRT-D6FLaEED.js} +1 -1
  37. package/static/assets/{flowDiagram-23GEKE2U-BbyDOz5x.js → flowDiagram-23GEKE2U-C-d7PYEe.js} +1 -1
  38. package/static/assets/{ganttDiagram-NO4QXBWP-CceMROcR.js → ganttDiagram-NO4QXBWP-Ba6Uwkik.js} +1 -1
  39. package/static/assets/{gitGraphDiagram-IHSO6WYX-t2R0tkUO.js → gitGraphDiagram-IHSO6WYX-ZAJbW3RO.js} +1 -1
  40. package/static/assets/{index-BM5AGe_l.css → index-DPxMV4aU.css} +1 -1
  41. package/static/assets/index-DU7Xwr-g.js +496 -0
  42. package/static/assets/{infoDiagram-FWYZ7A6U-Du1gMFcI.js → infoDiagram-FWYZ7A6U-BFfhZFvq.js} +1 -1
  43. package/static/assets/{ishikawaDiagram-FXEZZL3T-VAYbdalo.js → ishikawaDiagram-FXEZZL3T-IIK9GJIX.js} +1 -1
  44. package/static/assets/{journeyDiagram-5HDEW3XC-DkLYEpM2.js → journeyDiagram-5HDEW3XC-DREaqROi.js} +1 -1
  45. package/static/assets/{kanban-definition-HUTT4EX6-BCzd09tX.js → kanban-definition-HUTT4EX6-XQ87DJka.js} +1 -1
  46. package/static/assets/{linear-Dm0uNoIF.js → linear-BRptxfMg.js} +1 -1
  47. package/static/assets/{mindmap-definition-LN4V7U3C-D69_xTUO.js → mindmap-definition-LN4V7U3C-zx0hP0Si.js} +1 -1
  48. package/static/assets/{pegDiagram-2B236MQR-D6t8-mr5.js → pegDiagram-2B236MQR-BkKjcF1V.js} +1 -1
  49. package/static/assets/{pieDiagram-ENE6RG2P-CRhMSL7L.js → pieDiagram-ENE6RG2P-BlrcgJsf.js} +1 -1
  50. package/static/assets/{quadrantDiagram-ABIIQ3AL-DLSgxv-x.js → quadrantDiagram-ABIIQ3AL-BY6Q-v3j.js} +1 -1
  51. package/static/assets/{railroadDiagram-RFXS5EU6-b1SreCxV.js → railroadDiagram-RFXS5EU6-Dd0Y_o2f.js} +1 -1
  52. package/static/assets/{requirementDiagram-TGXJPOKE-BV4CNLIo.js → requirementDiagram-TGXJPOKE-DnkNRD4q.js} +1 -1
  53. package/static/assets/{sankeyDiagram-HTMAVEWB-BiFv1ux8.js → sankeyDiagram-HTMAVEWB-DIEbMauU.js} +1 -1
  54. package/static/assets/{sequenceDiagram-DBY2YBRQ-Dx4t2iJL.js → sequenceDiagram-DBY2YBRQ-DrSyx6Hq.js} +1 -1
  55. package/static/assets/{sizeCapture-X5ZJPWSS-CnQy7abz.js → sizeCapture-X5ZJPWSS-BHRK6fVR.js} +1 -1
  56. package/static/assets/{stateDiagram-2N3HPSRC-Dydsj0oL.js → stateDiagram-2N3HPSRC-p36VYpET.js} +1 -1
  57. package/static/assets/stateDiagram-v2-6OUMAXLB-CHODjKhh.js +1 -0
  58. package/static/assets/{swimlanes-5IMT3BWC-CxCwYCDy.js → swimlanes-5IMT3BWC-B27NzwNn.js} +2 -2
  59. package/static/assets/swimlanesDiagram-G3AALYLV-DZEtOcuy.js +8 -0
  60. package/static/assets/{timeline-definition-FHXFAJF6-C_Fi6bNQ.js → timeline-definition-FHXFAJF6-BBkuwSpt.js} +1 -1
  61. package/static/assets/{vennDiagram-L72KCM5P-CgwC5qPZ.js → vennDiagram-L72KCM5P-BkqY7uCt.js} +1 -1
  62. package/static/assets/{wardleyDiagram-EHGQE667-s9kPgnSC.js → wardleyDiagram-EHGQE667-BhekO6RT.js} +1 -1
  63. package/static/assets/{xychartDiagram-FW5EYKEG-DBDMMVMd.js → xychartDiagram-FW5EYKEG-Dsyggs2D.js} +1 -1
  64. package/static/index.html +2 -2
  65. package/static/assets/channel-DKYjk4Z0.js +0 -1
  66. package/static/assets/classDiagram-OUVF2IWQ-BypGwdom.js +0 -1
  67. package/static/assets/classDiagram-v2-EOCWNBFH-BypGwdom.js +0 -1
  68. package/static/assets/index-C26387Mq.js +0 -496
  69. package/static/assets/stateDiagram-v2-6OUMAXLB-C8SPn3Oh.js +0 -1
  70. package/static/assets/swimlanesDiagram-G3AALYLV-74ote7Bb.js +0 -8
Binary file
Binary file
Binary file
package/dist/index.js CHANGED
@@ -6809,8 +6809,8 @@ var {
6809
6809
  // package.json
6810
6810
  var package_default = {
6811
6811
  name: "@rashidee/co2",
6812
- version: "1.3.27",
6813
- description: "Compound Context Studio \xC3\xA2\xE2\u201A\xAC\xE2\u20AC\x9D self-hosted team context authoring for CO2 projects",
6812
+ version: "1.3.28",
6813
+ description: "Compound Context Studio \xC3\u0192\xC2\xA2\xC3\xA2\xE2\u20AC\u0161\xC2\xAC\xC3\xA2\xE2\u201A\xAC\xC2\x9D self-hosted team context authoring for CO2 projects",
6814
6814
  type: "module",
6815
6815
  license: "MIT",
6816
6816
  publishConfig: {
@@ -12320,8 +12320,10 @@ var bugReports = sqliteTable("bug_reports", {
12320
12320
  title: text("title").notNull(),
12321
12321
  description: text("description"),
12322
12322
  // [v1.5.1] severity dropped — the CO2 BUG.md standard carries no severity level.
12323
+ // 'rejected' — withdrawn report, superseded by a new one (type-level only; the column has
12324
+ // no CHECK constraint, so no migration is needed).
12323
12325
  status: text("status", {
12324
- enum: ["open", "in_fix", "fixed", "verified", "closed"]
12326
+ enum: ["open", "in_fix", "fixed", "verified", "closed", "rejected"]
12325
12327
  }).notNull().default("open"),
12326
12328
  // [v1.8.0] CO2 BUG.md is grouped by module — the module name verbatim from the CLAUDE.md
12327
12329
  // registry / imported BUG.md section (migration 0014 ALTER ADD). NULL → `# Common Module`.
@@ -19567,7 +19569,7 @@ var dashboardProjectSchema = external_exports.object({
19567
19569
  });
19568
19570
 
19569
19571
  // ../core/src/schemas/defect.ts
19570
- var bugStatusSchema = external_exports.enum(["open", "in_fix", "fixed", "verified", "closed"]);
19572
+ var bugStatusSchema = external_exports.enum(["open", "in_fix", "fixed", "verified", "closed", "rejected"]);
19571
19573
  var EDITABLE_BUG_STATUSES = ["open", "in_fix"];
19572
19574
  var REOPENABLE_BUG_STATUSES = ["open", "in_fix", "fixed"];
19573
19575
  var reopenBugsSchema = external_exports.object({
@@ -20975,6 +20977,18 @@ function getFacet(db, moduleId, prdVersionId, facet) {
20975
20977
  ).limit(1).get();
20976
20978
  return row ? stripVersionTags(row.content) : "";
20977
20979
  }
20980
+ function getFacetHistory(db, projectId, moduleId, facet) {
20981
+ const mod = db.select({ projectId: applications.projectId }).from(projectModules).innerJoin(applications, eq(applications.id, projectModules.applicationId)).where(eq(projectModules.id, moduleId)).limit(1).get();
20982
+ if (!mod || mod.projectId !== projectId) throw svcError3("MODULE_NOT_FOUND", 404);
20983
+ const versions = db.select({ id: prdVersions.id, semver: prdVersions.semver, isCurrent: prdVersions.isCurrent }).from(prdVersions).where(eq(prdVersions.projectId, projectId)).all();
20984
+ const rows = db.select({ prdVersionId: prdRequirements.prdVersionId, content: prdRequirements.content }).from(prdRequirements).where(and(eq(prdRequirements.moduleId, moduleId), eq(prdRequirements.facet, facet))).all();
20985
+ const contentByVersion = new Map(rows.map((r) => [r.prdVersionId, r.content]));
20986
+ return versions.filter((v) => !v.isCurrent).map((v) => ({
20987
+ versionId: v.id,
20988
+ semver: v.semver,
20989
+ content: stripVersionTags(contentByVersion.get(v.id) ?? "")
20990
+ })).filter((entry) => entry.content !== "").sort((a, b) => compareSemver(b.semver, a.semver));
20991
+ }
20978
20992
  function getSection(db, applicationId, sectionType) {
20979
20993
  const row = db.select({ content: prdSections.content }).from(prdSections).where(
20980
20994
  and(eq(prdSections.applicationId, applicationId), eq(prdSections.sectionType, sectionType))
@@ -24170,6 +24184,19 @@ function contextRoutes(db, workspacePath) {
24170
24184
  }
24171
24185
  return c.json({ content });
24172
24186
  });
24187
+ app.get("/:projectId/modules/:moduleId/facets/:facet/history", (c) => {
24188
+ const projectId = Number(c.req.param("projectId"));
24189
+ const moduleId = Number(c.req.param("moduleId"));
24190
+ const facetParse = facetSchema.safeParse(c.req.param("facet"));
24191
+ if (Number.isNaN(projectId) || Number.isNaN(moduleId) || !facetParse.success) {
24192
+ return c.json({ code: "INVALID_ID" }, 400);
24193
+ }
24194
+ try {
24195
+ return c.json({ entries: getFacetHistory(db, projectId, moduleId, facetParse.data) });
24196
+ } catch (e) {
24197
+ return errorResponse4(c, e);
24198
+ }
24199
+ });
24173
24200
  app.patch(
24174
24201
  "/:projectId/modules/:moduleId/facets/:facet",
24175
24202
  zValidator("json", upsertFacetSchema),
@@ -24579,10 +24606,18 @@ function updateBugReport(db, workspacePath, bugId, input) {
24579
24606
  syncBugMdToDisk(db, workspacePath, existing.applicationId, bugId);
24580
24607
  }
24581
24608
  function updateBugStatus(db, workspacePath, bugId, status) {
24582
- const existing = db.select({ id: bugReports.id, applicationId: bugReports.applicationId }).from(bugReports).where(and(eq(bugReports.id, bugId), eq(bugReports.isDeleted, 0))).get();
24609
+ const existing = db.select({
24610
+ id: bugReports.id,
24611
+ title: bugReports.title,
24612
+ applicationId: bugReports.applicationId
24613
+ }).from(bugReports).where(and(eq(bugReports.id, bugId), eq(bugReports.isDeleted, 0))).get();
24583
24614
  if (!existing) throw svcError11("BUG_NOT_FOUND", 404);
24584
24615
  db.update(bugReports).set({ status, updatedAt: (/* @__PURE__ */ new Date()).toISOString() }).where(eq(bugReports.id, bugId)).run();
24585
- syncBugMdToDisk(db, workspacePath, existing.applicationId, bugId);
24616
+ if (status === "rejected") {
24617
+ removeBugBulletFromDisk(db, workspacePath, existing.applicationId, existing);
24618
+ } else {
24619
+ syncBugMdToDisk(db, workspacePath, existing.applicationId, bugId);
24620
+ }
24586
24621
  }
24587
24622
  function moveBugReport(db, workspacePath, bugId, input) {
24588
24623
  const existing = db.select().from(bugReports).where(and(eq(bugReports.id, bugId), eq(bugReports.isDeleted, 0))).get();
@@ -24838,7 +24873,13 @@ function mergeBugIntoBugMd(content, bug, semver, moduleCategory, mode) {
24838
24873
  return bom + lines.join(eol);
24839
24874
  }
24840
24875
  function writeBugMdFile(db, workspacePath, app, projectFolderName) {
24841
- const bugs = db.select().from(bugReports).where(and(eq(bugReports.applicationId, app.id), eq(bugReports.isDeleted, 0))).all();
24876
+ const bugs = db.select().from(bugReports).where(
24877
+ and(
24878
+ eq(bugReports.applicationId, app.id),
24879
+ eq(bugReports.isDeleted, 0),
24880
+ ne(bugReports.status, "rejected")
24881
+ )
24882
+ ).all();
24842
24883
  const modules = db.select({ name: projectModules.name, category: projectModules.category }).from(projectModules).where(and(eq(projectModules.applicationId, app.id), eq(projectModules.isDeleted, 0))).orderBy(projectModules.displayOrder, projectModules.id).all();
24843
24884
  const semverByVersionId = new Map(
24844
24885
  db.select({ id: prdVersions.id, semver: prdVersions.semver }).from(prdVersions).where(eq(prdVersions.projectId, app.projectId)).all().map((v) => [v.id, v.semver])
@@ -24864,7 +24905,8 @@ function syncBugStatusesFromMaster(db, trackingFilePath, applicationId) {
24864
24905
  let updated = 0;
24865
24906
  const now = (/* @__PURE__ */ new Date()).toISOString();
24866
24907
  for (const row of rows) {
24867
- if (row.status === "verified" || row.status === "closed") continue;
24908
+ if (row.status === "verified" || row.status === "closed" || row.status === "rejected")
24909
+ continue;
24868
24910
  const entry = entries.get(bugCodeAndTitle(row).code);
24869
24911
  if (!entry) continue;
24870
24912
  const next = mapBugStatus(entry.status);
@@ -26683,6 +26725,32 @@ function rescanProjectWorkflows(db, workspacePath, projectId, user, watcherInter
26683
26725
  const currentVersionId = ensureBaselineVersion(db, projectId, user.id);
26684
26726
  const semver = db.select({ semver: prdVersions.semver }).from(prdVersions).where(eq(prdVersions.id, currentVersionId)).get()?.semver ?? null;
26685
26727
  const affectedForCurrentVersion = getVersionAffectedAppIds(db, projectId, currentVersionId);
26728
+ const bugAppsForCurrentVersion = getAppsWithBugsInVersion(db, projectId, currentVersionId);
26729
+ let prunedRuns = 0;
26730
+ const bugAppsByVersion = /* @__PURE__ */ new Map([
26731
+ [currentVersionId, bugAppsForCurrentVersion]
26732
+ ]);
26733
+ const discoveredQualityRows = db.select({ run: conductorRuns, wfmId: workflowMarkdowns.id, filePath: workflowMarkdowns.filePath }).from(conductorRuns).innerJoin(workflowMarkdowns, eq(workflowMarkdowns.id, conductorRuns.workflowMarkdownId)).where(
26734
+ and(
26735
+ eq(conductorRuns.projectId, projectId),
26736
+ inArray(conductorRuns.conductorType, ["quality", "defect"])
26737
+ )
26738
+ ).all();
26739
+ for (const { run, wfmId, filePath } of discoveredQualityRows) {
26740
+ if (!filePath.endsWith("BUG_MASTER.md")) continue;
26741
+ const versionId = run.prdVersionId ?? currentVersionId;
26742
+ let bugApps = bugAppsByVersion.get(versionId);
26743
+ if (!bugApps) {
26744
+ bugApps = getAppsWithBugsInVersion(db, projectId, versionId);
26745
+ bugAppsByVersion.set(versionId, bugApps);
26746
+ }
26747
+ if (bugApps.has(run.applicationId)) continue;
26748
+ stopWatcher(run.id);
26749
+ db.delete(conductorRuns).where(eq(conductorRuns.id, run.id)).run();
26750
+ const remaining = db.select({ id: conductorRuns.id }).from(conductorRuns).where(eq(conductorRuns.workflowMarkdownId, wfmId)).limit(1).get();
26751
+ if (!remaining) db.delete(workflowMarkdowns).where(eq(workflowMarkdowns.id, wfmId)).run();
26752
+ prunedRuns++;
26753
+ }
26686
26754
  let discoveredRuns = 0;
26687
26755
  const now = (/* @__PURE__ */ new Date()).toISOString();
26688
26756
  for (const app of apps) {
@@ -26693,6 +26761,9 @@ function rescanProjectWorkflows(db, workspacePath, projectId, user, watcherInter
26693
26761
  if ((conductorType === "prepare" || conductorType === "develop") && affectedForCurrentVersion !== null && !affectedForCurrentVersion.has(app.id)) {
26694
26762
  continue;
26695
26763
  }
26764
+ if (conductorType === "quality" && !bugAppsForCurrentVersion.has(app.id)) {
26765
+ continue;
26766
+ }
26696
26767
  const aliases = conductorType === "quality" ? ["quality", "defect"] : [conductorType];
26697
26768
  const known = db.select({
26698
26769
  status: conductorRuns.status,
@@ -26786,7 +26857,7 @@ function rescanProjectWorkflows(db, workspacePath, projectId, user, watcherInter
26786
26857
  }
26787
26858
  }
26788
26859
  }
26789
- return { rescannedRuns, discoveredRuns };
26860
+ return { rescannedRuns, discoveredRuns, prunedRuns };
26790
26861
  }
26791
26862
  function getWorkflowRun(db, workflowMarkdownId, workspacePath) {
26792
26863
  const wfm = db.select().from(workflowMarkdowns).where(eq(workflowMarkdowns.id, workflowMarkdownId)).get();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rashidee/co2",
3
- "version": "1.3.27",
4
- "description": "Compound Context Studio — self-hosted team context authoring for CO2 projects",
3
+ "version": "1.3.29",
4
+ "description": "Compound Context Studio — self-hosted team context authoring for CO2 projects",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "publishConfig": {
@@ -1,22 +1,22 @@
1
- {
2
- "name": "co2-skills",
3
- "version": "1.8.4",
4
- "description": "Compound Context Skills an opinionated context engineering methodology for AI-driven software development. Generates data models, HTML mockups, technical specifications, test specifications, and orchestrates full-stack development from Agile user stories.",
5
- "author": {
6
- "name": "Rashidee M.Rashid"
7
- },
8
- "repository": "https://github.com/rashidee/co2-skills",
9
- "license": "MIT",
10
- "keywords": [
11
- "context-engineering",
12
- "user-stories",
13
- "code-generation",
14
- "ddd",
15
- "spring-boot",
16
- "laravel",
17
- "playwright",
18
- "mockups",
19
- "specifications",
20
- "data-modeling"
21
- ]
22
- }
1
+ {
2
+ "name": "co2-skills",
3
+ "version": "1.8.5",
4
+ "description": "Compound Context Skills — an opinionated context engineering methodology for AI-driven software development. Generates data models, HTML mockups, technical specifications, test specifications, and orchestrates full-stack development from Agile user stories.",
5
+ "author": {
6
+ "name": "Rashidee M.Rashid"
7
+ },
8
+ "repository": "https://github.com/rashidee/co2-skills",
9
+ "license": "MIT",
10
+ "keywords": [
11
+ "context-engineering",
12
+ "user-stories",
13
+ "code-generation",
14
+ "ddd",
15
+ "spring-boot",
16
+ "laravel",
17
+ "playwright",
18
+ "mockups",
19
+ "specifications",
20
+ "data-modeling"
21
+ ]
22
+ }