@owlmeans/planning 0.1.18-rc.2 → 0.1.18-rc.21

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 (228) hide show
  1. package/README.md +69 -26
  2. package/agent-meta/manifest.json +2 -2
  3. package/agent-meta/skills/planning/SKILL.md +157 -45
  4. package/build/aliases/types.d.ts +49 -0
  5. package/build/aliases/types.d.ts.map +1 -0
  6. package/build/aliases/types.js +2 -0
  7. package/build/aliases/types.js.map +1 -0
  8. package/build/aliases.d.ts +4 -0
  9. package/build/aliases.d.ts.map +1 -0
  10. package/build/aliases.js +27 -0
  11. package/build/aliases.js.map +1 -0
  12. package/build/consts.d.ts +23 -34
  13. package/build/consts.d.ts.map +1 -1
  14. package/build/consts.js +26 -25
  15. package/build/consts.js.map +1 -1
  16. package/build/entrypoints/types.d.ts +96 -0
  17. package/build/entrypoints/types.d.ts.map +1 -0
  18. package/build/entrypoints/types.js +2 -0
  19. package/build/entrypoints/types.js.map +1 -0
  20. package/build/entrypoints.d.ts +5 -1
  21. package/build/entrypoints.d.ts.map +1 -1
  22. package/build/entrypoints.js +17 -6
  23. package/build/entrypoints.js.map +1 -1
  24. package/build/errors.d.ts +41 -0
  25. package/build/errors.d.ts.map +1 -1
  26. package/build/errors.js +61 -0
  27. package/build/errors.js.map +1 -1
  28. package/build/helpers/apply/consts.local.d.ts +7 -0
  29. package/build/helpers/apply/consts.local.d.ts.map +1 -0
  30. package/build/helpers/apply/consts.local.js +9 -0
  31. package/build/helpers/apply/consts.local.js.map +1 -0
  32. package/build/helpers/apply/types.d.ts +32 -0
  33. package/build/helpers/apply/types.d.ts.map +1 -0
  34. package/build/helpers/apply/types.js +2 -0
  35. package/build/helpers/apply/types.js.map +1 -0
  36. package/build/helpers/apply.d.ts +5 -23
  37. package/build/helpers/apply.d.ts.map +1 -1
  38. package/build/helpers/apply.js +121 -143
  39. package/build/helpers/apply.js.map +1 -1
  40. package/build/helpers/card/types.d.ts +20 -0
  41. package/build/helpers/card/types.d.ts.map +1 -0
  42. package/build/helpers/card/types.js +2 -0
  43. package/build/helpers/card/types.js.map +1 -0
  44. package/build/helpers/card.d.ts +11 -7
  45. package/build/helpers/card.d.ts.map +1 -1
  46. package/build/helpers/card.js +41 -28
  47. package/build/helpers/card.js.map +1 -1
  48. package/build/helpers/changes/consts.local.d.ts +13 -0
  49. package/build/helpers/changes/consts.local.d.ts.map +1 -0
  50. package/build/helpers/changes/consts.local.js +13 -0
  51. package/build/helpers/changes/consts.local.js.map +1 -0
  52. package/build/helpers/changes/types.d.ts +58 -0
  53. package/build/helpers/changes/types.d.ts.map +1 -0
  54. package/build/helpers/changes/types.js +2 -0
  55. package/build/helpers/changes/types.js.map +1 -0
  56. package/build/helpers/changes.d.ts +11 -42
  57. package/build/helpers/changes.d.ts.map +1 -1
  58. package/build/helpers/changes.js +234 -251
  59. package/build/helpers/changes.js.map +1 -1
  60. package/build/helpers/code/types.d.ts +27 -0
  61. package/build/helpers/code/types.d.ts.map +1 -0
  62. package/build/helpers/code/types.js +2 -0
  63. package/build/helpers/code/types.js.map +1 -0
  64. package/build/helpers/code.d.ts +6 -17
  65. package/build/helpers/code.d.ts.map +1 -1
  66. package/build/helpers/code.js +39 -40
  67. package/build/helpers/code.js.map +1 -1
  68. package/build/helpers/index.d.ts +12 -0
  69. package/build/helpers/index.d.ts.map +1 -1
  70. package/build/helpers/index.js +2 -0
  71. package/build/helpers/index.js.map +1 -1
  72. package/build/helpers/query/types.d.ts +23 -0
  73. package/build/helpers/query/types.d.ts.map +1 -0
  74. package/build/helpers/query/types.js +2 -0
  75. package/build/helpers/query/types.js.map +1 -0
  76. package/build/helpers/query.d.ts +25 -17
  77. package/build/helpers/query.d.ts.map +1 -1
  78. package/build/helpers/query.js +108 -280
  79. package/build/helpers/query.js.map +1 -1
  80. package/build/helpers/scoped/types.d.ts +59 -0
  81. package/build/helpers/scoped/types.d.ts.map +1 -0
  82. package/build/helpers/scoped/types.js +2 -0
  83. package/build/helpers/scoped/types.js.map +1 -0
  84. package/build/helpers/scoped.d.ts +24 -0
  85. package/build/helpers/scoped.d.ts.map +1 -0
  86. package/build/helpers/scoped.js +197 -0
  87. package/build/helpers/scoped.js.map +1 -0
  88. package/build/helpers/specification/types.d.ts +24 -0
  89. package/build/helpers/specification/types.d.ts.map +1 -0
  90. package/build/helpers/specification/types.js +2 -0
  91. package/build/helpers/specification/types.js.map +1 -0
  92. package/build/helpers/specification.d.ts +9 -13
  93. package/build/helpers/specification.d.ts.map +1 -1
  94. package/build/helpers/specification.js +47 -44
  95. package/build/helpers/specification.js.map +1 -1
  96. package/build/helpers/status/types.d.ts +48 -0
  97. package/build/helpers/status/types.d.ts.map +1 -0
  98. package/build/helpers/status/types.js +2 -0
  99. package/build/helpers/status/types.js.map +1 -0
  100. package/build/helpers/status.d.ts +16 -29
  101. package/build/helpers/status.d.ts.map +1 -1
  102. package/build/helpers/status.js +77 -73
  103. package/build/helpers/status.js.map +1 -1
  104. package/build/helpers/types.local.d.ts +17 -0
  105. package/build/helpers/types.local.d.ts.map +1 -0
  106. package/build/helpers/types.local.js +2 -0
  107. package/build/helpers/types.local.js.map +1 -0
  108. package/build/helpers/validate/types.d.ts +30 -0
  109. package/build/helpers/validate/types.d.ts.map +1 -0
  110. package/build/helpers/validate/types.js +2 -0
  111. package/build/helpers/validate/types.js.map +1 -0
  112. package/build/helpers/validate.d.ts +8 -19
  113. package/build/helpers/validate.d.ts.map +1 -1
  114. package/build/helpers/validate.js +74 -79
  115. package/build/helpers/validate.js.map +1 -1
  116. package/build/helpers/wire/types.d.ts +28 -0
  117. package/build/helpers/wire/types.d.ts.map +1 -0
  118. package/build/helpers/wire/types.js +2 -0
  119. package/build/helpers/wire/types.js.map +1 -0
  120. package/build/helpers/wire.d.ts +4 -0
  121. package/build/helpers/wire.d.ts.map +1 -0
  122. package/build/helpers/wire.js +215 -0
  123. package/build/helpers/wire.js.map +1 -0
  124. package/build/i18n/be.json +5 -0
  125. package/build/i18n/de.json +5 -0
  126. package/build/i18n/en.json +5 -0
  127. package/build/i18n/es.json +5 -0
  128. package/build/i18n/fr.json +56 -0
  129. package/build/i18n/pl.json +5 -0
  130. package/build/i18n/ru.json +5 -0
  131. package/build/i18n/uk.json +5 -0
  132. package/build/i18n.js +5 -4
  133. package/build/i18n.js.map +1 -1
  134. package/build/index.d.ts +4 -0
  135. package/build/index.d.ts.map +1 -1
  136. package/build/index.js +2 -0
  137. package/build/index.js.map +1 -1
  138. package/build/models/index.d.ts +2 -3
  139. package/build/models/index.d.ts.map +1 -1
  140. package/build/models/index.js +1 -15
  141. package/build/models/index.js.map +1 -1
  142. package/build/models/model.d.ts +5 -0
  143. package/build/models/model.d.ts.map +1 -0
  144. package/build/models/model.js +16 -0
  145. package/build/models/model.js.map +1 -0
  146. package/build/models/project.d.ts +2 -1
  147. package/build/models/project.d.ts.map +1 -1
  148. package/build/models/project.js.map +1 -1
  149. package/build/models/specification.d.ts +2 -1
  150. package/build/models/specification.d.ts.map +1 -1
  151. package/build/models/specification.js.map +1 -1
  152. package/build/models/types.d.ts +69 -0
  153. package/build/models/types.d.ts.map +1 -0
  154. package/build/models/types.js +2 -0
  155. package/build/models/types.js.map +1 -0
  156. package/build/models/workcard.d.ts +2 -1
  157. package/build/models/workcard.d.ts.map +1 -1
  158. package/build/models/workcard.js +12 -12
  159. package/build/models/workcard.js.map +1 -1
  160. package/build/schemas.d.ts +10 -2
  161. package/build/schemas.d.ts.map +1 -1
  162. package/build/schemas.js +87 -1
  163. package/build/schemas.js.map +1 -1
  164. package/build/types.d.ts +199 -148
  165. package/build/types.d.ts.map +1 -1
  166. package/build/utils.d.ts +6 -0
  167. package/build/utils.d.ts.map +1 -0
  168. package/build/utils.js +6 -0
  169. package/build/utils.js.map +1 -0
  170. package/package.json +11 -11
  171. package/src/aliases/types.ts +38 -0
  172. package/src/aliases.ts +31 -0
  173. package/src/consts.ts +26 -25
  174. package/src/entrypoints/types.ts +68 -0
  175. package/src/entrypoints.ts +34 -14
  176. package/src/errors.ts +71 -0
  177. package/src/helpers/apply/consts.local.ts +10 -0
  178. package/src/helpers/apply/types.ts +32 -0
  179. package/src/helpers/apply.ts +135 -152
  180. package/src/helpers/card/types.ts +20 -0
  181. package/src/helpers/card.ts +59 -33
  182. package/src/helpers/changes/consts.local.ts +17 -0
  183. package/src/helpers/changes/types.ts +66 -0
  184. package/src/helpers/changes.ts +267 -280
  185. package/src/helpers/code/types.ts +31 -0
  186. package/src/helpers/code.ts +52 -48
  187. package/src/helpers/index.ts +13 -0
  188. package/src/helpers/query/types.ts +26 -0
  189. package/src/helpers/query.ts +144 -314
  190. package/src/helpers/scoped/types.ts +64 -0
  191. package/src/helpers/scoped.ts +257 -0
  192. package/src/helpers/specification/types.ts +26 -0
  193. package/src/helpers/specification.ts +69 -51
  194. package/src/helpers/status/types.ts +46 -0
  195. package/src/helpers/status.ts +117 -93
  196. package/src/helpers/types.local.ts +18 -0
  197. package/src/helpers/validate/types.ts +30 -0
  198. package/src/helpers/validate.ts +84 -77
  199. package/src/helpers/wire/types.ts +31 -0
  200. package/src/helpers/wire.ts +251 -0
  201. package/src/i18n/be.json +5 -0
  202. package/src/i18n/de.json +5 -0
  203. package/src/i18n/en.json +5 -0
  204. package/src/i18n/es.json +5 -0
  205. package/src/i18n/fr.json +56 -0
  206. package/src/i18n/pl.json +5 -0
  207. package/src/i18n/ru.json +5 -0
  208. package/src/i18n/uk.json +5 -0
  209. package/src/i18n.ts +6 -4
  210. package/src/index.ts +4 -0
  211. package/src/models/index.ts +2 -17
  212. package/src/models/model.ts +18 -0
  213. package/src/models/project.ts +2 -1
  214. package/src/models/specification.ts +2 -1
  215. package/src/models/types.ts +70 -0
  216. package/src/models/workcard.ts +14 -16
  217. package/src/schemas.ts +98 -2
  218. package/src/types.ts +207 -126
  219. package/src/utils.ts +9 -0
  220. package/tests/apply.spec.ts +95 -31
  221. package/tests/code.spec.ts +9 -9
  222. package/tests/entrypoints.spec.ts +18 -2
  223. package/tests/error-status.spec.ts +6 -1
  224. package/tests/models.spec.ts +16 -15
  225. package/tests/query.spec.ts +13 -15
  226. package/tests/schemas.spec.ts +8 -8
  227. package/tests/scoped.spec.ts +154 -0
  228. package/tests/status.spec.ts +31 -22
@@ -2,65 +2,69 @@ import { createIdOfLength, generateWordSlug, IdStyle, nextSlugCandidate } from '
2
2
  import { CODE_MAX, CODE_MINT_ATTEMPTS, CodeScope, CodeStyle, DEFAULT_CODE_LENGTH } from '../consts.js'
3
3
  import { CodeTaken } from '../errors.js'
4
4
  import type { CodePolicy, WorkcardDraft } from '../types.js'
5
+ import type { CodeHelper, MintCodeOptions } from './code/types.js'
5
6
 
6
- export interface MintCodeOptions {
7
- /** Slug style: the text the slug is derived from (a title). A word slug when omitted. */
8
- seed?: string
9
- /** Sequential style: how many codes the scope already holds. */
10
- count?: number
11
- }
12
-
13
- /** `Some Title!` → `some-title`. */
14
- export const slugOf = (text: string, max: number = CODE_MAX): string => text
15
- .normalize('NFKD').replace(/[̀-ͯ]/g, '')
16
- .toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')
17
- .slice(0, max).replace(/-+$/g, '')
7
+ export const createCodeHelper = (): CodeHelper => {
8
+ const slugOf = (text: string, max: number = CODE_MAX): string => text
9
+ .normalize('NFKD').replace(/[̀-ͯ]/g, '')
10
+ .toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')
11
+ .slice(0, max).replace(/-+$/g, '')
18
12
 
19
- const candidateOf = (policy: CodePolicy, attempt: number, base: string, opts?: MintCodeOptions): string => {
20
- const prefix = policy.prefix ?? ''
21
- switch (policy.style) {
22
- case CodeStyle.Slug:
23
- return `${prefix}${nextSlugCandidate(base, attempt + 1)}`
24
- case CodeStyle.Sequential: {
25
- const number = `${(opts?.count ?? 0) + attempt + 1}`
26
- return `${prefix}${policy.length != null ? number.padStart(policy.length, '0') : number}`
13
+ const candidateOf = (policy: CodePolicy, attempt: number, base: string, opts?: MintCodeOptions): string => {
14
+ const prefix = policy.prefix ?? ''
15
+ switch (policy.style) {
16
+ case CodeStyle.Slug:
17
+ return `${prefix}${nextSlugCandidate(base, attempt + 1)}`
18
+ case CodeStyle.Sequential: {
19
+ const number = `${(opts?.count ?? 0) + attempt + 1}`
20
+ return `${prefix}${policy.length != null ? number.padStart(policy.length, '0') : number}`
21
+ }
22
+ case CodeStyle.Random:
23
+ default: {
24
+ const random = createIdOfLength(policy.length ?? DEFAULT_CODE_LENGTH, IdStyle.Base58)
25
+ return `${prefix}${policy.uppercase === true ? random.toUpperCase() : random}`
26
+ }
27
27
  }
28
- case CodeStyle.Random:
29
- default: {
30
- const random = createIdOfLength(policy.length ?? DEFAULT_CODE_LENGTH, IdStyle.Base58)
31
- return `${prefix}${policy.uppercase === true ? random.toUpperCase() : random}`
28
+ }
29
+
30
+ const mintCode = async (
31
+ policy: CodePolicy,
32
+ taken: (code: string) => boolean | Promise<boolean>,
33
+ attempts: number = CODE_MINT_ATTEMPTS,
34
+ opts?: MintCodeOptions
35
+ ): Promise<string> => {
36
+ const seeded = opts?.seed != null ? slugOf(opts.seed, CODE_MAX - (policy.prefix?.length ?? 0) - 4) : ''
37
+ const base = policy.style === CodeStyle.Slug ? (seeded !== '' ? seeded : generateWordSlug()) : ''
38
+
39
+ for (let attempt = 0; attempt < attempts; ++attempt) {
40
+ const candidate = candidateOf(policy, attempt, base, opts)
41
+ if (!await taken(candidate)) {
42
+ return candidate
43
+ }
32
44
  }
45
+
46
+ throw new CodeTaken(`${policy.style}:${policy.prefix ?? ''}:${attempts}`)
33
47
  }
48
+
49
+ const codeScopeOf = (policy: CodePolicy, draft: Pick<WorkcardDraft, 'parent'>): { parent?: string } =>
50
+ policy.uniqueWithin === CodeScope.Parent ? { parent: draft.parent } : {}
51
+
52
+ return { slugOf, mintCode, codeScopeOf }
34
53
  }
35
54
 
36
- /**
37
- * Mint a code under a policy, asking `taken` for each candidate.
38
- *
39
- * `random` draws `prefix + Base58(length)` (upper-cased when asked) afresh per attempt; `slug`
40
- * walks `base`, `base-2`, `base-3` from the seed (a word slug without one); `sequential` counts on
41
- * from `opts.count`, zero-padded to `length`. After `attempts` taken candidates it refuses.
42
- *
43
- * @throws {CodeTaken}
44
- */
55
+ export const codeHelper = createCodeHelper()
56
+
57
+ /** @deprecated compat:factory-refactor — use `codeHelper.slugOf(…)` */
58
+ export const slugOf = (text: string, max: number = CODE_MAX): string => codeHelper.slugOf(text, max)
59
+
60
+ /** @deprecated compat:factory-refactor — use `codeHelper.mintCode(…)` */
45
61
  export const mintCode = async (
46
62
  policy: CodePolicy,
47
63
  taken: (code: string) => boolean | Promise<boolean>,
48
64
  attempts: number = CODE_MINT_ATTEMPTS,
49
65
  opts?: MintCodeOptions
50
- ): Promise<string> => {
51
- const seeded = opts?.seed != null ? slugOf(opts.seed, CODE_MAX - (policy.prefix?.length ?? 0) - 4) : ''
52
- const base = policy.style === CodeStyle.Slug ? (seeded !== '' ? seeded : generateWordSlug()) : ''
53
-
54
- for (let attempt = 0; attempt < attempts; ++attempt) {
55
- const candidate = candidateOf(policy, attempt, base, opts)
56
- if (!await taken(candidate)) {
57
- return candidate
58
- }
59
- }
60
-
61
- throw new CodeTaken(`${policy.style}:${policy.prefix ?? ''}:${attempts}`)
62
- }
66
+ ): Promise<string> => await codeHelper.mintCode(policy, taken, attempts, opts)
63
67
 
64
- /** Where a draft's code must be unique: its parent, or the whole entity. */
68
+ /** @deprecated compat:factory-refactor — use `codeHelper.codeScopeOf(…)` */
65
69
  export const codeScopeOf = (policy: CodePolicy, draft: Pick<WorkcardDraft, 'parent'>): { parent?: string } =>
66
- policy.uniqueWithin === CodeScope.Parent ? { parent: draft.parent } : {}
70
+ codeHelper.codeScopeOf(policy, draft)
@@ -1,8 +1,21 @@
1
+ export type * from './apply/types.js'
2
+ export type * from './card/types.js'
3
+ export type * from './changes/types.js'
4
+ export type * from './code/types.js'
5
+ export type * from './query/types.js'
6
+ export type * from './scoped/types.js'
7
+ export type * from './specification/types.js'
8
+ export type * from './status/types.js'
9
+ export type * from './validate/types.js'
10
+ export type * from './wire/types.js'
11
+
1
12
  export * from './apply.js'
2
13
  export * from './card.js'
3
14
  export * from './changes.js'
4
15
  export * from './code.js'
5
16
  export * from './query.js'
17
+ export * from './scoped.js'
6
18
  export * from './specification.js'
7
19
  export * from './status.js'
8
20
  export * from './validate.js'
21
+ export * from './wire.js'
@@ -0,0 +1,26 @@
1
+ import type { Criteria, ListOptions, ResourceRecord } from '@owlmeans/resource'
2
+ import type {
3
+ RelationshipQuery, RelationshipWhere, Specification, SpecificationQuery, SummaryView, TransitionQuery,
4
+ TransitionWhere, Workcard, WorkcardQuery,
5
+ } from '../../types.js'
6
+ import type { Scope } from '../types.local.js'
7
+
8
+ /** The ONE translation of a planning query into the store's criteria, and the views read from it. */
9
+ export interface QueryHelper {
10
+ /**
11
+ * `WorkcardQuery` → `Criteria<Workcard>` — the ONE translation every store answers, so a query
12
+ * means the same thing in memory, in Mongo and in a client mirror.
13
+ *
14
+ * `entityId` always comes from the scope (a query that forgot it would be a cross-tenant read);
15
+ * `undefined` values are omitted. Paging and sorting are {@link QueryHelper.listOptionsOf}'s.
16
+ */
17
+ criteriaOf: (query?: WorkcardQuery | null, scope?: Scope) => Criteria<Workcard>
18
+ /** Paging and sorting out of a query. `size: 0` (no limit) survives. */
19
+ listOptionsOf: <T extends ResourceRecord>(query?: ListOptions<T> | null) => ListOptions<T>
20
+ /** The criteria over a parent's specifications. */
21
+ specCriteriaOf: (parent: string, query?: SpecificationQuery | null, scope?: Scope) => Criteria<Specification>
22
+ linkWhereOf: (query: RelationshipQuery | null | undefined, scope: Scope) => RelationshipWhere
23
+ transitionWhereOf: (query: TransitionQuery | null | undefined, scope: Scope) => TransitionWhere
24
+ /** Counts of DIRECT children (`card.parent`) per parent, by intrinsic state. No key for a parent with none. */
25
+ summaryOf: (cards: Workcard[], parents: string[]) => SummaryView
26
+ }