@kernhq/module-tracker 0.1.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 (158) hide show
  1. package/LICENSE +662 -0
  2. package/README.md +265 -0
  3. package/dist/contract/events.d.ts +140 -0
  4. package/dist/contract/events.d.ts.map +1 -0
  5. package/dist/contract/events.js +51 -0
  6. package/dist/contract/events.js.map +1 -0
  7. package/dist/contract/index.d.ts +6 -0
  8. package/dist/contract/index.d.ts.map +1 -0
  9. package/dist/contract/index.js +6 -0
  10. package/dist/contract/index.js.map +1 -0
  11. package/dist/contract/models.d.ts +2547 -0
  12. package/dist/contract/models.d.ts.map +1 -0
  13. package/dist/contract/models.js +1214 -0
  14. package/dist/contract/models.js.map +1 -0
  15. package/dist/contract/notifications.d.ts +4 -0
  16. package/dist/contract/notifications.d.ts.map +1 -0
  17. package/dist/contract/notifications.js +46 -0
  18. package/dist/contract/notifications.js.map +1 -0
  19. package/dist/contract/permissions.d.ts +161 -0
  20. package/dist/contract/permissions.d.ts.map +1 -0
  21. package/dist/contract/permissions.js +192 -0
  22. package/dist/contract/permissions.js.map +1 -0
  23. package/dist/contract/router.d.ts +9659 -0
  24. package/dist/contract/router.d.ts.map +1 -0
  25. package/dist/contract/router.js +732 -0
  26. package/dist/contract/router.js.map +1 -0
  27. package/dist/kql/ast.d.ts +90 -0
  28. package/dist/kql/ast.d.ts.map +1 -0
  29. package/dist/kql/ast.js +80 -0
  30. package/dist/kql/ast.js.map +1 -0
  31. package/dist/kql/dates.d.ts +16 -0
  32. package/dist/kql/dates.d.ts.map +1 -0
  33. package/dist/kql/dates.js +54 -0
  34. package/dist/kql/dates.js.map +1 -0
  35. package/dist/kql/fields.d.ts +61 -0
  36. package/dist/kql/fields.d.ts.map +1 -0
  37. package/dist/kql/fields.js +106 -0
  38. package/dist/kql/fields.js.map +1 -0
  39. package/dist/kql/index.d.ts +16 -0
  40. package/dist/kql/index.d.ts.map +1 -0
  41. package/dist/kql/index.js +16 -0
  42. package/dist/kql/index.js.map +1 -0
  43. package/dist/kql/lexer.d.ts +28 -0
  44. package/dist/kql/lexer.d.ts.map +1 -0
  45. package/dist/kql/lexer.js +127 -0
  46. package/dist/kql/lexer.js.map +1 -0
  47. package/dist/kql/parser.d.ts +14 -0
  48. package/dist/kql/parser.d.ts.map +1 -0
  49. package/dist/kql/parser.js +290 -0
  50. package/dist/kql/parser.js.map +1 -0
  51. package/dist/kql/suggest.d.ts +8 -0
  52. package/dist/kql/suggest.d.ts.map +1 -0
  53. package/dist/kql/suggest.js +96 -0
  54. package/dist/kql/suggest.js.map +1 -0
  55. package/dist/kql/validate.d.ts +10 -0
  56. package/dist/kql/validate.d.ts.map +1 -0
  57. package/dist/kql/validate.js +84 -0
  58. package/dist/kql/validate.js.map +1 -0
  59. package/dist/server/index.d.ts +17 -0
  60. package/dist/server/index.d.ts.map +1 -0
  61. package/dist/server/index.js +583 -0
  62. package/dist/server/index.js.map +1 -0
  63. package/dist/server/kql/compile.d.ts +49 -0
  64. package/dist/server/kql/compile.d.ts.map +1 -0
  65. package/dist/server/kql/compile.js +372 -0
  66. package/dist/server/kql/compile.js.map +1 -0
  67. package/dist/server/rank.d.ts +23 -0
  68. package/dist/server/rank.d.ts.map +1 -0
  69. package/dist/server/rank.js +66 -0
  70. package/dist/server/rank.js.map +1 -0
  71. package/dist/server/rich.d.ts +30 -0
  72. package/dist/server/rich.d.ts.map +1 -0
  73. package/dist/server/rich.js +97 -0
  74. package/dist/server/rich.js.map +1 -0
  75. package/dist/server/router.d.ts +10589 -0
  76. package/dist/server/router.d.ts.map +1 -0
  77. package/dist/server/router.js +431 -0
  78. package/dist/server/router.js.map +1 -0
  79. package/dist/server/schema.d.ts +6622 -0
  80. package/dist/server/schema.d.ts.map +1 -0
  81. package/dist/server/schema.js +581 -0
  82. package/dist/server/schema.js.map +1 -0
  83. package/dist/server/services/access.d.ts +53 -0
  84. package/dist/server/services/access.d.ts.map +1 -0
  85. package/dist/server/services/access.js +146 -0
  86. package/dist/server/services/access.js.map +1 -0
  87. package/dist/server/services/comments.d.ts +36 -0
  88. package/dist/server/services/comments.d.ts.map +1 -0
  89. package/dist/server/services/comments.js +231 -0
  90. package/dist/server/services/comments.js.map +1 -0
  91. package/dist/server/services/config.d.ts +130 -0
  92. package/dist/server/services/config.d.ts.map +1 -0
  93. package/dist/server/services/config.js +797 -0
  94. package/dist/server/services/config.js.map +1 -0
  95. package/dist/server/services/db.d.ts +93 -0
  96. package/dist/server/services/db.d.ts.map +1 -0
  97. package/dist/server/services/db.js +519 -0
  98. package/dist/server/services/db.js.map +1 -0
  99. package/dist/server/services/imports.d.ts +37 -0
  100. package/dist/server/services/imports.d.ts.map +1 -0
  101. package/dist/server/services/imports.js +324 -0
  102. package/dist/server/services/imports.js.map +1 -0
  103. package/dist/server/services/index.d.ts +36 -0
  104. package/dist/server/services/index.d.ts.map +1 -0
  105. package/dist/server/services/index.js +57 -0
  106. package/dist/server/services/index.js.map +1 -0
  107. package/dist/server/services/intake.d.ts +47 -0
  108. package/dist/server/services/intake.d.ts.map +1 -0
  109. package/dist/server/services/intake.js +268 -0
  110. package/dist/server/services/intake.js.map +1 -0
  111. package/dist/server/services/issues.d.ts +763 -0
  112. package/dist/server/services/issues.d.ts.map +1 -0
  113. package/dist/server/services/issues.js +1381 -0
  114. package/dist/server/services/issues.js.map +1 -0
  115. package/dist/server/services/notify.d.ts +51 -0
  116. package/dist/server/services/notify.d.ts.map +1 -0
  117. package/dist/server/services/notify.js +90 -0
  118. package/dist/server/services/notify.js.map +1 -0
  119. package/dist/server/services/planning.d.ts +62 -0
  120. package/dist/server/services/planning.d.ts.map +1 -0
  121. package/dist/server/services/planning.js +614 -0
  122. package/dist/server/services/planning.js.map +1 -0
  123. package/dist/server/services/projects.d.ts +43 -0
  124. package/dist/server/services/projects.d.ts.map +1 -0
  125. package/dist/server/services/projects.js +375 -0
  126. package/dist/server/services/projects.js.map +1 -0
  127. package/dist/server/services/query.d.ts +24 -0
  128. package/dist/server/services/query.d.ts.map +1 -0
  129. package/dist/server/services/query.js +312 -0
  130. package/dist/server/services/query.js.map +1 -0
  131. package/dist/server/services/reports.d.ts +30 -0
  132. package/dist/server/services/reports.d.ts.map +1 -0
  133. package/dist/server/services/reports.js +295 -0
  134. package/dist/server/services/reports.js.map +1 -0
  135. package/dist/server/services/time.d.ts +53 -0
  136. package/dist/server/services/time.d.ts.map +1 -0
  137. package/dist/server/services/time.js +192 -0
  138. package/dist/server/services/time.js.map +1 -0
  139. package/dist/server/services/transitions.d.ts +61 -0
  140. package/dist/server/services/transitions.d.ts.map +1 -0
  141. package/dist/server/services/transitions.js +493 -0
  142. package/dist/server/services/transitions.js.map +1 -0
  143. package/dist/server/services/views.d.ts +33 -0
  144. package/dist/server/services/views.d.ts.map +1 -0
  145. package/dist/server/services/views.js +195 -0
  146. package/dist/server/services/views.js.map +1 -0
  147. package/migrations/0000_init.sql +529 -0
  148. package/migrations/0001_rls.sql +259 -0
  149. package/migrations/meta/0000_snapshot.json +4140 -0
  150. package/migrations/meta/_journal.json +20 -0
  151. package/package.json +82 -0
  152. package/src/client/api.ts +15 -0
  153. package/src/client/format.ts +164 -0
  154. package/src/client/group.ts +150 -0
  155. package/src/client/index.ts +60 -0
  156. package/src/client/kql.ts +492 -0
  157. package/src/client/rank.ts +87 -0
  158. package/src/client/types.ts +57 -0
@@ -0,0 +1,84 @@
1
+ import { walkComparisons } from './ast.js';
2
+ import { findField, KQL_FUNCTIONS, operatorsFor } from './fields.js';
3
+ const FUNCTIONS = new Map(KQL_FUNCTIONS.map((f) => [f.name.toLowerCase(), f]));
4
+ const argCountOk = (spec, got) => typeof spec === 'number' ? got === spec : spec === '0-1' ? got <= 1 : true;
5
+ /** Semantic checks: known fields, operators the field supports, plausible values, known functions. */
6
+ export function validateQuery(query, fields) {
7
+ const issues = [];
8
+ walkComparisons(query.where, (cmp) => issues.push(...checkComparison(cmp, fields)));
9
+ for (const order of query.orderBy) {
10
+ const field = findField(fields, order.field);
11
+ if (!field) {
12
+ issues.push({ message: `Unknown field "${order.field}"`, ...order.span });
13
+ continue;
14
+ }
15
+ // only fields explicitly marked sortable have a deterministic column to order by
16
+ if (!field.sortable)
17
+ issues.push({ message: `Field "${order.field}" cannot be sorted on`, ...order.span });
18
+ }
19
+ return issues;
20
+ }
21
+ function checkComparison(cmp, fields) {
22
+ const issues = [];
23
+ const field = findField(fields, cmp.field);
24
+ if (!field) {
25
+ return [{ message: `Unknown field "${cmp.field}"`, start: cmp.span.start, end: cmp.span.end }];
26
+ }
27
+ const allowed = operatorsFor(field);
28
+ if (!allowed.includes(cmp.op))
29
+ issues.push({
30
+ message: `Operator "${cmp.op}" is not supported for "${field.name}" (try ${allowed.join(', ')})`,
31
+ start: cmp.span.start,
32
+ end: cmp.span.end,
33
+ });
34
+ for (const v of [cmp.value, ...(cmp.values ?? [])])
35
+ if (v)
36
+ issues.push(...checkValue(v, field));
37
+ return issues;
38
+ }
39
+ function checkValue(value, field) {
40
+ if (value.kind === 'func') {
41
+ const spec = FUNCTIONS.get(value.name.toLowerCase());
42
+ if (!spec)
43
+ return [{ message: `Unknown function "${value.name}()"`, ...value.span }];
44
+ if (!argCountOk(spec.args, value.args.length))
45
+ return [{ message: `${value.name}() expects ${spec.args} argument(s)`, ...value.span }];
46
+ return [];
47
+ }
48
+ if (value.kind === 'null')
49
+ return [];
50
+ switch (field.kind) {
51
+ case 'number':
52
+ if (value.kind !== 'number')
53
+ return [{ message: `"${field.name}" expects a number`, ...value.span }];
54
+ return [];
55
+ case 'boolean':
56
+ if (value.kind !== 'bool')
57
+ return [{ message: `"${field.name}" expects true or false`, ...value.span }];
58
+ return [];
59
+ case 'date':
60
+ case 'datetime':
61
+ if (value.kind !== 'date' && value.kind !== 'reldate')
62
+ return [
63
+ {
64
+ message: `"${field.name}" expects a date (2026-08-22), a relative date (-7d) or a function`,
65
+ ...value.span,
66
+ },
67
+ ];
68
+ return [];
69
+ case 'enum': {
70
+ const text = value.kind === 'string' || value.kind === 'ident' ? String(value.value) : null;
71
+ if (text && field.enumValues && !field.enumValues.includes(text.toLowerCase()))
72
+ return [
73
+ {
74
+ message: `"${text}" is not a valid ${field.name} (${field.enumValues.join(', ')})`,
75
+ ...value.span,
76
+ },
77
+ ];
78
+ return [];
79
+ }
80
+ default:
81
+ return [];
82
+ }
83
+ }
84
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/kql/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ export * from './rank.js';
3
+ export * from './rich.js';
4
+ export { trackerRouter } from './router.js';
5
+ export * from './schema.js';
6
+ export * from './services/index.js';
7
+ /**
8
+ * The tracker module: projects, work items, workflows, KQL, planning, time tracking and reports.
9
+ *
10
+ * Hosted by the core service by default. Like every Kern module it is reachable from anywhere through
11
+ * `/api/tracker` and `kernel.call('tracker.*')`, so a deployment that outgrows core can move it to its
12
+ * own service by registering it there instead.
13
+ */
14
+ export declare const trackerModule: import("@kernhq/kernel").ServerModule<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
15
+ export default trackerModule;
16
+ export type TrackerModule = typeof trackerModule;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AAqNnC;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,gHA0cxB,CAAA;AAsBF,eAAe,aAAa,CAAA;AAC5B,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAA"}