@gitroll/tacitt-cli 0.6.9 → 0.6.10

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 (41) hide show
  1. package/dist/{agent-setup-CODlN6zl.mjs → agent-setup-LPd8WEsN.mjs} +2 -2
  2. package/dist/agent-setup-worker.mjs +5 -5
  3. package/dist/cli.mjs +19 -10
  4. package/dist/codex-title-worker.mjs +1 -1
  5. package/dist/configured-preview-worker.mjs +5 -5
  6. package/dist/configured-session-worker.mjs +5 -5
  7. package/dist/{frame-Dj5Zs6UW.mjs → frame-ByT1xayJ.mjs} +1 -1
  8. package/dist/{heap-Dt3-d27v.mjs → heap-CM298Yu0.mjs} +8 -6
  9. package/dist/inspection-worker.mjs +4 -4
  10. package/dist/{job-BQXssW46.mjs → job-BHIwElNF.mjs} +5 -5
  11. package/dist/{locate-BWkblijS.mjs → locate-Cwv6WH8n.mjs} +25 -2
  12. package/dist/{model-CSx2dP_P.mjs → model-zvn5GUJ9.mjs} +1 -1
  13. package/dist/operation-executor.mjs +3 -3
  14. package/dist/preview-worker.mjs +1 -1
  15. package/dist/privacy-validator.mjs +1 -1
  16. package/dist/{query-CfhcS4gd.mjs → query-By41gaKm.mjs} +424 -145
  17. package/dist/{run-xlOaKCk8.mjs → run-ZQx7p4Rw.mjs} +4 -4
  18. package/dist/{src-V9GHLZQs.mjs → src-3jvMvSQn.mjs} +3 -3
  19. package/dist/{src-DzKuzGVH.mjs → src-BqtdFVq7.mjs} +484 -178
  20. package/dist/{src-BgsEnMsy.mjs → src-D_DfY--2.mjs} +4 -4
  21. package/dist/store-database-worker.mjs +1 -1
  22. package/dist/web/assets/index-B14e6_-z.js +174 -0
  23. package/dist/web/index.html +1 -1
  24. package/package.json +1 -1
  25. package/skills/tacitt/INDEX.md +6 -6
  26. package/skills/tacitt/SKILL.md +2 -2
  27. package/skills/tacitt/references/INDEX.md +3 -3
  28. package/skills/tacitt/references/classification.md +12 -2
  29. package/skills/tacitt/references/commands.md +10 -2
  30. package/skills/tacitt/references/journey.md +9 -1
  31. package/skills/tacitt/references/send.md +29 -8
  32. package/skills/tacitt/scripts/INDEX.md +37 -37
  33. package/skills/tacitt/scripts/journey-classification-validation.d.mts +13 -0
  34. package/skills/tacitt/scripts/journey-classification-validation.mjs +38 -0
  35. package/skills/tacitt/scripts/journey-state.d.mts +6 -0
  36. package/skills/tacitt/scripts/journey-state.mjs +24 -1
  37. package/skills/tacitt/scripts/journey.d.mts +5 -0
  38. package/skills/tacitt/scripts/journey.mjs +33 -3
  39. package/skills/tacitt/scripts/privacy-validator.mjs +11 -1
  40. package/skills/tacitt/scripts/review.mjs +14 -2
  41. package/dist/web/assets/index-9UfCT_2C.js +0 -174
@@ -22,6 +22,7 @@ import {
22
22
  uncoveredPending,
23
23
  } from './journey-state.mjs'
24
24
  import { classificationTasks } from './journey-classification-tasks.mjs'
25
+ import { validateLatePlacedWorks } from './journey-classification-validation.mjs'
25
26
  import { classificationEvidence, classificationFormat } from './journey-classification.mjs'
26
27
  import {
27
28
  consolidateClassification,
@@ -514,7 +515,7 @@ async function runPhaseCore(
514
515
  ? { expectedClassificationRevision: manifest.partial.revision }
515
516
  : {}),
516
517
  ...(stage === 'classification'
517
- ? { [key]: await classificationSubmission(manifest, view) }
518
+ ? { [key]: await classificationItems(manifest, view) }
518
519
  : stage === 'cards'
519
520
  ? cards
520
521
  : { [key]: await answers(tasks, key) }),
@@ -549,6 +550,16 @@ async function runPhaseCore(
549
550
  return { stage, status: result.status, revision: result.state?.revision }
550
551
  }
551
552
 
553
+ /**
554
+ * The complete proposal, checked before commit: after scope confirmation an item never joins
555
+ * placed Works with different visibility (ADR 0274), which CLI would refuse.
556
+ */
557
+ async function classificationItems(manifest, view) {
558
+ const items = await classificationSubmission(manifest, view)
559
+ if (view.scope?.status === 'confirmed') validateLatePlacedWorks(items, view.works)
560
+ return items
561
+ }
562
+
552
563
  /** Classification published known Works and is still grouping the remaining roots (E2). */
553
564
  const grouping = (view) => view.works.some((work) => work.placement === 'classifying')
554
565
 
@@ -591,6 +602,7 @@ async function ingestKnownWorks(directory, manifest, view, call, partial) {
591
602
 
592
603
  const terminalClassificationErrors = new Set([
593
604
  'INVALID_SELECTION',
605
+ 'CLASSIFICATION_LATE_SEVERAL_WORKS',
594
606
  'CLASSIFICATION_PROJECT_NAME_CONFLICT',
595
607
  'CLASSIFICATION_ROOT_COVERAGE_INVALID',
596
608
  'CLASSIFICATION_THEME_TOO_SMALL',
@@ -665,13 +677,31 @@ export async function main(argv) {
665
677
  ),
666
678
  )
667
679
  }
680
+ const safeId = /^[A-Za-z0-9._:-]{1,128}$/u
681
+ /**
682
+ * Stderr for a failed command: the code, and for CLASSIFICATION_LATE_SEVERAL_WORKS one line per
683
+ * refused item with its index and the placed Work ids, never a title or path (ADR 0274).
684
+ */
685
+ export function failureOutput(error) {
686
+ const message = error?.message ?? ''
687
+ const code = /^[A-Z_]{3,80}$/u.test(message) ? message : 'JOURNEY_HELPER_FAILED'
688
+ const lines = [code]
689
+ if (code === 'CLASSIFICATION_LATE_SEVERAL_WORKS')
690
+ for (const conflict of error.conflicts ?? [])
691
+ if (Number.isInteger(conflict.item))
692
+ lines.push(
693
+ `items[${conflict.item}] joins Works ${conflict.workIds
694
+ .map((id) => (safeId.test(id) ? id : '?'))
695
+ .join(', ')}`,
696
+ )
697
+ return lines.join('\n') + '\n'
698
+ }
668
699
  const entry = process.argv[1]
669
700
  if (entry && (await realpath(entry)) === fileURLToPath(import.meta.url))
670
701
  main(process.argv.slice(2)).then(
671
702
  (result) => process.stdout.write(JSON.stringify({ ok: true, ...result }) + '\n'),
672
703
  (error) => {
673
- const code = /^[A-Z_]{3,80}$/u.test(error.message) ? error.message : 'JOURNEY_HELPER_FAILED'
674
- process.stderr.write(code + '\n')
704
+ process.stderr.write(failureOutput(error))
675
705
  process.exitCode = 1
676
706
  },
677
707
  )
@@ -10131,7 +10131,8 @@ const journeyWorkSchema = object({
10131
10131
  "default",
10132
10132
  "model",
10133
10133
  "explicit",
10134
- "delegate"
10134
+ "delegate",
10135
+ "account"
10135
10136
  ]),
10136
10137
  placement: _enum([
10137
10138
  "placed",
@@ -10148,6 +10149,15 @@ const journeyWorkSchema = object({
10148
10149
  grouping: _enum(["workspace", "regrouped"]),
10149
10150
  access: journeyAccessSchema,
10150
10151
  accessConfirmed: boolean(),
10152
+ accessChoice: object({
10153
+ channel: _enum([
10154
+ "conversation",
10155
+ "panel",
10156
+ "account"
10157
+ ]),
10158
+ at: datetime()
10159
+ }).strict().optional(),
10160
+ accountAccessConflict: boolean().optional(),
10151
10161
  reason: string().max(1e3),
10152
10162
  revision: count$1,
10153
10163
  inputRevision: count$1.min(1),
@@ -85,9 +85,21 @@ class HelperError extends Error {
85
85
  super(code)
86
86
  this.code = /^[A-Z_]{3,80}$/u.test(code) ? code : 'HELPER_FAILED'
87
87
  if (
88
- code === 'INVALID_REVIEW_SPAN' &&
89
88
  typeof field === 'string' &&
90
- /^terms\[\d+(?:,\d+){0,31}\]$/u.test(field)
89
+ ((code === 'INVALID_REVIEW_SPAN' && /^terms\[\d+(?:,\d+){0,31}\]$/u.test(field)) ||
90
+ (code === 'INVALID_SELECTION' &&
91
+ [
92
+ 'cards.append.empty',
93
+ 'cards.append.limit',
94
+ 'cards.append.duplicate-card',
95
+ 'cards.append.existing-card',
96
+ 'cards.append.duplicate-extension',
97
+ 'cards.append.unknown-card',
98
+ 'cards.append.duplicate-term',
99
+ 'cards.append.term-not-open',
100
+ 'cards.append.own-identity-card',
101
+ 'cards.append.other-person',
102
+ ].includes(field)))
91
103
  )
92
104
  this.field = field
93
105
  }