@pareto4/pp-core 1.21.1 → 1.23.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.
- package/.claude-plugin/plugin.json +1 -1
- package/bin/install.js +205 -28
- package/commands/pp-help.md +2 -1
- package/gemini-extension.json +1 -1
- package/hooks/dist/pp-check-update-worker.js +1 -1
- package/hooks/dist/pp-context-monitor.js +3 -3
- package/hooks/dist/pp-statusline.js +88 -14
- package/hooks/dist/pp-update-banner.js +44 -4
- package/hooks/dist/pp-workflow-guard.js +3 -3
- package/hooks/pp-check-update-worker.js +1 -1
- package/hooks/pp-context-monitor.js +3 -3
- package/hooks/pp-statusline.js +88 -14
- package/hooks/pp-update-banner.js +44 -4
- package/hooks/pp-workflow-guard.js +3 -3
- package/package.json +2 -2
- package/pp-core/bin/lib/audience-command.cjs +271 -0
- package/pp-core/bin/lib/audience.cjs +293 -0
- package/pp-core/bin/lib/commands.cjs +26 -17
- package/pp-core/bin/lib/discovery-charter.cjs +13 -1
- package/pp-core/bin/lib/discovery-flow-page.cjs +191 -0
- package/pp-core/bin/lib/discovery-for-phase.cjs +33 -5
- package/pp-core/bin/lib/discovery-input-check.cjs +11 -11
- package/pp-core/bin/lib/discovery-processes.cjs +97 -4
- package/pp-core/bin/lib/discovery-session-check.cjs +7 -7
- package/pp-core/bin/lib/discovery-status.cjs +419 -0
- package/pp-core/bin/lib/discovery-stories.cjs +36 -5
- package/pp-core/bin/lib/discovery-tests.cjs +398 -0
- package/pp-core/bin/lib/explain-command.cjs +48 -0
- package/pp-core/bin/lib/gate-card.cjs +97 -0
- package/pp-core/bin/lib/hook-messages.cjs +132 -0
- package/pp-core/bin/lib/init-contract.cjs +116 -76
- package/pp-core/bin/lib/init-interactive.cjs +110 -49
- package/pp-core/bin/lib/init.cjs +44 -3
- package/pp-core/bin/lib/io.cjs +38 -0
- package/pp-core/bin/lib/message-labels.cjs +75 -0
- package/pp-core/bin/lib/messages/core.cjs +20 -0
- package/pp-core/bin/lib/messages/discovery.cjs +267 -0
- package/pp-core/bin/lib/messages/gate.cjs +257 -0
- package/pp-core/bin/lib/messages/hook.cjs +114 -0
- package/pp-core/bin/lib/messages/init.cjs +513 -0
- package/pp-core/bin/lib/messages/progress.cjs +110 -0
- package/pp-core/bin/lib/messages.cjs +208 -0
- package/pp-core/bin/lib/vault-command-router.cjs +16 -3
- package/pp-core/bin/lib/violation-render.cjs +78 -0
- package/pp-core/bin/pp-tools.cjs +92 -23
- package/pp-core/bin/shared/config-schema.manifest.json +1 -0
- package/pp-core/references/audience-moments.md +119 -0
- package/pp-core/references/audience.md +114 -0
- package/pp-core/references/discovery-build-consumption.md +5 -2
- package/pp-core/references/discovery-charter.md +2 -2
- package/pp-core/references/discovery-id-conventions.md +1 -1
- package/pp-core/references/discovery-processes.md +31 -7
- package/pp-core/references/discovery-session-output.md +1 -1
- package/pp-core/references/discovery-tests.md +186 -0
- package/pp-core/templates/project-charter.md +3 -4
- package/pp-core/workflows/add-phase.md +2 -0
- package/pp-core/workflows/add-tests.md +2 -0
- package/pp-core/workflows/add-todo.md +2 -0
- package/pp-core/workflows/ai-integration-phase.md +2 -0
- package/pp-core/workflows/audit-milestone.md +2 -0
- package/pp-core/workflows/autonomous.md +2 -0
- package/pp-core/workflows/check-todos.md +2 -0
- package/pp-core/workflows/code-review-fix.md +2 -0
- package/pp-core/workflows/code-review.md +2 -0
- package/pp-core/workflows/complete-milestone.md +10 -1
- package/pp-core/workflows/discovery-sprint/charter.md +3 -2
- package/pp-core/workflows/discovery-sprint/prefill.md +3 -0
- package/pp-core/workflows/discovery-sprint/prototype.md +14 -0
- package/pp-core/workflows/discovery-sprint/session-13-gates.md +2 -0
- package/pp-core/workflows/discovery-sprint/sessions/01-kick-off.md +4 -1
- package/pp-core/workflows/discovery-sprint/sessions/03-to-be.md +135 -76
- package/pp-core/workflows/discovery-sprint/sessions/09-qa.md +94 -64
- package/pp-core/workflows/discovery-sprint/sessions/13-wrap-up.md +3 -2
- package/pp-core/workflows/discovery-sprint/vault-context.md +15 -0
- package/pp-core/workflows/discovery-sprint.md +16 -2
- package/pp-core/workflows/discovery-to-build/steps/handoff-gates.md +16 -9
- package/pp-core/workflows/discovery-to-build/templates/discovery-references.md +1 -1
- package/pp-core/workflows/discovery-to-build/templates/pp-handoff.md +9 -1
- package/pp-core/workflows/discovery-to-build.md +10 -4
- package/pp-core/workflows/discuss-phase/discovery.md +2 -2
- package/pp-core/workflows/discuss-phase-assumptions.md +2 -0
- package/pp-core/workflows/discuss-phase.md +1 -1
- package/pp-core/workflows/edit-phase.md +2 -0
- package/pp-core/workflows/eval-review.md +2 -0
- package/pp-core/workflows/execute-phase/steps/check-query-gate.md +25 -1
- package/pp-core/workflows/execute-phase/steps/vault-fetch.md +1 -0
- package/pp-core/workflows/execute-phase/steps/vault-load-gate.md +2 -0
- package/pp-core/workflows/execute-phase.md +1 -1
- package/pp-core/workflows/execute-plan.md +2 -0
- package/pp-core/workflows/extract-learnings.md +2 -0
- package/pp-core/workflows/help/modes/business.md +56 -0
- package/pp-core/workflows/help.md +12 -2
- package/pp-core/workflows/import.md +10 -1
- package/pp-core/workflows/ingest-docs.md +2 -0
- package/pp-core/workflows/init.md +17 -1
- package/pp-core/workflows/insert-phase.md +2 -0
- package/pp-core/workflows/list-workspaces.md +2 -0
- package/pp-core/workflows/manager.md +2 -0
- package/pp-core/workflows/map-codebase.md +2 -0
- package/pp-core/workflows/milestone-summary.md +2 -0
- package/pp-core/workflows/new-milestone.md +10 -1
- package/pp-core/workflows/new-project.md +12 -2
- package/pp-core/workflows/new-workspace.md +2 -0
- package/pp-core/workflows/next.md +8 -0
- package/pp-core/workflows/plan-milestone-gaps.md +10 -1
- package/pp-core/workflows/plan-phase.md +2 -1
- package/pp-core/workflows/plan-review-convergence.md +1 -1
- package/pp-core/workflows/progress.md +10 -0
- package/pp-core/workflows/quick.md +11 -1
- package/pp-core/workflows/remove-phase.md +2 -0
- package/pp-core/workflows/remove-workspace.md +2 -0
- package/pp-core/workflows/resume-project.md +25 -0
- package/pp-core/workflows/review.md +2 -0
- package/pp-core/workflows/scan.md +2 -0
- package/pp-core/workflows/secure-phase.md +2 -0
- package/pp-core/workflows/settings.md +41 -0
- package/pp-core/workflows/ship.md +2 -0
- package/pp-core/workflows/spec-phase.md +1 -1
- package/pp-core/workflows/ui-phase.md +2 -0
- package/pp-core/workflows/ui-review.md +2 -0
- package/pp-core/workflows/ultraplan-phase.md +2 -0
- package/pp-core/workflows/validate-phase.md +2 -0
- package/pp-core/workflows/vault-review.md +2 -0
- package/pp-core/workflows/verify-phase.md +2 -0
- package/pp-core/workflows/verify-work.md +2 -0
- package/scripts/affected-tests-lib.cjs +26 -12
- package/scripts/ci-release-only.cjs +158 -0
- package/scripts/live-runs/driver.cjs +326 -0
- package/scripts/live-runs/run.cjs +906 -0
- package/scripts/live-runs/scenarios.cjs +326 -0
- package/scripts/live-runs/scratch-project.cjs +132 -0
- package/scripts/live-runs/scrub.cjs +291 -0
- package/scripts/live-runs/turn-guard.cjs +107 -0
- package/scripts/live-runs/walk-setup.cjs +198 -0
- package/scripts/run-tests.cjs +151 -132
- package/scripts/test-env.cjs +64 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Catalog slice: init messages (Phase 41). Data only.
|
|
4
|
+
*
|
|
5
|
+
* ADR-457 build-at-publish: compiles to the gitignored
|
|
6
|
+
* `pp-core/bin/lib/messages/init.cjs`. Imports nothing but the entry type.
|
|
7
|
+
*
|
|
8
|
+
* Plan 41-07 puts the asking half here: the ten questions (`init.step.*`),
|
|
9
|
+
* the prompt chrome (`init.chrome.*`), the compose summary printed before the
|
|
10
|
+
* confirmation (`init.compose.*`) and the auto-answer echoes
|
|
11
|
+
* (`init.auto_answer.*`). Plan 41-09 adds the answers and errors, plan 41-10 the outcomes
|
|
12
|
+
* (Done lines, verify report, invariant messages, CLI refusals).
|
|
13
|
+
*
|
|
14
|
+
* The `developer` text of every entry is the wording the untouched code printed
|
|
15
|
+
* (tests/fixtures/message-oracle-init.json pins it byte for byte). The answer
|
|
16
|
+
* tokens a person types (`internal`, `none`, `yes`, `no`, the provider and
|
|
17
|
+
* visibility words) are never translated: every reworded variant names them in
|
|
18
|
+
* backticks. `Ref:` lines are added at render time, never written here.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.init = void 0;
|
|
22
|
+
exports.init = Object.freeze({
|
|
23
|
+
// ─── Answers and errors (plan 41-09) ────────────────────────────────────────
|
|
24
|
+
'init.answer.answer_required': {
|
|
25
|
+
reach: 'business',
|
|
26
|
+
developer: 'Question "{step}" requires a non-blank answer.',
|
|
27
|
+
engineer: 'This question needs an answer, so it cannot be left blank. Type one and press Enter.',
|
|
28
|
+
business: 'This answer cannot be left empty. Type an answer and press Enter.',
|
|
29
|
+
explain: 'Every question except the optional ones needs an answer before setup can go on. The same question is asked again.',
|
|
30
|
+
},
|
|
31
|
+
'init.answer.invalid_client_vault': {
|
|
32
|
+
reach: 'business',
|
|
33
|
+
developer: 'Question "client_vault": {detail}',
|
|
34
|
+
engineer: 'That standards vault location was refused: it must be "owner/name" or a clone URL with no credentials or machine-specific path in it. Type a usable location, or type `none`.',
|
|
35
|
+
business: 'That location for your standards cannot be used. Type it as "owner/name" or a web address with no password in it, or type `none`.',
|
|
36
|
+
explain: 'The location is saved in a file that is shared with the team, so it must not hold a password or a path that only works on one computer. The same question is asked again.',
|
|
37
|
+
},
|
|
38
|
+
'init.answer.invalid_compose_confirm': {
|
|
39
|
+
reach: 'business',
|
|
40
|
+
developer: 'compose_confirm requires "yes" or "no" (also accepts approve/decline, y/n, true/false).',
|
|
41
|
+
engineer: 'That was not a yes or no. Type `yes` to write `.platform-bindings.json`, or `no` to skip it.',
|
|
42
|
+
business: 'Please answer `yes` or `no`. Type `yes` to write `.platform-bindings.json`, or `no` to skip it.',
|
|
43
|
+
explain: 'Setup only writes the platform connection file after you agree. It also accepts y, n, approve and decline. The same question is asked again.',
|
|
44
|
+
},
|
|
45
|
+
'init.answer.compose_write_failed': {
|
|
46
|
+
reach: 'business',
|
|
47
|
+
developer: 'compose_confirm was approved, but the write to .platform-bindings.json did not succeed — this was NOT recorded as skipped or declined. Call --session-next to see the current state and try again.',
|
|
48
|
+
engineer: '`.platform-bindings.json` could not be written, so nothing was recorded: the file was not skipped or declined. Type `yes` to try again, or `no` to skip it.',
|
|
49
|
+
business: '`.platform-bindings.json` could not be written, so nothing was recorded. Type `yes` to try again, or `no` to skip it.',
|
|
50
|
+
explain: 'You agreed to write the platform connection file, but the write did not succeed. Nothing was saved and your choice was not counted as a no, so the question is asked again.',
|
|
51
|
+
},
|
|
52
|
+
'init.answer.compose_write_failed_warnings': {
|
|
53
|
+
reach: 'business',
|
|
54
|
+
developer: 'compose_confirm was approved, but the write to .platform-bindings.json did not succeed — this was NOT recorded as skipped or declined. Warnings: {warnings}. Call --session-next to see the current state and try again.',
|
|
55
|
+
engineer: '`.platform-bindings.json` could not be written, so nothing was recorded: the file was not skipped or declined. What was reported: {warnings}. Type `yes` to try again, or `no` to skip it.',
|
|
56
|
+
business: '`.platform-bindings.json` could not be written, so nothing was recorded. What was reported: {warnings}. Type `yes` to try again, or `no` to skip it.',
|
|
57
|
+
explain: 'You agreed to write the platform connection file, but the write did not succeed. Nothing was saved and your choice was not counted as a no, so the question is asked again.',
|
|
58
|
+
// Every warning joined with `; `: capped at DIAG_CAP so the later warnings are not dropped.
|
|
59
|
+
longParams: ['warnings'],
|
|
60
|
+
},
|
|
61
|
+
'init.answer.session_malformed': {
|
|
62
|
+
reach: 'business',
|
|
63
|
+
developer: 'The init session file at .planning/.init-session.json exists but is malformed or unreadable. Run "pp_run query init-contract --session-reset" to start over.',
|
|
64
|
+
engineer: 'The saved setup answers are damaged or unreadable. Run `pp-tools init --reset` to start over.',
|
|
65
|
+
business: 'The answers saved for this setup are damaged. Run `pp-tools init --reset` to start over.',
|
|
66
|
+
explain: 'Setup keeps your answers in a small file so it can carry on where you left off. That file cannot be read, so setup will not guess. Starting over clears it.',
|
|
67
|
+
},
|
|
68
|
+
INIT_SESSION_MALFORMED: {
|
|
69
|
+
reach: 'business',
|
|
70
|
+
developer: 'The init session file at .planning/.init-session.json exists but is malformed or unreadable. Run "pp_run query init-contract --session-reset" to start over — it is never resumed silently into an unknown state.',
|
|
71
|
+
engineer: 'The saved setup answers are damaged or unreadable. Run `pp-tools init --reset` to start over; setup is never resumed from a state it cannot read.',
|
|
72
|
+
business: 'The answers saved for this setup are damaged. Run `pp-tools init --reset` to start over.',
|
|
73
|
+
explain: 'Setup keeps your answers in a small file so it can carry on where you left off. That file cannot be read, so setup will not guess. Starting over clears it.',
|
|
74
|
+
},
|
|
75
|
+
INIT_SESSION_WRITE_FAILED: {
|
|
76
|
+
reach: 'business',
|
|
77
|
+
developer: "A filesystem write inside the init session failed ({detail}). This project's .planning directory (or .platform-bindings.json) may not be writable (permissions, a read-only mount, a full disk). Nothing further was recorded for this step — fix the underlying filesystem issue and try the same step again.",
|
|
78
|
+
engineer: 'Setup could not save your answer to disk, so nothing was recorded for this step. Check that the project folder is writable (permissions, a read-only mount, a full disk), then answer again.',
|
|
79
|
+
business: 'Your answer could not be saved, so nothing was recorded for this step. Check that the project folder can be written to, then answer again.',
|
|
80
|
+
explain: 'Setup saves each answer as you give it. Saving failed, usually because the folder is read-only or the disk is full. Fix that, then answer the same question again.',
|
|
81
|
+
},
|
|
82
|
+
'init.error_line': {
|
|
83
|
+
reach: 'developer',
|
|
84
|
+
developer: 'Error: {message}',
|
|
85
|
+
},
|
|
86
|
+
'init.rejected_fallback': {
|
|
87
|
+
reach: 'business',
|
|
88
|
+
developer: 'Rejected ({reason}) — please answer again.',
|
|
89
|
+
engineer: 'That answer was not accepted. Please answer again.',
|
|
90
|
+
business: 'That answer was not accepted. Please answer again.',
|
|
91
|
+
explain: 'Setup did not accept the answer and gave no more detail. The same question is asked again.',
|
|
92
|
+
},
|
|
93
|
+
'init.unexpected_state': {
|
|
94
|
+
reach: 'business',
|
|
95
|
+
developer: 'Unexpected session state: no step id was returned.',
|
|
96
|
+
engineer: 'Setup reached a state it did not expect. Run `pp-tools init --reset` to start over.',
|
|
97
|
+
business: 'Setup reached a state it did not expect. Run `pp-tools init --reset` to start over.',
|
|
98
|
+
explain: 'Setup lost track of which question comes next and stopped rather than guess. Starting over clears it.',
|
|
99
|
+
},
|
|
100
|
+
'init.step_overflow': {
|
|
101
|
+
reach: 'business',
|
|
102
|
+
developer: 'init session exceeded the maximum step count — aborting to avoid an infinite loop.',
|
|
103
|
+
engineer: 'Setup went on far longer than it should and was stopped. Run `pp-tools init --reset` and try again.',
|
|
104
|
+
business: 'Setup went on far longer than it should and was stopped. Run `pp-tools init --reset` and try again.',
|
|
105
|
+
explain: 'Setup stops after a fixed number of steps so it can never loop forever. Starting over clears the saved answers.',
|
|
106
|
+
},
|
|
107
|
+
// ─── Outcomes (plan 41-10) ──────────────────────────────────────────────────
|
|
108
|
+
// The Done lines, the unfinished-session report, the three invariant messages and the two CLI
|
|
109
|
+
// refusals. Each Done variant is its own whole sentence, chosen from a reading of the config
|
|
110
|
+
// (readVaultEnabledState / readVaultRequiredState), never from a claim.
|
|
111
|
+
'init.done.vault_off': {
|
|
112
|
+
reach: 'business',
|
|
113
|
+
developer: 'Done — .platform-bindings.json was composed and written; vault.enabled was left at false as this project set it, so the vault capability stays off and /pp-init Step 2.6 stays inert (arm it with pp-tools config-set vault.enabled true).',
|
|
114
|
+
engineer: 'Done. The platform connection was saved to `.platform-bindings.json`. `vault.enabled` was left at `false`, as this project set it, so the standards vault stays off and the reachability check in `/pp-init` is skipped. To switch the vault on, run `pp-tools config-set vault.enabled true`.',
|
|
115
|
+
business: "Done. Your platform connection was saved to `.platform-bindings.json`. Your organisation's standards are switched off, because this project's settings say so, so they are not used and nobody checks that they can be reached. To switch them on, run `pp-tools config-set vault.enabled true`.",
|
|
116
|
+
explain: "The platform connection was saved. The setting that switches on your organisation's standards is `false` in this project, and setup respects that. Change it with the command shown if you want the standards used.",
|
|
117
|
+
},
|
|
118
|
+
'init.done.vault_malformed': {
|
|
119
|
+
reach: 'business',
|
|
120
|
+
developer: 'Done — .platform-bindings.json was composed and written; vault.enabled holds a non-boolean value and was left untouched — pp-tools query init-contract --verify reports it as INIT_VAULT_ENABLED_MALFORMED; store the boolean with pp-tools config-set vault.enabled true.',
|
|
121
|
+
engineer: 'Done. The platform connection was saved to `.platform-bindings.json`. `vault.enabled` holds a value that is not true or false, so it was left untouched and the standards vault stays off. `pp-tools query init-contract --verify` reports it as `INIT_VAULT_ENABLED_MALFORMED`. To fix it, run `pp-tools config-set vault.enabled true`.',
|
|
122
|
+
business: "Done. Your platform connection was saved to `.platform-bindings.json`. The setting that switches on your organisation's standards holds a value that is neither true nor false, so it was left as it is and the standards stay off. To switch them on, run `pp-tools config-set vault.enabled true`.",
|
|
123
|
+
explain: "The platform connection was saved. The setting for your organisation's standards holds something other than true or false. Setup does not guess what was meant, so it left the value alone. Store a clear true with the command shown.",
|
|
124
|
+
},
|
|
125
|
+
'init.done.vault_armed': {
|
|
126
|
+
reach: 'business',
|
|
127
|
+
developer: 'Done — .platform-bindings.json was composed and written; vault.enabled is now true (the vault capability is armed — /pp-init Step 2.6 probes reachability next); each plan records which client standards documents governed it (<vault_standards>), checked by the vault.trace gate.',
|
|
128
|
+
engineer: 'Done. The platform connection was saved to `.platform-bindings.json` and `vault.enabled` is now `true`, so the standards vault is switched on. Each plan records which client standards documents governed it, and the `vault.trace` check verifies that record. Next, `/pp-init` checks that the vault can be reached.',
|
|
129
|
+
business: "Done. Your platform connection was saved to `.platform-bindings.json`, and your organisation's standards are now switched on. Each plan records which standards applied to it, and that record is checked. Next, `/pp-init` checks that the standards can be reached.",
|
|
130
|
+
explain: "The platform connection was saved and your organisation's standards were switched on. From now on every plan notes which standards it followed, and that note is checked. The next step in `/pp-init` tests that the standards can be fetched.",
|
|
131
|
+
},
|
|
132
|
+
'init.done.vault_armed_required': {
|
|
133
|
+
reach: 'business',
|
|
134
|
+
developer: 'Done — .platform-bindings.json was composed and written; vault.enabled is now true (the vault capability is armed — /pp-init Step 2.6 probes reachability next); each plan records which client standards documents governed it (<vault_standards>), checked by the vault.trace gate; vault.required is true, so a client vault miss, a failed fetch or an unwritable vault summary stops the build at plan:pre and execute:pre.',
|
|
135
|
+
engineer: 'Done. The platform connection was saved to `.platform-bindings.json` and `vault.enabled` is now `true`, so the standards vault is switched on. Each plan records which client standards documents governed it, and the `vault.trace` check verifies that record. `vault.required` is `true`, so a vault miss, a failed fetch or an unwritable vault summary stops the work before a plan is written and before it is built. Next, `/pp-init` checks that the vault can be reached.',
|
|
136
|
+
business: "Done. Your platform connection was saved to `.platform-bindings.json`, and your organisation's standards are now switched on and required. Each plan records which standards applied to it, and that record is checked. If the standards cannot be found, downloaded or saved, work stops before a plan is written or built. Next, `/pp-init` checks that the standards can be reached.",
|
|
137
|
+
explain: "The platform connection was saved and your organisation's standards were switched on as a requirement. If they go missing or cannot be fetched, planning and building stop instead of carrying on without them. The next step in `/pp-init` tests that the standards can be fetched.",
|
|
138
|
+
},
|
|
139
|
+
'init.done.written': {
|
|
140
|
+
reach: 'business',
|
|
141
|
+
developer: 'Done — .platform-bindings.json was composed and written.',
|
|
142
|
+
engineer: 'Done. The platform connection was saved to `.platform-bindings.json`. `vault.enabled` was not found in the project settings, so nothing about the standards vault was changed.',
|
|
143
|
+
business: "Done. Your platform connection was saved to `.platform-bindings.json`. No setting for your organisation's standards was found, so nothing about them was changed.",
|
|
144
|
+
explain: 'The platform connection was saved. Setup could not find the setting that switches on your organisation\'s standards, so it says nothing about them.',
|
|
145
|
+
},
|
|
146
|
+
'init.done.nothing_composed': {
|
|
147
|
+
reach: 'business',
|
|
148
|
+
developer: 'Done — nothing was composed (declined, or nothing was composable).',
|
|
149
|
+
engineer: 'Done. Nothing was written to `.platform-bindings.json`: you declined, or nothing could be composed. To be asked again, run `pp-tools init --reset`.',
|
|
150
|
+
business: 'Done. Nothing was saved: you chose not to set up the platform connection, or there was not enough to set it up with. To be asked again, run `pp-tools init --reset`.',
|
|
151
|
+
explain: 'Setup ended without saving a platform connection, either because you said no or because there was nothing to save. A finished setup does not ask again by itself; `pp-tools init --reset` starts the questions over.',
|
|
152
|
+
},
|
|
153
|
+
'init.done.skipped': {
|
|
154
|
+
reach: 'business',
|
|
155
|
+
developer: 'Nothing was composable from the org profile and project answers — no compose_confirm step was shown and nothing was written (the inert path, INIT-02).',
|
|
156
|
+
engineer: "Nothing was written: your organisation's profile and your answers were not enough to compose a platform connection, so no confirmation was asked and `.platform-bindings.json` was not created. That is normal for a project no organisation profile applies to.",
|
|
157
|
+
business: "Nothing was saved: your answers and your organisation's settings were not enough to set up a platform connection, so you were not asked to confirm one and `.platform-bindings.json` was not created. That is normal for a project that no organisation settings apply to.",
|
|
158
|
+
explain: 'Setup finished without a platform connection because there was nothing it could build one from. No question was skipped and nothing was lost.',
|
|
159
|
+
},
|
|
160
|
+
'init.done.unchanged': {
|
|
161
|
+
reach: 'business',
|
|
162
|
+
developer: 'The existing .platform-bindings.json is already up to date with what the org profile and project answers would produce — no compose_confirm step was needed and nothing was written.',
|
|
163
|
+
engineer: "The existing `.platform-bindings.json` already matches what your organisation's profile and your answers would produce, so no confirmation was needed and nothing was written.",
|
|
164
|
+
business: "Your existing platform connection in `.platform-bindings.json` already matches your answers and your organisation's settings, so you were not asked to confirm anything and nothing was changed.",
|
|
165
|
+
explain: 'The saved platform connection is already what setup would have built, so setup left the file as it was.',
|
|
166
|
+
},
|
|
167
|
+
'init.verify': {
|
|
168
|
+
reach: 'business',
|
|
169
|
+
developer: 'The session could not reach a clean end state:',
|
|
170
|
+
engineer: 'Setup did not reach a clean end state. These problems need fixing:',
|
|
171
|
+
business: 'Setup did not finish. These problems need fixing:',
|
|
172
|
+
explain: 'Setup stopped with problems still open. Each one is listed below with its own reference code, then this one.',
|
|
173
|
+
},
|
|
174
|
+
'init.verify.line': {
|
|
175
|
+
reach: 'developer',
|
|
176
|
+
developer: ' - [{code}] {message}',
|
|
177
|
+
},
|
|
178
|
+
INIT_IDENTITY_MISSING: {
|
|
179
|
+
reach: 'business',
|
|
180
|
+
developer: 'No "project" block found in .planning/config.json — Step 2 identity capture did not complete.',
|
|
181
|
+
engineer: 'The project details were not saved: `.planning/config.json` has no `project` section. Run `pp-tools init --reset` and answer the questions again.',
|
|
182
|
+
business: 'The project details were not saved: `.planning/config.json` has no `project` section. Run `pp-tools init --reset` and answer the questions again.',
|
|
183
|
+
explain: 'Setup keeps the project name, client and provider in the `project` section of `.planning/config.json`. That section is missing, so the answers did not get saved.',
|
|
184
|
+
},
|
|
185
|
+
INIT_VAULT_PROVIDER_UNSET: {
|
|
186
|
+
reach: 'business',
|
|
187
|
+
developer: 'project.provider is "{provider}" but vault.provider is unset — the D-13 provisioning gate is disabled.',
|
|
188
|
+
engineer: '`project.provider` is `{provider}` but `vault.provider` is not set in `.planning/config.json`, so the provisioning check stays off. Set `vault.provider` and run the check again.',
|
|
189
|
+
business: 'The project is kept on `{provider}`, but `vault.provider` is not set in `.planning/config.json`, so the check that the project is set up there cannot run. Set `vault.provider` and run the check again.',
|
|
190
|
+
explain: 'The project names a hosting service, but the matching setting for your organisation\'s standards is empty, so one of the setup checks is switched off until it is filled in.',
|
|
191
|
+
},
|
|
192
|
+
INIT_COMPOSITION_NOT_RUN: {
|
|
193
|
+
reach: 'business',
|
|
194
|
+
developer: 'A binding is composable from the org profile and project answers, but .platform-bindings.json was never written and no decline was recorded — Step 2.5 appears to have been skipped. Run "pp-tools init --reset" to redo the question set and reach the compose confirmation (init-friction F3: a completed session never re-offers composition on a bare re-run).',
|
|
195
|
+
engineer: "A platform connection could be built from your organisation's profile and your answers, but `.platform-bindings.json` was never written and no decline was recorded, so the confirmation step looks skipped. Run `pp-tools init --reset` to answer the questions again and reach the confirmation. A finished setup does not offer it again on a plain re-run.",
|
|
196
|
+
business: "A platform connection could be set up from your answers and your organisation's settings, but `.platform-bindings.json` was never saved and you did not say no. Run `pp-tools init --reset` to answer the questions again and reach the confirmation. A finished setup does not offer it again on a plain re-run.",
|
|
197
|
+
explain: 'Setup could have built the platform connection but never asked you to confirm it. Starting over with `pp-tools init --reset` brings the question back.',
|
|
198
|
+
},
|
|
199
|
+
init_non_interactive: {
|
|
200
|
+
reach: 'business',
|
|
201
|
+
developer: '"pp-tools init" requires an interactive terminal (stdin is not a TTY) and will not prompt. This command cannot run inside an AI-agent shell or a piped session — open a regular terminal window (e.g. Terminal, iTerm, or Windows Terminal) and run it there. For a non-interactive/CI-driven session, use "pp-tools query init-contract --session-next" / "--session-answer <stepId>=<value>" directly instead.',
|
|
202
|
+
engineer: '`pp-tools init` asks its questions in a terminal, and this is not one, so nothing was asked. Open a regular terminal window (for example Terminal, iTerm or Windows Terminal) and run `pp-tools init` there. To answer the questions from a script or a CI job, use `pp-tools query init-contract --session-next` and `pp-tools query init-contract --session-answer <stepId>=<value>`.',
|
|
203
|
+
business: '`pp-tools init` asks its questions in a terminal window, and this is not one, so nothing was asked. Open a regular terminal window (for example Terminal, iTerm or Windows Terminal) and run `pp-tools init` there.',
|
|
204
|
+
explain: 'Setup asks you questions, so it needs a real terminal window. It refuses to start anywhere else rather than wait for answers that can never arrive.',
|
|
205
|
+
},
|
|
206
|
+
'init.unknown_flag': {
|
|
207
|
+
reach: 'business',
|
|
208
|
+
developer: 'Unrecognized flag "{flag}" for init. Supported: --offline, --reset. For init workflow subcommands (execute-phase, plan-phase, new-project, ...), use "pp-tools query init.<subcommand>".',
|
|
209
|
+
engineer: '`{flag}` is not an option that `pp-tools init` understands. The options are `--offline` and `--reset`. For the other init commands, such as `execute-phase`, use `pp-tools query init.<subcommand>`.',
|
|
210
|
+
business: '`{flag}` is not an option that `pp-tools init` understands. Use `--offline` or `--reset`, or run `pp-tools init` with no option.',
|
|
211
|
+
explain: '`pp-tools init` accepts only `--offline` (skip the online version lookup) and `--reset` (clear the saved answers and start over). Anything else is refused.',
|
|
212
|
+
},
|
|
213
|
+
// ─── Questions: key = init.step.<step id> ──────────────────────────────────
|
|
214
|
+
'init.step.project_name': {
|
|
215
|
+
reach: 'business',
|
|
216
|
+
developer: 'Project name (human-readable, e.g. "Acme Dashboard")',
|
|
217
|
+
engineer: 'Project name, in plain words (for example "Acme Dashboard").',
|
|
218
|
+
business: 'What is your project called? Type its name in plain words, for example "Acme Dashboard".',
|
|
219
|
+
explain: 'The project name is the title people will see for this project. Type it the way you would say it out loud. A short name for web addresses is asked for next.',
|
|
220
|
+
},
|
|
221
|
+
'init.step.project_slug': {
|
|
222
|
+
reach: 'business',
|
|
223
|
+
developer: 'Project slug (kebab-case, e.g. "acme-dashboard")',
|
|
224
|
+
engineer: 'Project short name (URL-safe: lowercase words joined by hyphens, for example "acme-dashboard").',
|
|
225
|
+
business: 'Type a short name for the project: lowercase words joined by hyphens, for example "acme-dashboard".',
|
|
226
|
+
explain: 'The short name is a compact version of the project name that is safe to use in web addresses and file names. Use lowercase letters, numbers and hyphens only.',
|
|
227
|
+
},
|
|
228
|
+
'init.step.client_name': {
|
|
229
|
+
reach: 'business',
|
|
230
|
+
developer: 'Client name (company / team, e.g. "Acme Corp") — type "internal" if none',
|
|
231
|
+
engineer: 'Client name (the company or team, for example "Acme Corp"). Type `internal` if there is no client.',
|
|
232
|
+
business: 'Who is this project for? Type the company or team name, for example "Acme Corp". If there is no client, type `internal`.',
|
|
233
|
+
explain: 'The client is the company or team the project is built for. Work for your own organisation has no client, so type `internal`.',
|
|
234
|
+
},
|
|
235
|
+
'init.step.client_slug': {
|
|
236
|
+
reach: 'business',
|
|
237
|
+
developer: 'Client slug (kebab-case, e.g. "acme") — type "internal" if none',
|
|
238
|
+
engineer: 'Client short name (URL-safe: lowercase words joined by hyphens, for example "acme"). Type `internal` if there is no client.',
|
|
239
|
+
business: 'Type a short name for the client: lowercase words joined by hyphens, for example "acme". If there is no client, type `internal`.',
|
|
240
|
+
explain: 'The client short name is a compact version of the client name for web addresses and file names. Work for your own organisation has no client, so type `internal`.',
|
|
241
|
+
},
|
|
242
|
+
'init.step.client_vault': {
|
|
243
|
+
reach: 'business',
|
|
244
|
+
developer: 'Client vault repo ("owner/name" or a full clone URL) — type "none" to bind no client vault',
|
|
245
|
+
engineer: 'Standards vault repository for this client ("owner/name" or a full clone URL). Type `none` to connect no standards vault.',
|
|
246
|
+
business: 'Where are this client\'s standards kept? Type the location as "owner/name" or a full web address, or type `none` to connect no standards.',
|
|
247
|
+
explain: 'Some clients keep their coding and delivery standards in a shared place. Naming it here lets pp-core use those standards in the plans it writes. Type `none` if this client has none.',
|
|
248
|
+
},
|
|
249
|
+
'init.step.client_vault_default': {
|
|
250
|
+
reach: 'business',
|
|
251
|
+
developer: 'Client vault repo ("owner/name" or a full clone URL) — type "none" to use the default vault ({repo})',
|
|
252
|
+
engineer: 'Standards vault repository for this client ("owner/name" or a full clone URL). Type `none` to use the default vault (`{repo}`).',
|
|
253
|
+
business: 'Where are this client\'s standards kept? Type the location as "owner/name" or a full web address, or type `none` to use your organisation\'s standards (`{repo}`).',
|
|
254
|
+
explain: 'Your organisation already names a place where standards are kept. Type `none` to use it, or give a different location if this client keeps its own.',
|
|
255
|
+
},
|
|
256
|
+
'init.step.description': {
|
|
257
|
+
reach: 'business',
|
|
258
|
+
developer: 'One-line description (what this project does)',
|
|
259
|
+
engineer: 'One-line description of what the project does.',
|
|
260
|
+
business: 'Describe in one sentence what this project does.',
|
|
261
|
+
explain: 'The description is one sentence that tells a new reader what the project is for. It is shown next to the project name.',
|
|
262
|
+
},
|
|
263
|
+
'init.step.provider': {
|
|
264
|
+
reach: 'business',
|
|
265
|
+
developer: 'Provider (gitlab / azure / github / other / none)',
|
|
266
|
+
engineer: 'Which Git hosting provider holds this project? Choose `gitlab`, `azure`, `github`, `other` or `none`.',
|
|
267
|
+
business: 'Which service will keep this project\'s work online? Choose `gitlab`, `azure`, `github`, `other` or `none`.',
|
|
268
|
+
explain: 'pp-core connects to the service that keeps your project online. Pick the one your team uses, `other` for a service not listed, or `none` if the project is not kept online yet.',
|
|
269
|
+
},
|
|
270
|
+
'init.step.visibility': {
|
|
271
|
+
reach: 'business',
|
|
272
|
+
developer: 'Visibility (private / public / internal)',
|
|
273
|
+
engineer: 'Who can see the repository? Choose `private`, `public` or `internal`.',
|
|
274
|
+
business: 'Who should be able to see this project? Choose `private` (only invited people), `public` (anyone) or `internal` (people in your organisation).',
|
|
275
|
+
explain: 'Visibility decides who can find and read the project on the service that keeps it online. Choose `private` when you are not sure; it can be widened later.',
|
|
276
|
+
},
|
|
277
|
+
'init.step.compose_confirm': {
|
|
278
|
+
reach: 'business',
|
|
279
|
+
developer: 'A binding can be composed from the org profile and project answers. Compose and write .platform-bindings.json now? (yes/no)',
|
|
280
|
+
engineer: "A platform connection can be built from your organisation's profile and your answers. Write it to `.platform-bindings.json` now? Type `yes` to save it or `no` to save nothing.",
|
|
281
|
+
business: "Your answers and your organisation's settings are enough to set up the platform connection. Save it to `.platform-bindings.json` now? Type `yes` to save it, or `no` to save nothing.",
|
|
282
|
+
explain: 'The platform connection tells pp-core where this project lives and which standards apply. It is saved in the file `.platform-bindings.json`. Type `yes` to save it, or `no` to leave it for later; nothing is written until you say `yes`.',
|
|
283
|
+
},
|
|
284
|
+
// ─── Prompt chrome (fragments of a question) ───────────────────────────────
|
|
285
|
+
'init.chrome.options': {
|
|
286
|
+
reach: 'business',
|
|
287
|
+
developer: 'Options: {options}',
|
|
288
|
+
engineer: 'Options: {options}',
|
|
289
|
+
business: 'Choose one: {options}',
|
|
290
|
+
part: true,
|
|
291
|
+
},
|
|
292
|
+
'init.chrome.skip_hint': {
|
|
293
|
+
reach: 'business',
|
|
294
|
+
developer: '(press Enter to skip)',
|
|
295
|
+
engineer: '(press Enter to skip)',
|
|
296
|
+
business: '(or press Enter to skip this question)',
|
|
297
|
+
part: true,
|
|
298
|
+
},
|
|
299
|
+
'init.chrome.preselected': {
|
|
300
|
+
reach: 'business',
|
|
301
|
+
developer: 'preselected',
|
|
302
|
+
engineer: 'preselected',
|
|
303
|
+
business: 'suggested',
|
|
304
|
+
part: true,
|
|
305
|
+
},
|
|
306
|
+
'init.chrome.resolved_default': {
|
|
307
|
+
reach: 'business',
|
|
308
|
+
developer: '{provider} (resolved default)',
|
|
309
|
+
engineer: 'detected default',
|
|
310
|
+
business: 'suggested',
|
|
311
|
+
part: true,
|
|
312
|
+
},
|
|
313
|
+
// ─── Compose summary shown before the confirmation ─────────────────────────
|
|
314
|
+
'init.compose.header': {
|
|
315
|
+
reach: 'business',
|
|
316
|
+
developer: 'A binding can be composed from the org profile and project answers:',
|
|
317
|
+
engineer: "A platform connection can be built from your organisation's profile and your answers:",
|
|
318
|
+
business: "Here is the platform connection that can be set up from your answers and your organisation's settings:",
|
|
319
|
+
part: true,
|
|
320
|
+
},
|
|
321
|
+
'init.compose.provenance': {
|
|
322
|
+
reach: 'business',
|
|
323
|
+
developer: ' {field} = {value} (from {source})',
|
|
324
|
+
engineer: ' `{field}` = {value} (from {source})',
|
|
325
|
+
business: ' `{field}` = {value} (from {source})',
|
|
326
|
+
part: true,
|
|
327
|
+
// The value the person approves: shown whole, not cut at the echo cap.
|
|
328
|
+
longParams: ['value'],
|
|
329
|
+
},
|
|
330
|
+
'init.compose.drift_header': {
|
|
331
|
+
reach: 'business',
|
|
332
|
+
developer: 'Drift (the already-committed file wins — nothing here is a proposed change):',
|
|
333
|
+
engineer: 'Out-of-date settings (the file already on disk wins; nothing here is a proposed change):',
|
|
334
|
+
business: "Some of your organisation's settings differ from the saved file. The saved file wins, so nothing here changes:",
|
|
335
|
+
part: true,
|
|
336
|
+
},
|
|
337
|
+
'init.compose.drift': {
|
|
338
|
+
reach: 'business',
|
|
339
|
+
developer: ' the profile would have supplied {profile_value} for "{key}"; the file already says {file_value}, and {file_value} wins.',
|
|
340
|
+
engineer: ' The profile would have supplied {profile_value} for `{key}`; the file already says {file_value}, and {file_value} wins.',
|
|
341
|
+
business: " Your organisation's settings suggest {profile_value} for `{key}`, but the saved file says {file_value}, so {file_value} stays.",
|
|
342
|
+
part: true,
|
|
343
|
+
longParams: ['file_value', 'profile_value'],
|
|
344
|
+
},
|
|
345
|
+
'init.compose.warning': {
|
|
346
|
+
reach: 'business',
|
|
347
|
+
developer: ' warning: {warning}',
|
|
348
|
+
engineer: ' Warning: {warning}',
|
|
349
|
+
business: ' Note: {warning}',
|
|
350
|
+
part: true,
|
|
351
|
+
// A compose warning (up to 200 characters) ends with its remedy: never cut at the echo cap.
|
|
352
|
+
longParams: ['warning'],
|
|
353
|
+
},
|
|
354
|
+
'init.compose.action': {
|
|
355
|
+
reach: 'business',
|
|
356
|
+
developer: 'Action: {action}',
|
|
357
|
+
engineer: 'Action: {action}',
|
|
358
|
+
business: 'What happens if you say `yes`: {action}',
|
|
359
|
+
part: true,
|
|
360
|
+
},
|
|
361
|
+
// ─── Answers the session filled in itself ──────────────────────────────────
|
|
362
|
+
'init.auto_answer.derived': {
|
|
363
|
+
reach: 'business',
|
|
364
|
+
developer: ' {id} = {value} (derived)',
|
|
365
|
+
engineer: ' {id} = {value} (worked out from your other answers)',
|
|
366
|
+
business: ' {id} = {value} (worked out from your other answers)',
|
|
367
|
+
part: true,
|
|
368
|
+
},
|
|
369
|
+
'init.auto_answer.org_profile': {
|
|
370
|
+
reach: 'business',
|
|
371
|
+
developer: ' {id} = {value} (set by the org profile)',
|
|
372
|
+
engineer: " {id} = {value} (set by your organisation's profile)",
|
|
373
|
+
business: " {id} = {value} (set by your organisation's settings)",
|
|
374
|
+
part: true,
|
|
375
|
+
},
|
|
376
|
+
// ─── Words for values the compose summary and auto-answer echoes show ──────
|
|
377
|
+
// The developer text is the raw value the code always printed; the driver looks these up for
|
|
378
|
+
// business and engineer only (`init.word.<kind>.<value, hyphens as underscores>`). Not part of
|
|
379
|
+
// the `init.step|chrome|compose|auto_answer` asking set.
|
|
380
|
+
'init.word.source.profile_seed': {
|
|
381
|
+
reach: 'business',
|
|
382
|
+
developer: 'profile-seed',
|
|
383
|
+
engineer: "your organisation's settings",
|
|
384
|
+
business: "your organisation's settings",
|
|
385
|
+
part: true,
|
|
386
|
+
},
|
|
387
|
+
'init.word.source.project_answer': {
|
|
388
|
+
reach: 'business',
|
|
389
|
+
developer: 'project-answer',
|
|
390
|
+
engineer: 'your answer',
|
|
391
|
+
business: 'your answer',
|
|
392
|
+
part: true,
|
|
393
|
+
},
|
|
394
|
+
'init.word.source.resolved_host': {
|
|
395
|
+
reach: 'business',
|
|
396
|
+
developer: 'resolved-host',
|
|
397
|
+
engineer: 'the detected host',
|
|
398
|
+
business: 'the detected host',
|
|
399
|
+
part: true,
|
|
400
|
+
},
|
|
401
|
+
'init.word.source.resolved_tag': {
|
|
402
|
+
reach: 'business',
|
|
403
|
+
developer: 'resolved-tag',
|
|
404
|
+
engineer: 'the latest published version',
|
|
405
|
+
business: 'the latest published version',
|
|
406
|
+
part: true,
|
|
407
|
+
},
|
|
408
|
+
'init.word.source.package_identity': {
|
|
409
|
+
reach: 'business',
|
|
410
|
+
developer: 'package-identity',
|
|
411
|
+
engineer: 'the package details',
|
|
412
|
+
business: 'the package details',
|
|
413
|
+
part: true,
|
|
414
|
+
},
|
|
415
|
+
'init.word.source.contract': {
|
|
416
|
+
reach: 'business',
|
|
417
|
+
developer: 'contract',
|
|
418
|
+
engineer: "pp-core's defaults",
|
|
419
|
+
business: "pp-core's defaults",
|
|
420
|
+
part: true,
|
|
421
|
+
},
|
|
422
|
+
'init.word.source.existing_file': {
|
|
423
|
+
reach: 'business',
|
|
424
|
+
developer: 'existing-file',
|
|
425
|
+
engineer: 'the saved file',
|
|
426
|
+
business: 'the saved file',
|
|
427
|
+
part: true,
|
|
428
|
+
},
|
|
429
|
+
'init.word.action.create': {
|
|
430
|
+
reach: 'business',
|
|
431
|
+
developer: 'create',
|
|
432
|
+
engineer: 'create the file',
|
|
433
|
+
business: 'create the file',
|
|
434
|
+
part: true,
|
|
435
|
+
},
|
|
436
|
+
'init.word.action.update': {
|
|
437
|
+
reach: 'business',
|
|
438
|
+
developer: 'update',
|
|
439
|
+
engineer: 'update the file',
|
|
440
|
+
business: 'update the file',
|
|
441
|
+
part: true,
|
|
442
|
+
},
|
|
443
|
+
'init.word.action.unchanged': {
|
|
444
|
+
reach: 'business',
|
|
445
|
+
developer: 'unchanged',
|
|
446
|
+
engineer: 'leave the file as it is',
|
|
447
|
+
business: 'leave the file as it is',
|
|
448
|
+
part: true,
|
|
449
|
+
},
|
|
450
|
+
'init.word.action.none': {
|
|
451
|
+
reach: 'business',
|
|
452
|
+
developer: 'none',
|
|
453
|
+
engineer: 'nothing to write',
|
|
454
|
+
business: 'nothing to write',
|
|
455
|
+
part: true,
|
|
456
|
+
},
|
|
457
|
+
'init.word.step.project_name': {
|
|
458
|
+
reach: 'business',
|
|
459
|
+
developer: 'project_name',
|
|
460
|
+
engineer: 'project name',
|
|
461
|
+
business: 'project name',
|
|
462
|
+
part: true,
|
|
463
|
+
},
|
|
464
|
+
'init.word.step.project_slug': {
|
|
465
|
+
reach: 'business',
|
|
466
|
+
developer: 'project_slug',
|
|
467
|
+
engineer: 'project short name',
|
|
468
|
+
business: 'project short name',
|
|
469
|
+
part: true,
|
|
470
|
+
},
|
|
471
|
+
'init.word.step.client_name': {
|
|
472
|
+
reach: 'business',
|
|
473
|
+
developer: 'client_name',
|
|
474
|
+
engineer: 'client name',
|
|
475
|
+
business: 'client name',
|
|
476
|
+
part: true,
|
|
477
|
+
},
|
|
478
|
+
'init.word.step.client_slug': {
|
|
479
|
+
reach: 'business',
|
|
480
|
+
developer: 'client_slug',
|
|
481
|
+
engineer: 'client short name',
|
|
482
|
+
business: 'client short name',
|
|
483
|
+
part: true,
|
|
484
|
+
},
|
|
485
|
+
'init.word.step.client_vault': {
|
|
486
|
+
reach: 'business',
|
|
487
|
+
developer: 'client_vault',
|
|
488
|
+
engineer: 'client standards location',
|
|
489
|
+
business: 'client standards location',
|
|
490
|
+
part: true,
|
|
491
|
+
},
|
|
492
|
+
'init.word.step.description': {
|
|
493
|
+
reach: 'business',
|
|
494
|
+
developer: 'description',
|
|
495
|
+
engineer: 'description',
|
|
496
|
+
business: 'description',
|
|
497
|
+
part: true,
|
|
498
|
+
},
|
|
499
|
+
'init.word.step.provider': {
|
|
500
|
+
reach: 'business',
|
|
501
|
+
developer: 'provider',
|
|
502
|
+
engineer: 'provider',
|
|
503
|
+
business: 'provider',
|
|
504
|
+
part: true,
|
|
505
|
+
},
|
|
506
|
+
'init.word.step.visibility': {
|
|
507
|
+
reach: 'business',
|
|
508
|
+
developer: 'visibility',
|
|
509
|
+
engineer: 'visibility',
|
|
510
|
+
business: 'visibility',
|
|
511
|
+
part: true,
|
|
512
|
+
},
|
|
513
|
+
});
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Catalog slice: progress and stats table messages (Phase 41, plan 41-08). Data only.
|
|
4
|
+
*
|
|
5
|
+
* ADR-457 build-at-publish: compiles to the gitignored
|
|
6
|
+
* `pp-core/bin/lib/messages/progress.cjs`. Imports nothing but the entry type.
|
|
7
|
+
*
|
|
8
|
+
* Only the `table` format of `progress` and `stats` is display text; the json
|
|
9
|
+
* and bar formats are machine output and never read this slice. The `developer`
|
|
10
|
+
* text of every entry is the wording the untouched code printed
|
|
11
|
+
* (tests/fixtures/message-oracle.json pins it byte for byte). The status cell of
|
|
12
|
+
* each row is not here: it is the canonical word run through
|
|
13
|
+
* `label('phase.status', …)` at the last step of the render (D-13).
|
|
14
|
+
*
|
|
15
|
+
* `engineer` and `business` follow pp-core/references/audience.md: business
|
|
16
|
+
* says "stage" for phase and "release" for milestone. The pipe columns of a
|
|
17
|
+
* header entry and the separator row under it must keep the same shape. The
|
|
18
|
+
* header codes hold the header row, a newline, and the separator row. The
|
|
19
|
+
* `Ref:` line is added by the renderer once, at the end of the table.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.progress = void 0;
|
|
23
|
+
exports.progress = Object.freeze({
|
|
24
|
+
// ─── progress table ────────────────────────────────────────────────────────
|
|
25
|
+
'progress.table': {
|
|
26
|
+
reach: 'business',
|
|
27
|
+
developer: '# {version} {name}',
|
|
28
|
+
engineer: '# Milestone {version}: {name}',
|
|
29
|
+
business: '# Release {version}: {name}',
|
|
30
|
+
explain: 'This table shows how far the current release has come: one overall progress line, then one row per stage with the plans finished and where the stage stands. The status words in the last column are the same words the work itself uses, written out in plain language.',
|
|
31
|
+
},
|
|
32
|
+
'progress.table.progress': {
|
|
33
|
+
reach: 'business',
|
|
34
|
+
developer: '**Progress:** [{bar}] {done}/{total} plans ({percent}%)',
|
|
35
|
+
engineer: '**Progress:** [{bar}] {done} of {total} plans complete ({percent}%)',
|
|
36
|
+
business: '**How far along:** [{bar}] {done} of {total} plans done ({percent}%)',
|
|
37
|
+
part: true,
|
|
38
|
+
},
|
|
39
|
+
'progress.table.header': {
|
|
40
|
+
reach: 'business',
|
|
41
|
+
developer: '| Phase | Name | Plans | Status |\n|-------|------|-------|--------|',
|
|
42
|
+
engineer: '| Phase | Name | Plans done | Status |\n|-------|------|------------|--------|',
|
|
43
|
+
business: '| Stage | Name | Plans done | Status |\n|-------|------|------------|--------|',
|
|
44
|
+
part: true,
|
|
45
|
+
},
|
|
46
|
+
// ─── stats table ───────────────────────────────────────────────────────────
|
|
47
|
+
'stats.table': {
|
|
48
|
+
reach: 'business',
|
|
49
|
+
developer: '# {version} {name} — Statistics',
|
|
50
|
+
engineer: '# Milestone {version}: {name} (statistics)',
|
|
51
|
+
business: '# Release {version}: {name} (how things stand)',
|
|
52
|
+
explain: 'This table sums up the current release: how many stages and plans are done, how many requirements are met, one row per stage, and when the work last moved. The status words in the table are the same words the work itself uses, written out in plain language.',
|
|
53
|
+
},
|
|
54
|
+
'stats.table.progress': {
|
|
55
|
+
reach: 'business',
|
|
56
|
+
developer: '**Progress:** [{bar}] {done}/{total} phases ({percent}%)',
|
|
57
|
+
engineer: '**Progress:** [{bar}] {done} of {total} phases complete ({percent}%)',
|
|
58
|
+
business: '**How far along:** [{bar}] {done} of {total} stages done ({percent}%)',
|
|
59
|
+
part: true,
|
|
60
|
+
},
|
|
61
|
+
'stats.table.plans': {
|
|
62
|
+
reach: 'business',
|
|
63
|
+
developer: '**Plans:** {done}/{total} complete ({percent}%)',
|
|
64
|
+
engineer: '**Plans:** {done} of {total} complete ({percent}%)',
|
|
65
|
+
business: '**Plans:** {done} of {total} done ({percent}%)',
|
|
66
|
+
part: true,
|
|
67
|
+
},
|
|
68
|
+
'stats.table.phases': {
|
|
69
|
+
reach: 'business',
|
|
70
|
+
developer: '**Phases:** {done}/{total} complete',
|
|
71
|
+
engineer: '**Phases:** {done} of {total} complete',
|
|
72
|
+
business: '**Stages:** {done} of {total} done',
|
|
73
|
+
part: true,
|
|
74
|
+
},
|
|
75
|
+
'stats.table.requirements': {
|
|
76
|
+
reach: 'business',
|
|
77
|
+
developer: '**Requirements:** {done}/{total} complete',
|
|
78
|
+
engineer: '**Requirements:** {done} of {total} complete',
|
|
79
|
+
business: '**Requirements:** {done} of {total} met',
|
|
80
|
+
part: true,
|
|
81
|
+
},
|
|
82
|
+
'stats.table.header': {
|
|
83
|
+
reach: 'business',
|
|
84
|
+
developer: '| Phase | Name | Plans | Completed | Status | Wall-clock |\n|-------|------|-------|-----------|--------|------------|',
|
|
85
|
+
engineer: '| Phase | Name | Plans | Completed | Status | Elapsed time |\n|-------|------|-------|-----------|--------|--------------|',
|
|
86
|
+
business: '| Stage | Name | Plans | Plans done | Status | Time taken |\n|-------|------|-------|------------|--------|------------|',
|
|
87
|
+
part: true,
|
|
88
|
+
},
|
|
89
|
+
'stats.table.git': {
|
|
90
|
+
reach: 'business',
|
|
91
|
+
developer: '**Git:** {count} commits',
|
|
92
|
+
engineer: '**Commits:** {count}',
|
|
93
|
+
business: '**Changes saved:** {count}',
|
|
94
|
+
part: true,
|
|
95
|
+
},
|
|
96
|
+
'stats.table.git_since': {
|
|
97
|
+
reach: 'business',
|
|
98
|
+
developer: ' (since {date})',
|
|
99
|
+
engineer: ' (since {date})',
|
|
100
|
+
business: ' (since {date})',
|
|
101
|
+
part: true,
|
|
102
|
+
},
|
|
103
|
+
'stats.table.last_activity': {
|
|
104
|
+
reach: 'business',
|
|
105
|
+
developer: '**Last activity:** {date}',
|
|
106
|
+
engineer: '**Last activity:** {date}',
|
|
107
|
+
business: '**Last activity:** {date}',
|
|
108
|
+
part: true,
|
|
109
|
+
},
|
|
110
|
+
});
|