@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.
- package/README.md +69 -26
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/planning/SKILL.md +157 -45
- package/build/aliases/types.d.ts +49 -0
- package/build/aliases/types.d.ts.map +1 -0
- package/build/aliases/types.js +2 -0
- package/build/aliases/types.js.map +1 -0
- package/build/aliases.d.ts +4 -0
- package/build/aliases.d.ts.map +1 -0
- package/build/aliases.js +27 -0
- package/build/aliases.js.map +1 -0
- package/build/consts.d.ts +23 -34
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +26 -25
- package/build/consts.js.map +1 -1
- package/build/entrypoints/types.d.ts +96 -0
- package/build/entrypoints/types.d.ts.map +1 -0
- package/build/entrypoints/types.js +2 -0
- package/build/entrypoints/types.js.map +1 -0
- package/build/entrypoints.d.ts +5 -1
- package/build/entrypoints.d.ts.map +1 -1
- package/build/entrypoints.js +17 -6
- package/build/entrypoints.js.map +1 -1
- package/build/errors.d.ts +41 -0
- package/build/errors.d.ts.map +1 -1
- package/build/errors.js +61 -0
- package/build/errors.js.map +1 -1
- package/build/helpers/apply/consts.local.d.ts +7 -0
- package/build/helpers/apply/consts.local.d.ts.map +1 -0
- package/build/helpers/apply/consts.local.js +9 -0
- package/build/helpers/apply/consts.local.js.map +1 -0
- package/build/helpers/apply/types.d.ts +32 -0
- package/build/helpers/apply/types.d.ts.map +1 -0
- package/build/helpers/apply/types.js +2 -0
- package/build/helpers/apply/types.js.map +1 -0
- package/build/helpers/apply.d.ts +5 -23
- package/build/helpers/apply.d.ts.map +1 -1
- package/build/helpers/apply.js +121 -143
- package/build/helpers/apply.js.map +1 -1
- package/build/helpers/card/types.d.ts +20 -0
- package/build/helpers/card/types.d.ts.map +1 -0
- package/build/helpers/card/types.js +2 -0
- package/build/helpers/card/types.js.map +1 -0
- package/build/helpers/card.d.ts +11 -7
- package/build/helpers/card.d.ts.map +1 -1
- package/build/helpers/card.js +41 -28
- package/build/helpers/card.js.map +1 -1
- package/build/helpers/changes/consts.local.d.ts +13 -0
- package/build/helpers/changes/consts.local.d.ts.map +1 -0
- package/build/helpers/changes/consts.local.js +13 -0
- package/build/helpers/changes/consts.local.js.map +1 -0
- package/build/helpers/changes/types.d.ts +58 -0
- package/build/helpers/changes/types.d.ts.map +1 -0
- package/build/helpers/changes/types.js +2 -0
- package/build/helpers/changes/types.js.map +1 -0
- package/build/helpers/changes.d.ts +11 -42
- package/build/helpers/changes.d.ts.map +1 -1
- package/build/helpers/changes.js +234 -251
- package/build/helpers/changes.js.map +1 -1
- package/build/helpers/code/types.d.ts +27 -0
- package/build/helpers/code/types.d.ts.map +1 -0
- package/build/helpers/code/types.js +2 -0
- package/build/helpers/code/types.js.map +1 -0
- package/build/helpers/code.d.ts +6 -17
- package/build/helpers/code.d.ts.map +1 -1
- package/build/helpers/code.js +39 -40
- package/build/helpers/code.js.map +1 -1
- package/build/helpers/index.d.ts +12 -0
- package/build/helpers/index.d.ts.map +1 -1
- package/build/helpers/index.js +2 -0
- package/build/helpers/index.js.map +1 -1
- package/build/helpers/query/types.d.ts +23 -0
- package/build/helpers/query/types.d.ts.map +1 -0
- package/build/helpers/query/types.js +2 -0
- package/build/helpers/query/types.js.map +1 -0
- package/build/helpers/query.d.ts +25 -17
- package/build/helpers/query.d.ts.map +1 -1
- package/build/helpers/query.js +108 -280
- package/build/helpers/query.js.map +1 -1
- package/build/helpers/scoped/types.d.ts +59 -0
- package/build/helpers/scoped/types.d.ts.map +1 -0
- package/build/helpers/scoped/types.js +2 -0
- package/build/helpers/scoped/types.js.map +1 -0
- package/build/helpers/scoped.d.ts +24 -0
- package/build/helpers/scoped.d.ts.map +1 -0
- package/build/helpers/scoped.js +197 -0
- package/build/helpers/scoped.js.map +1 -0
- package/build/helpers/specification/types.d.ts +24 -0
- package/build/helpers/specification/types.d.ts.map +1 -0
- package/build/helpers/specification/types.js +2 -0
- package/build/helpers/specification/types.js.map +1 -0
- package/build/helpers/specification.d.ts +9 -13
- package/build/helpers/specification.d.ts.map +1 -1
- package/build/helpers/specification.js +47 -44
- package/build/helpers/specification.js.map +1 -1
- package/build/helpers/status/types.d.ts +48 -0
- package/build/helpers/status/types.d.ts.map +1 -0
- package/build/helpers/status/types.js +2 -0
- package/build/helpers/status/types.js.map +1 -0
- package/build/helpers/status.d.ts +16 -29
- package/build/helpers/status.d.ts.map +1 -1
- package/build/helpers/status.js +77 -73
- package/build/helpers/status.js.map +1 -1
- package/build/helpers/types.local.d.ts +17 -0
- package/build/helpers/types.local.d.ts.map +1 -0
- package/build/helpers/types.local.js +2 -0
- package/build/helpers/types.local.js.map +1 -0
- package/build/helpers/validate/types.d.ts +30 -0
- package/build/helpers/validate/types.d.ts.map +1 -0
- package/build/helpers/validate/types.js +2 -0
- package/build/helpers/validate/types.js.map +1 -0
- package/build/helpers/validate.d.ts +8 -19
- package/build/helpers/validate.d.ts.map +1 -1
- package/build/helpers/validate.js +74 -79
- package/build/helpers/validate.js.map +1 -1
- package/build/helpers/wire/types.d.ts +28 -0
- package/build/helpers/wire/types.d.ts.map +1 -0
- package/build/helpers/wire/types.js +2 -0
- package/build/helpers/wire/types.js.map +1 -0
- package/build/helpers/wire.d.ts +4 -0
- package/build/helpers/wire.d.ts.map +1 -0
- package/build/helpers/wire.js +215 -0
- package/build/helpers/wire.js.map +1 -0
- package/build/i18n/be.json +5 -0
- package/build/i18n/de.json +5 -0
- package/build/i18n/en.json +5 -0
- package/build/i18n/es.json +5 -0
- package/build/i18n/fr.json +56 -0
- package/build/i18n/pl.json +5 -0
- package/build/i18n/ru.json +5 -0
- package/build/i18n/uk.json +5 -0
- package/build/i18n.js +5 -4
- package/build/i18n.js.map +1 -1
- package/build/index.d.ts +4 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/build/models/index.d.ts +2 -3
- package/build/models/index.d.ts.map +1 -1
- package/build/models/index.js +1 -15
- package/build/models/index.js.map +1 -1
- package/build/models/model.d.ts +5 -0
- package/build/models/model.d.ts.map +1 -0
- package/build/models/model.js +16 -0
- package/build/models/model.js.map +1 -0
- package/build/models/project.d.ts +2 -1
- package/build/models/project.d.ts.map +1 -1
- package/build/models/project.js.map +1 -1
- package/build/models/specification.d.ts +2 -1
- package/build/models/specification.d.ts.map +1 -1
- package/build/models/specification.js.map +1 -1
- package/build/models/types.d.ts +69 -0
- package/build/models/types.d.ts.map +1 -0
- package/build/models/types.js +2 -0
- package/build/models/types.js.map +1 -0
- package/build/models/workcard.d.ts +2 -1
- package/build/models/workcard.d.ts.map +1 -1
- package/build/models/workcard.js +12 -12
- package/build/models/workcard.js.map +1 -1
- package/build/schemas.d.ts +10 -2
- package/build/schemas.d.ts.map +1 -1
- package/build/schemas.js +87 -1
- package/build/schemas.js.map +1 -1
- package/build/types.d.ts +199 -148
- package/build/types.d.ts.map +1 -1
- package/build/utils.d.ts +6 -0
- package/build/utils.d.ts.map +1 -0
- package/build/utils.js +6 -0
- package/build/utils.js.map +1 -0
- package/package.json +11 -11
- package/src/aliases/types.ts +38 -0
- package/src/aliases.ts +31 -0
- package/src/consts.ts +26 -25
- package/src/entrypoints/types.ts +68 -0
- package/src/entrypoints.ts +34 -14
- package/src/errors.ts +71 -0
- package/src/helpers/apply/consts.local.ts +10 -0
- package/src/helpers/apply/types.ts +32 -0
- package/src/helpers/apply.ts +135 -152
- package/src/helpers/card/types.ts +20 -0
- package/src/helpers/card.ts +59 -33
- package/src/helpers/changes/consts.local.ts +17 -0
- package/src/helpers/changes/types.ts +66 -0
- package/src/helpers/changes.ts +267 -280
- package/src/helpers/code/types.ts +31 -0
- package/src/helpers/code.ts +52 -48
- package/src/helpers/index.ts +13 -0
- package/src/helpers/query/types.ts +26 -0
- package/src/helpers/query.ts +144 -314
- package/src/helpers/scoped/types.ts +64 -0
- package/src/helpers/scoped.ts +257 -0
- package/src/helpers/specification/types.ts +26 -0
- package/src/helpers/specification.ts +69 -51
- package/src/helpers/status/types.ts +46 -0
- package/src/helpers/status.ts +117 -93
- package/src/helpers/types.local.ts +18 -0
- package/src/helpers/validate/types.ts +30 -0
- package/src/helpers/validate.ts +84 -77
- package/src/helpers/wire/types.ts +31 -0
- package/src/helpers/wire.ts +251 -0
- package/src/i18n/be.json +5 -0
- package/src/i18n/de.json +5 -0
- package/src/i18n/en.json +5 -0
- package/src/i18n/es.json +5 -0
- package/src/i18n/fr.json +56 -0
- package/src/i18n/pl.json +5 -0
- package/src/i18n/ru.json +5 -0
- package/src/i18n/uk.json +5 -0
- package/src/i18n.ts +6 -4
- package/src/index.ts +4 -0
- package/src/models/index.ts +2 -17
- package/src/models/model.ts +18 -0
- package/src/models/project.ts +2 -1
- package/src/models/specification.ts +2 -1
- package/src/models/types.ts +70 -0
- package/src/models/workcard.ts +14 -16
- package/src/schemas.ts +98 -2
- package/src/types.ts +207 -126
- package/src/utils.ts +9 -0
- package/tests/apply.spec.ts +95 -31
- package/tests/code.spec.ts +9 -9
- package/tests/entrypoints.spec.ts +18 -2
- package/tests/error-status.spec.ts +6 -1
- package/tests/models.spec.ts +16 -15
- package/tests/query.spec.ts +13 -15
- package/tests/schemas.spec.ts +8 -8
- package/tests/scoped.spec.ts +154 -0
- package/tests/status.spec.ts +31 -22
package/src/helpers/code.ts
CHANGED
|
@@ -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
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
/**
|
|
68
|
+
/** @deprecated compat:factory-refactor — use `codeHelper.codeScopeOf(…)` */
|
|
65
69
|
export const codeScopeOf = (policy: CodePolicy, draft: Pick<WorkcardDraft, 'parent'>): { parent?: string } =>
|
|
66
|
-
policy
|
|
70
|
+
codeHelper.codeScopeOf(policy, draft)
|
package/src/helpers/index.ts
CHANGED
|
@@ -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
|
+
}
|