@langadventurellc/task-trellis-mcp 2.3.0 → 2.5.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.
Files changed (117) hide show
  1. package/dist/http/__tests__/editCreateHandlers.test.js +2 -2
  2. package/dist/http/__tests__/editCreateHandlers.test.js.map +1 -1
  3. package/dist/http/__tests__/fileHandler.test.d.ts +2 -0
  4. package/dist/http/__tests__/fileHandler.test.d.ts.map +1 -0
  5. package/dist/http/__tests__/fileHandler.test.js +83 -0
  6. package/dist/http/__tests__/fileHandler.test.js.map +1 -0
  7. package/dist/http/__tests__/projectTreePage.test.js +3 -0
  8. package/dist/http/__tests__/projectTreePage.test.js.map +1 -1
  9. package/dist/http/index.d.ts.map +1 -1
  10. package/dist/http/index.js +1 -0
  11. package/dist/http/index.js.map +1 -1
  12. package/dist/http/projectTreePage/__tests__/renderDetailView.test.d.ts +2 -0
  13. package/dist/http/projectTreePage/__tests__/renderDetailView.test.d.ts.map +1 -0
  14. package/dist/http/projectTreePage/__tests__/renderDetailView.test.js +58 -0
  15. package/dist/http/projectTreePage/__tests__/renderDetailView.test.js.map +1 -0
  16. package/dist/http/projectTreePage/__tests__/renderEditForm.test.d.ts +2 -0
  17. package/dist/http/projectTreePage/__tests__/renderEditForm.test.d.ts.map +1 -0
  18. package/dist/http/projectTreePage/__tests__/renderEditForm.test.js +27 -0
  19. package/dist/http/projectTreePage/__tests__/renderEditForm.test.js.map +1 -0
  20. package/dist/http/projectTreePage/__tests__/renderMarkdown.test.d.ts +2 -0
  21. package/dist/http/projectTreePage/__tests__/renderMarkdown.test.d.ts.map +1 -0
  22. package/dist/http/projectTreePage/__tests__/renderMarkdown.test.js +49 -0
  23. package/dist/http/projectTreePage/__tests__/renderMarkdown.test.js.map +1 -0
  24. package/dist/http/projectTreePage/createTopSubmitHandler.d.ts.map +1 -1
  25. package/dist/http/projectTreePage/createTopSubmitHandler.js +13 -3
  26. package/dist/http/projectTreePage/createTopSubmitHandler.js.map +1 -1
  27. package/dist/http/projectTreePage/detailViewHandler.d.ts.map +1 -1
  28. package/dist/http/projectTreePage/detailViewHandler.js +5 -2
  29. package/dist/http/projectTreePage/detailViewHandler.js.map +1 -1
  30. package/dist/http/projectTreePage/editFormHandler.d.ts.map +1 -1
  31. package/dist/http/projectTreePage/editFormHandler.js +2 -0
  32. package/dist/http/projectTreePage/editFormHandler.js.map +1 -1
  33. package/dist/http/projectTreePage/editSubmitHandler.d.ts.map +1 -1
  34. package/dist/http/projectTreePage/editSubmitHandler.js +5 -2
  35. package/dist/http/projectTreePage/editSubmitHandler.js.map +1 -1
  36. package/dist/http/projectTreePage/fileHandler.d.ts +4 -0
  37. package/dist/http/projectTreePage/fileHandler.d.ts.map +1 -0
  38. package/dist/http/projectTreePage/fileHandler.js +48 -0
  39. package/dist/http/projectTreePage/fileHandler.js.map +1 -0
  40. package/dist/http/projectTreePage/index.d.ts +1 -0
  41. package/dist/http/projectTreePage/index.d.ts.map +1 -1
  42. package/dist/http/projectTreePage/index.js +3 -1
  43. package/dist/http/projectTreePage/index.js.map +1 -1
  44. package/dist/http/projectTreePage/renderCreateTopForm.d.ts +1 -0
  45. package/dist/http/projectTreePage/renderCreateTopForm.d.ts.map +1 -1
  46. package/dist/http/projectTreePage/renderCreateTopForm.js +5 -0
  47. package/dist/http/projectTreePage/renderCreateTopForm.js.map +1 -1
  48. package/dist/http/projectTreePage/renderDetailView.d.ts +1 -1
  49. package/dist/http/projectTreePage/renderDetailView.d.ts.map +1 -1
  50. package/dist/http/projectTreePage/renderDetailView.js +29 -3
  51. package/dist/http/projectTreePage/renderDetailView.js.map +1 -1
  52. package/dist/http/projectTreePage/renderEditForm.d.ts +2 -0
  53. package/dist/http/projectTreePage/renderEditForm.d.ts.map +1 -1
  54. package/dist/http/projectTreePage/renderEditForm.js +8 -0
  55. package/dist/http/projectTreePage/renderEditForm.js.map +1 -1
  56. package/dist/http/projectTreePage/renderMarkdown.d.ts +2 -0
  57. package/dist/http/projectTreePage/renderMarkdown.d.ts.map +1 -0
  58. package/dist/http/projectTreePage/renderMarkdown.js +18 -0
  59. package/dist/http/projectTreePage/renderMarkdown.js.map +1 -0
  60. package/dist/http/styles.css +175 -0
  61. package/dist/models/TrellisObject.d.ts +1 -0
  62. package/dist/models/TrellisObject.d.ts.map +1 -1
  63. package/dist/models/TrellisObjectSummary.d.ts +1 -0
  64. package/dist/models/TrellisObjectSummary.d.ts.map +1 -1
  65. package/dist/repositories/local/LocalRepository.d.ts +1 -0
  66. package/dist/repositories/local/LocalRepository.d.ts.map +1 -1
  67. package/dist/repositories/local/LocalRepository.js +9 -0
  68. package/dist/repositories/local/LocalRepository.js.map +1 -1
  69. package/dist/services/TaskTrellisService.d.ts +2 -2
  70. package/dist/services/TaskTrellisService.d.ts.map +1 -1
  71. package/dist/services/local/LocalTaskTrellisService.d.ts +2 -2
  72. package/dist/services/local/LocalTaskTrellisService.d.ts.map +1 -1
  73. package/dist/services/local/LocalTaskTrellisService.js +4 -4
  74. package/dist/services/local/LocalTaskTrellisService.js.map +1 -1
  75. package/dist/services/local/__tests__/createObject.test.js +20 -0
  76. package/dist/services/local/__tests__/createObject.test.js.map +1 -1
  77. package/dist/services/local/__tests__/listObjects.test.js +16 -0
  78. package/dist/services/local/__tests__/listObjects.test.js.map +1 -1
  79. package/dist/services/local/__tests__/updateObject.test.js +46 -0
  80. package/dist/services/local/__tests__/updateObject.test.js.map +1 -1
  81. package/dist/services/local/createObject.d.ts +1 -1
  82. package/dist/services/local/createObject.d.ts.map +1 -1
  83. package/dist/services/local/createObject.js +14 -9
  84. package/dist/services/local/createObject.js.map +1 -1
  85. package/dist/services/local/listObjects.d.ts.map +1 -1
  86. package/dist/services/local/listObjects.js +1 -0
  87. package/dist/services/local/listObjects.js.map +1 -1
  88. package/dist/services/local/updateObject.d.ts +1 -1
  89. package/dist/services/local/updateObject.d.ts.map +1 -1
  90. package/dist/services/local/updateObject.js +20 -9
  91. package/dist/services/local/updateObject.js.map +1 -1
  92. package/dist/tools/__tests__/createObjectTool.test.js +8 -8
  93. package/dist/tools/__tests__/createObjectTool.test.js.map +1 -1
  94. package/dist/tools/__tests__/updateObjectTool.test.js +6 -6
  95. package/dist/tools/__tests__/updateObjectTool.test.js.map +1 -1
  96. package/dist/tools/createObjectTool.d.ts +5 -1
  97. package/dist/tools/createObjectTool.d.ts.map +1 -1
  98. package/dist/tools/createObjectTool.js +9 -3
  99. package/dist/tools/createObjectTool.js.map +1 -1
  100. package/dist/tools/listObjectsTool.d.ts +1 -1
  101. package/dist/tools/listObjectsTool.js +1 -1
  102. package/dist/tools/listObjectsTool.js.map +1 -1
  103. package/dist/tools/updateObjectTool.d.ts +5 -1
  104. package/dist/tools/updateObjectTool.d.ts.map +1 -1
  105. package/dist/tools/updateObjectTool.js +7 -2
  106. package/dist/tools/updateObjectTool.js.map +1 -1
  107. package/dist/utils/__tests__/deserializeTrellisObject.test.js +40 -0
  108. package/dist/utils/__tests__/deserializeTrellisObject.test.js.map +1 -1
  109. package/dist/utils/__tests__/serializeTrellisObject.test.js +45 -0
  110. package/dist/utils/__tests__/serializeTrellisObject.test.js.map +1 -1
  111. package/dist/utils/deserializeTrellisObject.d.ts.map +1 -1
  112. package/dist/utils/deserializeTrellisObject.js +3 -0
  113. package/dist/utils/deserializeTrellisObject.js.map +1 -1
  114. package/dist/utils/serializeTrellisObject.d.ts.map +1 -1
  115. package/dist/utils/serializeTrellisObject.js +3 -0
  116. package/dist/utils/serializeTrellisObject.js.map +1 -1
  117. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"detailViewHandler.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/detailViewHandler.ts"],"names":[],"mappings":";;AAMA,8CAkBC;AAvBD,8CAA2C;AAC3C,yCAAsC;AACtC,yDAAsD;AAEtD,mFAAmF;AAC5E,KAAK,UAAU,iBAAiB,CACrC,IAAqB,EACrB,GAAmB,EACnB,MAA8B;IAE9B,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAEzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,GAAG,CAAC,sBAAsB,IAAA,uBAAU,EAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACpD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,GAAG,CAAC,MAAM,IAAA,mCAAgB,EAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"detailViewHandler.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/detailViewHandler.ts"],"names":[],"mappings":";;AAMA,8CAqBC;AA1BD,8CAA2C;AAC3C,yCAAsC;AACtC,yDAAsD;AAEtD,mFAAmF;AAC5E,KAAK,UAAU,iBAAiB,CACrC,IAAqB,EACrB,GAAmB,EACnB,MAA8B;IAE9B,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAEzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,GAAG,CAAC,sBAAsB,IAAA,uBAAU,EAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QACzB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;KAC/B,CAAC,CAAC;IACH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,GAAG,CAAC,MAAM,IAAA,mCAAgB,EAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AACzE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"editFormHandler.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/editFormHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKjE,wFAAwF;AACxF,wBAAsB,eAAe,CACnC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAqBf"}
1
+ {"version":3,"file":"editFormHandler.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/editFormHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKjE,wFAAwF;AACxF,wBAAsB,eAAe,CACnC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -21,6 +21,8 @@ async function editFormHandler(_req, res, params) {
21
21
  priority: obj.priority,
22
22
  body: obj.body,
23
23
  prerequisites: obj.prerequisites.join(", "),
24
+ externalIssueId: obj.externalIssueId,
25
+ isTopLevel: obj.parent === null,
24
26
  }));
25
27
  }
26
28
  //# sourceMappingURL=editFormHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"editFormHandler.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/editFormHandler.ts"],"names":[],"mappings":";;AAMA,0CAyBC;AA9BD,8CAA2C;AAC3C,yCAAsC;AACtC,qDAAkD;AAElD,wFAAwF;AACjF,KAAK,UAAU,eAAe,CACnC,IAAqB,EACrB,GAAmB,EACnB,MAA8B;IAE9B,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAEzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,GAAG,CAAC,sBAAsB,IAAA,uBAAU,EAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,GAAG,CACL,IAAA,+BAAc,EAAC,GAAG,EAAE,EAAE,EAAE;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,aAAa,EAAE,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;KAC5C,CAAC,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"editFormHandler.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/editFormHandler.ts"],"names":[],"mappings":";;AAMA,0CA2BC;AAhCD,8CAA2C;AAC3C,yCAAsC;AACtC,qDAAkD;AAElD,wFAAwF;AACjF,KAAK,UAAU,eAAe,CACnC,IAAqB,EACrB,GAAmB,EACnB,MAA8B;IAE9B,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAEzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,GAAG,CAAC,sBAAsB,IAAA,uBAAU,EAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,GAAG,CACL,IAAA,+BAAc,EAAC,GAAG,EAAE,EAAE,EAAE;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,aAAa,EAAE,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,UAAU,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI;KAChC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"editSubmitHandler.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/editSubmitHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA0BjE,oFAAoF;AACpF,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CA6Df"}
1
+ {"version":3,"file":"editSubmitHandler.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/editSubmitHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA2BjE,oFAAoF;AACpF,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAuEf"}
@@ -17,6 +17,7 @@ function parseEditFields(form, obj) {
17
17
  body: form.get("body") ?? "",
18
18
  prereqsRaw: form.get("prerequisites") ?? "",
19
19
  logEntry: form.get("log_entry") ?? "",
20
+ externalIssueId: form.get("externalIssueId") ?? undefined,
20
21
  };
21
22
  }
22
23
  /** Handles PUT /projects/:key/issues/:id — validates prereqs and saves the edit. */
@@ -30,7 +31,7 @@ async function editSubmitHandler(req, res, params) {
30
31
  return;
31
32
  }
32
33
  const form = await (0, readFormBody_1.readFormBody)(req);
33
- const { title, status, priority, body, prereqsRaw, logEntry } = parseEditFields(form, obj);
34
+ const { title, status, priority, body, prereqsRaw, logEntry, externalIssueId, } = parseEditFields(form, obj);
34
35
  const prereqs = (0, parsePrereqs_1.parsePrereqs)(prereqsRaw);
35
36
  for (const prereqId of prereqs) {
36
37
  const found = await repo.getObjectById(prereqId);
@@ -43,11 +44,13 @@ async function editSubmitHandler(req, res, params) {
43
44
  body,
44
45
  prerequisites: prereqsRaw,
45
46
  log_entry: logEntry,
47
+ externalIssueId,
48
+ isTopLevel: obj.parent === null,
46
49
  }, `Unknown prerequisite ID: ${(0, escapeHtml_1.escapeHtml)(prereqId)}`));
47
50
  return;
48
51
  }
49
52
  }
50
- await (0, updateObject_1.updateObject)(repo, makeRepo_1.SERVER_CONFIG, id, title, priority, prereqs, body, status, true);
53
+ await (0, updateObject_1.updateObject)(repo, makeRepo_1.SERVER_CONFIG, id, title, priority, prereqs, body, status, true, externalIssueId);
51
54
  if (logEntry.trim()) {
52
55
  await (0, appendObjectLog_1.appendObjectLog)(repo, id, logEntry.trim());
53
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"editSubmitHandler.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/editSubmitHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editSubmitHandler.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/editSubmitHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ /** Handles GET /projects/:key/issues/:id/file — streams the raw issue markdown file. */
3
+ export declare function fileHandler(_req: IncomingMessage, res: ServerResponse, params: Record<string, string>): Promise<void>;
4
+ //# sourceMappingURL=fileHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileHandler.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/fileHandler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAUjE,wFAAwF;AACxF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAsCf"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fileHandler = fileHandler;
4
+ const node_fs_1 = require("node:fs");
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_path_1 = require("node:path");
7
+ const resolveDataDir_1 = require("../../configuration/resolveDataDir");
8
+ const makeRepo_1 = require("./makeRepo");
9
+ function send404(res) {
10
+ res.writeHead(404, { "Content-Type": "text/plain" });
11
+ res.end("404 Not Found");
12
+ }
13
+ /** Handles GET /projects/:key/issues/:id/file — streams the raw issue markdown file. */
14
+ async function fileHandler(_req, res, params) {
15
+ const { key, id } = params;
16
+ const projectRoot = (0, node_path_1.join)((0, resolveDataDir_1.resolveDataDir)(), "projects", key);
17
+ if (!(0, node_fs_1.existsSync)(projectRoot)) {
18
+ send404(res);
19
+ return;
20
+ }
21
+ const repo = (0, makeRepo_1.makeRepo)(key);
22
+ const filePath = await repo.getObjectFilePath(id);
23
+ if (!filePath) {
24
+ send404(res);
25
+ return;
26
+ }
27
+ if (!filePath.startsWith(projectRoot)) {
28
+ send404(res);
29
+ return;
30
+ }
31
+ try {
32
+ await (0, promises_1.stat)(filePath);
33
+ }
34
+ catch {
35
+ send404(res);
36
+ return;
37
+ }
38
+ res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
39
+ const stream = (0, node_fs_1.createReadStream)(filePath);
40
+ stream.on("error", () => {
41
+ if (!res.headersSent) {
42
+ res.writeHead(500, { "Content-Type": "text/plain" });
43
+ res.end("500 Internal Server Error");
44
+ }
45
+ });
46
+ stream.pipe(res);
47
+ }
48
+ //# sourceMappingURL=fileHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileHandler.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/fileHandler.ts"],"names":[],"mappings":";;AAaA,kCA0CC;AAvDD,qCAAuD;AACvD,+CAAwC;AAExC,yCAAiC;AACjC,uEAAoE;AACpE,yCAAsC;AAEtC,SAAS,OAAO,CAAC,GAAmB;IAClC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;IACrD,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC3B,CAAC;AAED,wFAAwF;AACjF,KAAK,UAAU,WAAW,CAC/B,IAAqB,EACrB,GAAmB,EACnB,MAA8B;IAE9B,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;IAE3B,MAAM,WAAW,GAAG,IAAA,gBAAI,EAAC,IAAA,+BAAc,GAAE,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAA,oBAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAElD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAA,eAAI,EAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,IAAA,0BAAgB,EAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACtB,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC"}
@@ -7,6 +7,7 @@ export { deleteFormHandler } from "./deleteFormHandler";
7
7
  export { deleteSubmitHandler } from "./deleteSubmitHandler";
8
8
  export { detailViewHandler } from "./detailViewHandler";
9
9
  export { editFormHandler } from "./editFormHandler";
10
+ export { fileHandler } from "./fileHandler";
10
11
  export { editSubmitHandler } from "./editSubmitHandler";
11
12
  export { projectTreeHandler } from "./projectTreeHandler";
12
13
  export { searchHandler } from "./searchHandler";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.searchHandler = exports.projectTreeHandler = exports.editSubmitHandler = exports.editFormHandler = exports.detailViewHandler = exports.deleteSubmitHandler = exports.deleteFormHandler = exports.createTopSubmitHandler = exports.createTopFormHandler = exports.createChildSubmitHandler = exports.createChildFormHandler = exports.attachmentHandler = void 0;
3
+ exports.searchHandler = exports.projectTreeHandler = exports.editSubmitHandler = exports.fileHandler = exports.editFormHandler = exports.detailViewHandler = exports.deleteSubmitHandler = exports.deleteFormHandler = exports.createTopSubmitHandler = exports.createTopFormHandler = exports.createChildSubmitHandler = exports.createChildFormHandler = exports.attachmentHandler = void 0;
4
4
  var attachmentHandler_1 = require("./attachmentHandler");
5
5
  Object.defineProperty(exports, "attachmentHandler", { enumerable: true, get: function () { return attachmentHandler_1.attachmentHandler; } });
6
6
  var createChildFormHandler_1 = require("./createChildFormHandler");
@@ -19,6 +19,8 @@ var detailViewHandler_1 = require("./detailViewHandler");
19
19
  Object.defineProperty(exports, "detailViewHandler", { enumerable: true, get: function () { return detailViewHandler_1.detailViewHandler; } });
20
20
  var editFormHandler_1 = require("./editFormHandler");
21
21
  Object.defineProperty(exports, "editFormHandler", { enumerable: true, get: function () { return editFormHandler_1.editFormHandler; } });
22
+ var fileHandler_1 = require("./fileHandler");
23
+ Object.defineProperty(exports, "fileHandler", { enumerable: true, get: function () { return fileHandler_1.fileHandler; } });
22
24
  var editSubmitHandler_1 = require("./editSubmitHandler");
23
25
  Object.defineProperty(exports, "editSubmitHandler", { enumerable: true, get: function () { return editSubmitHandler_1.editSubmitHandler; } });
24
26
  var projectTreeHandler_1 = require("./projectTreeHandler");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/index.ts"],"names":[],"mappings":";;;AAAA,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,mEAAkE;AAAzD,gIAAA,sBAAsB,OAAA;AAC/B,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAC7B,mEAAkE;AAAzD,gIAAA,sBAAsB,OAAA;AAC/B,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AACxB,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA;AAC3B,iDAAgD;AAAvC,8GAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/index.ts"],"names":[],"mappings":";;;AAAA,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,mEAAkE;AAAzD,gIAAA,sBAAsB,OAAA;AAC/B,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAC7B,mEAAkE;AAAzD,gIAAA,sBAAsB,OAAA;AAC/B,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AACxB,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA;AAC3B,iDAAgD;AAAvC,8GAAA,aAAa,OAAA"}
@@ -5,6 +5,7 @@ type CreateTopFields = {
5
5
  priority?: string;
6
6
  body?: string;
7
7
  prerequisites?: string;
8
+ externalIssueId?: string;
8
9
  };
9
10
  /** Renders the data-view="create" form fragment for a new top-level issue. */
10
11
  export declare function renderCreateTopForm(key: string, fields?: CreateTopFields, error?: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"renderCreateTopForm.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderCreateTopForm.ts"],"names":[],"mappings":"AAKA,KAAK,eAAe,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAiBF,8EAA8E;AAC9E,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,eAAoB,EAC5B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAkDR"}
1
+ {"version":3,"file":"renderCreateTopForm.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderCreateTopForm.ts"],"names":[],"mappings":"AAKA,KAAK,eAAe,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAiBF,8EAA8E;AAC9E,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,eAAoB,EAC5B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAuDR"}
@@ -27,6 +27,10 @@ function renderCreateTopForm(key, fields = {}, error) {
27
27
  : "";
28
28
  const status = fields.status ?? models_1.TrellisObjectStatus.DRAFT;
29
29
  const priority = fields.priority ?? models_1.TrellisObjectPriority.MEDIUM;
30
+ const externalIdField = `<div class="fld">
31
+ <label for="top-external-id">External issue ID <span style="color:var(--text-subtle);font-weight:400;text-transform:none;letter-spacing:0;">(optional)</span></label>
32
+ <input id="top-external-id" type="text" name="externalIssueId" value="${(0, escapeHtml_1.escapeHtml)(fields.externalIssueId ?? "")}" placeholder="e.g., JIRA-42" />
33
+ </div>`;
30
34
  return `<div data-view="create">
31
35
  ${errorBanner}
32
36
  <form class="form-card" hx-post="/projects/${keyEsc}/issues" hx-target="#detail" hx-swap="innerHTML">
@@ -61,6 +65,7 @@ function renderCreateTopForm(key, fields = {}, error) {
61
65
  <label for="top-prereqs">Prerequisites</label>
62
66
  <input id="top-prereqs" type="text" name="prerequisites" value="${(0, escapeHtml_1.escapeHtml)(fields.prerequisites ?? "")}" placeholder="Comma-separated issue IDs (optional)" />
63
67
  </div>
68
+ ${externalIdField}
64
69
  </div>
65
70
  <div class="form-footer">
66
71
  <div class="left"></div>
@@ -1 +1 @@
1
- {"version":3,"file":"renderCreateTopForm.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderCreateTopForm.ts"],"names":[],"mappings":";;AA8BA,kDAsDC;AApFD,yCAA0E;AAC1E,8CAA2C;AAC3C,qDAAkD;AAClD,iDAA8C;AAW9C,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO;QACL,CAAC,SAAS,EAAE,SAAS,CAAC;QACtB,CAAC,MAAM,EAAE,MAAM,CAAC;QAChB,CAAC,SAAS,EAAE,SAAS,CAAC;QACtB,CAAC,MAAM,EAAE,MAAM,CAAC;KACjB;SACE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;QACtB,MAAM,EAAE,GAAG,KAAK,KAAK,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,2BAA2B,EAAE,wBAAwB,KAAK,IAAI,OAAO,yBAAyB,EAAE,KAAK,KAAK,UAAU,CAAC;IAC9H,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,SAAgB,mBAAmB,CACjC,GAAW,EACX,SAA0B,EAAE,EAC5B,KAAc;IAEd,MAAM,MAAM,GAAG,IAAA,uBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,KAAK;QACvB,CAAC,CAAC,6LAA6L,IAAA,uBAAU,EAAC,KAAK,CAAC,QAAQ;QACxN,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,4BAAmB,CAAC,KAAK,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,8BAAqB,CAAC,MAAM,CAAC;IACjE,OAAO;IACL,WAAW;+CACgC,MAAM;;;0BAG3B,MAAM;;;;;2BAKL,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;;;;gEAIQ,IAAA,uBAAU,EAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;;;;;6BAKjE,IAAA,2BAAY,EAAC,MAAM,EAAE,IAAI,CAAC;;;;6BAI1B,IAAA,+BAAc,EAAC,QAAQ,EAAE,IAAI,CAAC;;;;;8CAKb,IAAA,uBAAU,EAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;;;;0EAID,IAAA,uBAAU,EAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;;;;;;;;;;OAUzG,CAAC;AACR,CAAC"}
1
+ {"version":3,"file":"renderCreateTopForm.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderCreateTopForm.ts"],"names":[],"mappings":";;AA+BA,kDA2DC;AA1FD,yCAA0E;AAC1E,8CAA2C;AAC3C,qDAAkD;AAClD,iDAA8C;AAY9C,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO;QACL,CAAC,SAAS,EAAE,SAAS,CAAC;QACtB,CAAC,MAAM,EAAE,MAAM,CAAC;QAChB,CAAC,SAAS,EAAE,SAAS,CAAC;QACtB,CAAC,MAAM,EAAE,MAAM,CAAC;KACjB;SACE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;QACtB,MAAM,EAAE,GAAG,KAAK,KAAK,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,2BAA2B,EAAE,wBAAwB,KAAK,IAAI,OAAO,yBAAyB,EAAE,KAAK,KAAK,UAAU,CAAC;IAC9H,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,SAAgB,mBAAmB,CACjC,GAAW,EACX,SAA0B,EAAE,EAC5B,KAAc;IAEd,MAAM,MAAM,GAAG,IAAA,uBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,KAAK;QACvB,CAAC,CAAC,6LAA6L,IAAA,uBAAU,EAAC,KAAK,CAAC,QAAQ;QACxN,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,4BAAmB,CAAC,KAAK,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,8BAAqB,CAAC,MAAM,CAAC;IACjE,MAAM,eAAe,GAAG;;4EAEkD,IAAA,uBAAU,EAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;SAC3G,CAAC;IACR,OAAO;IACL,WAAW;+CACgC,MAAM;;;0BAG3B,MAAM;;;;;2BAKL,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;;;;gEAIQ,IAAA,uBAAU,EAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;;;;;6BAKjE,IAAA,2BAAY,EAAC,MAAM,EAAE,IAAI,CAAC;;;;6BAI1B,IAAA,+BAAc,EAAC,QAAQ,EAAE,IAAI,CAAC;;;;;8CAKb,IAAA,uBAAU,EAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;;;;0EAID,IAAA,uBAAU,EAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;;QAExG,eAAe;;;;;;;;;OAShB,CAAC;AACR,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { type TrellisObject } from "../../models";
2
2
  import type { Repository } from "../../repositories/Repository";
3
3
  /** Renders the detail pane HTML fragment for a Trellis object. */
4
- export declare function renderDetailView(key: string, obj: TrellisObject, repo: Repository, attachments?: string[]): Promise<string>;
4
+ export declare function renderDetailView(key: string, obj: TrellisObject, repo: Repository, attachments?: string[], filePath?: string | null): Promise<string>;
5
5
  //# sourceMappingURL=renderDetailView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderDetailView.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderDetailView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AA8DhE,kEAAkE;AAClE,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,UAAU,EAChB,WAAW,GAAE,MAAM,EAAO,GACzB,OAAO,CAAC,MAAM,CAAC,CAiGjB"}
1
+ {"version":3,"file":"renderDetailView.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderDetailView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AA+DhE,kEAAkE;AAClE,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,UAAU,EAChB,WAAW,GAAE,MAAM,EAAO,EAC1B,QAAQ,GAAE,MAAM,GAAG,IAAW,GAC7B,OAAO,CAAC,MAAM,CAAC,CA6HjB"}
@@ -4,6 +4,7 @@ exports.renderDetailView = renderDetailView;
4
4
  const models_1 = require("../../models");
5
5
  const escapeHtml_1 = require("../escapeHtml");
6
6
  const priorityCssClass_1 = require("./priorityCssClass");
7
+ const renderMarkdown_1 = require("./renderMarkdown");
7
8
  const statusCssClass_1 = require("./statusCssClass");
8
9
  const statusLabels_1 = require("./statusLabels");
9
10
  const typeLabel_1 = require("./typeLabel");
@@ -51,7 +52,7 @@ async function buildPrerequisites(obj, repo) {
51
52
  return `<ul class="prereq-list">${items.join("")}</ul>`;
52
53
  }
53
54
  /** Renders the detail pane HTML fragment for a Trellis object. */
54
- async function renderDetailView(key, obj, repo, attachments = []) {
55
+ async function renderDetailView(key, obj, repo, attachments = [], filePath = null) {
55
56
  const [breadcrumbs, prerequisites] = await Promise.all([
56
57
  buildBreadcrumbs(key, obj, repo),
57
58
  buildPrerequisites(obj, repo),
@@ -82,10 +83,14 @@ async function renderDetailView(key, obj, repo, attachments = []) {
82
83
  <span class="badge kind">${(0, escapeHtml_1.escapeHtml)((0, typeLabel_1.typeLabel)(obj.type))}</span>
83
84
  <span class="badge status-${(0, escapeHtml_1.escapeHtml)(statusClass)}"><span class="mini-dot"></span>${(0, escapeHtml_1.escapeHtml)(statusLabel(obj.status))}</span>
84
85
  <span class="badge priority ${(0, escapeHtml_1.escapeHtml)(priorityClass)}">${(0, escapeHtml_1.escapeHtml)(priorityLabel(obj.priority))}</span>
85
- <span class="id-chip">${idEsc}</span>
86
+ <span class="id-chip" role="button" tabindex="0" title="Click to copy ID"
87
+ data-copy="${idEsc}"
88
+ onclick="navigator.clipboard && navigator.clipboard.writeText(this.dataset.copy).then(()=>{const p=this.dataset.prev||this.textContent;this.dataset.prev=p;this.style.minWidth=this.offsetWidth+'px';this.textContent='Copied!';setTimeout(()=>{this.textContent=p;this.style.minWidth='';},1200);})"
89
+ onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();this.click();}"
90
+ >${idEsc}</span>
86
91
  </div>`;
87
92
  const description = obj.body
88
- ? `<div class="prose">${(0, escapeHtml_1.escapeHtml)(obj.body)}</div>`
93
+ ? `<div class="markdown">${(0, renderMarkdown_1.renderMarkdown)(obj.body)}</div>`
89
94
  : `<p class="empty">No description.</p>`;
90
95
  const log = obj.log.length > 0
91
96
  ? `<ul class="log-list">${obj.log
@@ -106,14 +111,35 @@ async function renderDetailView(key, obj, repo, attachments = []) {
106
111
  .join("")}</ul>
107
112
  </div>`
108
113
  : "";
114
+ const externalIssueIdSection = obj.parent === null && obj.externalIssueId
115
+ ? `<div class="field-group">
116
+ <div class="field-label">External issue ID</div>
117
+ <div class="prose">${(0, escapeHtml_1.escapeHtml)(obj.externalIssueId)}</div>
118
+ </div>`
119
+ : "";
120
+ const fileSection = filePath
121
+ ? `<div class="field-group">
122
+ <div class="field-label">File</div>
123
+ <div class="file-path-row">
124
+ <code class="file-path" role="button" tabindex="0" title="Click to copy path"
125
+ data-copy="${(0, escapeHtml_1.escapeHtml)(filePath)}"
126
+ onclick="navigator.clipboard && navigator.clipboard.writeText(this.dataset.copy).then(()=>{const p=this.dataset.prev||this.textContent;this.dataset.prev=p;this.textContent='Copied!';setTimeout(()=>{this.textContent=p;},1200);})"
127
+ onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();this.click();}"
128
+ >${(0, escapeHtml_1.escapeHtml)(filePath)}</code>
129
+ <a class="file-raw-link" href="/projects/${keyEsc}/issues/${idEsc}/file" target="_blank" rel="noopener">Open raw</a>
130
+ </div>
131
+ </div>`
132
+ : "";
109
133
  return `<div data-view="view">
110
134
  ${breadcrumbs}
111
135
  ${titleRow}
112
136
  ${badgesRow}
137
+ ${fileSection}
113
138
  <div class="field-group">
114
139
  <div class="field-label">Description</div>
115
140
  ${description}
116
141
  </div>
142
+ ${externalIssueIdSection}
117
143
  ${attachmentsList}
118
144
  <div class="field-group">
119
145
  <div class="field-label">Prerequisites</div>
@@ -1 +1 @@
1
- {"version":3,"file":"renderDetailView.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderDetailView.ts"],"names":[],"mappings":";;AAgEA,4CAsGC;AAtKD,yCAAqE;AAErE,8CAA2C;AAC3C,yDAAsD;AACtD,qDAAkD;AAClD,iDAA+C;AAC/C,2CAAwC;AAExC,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,4BAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,eAAe,CAAC;IAChD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,iBAAiB,CAAC;IACpD,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,cAAc,CAAC;IAC9C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,GAAW,EACX,GAAkB,EAClB,IAAgB;IAEhB,MAAM,MAAM,GAAyC,EAAE,CAAC;IACxD,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,OAAO,QAAQ,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ;YAAE,MAAM;QACrB,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3D,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD,MAAM,KAAK,GAAG,MAAM;SACjB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,wBAAwB,IAAA,uBAAU,EAAC,GAAG,CAAC,WAAW,IAAA,uBAAU,EAAC,CAAC,CAAC,EAAE,CAAC,oDAAoD,IAAA,uBAAU,EAAC,CAAC,CAAC,KAAK,CAAC,MAAM;QAC/I,iCAAiC,CACpC;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,uBAAuB,KAAK,yBAAyB,IAAA,uBAAU,EAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;AACnG,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,GAAkB,EAClB,IAAgB;IAEhB,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,wCAAwC,CAAC;IAClD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAA,+BAAc,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACnE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAA,uBAAU,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM;YAClB,CAAC,CAAC,6BAA6B,IAAA,uBAAU,EAAC,IAAA,+BAAc,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,6DAA6D,IAAA,uBAAU,EAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS;YACpL,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,yBAAyB,IAAA,uBAAU,EAAC,SAAS,CAAC,6BAA6B,IAAA,uBAAU,EAAC,QAAQ,CAAC,6BAA6B,IAAI,UAAU,KAAK,OAAO,CAAC;IAChK,CAAC,CAAC,CACH,CAAC;IACF,OAAO,2BAA2B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AAC1D,CAAC;AAED,kEAAkE;AAC3D,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,GAAkB,EAClB,IAAgB,EAChB,cAAwB,EAAE;IAE1B,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrD,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;QAChC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC;KAC9B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAA,uBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,uBAAU,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEjC,MAAM,cAAc,GAClB,GAAG,CAAC,IAAI,KAAK,0BAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,QAAQ,GAAG;sBACG,IAAA,uBAAU,EAAC,GAAG,CAAC,KAAK,CAAC;;;0BAGjB,MAAM,WAAW,KAAK;;;uCAGT,cAAc;0BAC3B,MAAM,WAAW,KAAK;;;;0BAItB,MAAM,WAAW,KAAK;;;;OAIzC,CAAC;IAEN,MAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,IAAA,mCAAgB,EAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG;6BACS,IAAA,uBAAU,EAAC,IAAA,qBAAS,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;8BAC9B,IAAA,uBAAU,EAAC,WAAW,CAAC,mCAAmC,IAAA,uBAAU,EAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gCAC3F,IAAA,uBAAU,EAAC,aAAa,CAAC,KAAK,IAAA,uBAAU,EAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;0BAC3E,KAAK;OACxB,CAAC;IAEN,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI;QAC1B,CAAC,CAAC,sBAAsB,IAAA,uBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,QAAQ;QACpD,CAAC,CAAC,sCAAsC,CAAC;IAE3C,MAAM,GAAG,GACP,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,CAAC,wBAAwB,GAAG,CAAC,GAAG;aAC5B,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CACR,2BAA2B,IAAA,uBAAU,EAAC,KAAK,CAAC,cAAc,CAC7D;aACA,IAAI,CAAC,EAAE,CAAC,OAAO;QACpB,CAAC,CAAC,sCAAsC,CAAC;IAE7C,IAAI,SAAS,GAAG,yCAAyC,CAAC;IAC1D,IAAI,GAAG,CAAC,aAAa,YAAY,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACnE,SAAS,GAAG,2BAA2B,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;aACpE,GAAG,CACF,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CACnB,wBAAwB,IAAA,uBAAU,EAAC,QAAQ,CAAC,6BAA6B,IAAA,uBAAU,EAAC,IAAI,CAAC,cAAc,CAC1G;aACA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,MAAM,eAAe,GACnB,WAAW,CAAC,MAAM,GAAG,CAAC;QACpB,CAAC,CAAC;;8BAEsB,WAAW;aAClC,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CACP,0BAA0B,MAAM,WAAW,KAAK,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,KAAK,IAAA,uBAAU,EAAC,IAAI,CAAC,WAAW,CAC3H;aACA,IAAI,CAAC,EAAE,CAAC;SACN;QACH,CAAC,CAAC,EAAE,CAAC;IAET,OAAO;IACL,WAAW;IACX,QAAQ;IACR,SAAS;;;MAGP,WAAW;;IAEb,eAAe;;;MAGb,aAAa;;;;MAIb,GAAG;;;;MAIH,SAAS;;OAER,CAAC;AACR,CAAC"}
1
+ {"version":3,"file":"renderDetailView.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderDetailView.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ type EditFields = {
5
5
  body: string;
6
6
  prerequisites: string;
7
7
  log_entry?: string;
8
+ externalIssueId?: string;
9
+ isTopLevel: boolean;
8
10
  };
9
11
  /** Renders the data-view="edit" form fragment for an issue. */
10
12
  export declare function renderEditForm(key: string, id: string, fields: EditFields, error?: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"renderEditForm.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderEditForm.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,+DAA+D;AAC/D,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,UAAU,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAoDR"}
1
+ {"version":3,"file":"renderEditForm.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderEditForm.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,+DAA+D;AAC/D,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,UAAU,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CA4DR"}
@@ -11,6 +11,13 @@ function renderEditForm(key, id, fields, error) {
11
11
  const errorBanner = error
12
12
  ? `<div class="error-banner" style="padding:10px 12px;margin-bottom:12px;border:1px solid var(--danger);background:var(--danger-tint);color:var(--danger);border-radius:6px;font-size:13px;">${(0, escapeHtml_1.escapeHtml)(error)}</div>`
13
13
  : "";
14
+ const externalIdField = fields.isTopLevel
15
+ ? `<div class="fld">
16
+ <label for="f-external-id">External issue ID <span style="color:var(--text-subtle);font-weight:400;text-transform:none;letter-spacing:0;">(optional)</span></label>
17
+ <input id="f-external-id" type="text" name="externalIssueId" value="${(0, escapeHtml_1.escapeHtml)(fields.externalIssueId ?? "")}" placeholder="e.g., JIRA-42" />
18
+ <div class="hint">Only available on top-level issues. Leave empty and save to clear.</div>
19
+ </div>`
20
+ : "";
14
21
  return `<div data-view="edit">
15
22
  ${errorBanner}
16
23
  <form class="form-card" hx-put="/projects/${keyEsc}/issues/${idEsc}" hx-target="#detail" hx-swap="innerHTML">
@@ -43,6 +50,7 @@ function renderEditForm(key, id, fields, error) {
43
50
  <input id="f-prereqs" type="text" name="prerequisites" value="${(0, escapeHtml_1.escapeHtml)(fields.prerequisites)}" placeholder="Comma-separated issue IDs" />
44
51
  <div class="hint">Comma-separated list of prerequisite issue IDs.</div>
45
52
  </div>
53
+ ${externalIdField}
46
54
  <div class="fld">
47
55
  <label for="f-log">Add log entry <span style="color:var(--text-subtle);font-weight:400;text-transform:none;letter-spacing:0;">(optional)</span></label>
48
56
  <input id="f-log" type="text" name="log_entry" value="${(0, escapeHtml_1.escapeHtml)(fields.log_entry ?? "")}" placeholder="What changed?" />
@@ -1 +1 @@
1
- {"version":3,"file":"renderEditForm.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderEditForm.ts"],"names":[],"mappings":";;AAcA,wCAyDC;AAvED,8CAA2C;AAC3C,qDAAkD;AAClD,iDAA8C;AAW9C,+DAA+D;AAC/D,SAAgB,cAAc,CAC5B,GAAW,EACX,EAAU,EACV,MAAkB,EAClB,KAAc;IAEd,MAAM,MAAM,GAAG,IAAA,uBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,uBAAU,EAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,WAAW,GAAG,KAAK;QACvB,CAAC,CAAC,6LAA6L,IAAA,uBAAU,EAAC,KAAK,CAAC,QAAQ;QACxN,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;IACL,WAAW;8CAC+B,MAAM,WAAW,KAAK;;;0BAG1C,KAAK;;;;;8DAK+B,IAAA,uBAAU,EAAC,MAAM,CAAC,KAAK,CAAC;;;;;6BAKzD,IAAA,2BAAY,EAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;6BAIhC,IAAA,+BAAc,EAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC;;;;;4CAKrB,IAAA,uBAAU,EAAC,MAAM,CAAC,IAAI,CAAC;;;;;wEAKK,IAAA,uBAAU,EAAC,MAAM,CAAC,aAAa,CAAC;;;;;gEAKxC,IAAA,uBAAU,EAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;;;;;;8DAMpC,MAAM,WAAW,KAAK;;;;;OAK7E,CAAC;AACR,CAAC"}
1
+ {"version":3,"file":"renderEditForm.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderEditForm.ts"],"names":[],"mappings":";;AAgBA,wCAiEC;AAjFD,8CAA2C;AAC3C,qDAAkD;AAClD,iDAA8C;AAa9C,+DAA+D;AAC/D,SAAgB,cAAc,CAC5B,GAAW,EACX,EAAU,EACV,MAAkB,EAClB,KAAc;IAEd,MAAM,MAAM,GAAG,IAAA,uBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,uBAAU,EAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,WAAW,GAAG,KAAK;QACvB,CAAC,CAAC,6LAA6L,IAAA,uBAAU,EAAC,KAAK,CAAC,QAAQ;QACxN,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU;QACvC,CAAC,CAAC;;8EAEwE,IAAA,uBAAU,EAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;;aAEzG;QACT,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;IACL,WAAW;8CAC+B,MAAM,WAAW,KAAK;;;0BAG1C,KAAK;;;;;8DAK+B,IAAA,uBAAU,EAAC,MAAM,CAAC,KAAK,CAAC;;;;;6BAKzD,IAAA,2BAAY,EAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;6BAIhC,IAAA,+BAAc,EAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC;;;;;4CAKrB,IAAA,uBAAU,EAAC,MAAM,CAAC,IAAI,CAAC;;;;;wEAKK,IAAA,uBAAU,EAAC,MAAM,CAAC,aAAa,CAAC;;;QAGhG,eAAe;;;gEAGyC,IAAA,uBAAU,EAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;;;;;;8DAMpC,MAAM,WAAW,KAAK;;;;;OAK7E,CAAC;AACR,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function renderMarkdown(src: string): string;
2
+ //# sourceMappingURL=renderMarkdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderMarkdown.d.ts","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderMarkdown.ts"],"names":[],"mappings":"AAWA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.renderMarkdown = renderMarkdown;
7
+ const markdown_it_1 = __importDefault(require("markdown-it"));
8
+ const md = new markdown_it_1.default({
9
+ html: false,
10
+ linkify: false,
11
+ breaks: false,
12
+ typographer: false,
13
+ });
14
+ md.disable(["autolink"]);
15
+ function renderMarkdown(src) {
16
+ return md.render(src);
17
+ }
18
+ //# sourceMappingURL=renderMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderMarkdown.js","sourceRoot":"","sources":["../../../src/http/projectTreePage/renderMarkdown.ts"],"names":[],"mappings":";;;;;AAWA,wCAEC;AAbD,8DAAqC;AAErC,MAAM,EAAE,GAAG,IAAI,qBAAU,CAAC;IACxB,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,KAAK;IACb,WAAW,EAAE,KAAK;CACnB,CAAC,CAAC;AAEH,EAAE,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAEzB,SAAgB,cAAc,CAAC,GAAW;IACxC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC"}
@@ -687,6 +687,7 @@ a {
687
687
  .id-chip {
688
688
  display: inline-flex;
689
689
  align-items: center;
690
+ justify-content: center;
690
691
  gap: 4px;
691
692
  font-family: var(--font-mono);
692
693
  font-size: 10px;
@@ -696,11 +697,17 @@ a {
696
697
  border-radius: 3px;
697
698
  background: var(--gray-50);
698
699
  margin-left: 2px;
700
+ cursor: pointer;
701
+ user-select: all;
699
702
  }
700
703
  .id-chip:hover {
701
704
  background: var(--gray-100);
702
705
  color: var(--text);
703
706
  }
707
+ .id-chip:focus-visible {
708
+ outline: 2px solid var(--accent);
709
+ outline-offset: 1px;
710
+ }
704
711
 
705
712
  /* ----- Field blocks ----- */
706
713
  .field-group {
@@ -724,6 +731,45 @@ a {
724
731
  font-size: var(--text-sm);
725
732
  }
726
733
 
734
+ /* File path row (click-to-copy + open-raw link) */
735
+ .file-path-row {
736
+ display: flex;
737
+ align-items: center;
738
+ gap: var(--sp-3);
739
+ flex-wrap: wrap;
740
+ }
741
+ .file-path {
742
+ font-family: var(--font-mono);
743
+ font-size: var(--text-sm);
744
+ color: var(--text);
745
+ background: var(--bg-sunken);
746
+ border: 1px solid var(--border);
747
+ border-radius: var(--radius);
748
+ padding: 4px 8px;
749
+ cursor: pointer;
750
+ user-select: all;
751
+ word-break: break-all;
752
+ flex: 1;
753
+ min-width: 0;
754
+ }
755
+ .file-path:hover {
756
+ background: var(--accent-tint);
757
+ border-color: var(--accent-border);
758
+ }
759
+ .file-path:focus-visible {
760
+ outline: 2px solid var(--accent);
761
+ outline-offset: 1px;
762
+ }
763
+ .file-raw-link {
764
+ font-size: var(--text-sm);
765
+ color: var(--accent);
766
+ text-decoration: none;
767
+ white-space: nowrap;
768
+ }
769
+ .file-raw-link:hover {
770
+ text-decoration: underline;
771
+ }
772
+
727
773
  /* Description body (markdown-ish) */
728
774
  .prose {
729
775
  background: var(--bg-sunken);
@@ -758,6 +804,135 @@ a {
758
804
  margin-bottom: 0;
759
805
  }
760
806
 
807
+ /* Rendered markdown body */
808
+ .markdown {
809
+ background: var(--bg-sunken);
810
+ border: 1px solid var(--border);
811
+ border-radius: var(--radius);
812
+ padding: var(--sp-4) var(--sp-5);
813
+ font-size: var(--text-md);
814
+ line-height: 1.6;
815
+ color: var(--gray-800);
816
+ }
817
+ .markdown > :first-child {
818
+ margin-top: 0;
819
+ }
820
+ .markdown > :last-child {
821
+ margin-bottom: 0;
822
+ }
823
+ .markdown p {
824
+ margin: 0 0 10px;
825
+ }
826
+ .markdown h1,
827
+ .markdown h2,
828
+ .markdown h3,
829
+ .markdown h4,
830
+ .markdown h5,
831
+ .markdown h6 {
832
+ margin: 18px 0 8px;
833
+ font-weight: 600;
834
+ line-height: 1.3;
835
+ }
836
+ .markdown h1 {
837
+ font-size: 1.5em;
838
+ border-bottom: 1px solid var(--border);
839
+ padding-bottom: 4px;
840
+ }
841
+ .markdown h2 {
842
+ font-size: 1.3em;
843
+ border-bottom: 1px solid var(--border);
844
+ padding-bottom: 3px;
845
+ }
846
+ .markdown h3 {
847
+ font-size: 1.15em;
848
+ }
849
+ .markdown h4 {
850
+ font-size: 1em;
851
+ }
852
+ .markdown h5,
853
+ .markdown h6 {
854
+ font-size: 0.95em;
855
+ color: var(--text-subtle);
856
+ }
857
+ .markdown ul,
858
+ .markdown ol {
859
+ margin: 0 0 10px;
860
+ padding-left: 24px;
861
+ }
862
+ .markdown li {
863
+ margin: 2px 0;
864
+ }
865
+ .markdown li > ul,
866
+ .markdown li > ol {
867
+ margin: 2px 0;
868
+ }
869
+ .markdown a {
870
+ color: var(--accent);
871
+ text-decoration: underline;
872
+ }
873
+ .markdown code {
874
+ font-family: var(--font-mono);
875
+ font-size: 0.9em;
876
+ background: var(--gray-200);
877
+ padding: 1px 5px;
878
+ border-radius: 3px;
879
+ }
880
+ .markdown pre {
881
+ margin: 0 0 10px;
882
+ padding: 10px 12px;
883
+ background: var(--gray-200);
884
+ border: 1px solid var(--border);
885
+ border-radius: var(--radius);
886
+ overflow-x: auto;
887
+ font-size: 0.9em;
888
+ line-height: 1.5;
889
+ }
890
+ .markdown pre code {
891
+ padding: 0;
892
+ background: transparent;
893
+ border-radius: 0;
894
+ font-size: 1em;
895
+ }
896
+ .markdown blockquote {
897
+ margin: 0 0 10px;
898
+ padding: 2px 12px;
899
+ border-left: 3px solid var(--border);
900
+ color: var(--text-subtle);
901
+ }
902
+ .markdown blockquote > :last-child {
903
+ margin-bottom: 0;
904
+ }
905
+ .markdown hr {
906
+ border: 0;
907
+ border-top: 1px solid var(--border);
908
+ margin: 16px 0;
909
+ }
910
+ .markdown img {
911
+ max-width: 100%;
912
+ height: auto;
913
+ }
914
+ .markdown table {
915
+ border-collapse: collapse;
916
+ margin: 0 0 10px;
917
+ font-size: 0.95em;
918
+ }
919
+ .markdown th,
920
+ .markdown td {
921
+ border: 1px solid var(--border);
922
+ padding: 6px 10px;
923
+ text-align: left;
924
+ }
925
+ .markdown th {
926
+ background: var(--gray-200);
927
+ font-weight: 600;
928
+ }
929
+ .markdown em {
930
+ font-style: italic;
931
+ }
932
+ .markdown strong {
933
+ font-weight: 600;
934
+ }
935
+
761
936
  /* Prereq + log lists */
762
937
  .prereq-list,
763
938
  .log-list {