@pennyfarthing/core 11.1.0 → 11.1.1

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 (128) hide show
  1. package/README.md +1 -1
  2. package/package.json +16 -14
  3. package/packages/core/dist/cli/utils/constants.d.ts +1 -1
  4. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  5. package/packages/core/dist/cli/utils/constants.js +2 -1
  6. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  7. package/packages/core/dist/consultation/dialogue-manager.d.ts +75 -0
  8. package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -0
  9. package/packages/core/dist/consultation/dialogue-manager.js +334 -0
  10. package/packages/core/dist/consultation/dialogue-manager.js.map +1 -0
  11. package/packages/core/dist/consultation/dialogue-manager.test.d.ts +19 -0
  12. package/packages/core/dist/consultation/dialogue-manager.test.d.ts.map +1 -0
  13. package/packages/core/dist/consultation/dialogue-manager.test.js +444 -0
  14. package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -0
  15. package/packages/core/dist/server/api/git.d.ts +13 -1
  16. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  17. package/packages/core/dist/server/api/git.js +53 -34
  18. package/packages/core/dist/server/api/git.js.map +1 -1
  19. package/packages/core/dist/shared/skill-search.test.js +2 -2
  20. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
  21. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
  22. package/pennyfarthing-dist/scripts/core/dialogue-manager.sh +322 -0
  23. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
  24. package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
  25. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  26. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
  27. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
  28. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +0 -0
  29. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  30. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
  31. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  32. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
  33. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  34. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  35. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  36. package/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh +0 -0
  37. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
  38. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
  39. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
  40. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  41. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  42. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  43. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  44. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  45. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
  46. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  47. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  48. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
  49. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
  50. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
  51. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  52. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
  53. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  54. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  55. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  56. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  57. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  58. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  59. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  60. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  61. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  62. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  63. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  64. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  65. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  66. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  67. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  68. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  69. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  70. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  71. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
  72. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  73. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  74. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  75. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  76. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  77. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  78. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
  79. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  80. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -0
  81. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -0
  82. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  83. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  84. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  85. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  86. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  87. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  88. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -0
  89. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  90. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  91. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  92. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  93. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  94. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
  95. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  96. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  97. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  98. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  99. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  100. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
  101. package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
  102. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  103. package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
  104. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -0
  105. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
  106. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  107. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
  108. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
  109. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
  110. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
  111. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
  112. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
  113. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
  114. package/pennyfarthing-dist/skills/pf-story/scripts/create-story.sh +0 -0
  115. package/pennyfarthing-dist/skills/pf-story/scripts/size-story.sh +0 -0
  116. package/pennyfarthing-dist/skills/pf-story/scripts/story-template.sh +0 -0
  117. package/pennyfarthing-dist/skills/pf-workflow/scripts/list-workflows.sh +0 -0
  118. package/pennyfarthing-dist/skills/pf-workflow/scripts/resume-workflow.sh +0 -0
  119. package/pennyfarthing-dist/skills/pf-workflow/scripts/show-workflow.sh +0 -0
  120. package/pennyfarthing-dist/skills/pf-workflow/scripts/start-workflow.sh +0 -0
  121. package/pennyfarthing-dist/skills/pf-workflow/scripts/workflow-status.sh +0 -0
  122. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  123. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  124. package/pennyfarthing_scripts/bikerack/cli.py +10 -11
  125. package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  126. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  127. package/pennyfarthing_scripts/sprint/story_finish.py +14 -0
  128. package/scripts/README.md +41 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Pennyfarthing
2
2
 
3
- **v11.0.0** | *The outer loop goes once, the inner loop goes many times.*
3
+ **v11.1.1** | *The outer loop goes once, the inner loop goes many times.*
4
4
 
5
5
  <img src="pennyfarthing.png" alt="Pennyfarthing Logo" width="75" style="float:left; margin:10px">
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pennyfarthing/core",
3
- "version": "11.1.0",
3
+ "version": "11.1.1",
4
4
  "description": "Claude Code agent framework with TDD workflow and persona system",
5
5
  "type": "module",
6
6
  "bin": {
@@ -30,6 +30,19 @@
30
30
  "bugs": {
31
31
  "url": "https://github.com/1898andCo/pennyfarthing/issues"
32
32
  },
33
+ "scripts": {
34
+ "prepublishOnly": "find pennyfarthing-dist/scripts -name '*.sh' ! -name 'find-root.sh' -exec chmod +x {} +",
35
+ "postinstall": "node scripts/postinstall.cjs",
36
+ "build": "pnpm --filter @pennyfarthing/shared build && pnpm --filter @pennyfarthing/core build && pnpm --filter @pennyfarthing/cyclist build && ./scripts/generate-skill-docs.sh",
37
+ "docs": "./scripts/generate-skill-docs.sh",
38
+ "dev": "pnpm -r --parallel dev",
39
+ "test": "pnpm -r test",
40
+ "lint": "eslint 'packages/*/src/**/*.ts' --max-warnings 0",
41
+ "lint:md": "markdownlint-cli2 'pennyfarthing-dist/**/*.md'",
42
+ "validate:refs": "node scripts/validate-refs.js",
43
+ "test:validate-refs": "node --test scripts/validate-refs.test.js",
44
+ "clean": "pnpm -r clean"
45
+ },
33
46
  "dependencies": {
34
47
  "@pennyfarthing/shared": "^10.0.3",
35
48
  "chalk": "^5.3.0",
@@ -50,16 +63,5 @@
50
63
  "engines": {
51
64
  "node": ">=18.0.0"
52
65
  },
53
- "scripts": {
54
- "postinstall": "node scripts/postinstall.cjs",
55
- "build": "pnpm --filter @pennyfarthing/shared build && pnpm --filter @pennyfarthing/core build && pnpm --filter @pennyfarthing/cyclist build && ./scripts/generate-skill-docs.sh",
56
- "docs": "./scripts/generate-skill-docs.sh",
57
- "dev": "pnpm -r --parallel dev",
58
- "test": "pnpm -r test",
59
- "lint": "eslint 'packages/*/src/**/*.ts' --max-warnings 0",
60
- "lint:md": "markdownlint-cli2 'pennyfarthing-dist/**/*.md'",
61
- "validate:refs": "node scripts/validate-refs.js",
62
- "test:validate-refs": "node --test scripts/validate-refs.test.js",
63
- "clean": "pnpm -r clean"
64
- }
65
- }
66
+ "packageManager": "pnpm@9.0.0"
67
+ }
@@ -5,7 +5,7 @@
5
5
  /**
6
6
  * Core agent types that have sidecars
7
7
  */
8
- export declare const CORE_AGENTS: readonly ["dev", "tea", "sm", "reviewer", "architect", "pm", "tech-writer", "ux-designer", "devops", "orchestrator"];
8
+ export declare const CORE_AGENTS: readonly ["dev", "tea", "sm", "reviewer", "architect", "pm", "tech-writer", "ux-designer", "devops", "orchestrator", "ba"];
9
9
  export type CoreAgent = typeof CORE_AGENTS[number];
10
10
  /**
11
11
  * Symlinks that point directly to node_modules directories
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,sHAWd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAQrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIf,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa,4OAUhB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,4HAYd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAQrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIf,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa,4OAUhB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC"}
@@ -15,7 +15,8 @@ export const CORE_AGENTS = [
15
15
  'tech-writer',
16
16
  'ux-designer',
17
17
  'devops',
18
- 'orchestrator'
18
+ 'orchestrator',
19
+ 'ba'
19
20
  ];
20
21
  /**
21
22
  * Symlinks that point directly to node_modules directories
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,KAAK;IACL,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,aAAa;IACb,aAAa;IACb,QAAQ;IACR,cAAc;CACN,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAC/C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAC/C,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,kBAAkB;IACrB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;CAClC,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,gBAAgB;IAChB,uBAAuB;IACvB,sBAAsB;IACtB,uBAAuB;IACvB,8BAA8B;IAC9B,yBAAyB;IACzB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,KAAK;IACL,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,aAAa;IACb,aAAa;IACb,QAAQ;IACR,cAAc;IACd,IAAI;CACI,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAC/C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAC/C,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,kBAAkB;IACrB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;CAClC,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,gBAAgB;IAChB,uBAAuB;IACvB,sBAAsB;IACtB,uBAAuB;IACvB,8BAA8B;IAC9B,yBAAyB;IACzB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Dialogue File Management for Story 86-3
3
+ *
4
+ * Persistence layer for tandem agent consultation exchanges.
5
+ * Creates, appends, and archives dialogue files following the format
6
+ * defined in ADR-0012 (lines 156-195).
7
+ *
8
+ * All functions are pure or use simple file I/O — no external dependencies.
9
+ */
10
+ export type Outcome = 'applied' | 'deferred' | 'rejected';
11
+ export interface DialogueHeader {
12
+ storyId: string;
13
+ workflow: string;
14
+ leader: string;
15
+ leaderCharacter?: string;
16
+ partner: string;
17
+ partnerCharacter?: string;
18
+ startedAt: string;
19
+ }
20
+ export interface DialogueExchange {
21
+ number: number;
22
+ timestamp: string;
23
+ leader: string;
24
+ partner: string;
25
+ question: string;
26
+ recommendation: string;
27
+ confidence: string;
28
+ outcome?: Outcome;
29
+ outcomeNote?: string;
30
+ }
31
+ export interface DialogueResult {
32
+ success: boolean;
33
+ data?: Record<string, unknown>;
34
+ error?: string;
35
+ }
36
+ interface ArchiveParams {
37
+ dialoguePath: string;
38
+ archiveDir: string;
39
+ jiraKey?: string;
40
+ storyId?: string;
41
+ }
42
+ /**
43
+ * Create initial dialogue file content with header and empty summary.
44
+ */
45
+ export declare function createDialogueContent(header: DialogueHeader): string;
46
+ /**
47
+ * Format a single exchange as markdown block.
48
+ */
49
+ export declare function formatExchange(exchange: DialogueExchange): string;
50
+ /**
51
+ * Parse exchanges from dialogue file content.
52
+ */
53
+ export declare function parseDialogueExchanges(content: string): DialogueExchange[];
54
+ /**
55
+ * Generate summary markdown section from exchanges.
56
+ */
57
+ export declare function generateSummary(exchanges: DialogueExchange[], startedAt: string): string;
58
+ /**
59
+ * Append an exchange to a dialogue file. Creates the file if missing.
60
+ */
61
+ export declare function appendExchangeToFile(dialoguePath: string, exchange: DialogueExchange, header?: DialogueHeader): Promise<DialogueResult>;
62
+ /**
63
+ * Update the outcome of a specific exchange in the dialogue file.
64
+ */
65
+ export declare function updateOutcomeInFile(dialoguePath: string, exchangeNum: number, outcome: Outcome, note?: string): Promise<DialogueResult>;
66
+ /**
67
+ * Regenerate the summary section in an existing dialogue file.
68
+ */
69
+ export declare function refreshSummary(dialoguePath: string): Promise<DialogueResult>;
70
+ /**
71
+ * Copy dialogue file to archive directory.
72
+ */
73
+ export declare function archiveDialogue(params: ArchiveParams): Promise<DialogueResult>;
74
+ export {};
75
+ //# sourceMappingURL=dialogue-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogue-manager.d.ts","sourceRoot":"","sources":["../../src/consultation/dialogue-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAqBpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAoBjE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAuG1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA0BxF;AAMD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CA6BzB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAsCzB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6BlF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAoBpF"}
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Dialogue File Management for Story 86-3
3
+ *
4
+ * Persistence layer for tandem agent consultation exchanges.
5
+ * Creates, appends, and archives dialogue files following the format
6
+ * defined in ADR-0012 (lines 156-195).
7
+ *
8
+ * All functions are pure or use simple file I/O — no external dependencies.
9
+ */
10
+ import fs from 'node:fs';
11
+ import path from 'node:path';
12
+ // =============================================================================
13
+ // Constants
14
+ // =============================================================================
15
+ const SUMMARY_MARKER = '## Summary';
16
+ const EXCHANGE_RE = /^## Exchange (\d+)/;
17
+ const OUTCOME_RE = /^\*\*Outcome:\*\*\s+(.+)/;
18
+ const DIRECTION_RE = /^\*\*\[(\d{2}:\d{2})\]\s+(\S+)\s+→\s+(\S+)\*\*/;
19
+ const PARTNER_RESP_RE = /^\*\*\[(\d{2}:\d{2})\]\s+(\S+):\*\*/;
20
+ const CONFIDENCE_RE = /^\*\*Confidence:\*\*\s+(\S+)/;
21
+ // =============================================================================
22
+ // Pure Functions
23
+ // =============================================================================
24
+ /**
25
+ * Create initial dialogue file content with header and empty summary.
26
+ */
27
+ export function createDialogueContent(header) {
28
+ const leaderLabel = header.leaderCharacter
29
+ ? `${header.leader} (${header.leaderCharacter})`
30
+ : header.leader;
31
+ const partnerLabel = header.partnerCharacter
32
+ ? `${header.partner} (${header.partnerCharacter})`
33
+ : header.partner;
34
+ return `# Tandem Dialogue: ${header.storyId}
35
+
36
+ **Workflow:** ${header.workflow}
37
+ **Leader:** ${leaderLabel} | **Partner:** ${partnerLabel}
38
+ **Started:** ${header.startedAt}
39
+
40
+ ---
41
+
42
+ ${SUMMARY_MARKER}
43
+ - **Total exchanges:** 0
44
+ - **Key decisions:** None
45
+ - **Time in tandem:** 0m
46
+ `;
47
+ }
48
+ /**
49
+ * Format a single exchange as markdown block.
50
+ */
51
+ export function formatExchange(exchange) {
52
+ const outcomeText = exchange.outcome
53
+ ? `**Outcome:** ${exchange.outcome}${exchange.outcomeNote ? ` - ${exchange.outcomeNote}` : ''}`
54
+ : '**Outcome:** _pending_';
55
+ return `## Exchange ${exchange.number}
56
+ **[${exchange.timestamp}] ${exchange.leader} → ${exchange.partner}**
57
+
58
+ > ${exchange.question}
59
+
60
+ **[${exchange.timestamp}] ${exchange.partner}:**
61
+
62
+ ${exchange.recommendation}
63
+
64
+ **Confidence:** ${exchange.confidence}
65
+
66
+ ${outcomeText}
67
+
68
+ ---
69
+ `;
70
+ }
71
+ /**
72
+ * Parse exchanges from dialogue file content.
73
+ */
74
+ export function parseDialogueExchanges(content) {
75
+ const exchanges = [];
76
+ const lines = content.split('\n');
77
+ let current = null;
78
+ let inQuestion = false;
79
+ let inRecommendation = false;
80
+ let questionLines = [];
81
+ let recLines = [];
82
+ for (let i = 0; i < lines.length; i++) {
83
+ const line = lines[i];
84
+ // New exchange starts
85
+ const exchangeMatch = line.match(EXCHANGE_RE);
86
+ if (exchangeMatch) {
87
+ if (current && current.number !== undefined) {
88
+ current.question = questionLines.join('\n');
89
+ current.recommendation = recLines.join('\n');
90
+ exchanges.push(current);
91
+ }
92
+ current = { number: parseInt(exchangeMatch[1], 10) };
93
+ questionLines = [];
94
+ recLines = [];
95
+ inQuestion = false;
96
+ inRecommendation = false;
97
+ continue;
98
+ }
99
+ if (!current)
100
+ continue;
101
+ // Leader → Partner direction line
102
+ const dirMatch = line.match(DIRECTION_RE);
103
+ if (dirMatch) {
104
+ current.timestamp = dirMatch[1];
105
+ current.leader = dirMatch[2];
106
+ current.partner = dirMatch[3];
107
+ inQuestion = true;
108
+ inRecommendation = false;
109
+ continue;
110
+ }
111
+ // Partner response line
112
+ const partnerMatch = line.match(PARTNER_RESP_RE);
113
+ if (partnerMatch) {
114
+ inQuestion = false;
115
+ inRecommendation = true;
116
+ continue;
117
+ }
118
+ // Confidence line
119
+ const confMatch = line.match(CONFIDENCE_RE);
120
+ if (confMatch) {
121
+ current.confidence = confMatch[1];
122
+ inRecommendation = false;
123
+ continue;
124
+ }
125
+ // Outcome line
126
+ const outcomeMatch = line.match(OUTCOME_RE);
127
+ if (outcomeMatch) {
128
+ const outcomeRaw = outcomeMatch[1].trim();
129
+ if (outcomeRaw === '_pending_') {
130
+ // No outcome yet
131
+ }
132
+ else {
133
+ const dashIdx = outcomeRaw.indexOf(' - ');
134
+ if (dashIdx >= 0) {
135
+ current.outcome = outcomeRaw.substring(0, dashIdx).trim();
136
+ current.outcomeNote = outcomeRaw.substring(dashIdx + 3).trim();
137
+ }
138
+ else {
139
+ current.outcome = outcomeRaw;
140
+ }
141
+ }
142
+ inRecommendation = false;
143
+ continue;
144
+ }
145
+ // Collect question text (blockquote lines)
146
+ if (inQuestion) {
147
+ const stripped = line.startsWith('> ') ? line.substring(2) : line;
148
+ if (stripped.trim()) {
149
+ questionLines.push(stripped);
150
+ }
151
+ continue;
152
+ }
153
+ // Collect recommendation text
154
+ if (inRecommendation) {
155
+ if (line.trim()) {
156
+ recLines.push(line);
157
+ }
158
+ continue;
159
+ }
160
+ }
161
+ // Push last exchange
162
+ if (current && current.number !== undefined) {
163
+ current.question = questionLines.join('\n');
164
+ current.recommendation = recLines.join('\n');
165
+ exchanges.push(current);
166
+ }
167
+ return exchanges;
168
+ }
169
+ /**
170
+ * Generate summary markdown section from exchanges.
171
+ */
172
+ export function generateSummary(exchanges, startedAt) {
173
+ const total = exchanges.length;
174
+ // Key decisions from applied outcomes
175
+ const applied = exchanges.filter(e => e.outcome === 'applied' && e.outcomeNote);
176
+ const decisionsText = applied.length > 0
177
+ ? applied.map(e => ` - ${e.outcomeNote}`).join('\n')
178
+ : 'None';
179
+ // Time in tandem: span between first and last exchange timestamps
180
+ let duration = '0m';
181
+ if (exchanges.length > 0) {
182
+ const first = parseTime(exchanges[0].timestamp);
183
+ const last = parseTime(exchanges[exchanges.length - 1].timestamp);
184
+ if (first !== null && last !== null) {
185
+ const mins = last - first;
186
+ duration = mins > 0 ? `${mins}m` : '0m';
187
+ }
188
+ }
189
+ return `${SUMMARY_MARKER}
190
+ - **Total exchanges:** ${total}
191
+ - **Key decisions:**
192
+ ${decisionsText}
193
+ - **Time in tandem:** ${duration}
194
+ `;
195
+ }
196
+ // =============================================================================
197
+ // File Operations
198
+ // =============================================================================
199
+ /**
200
+ * Append an exchange to a dialogue file. Creates the file if missing.
201
+ */
202
+ export async function appendExchangeToFile(dialoguePath, exchange, header) {
203
+ try {
204
+ if (!fs.existsSync(dialoguePath)) {
205
+ if (!header) {
206
+ return { success: false, error: 'Header required for new dialogue file' };
207
+ }
208
+ const initial = createDialogueContent(header);
209
+ fs.mkdirSync(path.dirname(dialoguePath), { recursive: true });
210
+ fs.writeFileSync(dialoguePath, initial, 'utf-8');
211
+ }
212
+ const content = fs.readFileSync(dialoguePath, 'utf-8');
213
+ const formatted = formatExchange(exchange);
214
+ // Insert exchange before summary section
215
+ const summaryIdx = content.indexOf(SUMMARY_MARKER);
216
+ if (summaryIdx < 0) {
217
+ // No summary marker — append at end
218
+ fs.writeFileSync(dialoguePath, content + '\n' + formatted, 'utf-8');
219
+ }
220
+ else {
221
+ const before = content.substring(0, summaryIdx);
222
+ const after = content.substring(summaryIdx);
223
+ fs.writeFileSync(dialoguePath, before + formatted + '\n' + after, 'utf-8');
224
+ }
225
+ return { success: true, data: { exchangeNumber: exchange.number } };
226
+ }
227
+ catch (err) {
228
+ return { success: false, error: `Failed to append exchange: ${err instanceof Error ? err.message : String(err)}` };
229
+ }
230
+ }
231
+ /**
232
+ * Update the outcome of a specific exchange in the dialogue file.
233
+ */
234
+ export async function updateOutcomeInFile(dialoguePath, exchangeNum, outcome, note) {
235
+ try {
236
+ if (!fs.existsSync(dialoguePath)) {
237
+ return { success: false, error: `Dialogue file not found: ${dialoguePath}` };
238
+ }
239
+ const content = fs.readFileSync(dialoguePath, 'utf-8');
240
+ const lines = content.split('\n');
241
+ // Find the exchange section
242
+ let inTargetExchange = false;
243
+ let found = false;
244
+ for (let i = 0; i < lines.length; i++) {
245
+ const exchangeMatch = lines[i].match(EXCHANGE_RE);
246
+ if (exchangeMatch) {
247
+ inTargetExchange = parseInt(exchangeMatch[1], 10) === exchangeNum;
248
+ }
249
+ if (inTargetExchange && OUTCOME_RE.test(lines[i])) {
250
+ const outcomeText = note
251
+ ? `**Outcome:** ${outcome} - ${note}`
252
+ : `**Outcome:** ${outcome}`;
253
+ lines[i] = outcomeText;
254
+ found = true;
255
+ break;
256
+ }
257
+ }
258
+ if (!found) {
259
+ return { success: false, error: `Exchange ${exchangeNum} not found in dialogue file` };
260
+ }
261
+ fs.writeFileSync(dialoguePath, lines.join('\n'), 'utf-8');
262
+ return { success: true, data: { exchangeNum, outcome } };
263
+ }
264
+ catch (err) {
265
+ return { success: false, error: `Failed to update outcome: ${err instanceof Error ? err.message : String(err)}` };
266
+ }
267
+ }
268
+ /**
269
+ * Regenerate the summary section in an existing dialogue file.
270
+ */
271
+ export async function refreshSummary(dialoguePath) {
272
+ try {
273
+ if (!fs.existsSync(dialoguePath)) {
274
+ return { success: false, error: `Dialogue file not found: ${dialoguePath}` };
275
+ }
276
+ const content = fs.readFileSync(dialoguePath, 'utf-8');
277
+ const exchanges = parseDialogueExchanges(content);
278
+ // Extract startedAt from header
279
+ const startedMatch = content.match(/\*\*Started:\*\*\s+(.+)/);
280
+ const startedAt = startedMatch ? startedMatch[1].trim() : new Date().toISOString();
281
+ const newSummary = generateSummary(exchanges, startedAt);
282
+ // Replace existing summary section
283
+ const summaryIdx = content.indexOf(SUMMARY_MARKER);
284
+ if (summaryIdx < 0) {
285
+ // Append summary at end
286
+ fs.writeFileSync(dialoguePath, content + '\n' + newSummary, 'utf-8');
287
+ }
288
+ else {
289
+ const before = content.substring(0, summaryIdx);
290
+ fs.writeFileSync(dialoguePath, before + newSummary, 'utf-8');
291
+ }
292
+ return { success: true, data: { totalExchanges: exchanges.length } };
293
+ }
294
+ catch (err) {
295
+ return { success: false, error: `Failed to refresh summary: ${err instanceof Error ? err.message : String(err)}` };
296
+ }
297
+ }
298
+ /**
299
+ * Copy dialogue file to archive directory.
300
+ */
301
+ export async function archiveDialogue(params) {
302
+ const { dialoguePath, archiveDir, jiraKey, storyId } = params;
303
+ try {
304
+ if (!fs.existsSync(dialoguePath)) {
305
+ return { success: false, error: `Dialogue file not found: ${dialoguePath}` };
306
+ }
307
+ fs.mkdirSync(archiveDir, { recursive: true });
308
+ const prefix = jiraKey || storyId || 'unknown';
309
+ const archiveName = `${prefix}-dialogue.md`;
310
+ const archivePath = path.join(archiveDir, archiveName);
311
+ fs.copyFileSync(dialoguePath, archivePath);
312
+ return { success: true, data: { archivePath } };
313
+ }
314
+ catch (err) {
315
+ return { success: false, error: `Failed to archive dialogue: ${err instanceof Error ? err.message : String(err)}` };
316
+ }
317
+ }
318
+ // =============================================================================
319
+ // Internal Helpers
320
+ // =============================================================================
321
+ /**
322
+ * Parse HH:MM timestamp to minutes since midnight.
323
+ */
324
+ function parseTime(timestamp) {
325
+ const parts = timestamp.split(':');
326
+ if (parts.length !== 2)
327
+ return null;
328
+ const hours = parseInt(parts[0], 10);
329
+ const minutes = parseInt(parts[1], 10);
330
+ if (Number.isNaN(hours) || Number.isNaN(minutes))
331
+ return null;
332
+ return hours * 60 + minutes;
333
+ }
334
+ //# sourceMappingURL=dialogue-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogue-manager.js","sourceRoot":"","sources":["../../src/consultation/dialogue-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Tests for Story 86-3: Dialogue File Management
3
+ *
4
+ * RED state tests for the dialogue file persistence layer.
5
+ * Dialogue files record all consultation exchanges between tandem agents,
6
+ * following the format defined in ADR-0012 (lines 156-195).
7
+ *
8
+ * ACs covered:
9
+ * AC1: Dialogue file created at .session/{story-id}-dialogue.md on first consultation
10
+ * AC2: Each exchange appended with: timestamp, agents, question, response, outcome
11
+ * AC3: Outcome tracked: applied / deferred / rejected
12
+ * AC4: Summary section auto-generated: total exchanges, key decisions, time in tandem
13
+ * AC5: Dialogue file archived alongside session file on story completion
14
+ * AC6: Dialogue file readable by Reviewer for audit
15
+ *
16
+ * Run with: npm test
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=dialogue-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogue-manager.test.d.ts","sourceRoot":"","sources":["../../src/consultation/dialogue-manager.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}