dxcomplete 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -70
- package/dist/cli.js +2 -2
- package/docs/cost-model.md +2 -2
- package/docs/decision-basis.md +5 -11
- package/docs/diagrams.md +3 -3
- package/docs/index.md +25 -39
- package/docs/model.md +12 -20
- package/docs/open-questions.md +1 -1
- package/docs/taxonomy.md +6 -7
- package/docs/workflows.md +3 -3
- package/package.json +2 -2
- package/templates/process/README.md +10 -10
- package/templates/process/controls.yml +19 -19
- package/templates/process/cost-model.yml +3 -3
- package/templates/process/decision-basis.yml +4 -4
- package/templates/process/diagrams/00-decision-basis.mmd +1 -1
- package/templates/process/diagrams/00-overview.mmd +1 -1
- package/templates/process/diagrams/01-intake-triage.mmd +4 -4
- package/templates/process/diagrams/02-product-definition.mmd +3 -3
- package/templates/process/diagrams/03-engineering-execution.mmd +1 -1
- package/templates/process/diagrams/04-qa-verification.mmd +1 -1
- package/templates/process/diagrams/05-product-validation.mmd +1 -1
- package/templates/process/diagrams/06-change-release-control.mmd +1 -1
- package/templates/process/diagrams/07-deployment-operations.mmd +1 -1
- package/templates/process/diagrams/08-support-incident-management.mmd +1 -1
- package/templates/process/diagrams/09-problem-improvement.mmd +1 -1
- package/templates/process/diagrams/10-risk-control-management.mmd +1 -1
- package/templates/process/diagrams/11-audit-evidence-capture.mmd +1 -1
- package/templates/process/roles.yml +6 -6
- package/templates/process/taxonomy.yml +46 -46
- package/templates/process/workflows.yml +29 -29
- package/website/account.html +57 -0
- package/website/app.js +177 -0
- package/website/flow.html +4 -0
- package/website/glossary.html +4 -0
- package/website/index.html +4 -0
- package/website/objects.html +4 -0
- package/website/operating-guide.html +4 -0
- package/website/outcomes.html +4 -0
- package/website/phase-build.html +4 -0
- package/website/phase-elicit.html +4 -0
- package/website/phase-go-live.html +4 -0
- package/website/phase-measure.html +4 -0
- package/website/phase-operate.html +4 -0
- package/website/phase-orient.html +4 -0
- package/website/phase-weigh.html +4 -0
- package/website/roles.html +4 -0
- package/website/styles.css +217 -1
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
schema: dxcomplete.workflows.v0
|
|
2
|
-
status:
|
|
2
|
+
status: current
|
|
3
3
|
notes:
|
|
4
4
|
- These workflows are editable templates.
|
|
5
|
-
- Add, remove, merge, or split workflows
|
|
5
|
+
- Add, remove, merge, or split workflows when the workspace process changes.
|
|
6
6
|
|
|
7
7
|
workflows:
|
|
8
8
|
- id: decision_basis
|
|
9
9
|
name: Decision basis
|
|
10
|
-
|
|
10
|
+
purpose: Move from user statement to expectations and requirements with enough detail to support useful cost, benefit, risk, confidence, and Weigh outcomes.
|
|
11
11
|
likely_roles:
|
|
12
12
|
- Owner
|
|
13
13
|
- Engineer
|
|
14
14
|
- Operator
|
|
15
15
|
- End User
|
|
16
|
-
|
|
16
|
+
steps:
|
|
17
17
|
- Capture statement in the user's own words and restate the expected result.
|
|
18
18
|
- Confirm captured wording before recording it on the user's behalf.
|
|
19
19
|
- Confirm how success will be recognized where possible.
|
|
@@ -39,12 +39,12 @@ workflows:
|
|
|
39
39
|
|
|
40
40
|
- id: intake_triage
|
|
41
41
|
name: Intake and triage
|
|
42
|
-
|
|
42
|
+
purpose: Decide whether a signal should become a ticket, statement, requirement, task, risk, decision, change, journal note, or another matching lifecycle concept.
|
|
43
43
|
likely_roles:
|
|
44
44
|
- Owner
|
|
45
45
|
- Support Agent
|
|
46
46
|
- Operator
|
|
47
|
-
|
|
47
|
+
steps:
|
|
48
48
|
- Capture signal.
|
|
49
49
|
- Identify source and urgency.
|
|
50
50
|
- Route to Owner, Operator, or Support Agent.
|
|
@@ -53,15 +53,15 @@ workflows:
|
|
|
53
53
|
|
|
54
54
|
- id: product_definition
|
|
55
55
|
name: Product definition
|
|
56
|
-
|
|
56
|
+
purpose: Translate expectations into requirements before Weigh, then refine requirement detail after Commitment where needed.
|
|
57
57
|
likely_roles:
|
|
58
58
|
- Owner
|
|
59
59
|
- End User
|
|
60
60
|
- Engineer
|
|
61
|
-
|
|
61
|
+
steps:
|
|
62
62
|
- Review linked Statement, Estimate, Benefits, and decisions where available.
|
|
63
63
|
- Review captured statement and expectations.
|
|
64
|
-
-
|
|
64
|
+
- Prepare requirement and acceptance criteria.
|
|
65
65
|
- Add Engineer review notes where delivery input should remain visible.
|
|
66
66
|
- Refine requirement detail after Commitment where needed.
|
|
67
67
|
- Link source objects.
|
|
@@ -70,10 +70,10 @@ workflows:
|
|
|
70
70
|
|
|
71
71
|
- id: engineering_execution
|
|
72
72
|
name: Engineering execution
|
|
73
|
-
|
|
73
|
+
purpose: Refine committed requirements into tasks and perform implementation work.
|
|
74
74
|
likely_roles:
|
|
75
75
|
- Engineer
|
|
76
|
-
|
|
76
|
+
steps:
|
|
77
77
|
- Review requirement and acceptance criteria.
|
|
78
78
|
- Review important notes attached to expectations or requirements.
|
|
79
79
|
- Add requirement detail and decide implementation approach.
|
|
@@ -83,11 +83,11 @@ workflows:
|
|
|
83
83
|
|
|
84
84
|
- id: qa_verification
|
|
85
85
|
name: QA verification
|
|
86
|
-
|
|
86
|
+
purpose: Verify completed work against requirements and acceptance criteria.
|
|
87
87
|
likely_roles:
|
|
88
88
|
- Tester
|
|
89
89
|
- Engineer
|
|
90
|
-
|
|
90
|
+
steps:
|
|
91
91
|
- Review requirement and task output.
|
|
92
92
|
- Plan verification.
|
|
93
93
|
- Execute checks.
|
|
@@ -96,11 +96,11 @@ workflows:
|
|
|
96
96
|
|
|
97
97
|
- id: product_validation
|
|
98
98
|
name: Product validation
|
|
99
|
-
|
|
99
|
+
purpose: Decide whether verified work achieves the intended product outcome.
|
|
100
100
|
likely_roles:
|
|
101
101
|
- Owner
|
|
102
102
|
- End User
|
|
103
|
-
|
|
103
|
+
steps:
|
|
104
104
|
- Review QA evidence.
|
|
105
105
|
- Validate outcome against product intent.
|
|
106
106
|
- Capture approval, rejection, or follow-up requirements.
|
|
@@ -108,13 +108,13 @@ workflows:
|
|
|
108
108
|
|
|
109
109
|
- id: change_release_control
|
|
110
110
|
name: Change and release control
|
|
111
|
-
|
|
111
|
+
purpose: Record a discrete service change, including change type, plan, execution, rollback, notice, veto, and result.
|
|
112
112
|
likely_roles:
|
|
113
113
|
- Operator
|
|
114
114
|
- Owner
|
|
115
115
|
- Engineer
|
|
116
116
|
- Tester
|
|
117
|
-
|
|
117
|
+
steps:
|
|
118
118
|
- Record the Change baseline.
|
|
119
119
|
- Confirm required evidence and notice.
|
|
120
120
|
- Assess risk, impact, and rollback.
|
|
@@ -124,12 +124,12 @@ workflows:
|
|
|
124
124
|
|
|
125
125
|
- id: deployment_operations
|
|
126
126
|
name: Deployment and operations
|
|
127
|
-
|
|
127
|
+
purpose: Deploy and run the service safely.
|
|
128
128
|
likely_roles:
|
|
129
129
|
- Operator
|
|
130
130
|
- Engineer
|
|
131
131
|
- Support Agent
|
|
132
|
-
|
|
132
|
+
steps:
|
|
133
133
|
- Prepare deployment.
|
|
134
134
|
- Execute deployment.
|
|
135
135
|
- Monitor service health.
|
|
@@ -139,11 +139,11 @@ workflows:
|
|
|
139
139
|
|
|
140
140
|
- id: operational_registry
|
|
141
141
|
name: Operational Registry maintenance
|
|
142
|
-
|
|
142
|
+
purpose: Keep the inventory of Environments and Components understandable without turning it into monitoring, diagnostics, secret storage, event history, or a runbook.
|
|
143
143
|
likely_roles:
|
|
144
144
|
- Operator
|
|
145
145
|
- Engineer
|
|
146
|
-
|
|
146
|
+
steps:
|
|
147
147
|
- Create or update Environment records for named operating contexts.
|
|
148
148
|
- Create or update Component records for operational items in each Environment.
|
|
149
149
|
- Record locator details, non-secret identifiers, and secret pointers where useful.
|
|
@@ -152,13 +152,13 @@ workflows:
|
|
|
152
152
|
|
|
153
153
|
- id: support_incident_management
|
|
154
154
|
name: Support and incident management
|
|
155
|
-
|
|
155
|
+
purpose: Handle user-facing issues and service-impacting events, using Incident when a specific occurrence needs response history.
|
|
156
156
|
likely_roles:
|
|
157
157
|
- Support Agent
|
|
158
158
|
- Operator
|
|
159
159
|
- Owner
|
|
160
160
|
- Engineer
|
|
161
|
-
|
|
161
|
+
steps:
|
|
162
162
|
- Capture user or monitoring signal.
|
|
163
163
|
- Classify as ticket, statement, incident, problem, risk, task, change, decision, requirement, or journal note.
|
|
164
164
|
- Communicate status to affected users where needed.
|
|
@@ -167,13 +167,13 @@ workflows:
|
|
|
167
167
|
|
|
168
168
|
- id: problem_improvement
|
|
169
169
|
name: Problem and improvement management
|
|
170
|
-
|
|
170
|
+
purpose: Convert recurring or root-cause signals into durable improvements through Problem records and linked follow-up.
|
|
171
171
|
likely_roles:
|
|
172
172
|
- Operator
|
|
173
173
|
- Engineer
|
|
174
174
|
- Owner
|
|
175
175
|
- Support Agent
|
|
176
|
-
|
|
176
|
+
steps:
|
|
177
177
|
- Identify recurring issue or root cause.
|
|
178
178
|
- Capture the underlying or recurring cause through Problem when incidents or operational evidence support it.
|
|
179
179
|
- Decide whether improvement requires a Requirement, Task, Risk, Decision, or Change.
|
|
@@ -182,13 +182,13 @@ workflows:
|
|
|
182
182
|
|
|
183
183
|
- id: risk_control_management
|
|
184
184
|
name: Risk and control management
|
|
185
|
-
|
|
185
|
+
purpose: Identify risks and define controls or evidence requirements.
|
|
186
186
|
likely_roles:
|
|
187
187
|
- Owner
|
|
188
188
|
- Operator
|
|
189
189
|
- Tester
|
|
190
190
|
- Engineer
|
|
191
|
-
|
|
191
|
+
steps:
|
|
192
192
|
- Identify risk.
|
|
193
193
|
- Decide owner and impact.
|
|
194
194
|
- Define control or mitigation.
|
|
@@ -197,13 +197,13 @@ workflows:
|
|
|
197
197
|
|
|
198
198
|
- id: audit_evidence_capture
|
|
199
199
|
name: Audit and evidence capture
|
|
200
|
-
|
|
200
|
+
purpose: Preserve evidence for decisions, verification, controls, releases, deployments, and approvals.
|
|
201
201
|
likely_roles:
|
|
202
202
|
- Operator
|
|
203
203
|
- Tester
|
|
204
204
|
- Engineer
|
|
205
205
|
- Owner
|
|
206
|
-
|
|
206
|
+
steps:
|
|
207
207
|
- Identify required evidence.
|
|
208
208
|
- Capture or link evidence.
|
|
209
209
|
- Record responsible person and timestamp.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>DX Complete Account</title>
|
|
7
|
+
<link rel="stylesheet" href="./styles.css?v=5" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<a class="skip-link" href="#content">Skip to content</a>
|
|
11
|
+
|
|
12
|
+
<header class="topbar">
|
|
13
|
+
<div class="topbar__brand">
|
|
14
|
+
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
15
|
+
<span>
|
|
16
|
+
<strong>DX Complete</strong>
|
|
17
|
+
<small>Plan, deliver, run, measure</small>
|
|
18
|
+
</span>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="topbar__actions">
|
|
21
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
22
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
23
|
+
</div>
|
|
24
|
+
</header>
|
|
25
|
+
|
|
26
|
+
<div class="layout">
|
|
27
|
+
<aside class="sidebar" aria-label="Documentation pages">
|
|
28
|
+
<div class="sidebar__eyebrow">Pages</div>
|
|
29
|
+
<nav>
|
|
30
|
+
<a class="nav-link" href="./index.html">Start here</a>
|
|
31
|
+
<a class="nav-link" href="./outcomes.html">Outcomes</a>
|
|
32
|
+
<a class="nav-link" href="./flow.html">Flow</a>
|
|
33
|
+
<a class="nav-link" href="./objects.html">Records</a>
|
|
34
|
+
<a class="nav-link" href="./roles.html">Roles</a>
|
|
35
|
+
<a class="nav-link" href="./operating-guide.html">Operating Guide</a>
|
|
36
|
+
<a class="nav-link" href="./glossary.html">Glossary</a>
|
|
37
|
+
</nav>
|
|
38
|
+
</aside>
|
|
39
|
+
|
|
40
|
+
<main id="content" class="content" tabindex="-1">
|
|
41
|
+
<section class="doc-section doc-section--last">
|
|
42
|
+
<p class="section-kicker">Account</p>
|
|
43
|
+
<h1>Set Up A Workspace</h1>
|
|
44
|
+
<p class="lede">
|
|
45
|
+
Sign in with Google, create a workspace, and save the service values needed by your project.
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
<div class="account-panel" data-account>
|
|
49
|
+
<p>Loading account state...</p>
|
|
50
|
+
</div>
|
|
51
|
+
</section>
|
|
52
|
+
</main>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<script src="./app.js?v=5"></script>
|
|
56
|
+
</body>
|
|
57
|
+
</html>
|
package/website/app.js
CHANGED
|
@@ -34,3 +34,180 @@ roleButtons.forEach((button, index) => {
|
|
|
34
34
|
detailPanel.textContent = detail;
|
|
35
35
|
});
|
|
36
36
|
});
|
|
37
|
+
|
|
38
|
+
const accountPanel = document.querySelector("[data-account]");
|
|
39
|
+
let accountState;
|
|
40
|
+
|
|
41
|
+
if (accountPanel) {
|
|
42
|
+
loadAccount();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function loadAccount() {
|
|
46
|
+
accountPanel.innerHTML = `<p>Loading account state...</p>`;
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetch("/api/dxcomplete/web/session", {
|
|
50
|
+
credentials: "same-origin"
|
|
51
|
+
});
|
|
52
|
+
accountState = await response.json();
|
|
53
|
+
renderAccount();
|
|
54
|
+
} catch {
|
|
55
|
+
accountPanel.innerHTML = `
|
|
56
|
+
<div class="account-message account-message--error">
|
|
57
|
+
Account state could not be loaded. Try again in a moment.
|
|
58
|
+
</div>
|
|
59
|
+
`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function renderAccount(created) {
|
|
64
|
+
const error = new URLSearchParams(window.location.search).get("error");
|
|
65
|
+
|
|
66
|
+
if (!accountState?.authenticated) {
|
|
67
|
+
accountPanel.innerHTML = `
|
|
68
|
+
${error ? `<div class="account-message account-message--error">Sign in could not be completed.</div>` : ""}
|
|
69
|
+
<div class="account-intro">
|
|
70
|
+
<p>Use Google sign in to create and view your DX Complete workspaces.</p>
|
|
71
|
+
<a class="account-primary" href="${escapeHtml(accountState?.signInUrl || "/api/dxcomplete/web/auth/google/start?returnTo=/account.html")}">Sign in with Google</a>
|
|
72
|
+
</div>
|
|
73
|
+
`;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const workspaces = Array.isArray(accountState.workspaces) ? accountState.workspaces : [];
|
|
78
|
+
accountPanel.innerHTML = `
|
|
79
|
+
<div class="account-bar">
|
|
80
|
+
<div>
|
|
81
|
+
<span>Signed in</span>
|
|
82
|
+
<strong>${escapeHtml(accountState.actor?.email || accountState.actor?.displayName || "Google account")}</strong>
|
|
83
|
+
</div>
|
|
84
|
+
<button class="account-secondary" type="button" data-account-logout>Sign out</button>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<form class="account-form" data-account-form>
|
|
88
|
+
<label for="workspace-name">Workspace name</label>
|
|
89
|
+
<div class="account-form__row">
|
|
90
|
+
<input id="workspace-name" name="name" type="text" minlength="2" maxlength="120" required autocomplete="organization" />
|
|
91
|
+
<button class="account-primary" type="submit">Create workspace</button>
|
|
92
|
+
</div>
|
|
93
|
+
<p>Use a service or project name that your team will recognize later.</p>
|
|
94
|
+
</form>
|
|
95
|
+
|
|
96
|
+
<div data-account-result>
|
|
97
|
+
${created ? renderCreatedWorkspace(created) : ""}
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<div class="account-list">
|
|
101
|
+
<h2>Your Workspaces</h2>
|
|
102
|
+
${workspaces.length ? workspaces.map(renderWorkspaceSummary).join("") : "<p>No workspaces yet.</p>"}
|
|
103
|
+
</div>
|
|
104
|
+
`;
|
|
105
|
+
|
|
106
|
+
accountPanel.querySelector("[data-account-logout]")?.addEventListener("click", logoutAccount);
|
|
107
|
+
accountPanel.querySelector("[data-account-form]")?.addEventListener("submit", createWorkspace);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async function createWorkspace(event) {
|
|
111
|
+
event.preventDefault();
|
|
112
|
+
const form = event.currentTarget;
|
|
113
|
+
const result = accountPanel.querySelector("[data-account-result]");
|
|
114
|
+
const button = form.querySelector("button[type='submit']");
|
|
115
|
+
const formData = new FormData(form);
|
|
116
|
+
const name = String(formData.get("name") || "");
|
|
117
|
+
|
|
118
|
+
button.disabled = true;
|
|
119
|
+
result.innerHTML = `<div class="account-message">Creating workspace...</div>`;
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
const response = await fetch("/api/dxcomplete/web/workspaces", {
|
|
123
|
+
method: "POST",
|
|
124
|
+
credentials: "same-origin",
|
|
125
|
+
headers: {
|
|
126
|
+
"content-type": "application/json",
|
|
127
|
+
"x-dxc-csrf-token": accountState.csrfToken
|
|
128
|
+
},
|
|
129
|
+
body: JSON.stringify({ name })
|
|
130
|
+
});
|
|
131
|
+
const body = await response.json();
|
|
132
|
+
|
|
133
|
+
if (!response.ok) {
|
|
134
|
+
throw new Error(body.error_description || "Workspace could not be created.");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
form.reset();
|
|
138
|
+
await refreshAccountState();
|
|
139
|
+
renderAccount(body);
|
|
140
|
+
} catch (error) {
|
|
141
|
+
result.innerHTML = `
|
|
142
|
+
<div class="account-message account-message--error">
|
|
143
|
+
${escapeHtml(error instanceof Error ? error.message : "Workspace could not be created.")}
|
|
144
|
+
</div>
|
|
145
|
+
`;
|
|
146
|
+
} finally {
|
|
147
|
+
button.disabled = false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function logoutAccount() {
|
|
152
|
+
await fetch("/api/dxcomplete/web/logout", {
|
|
153
|
+
method: "POST",
|
|
154
|
+
credentials: "same-origin",
|
|
155
|
+
headers: {
|
|
156
|
+
"x-dxc-csrf-token": accountState.csrfToken
|
|
157
|
+
}
|
|
158
|
+
}).catch(() => undefined);
|
|
159
|
+
|
|
160
|
+
await loadAccount();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function refreshAccountState() {
|
|
164
|
+
const response = await fetch("/api/dxcomplete/web/session", {
|
|
165
|
+
credentials: "same-origin"
|
|
166
|
+
});
|
|
167
|
+
accountState = await response.json();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function renderCreatedWorkspace(created) {
|
|
171
|
+
const env = created.install?.env || {};
|
|
172
|
+
const workspace = created.install?.workspaceConfig || {};
|
|
173
|
+
const envBlock = [
|
|
174
|
+
`DXC_SERVICE_URL=${env.DXC_SERVICE_URL || ""}`,
|
|
175
|
+
`DXC_SERVICE_CLIENT_ID=${env.DXC_SERVICE_CLIENT_ID || ""}`,
|
|
176
|
+
`DXC_SERVICE_CLIENT_SECRET=${env.DXC_SERVICE_CLIENT_SECRET || ""}`
|
|
177
|
+
].join("\n");
|
|
178
|
+
const workspaceBlock = JSON.stringify(workspace, null, 2);
|
|
179
|
+
|
|
180
|
+
return `
|
|
181
|
+
<div class="account-result">
|
|
182
|
+
<h2>Workspace Created</h2>
|
|
183
|
+
<p>Save these values now. The secret is shown only once.</p>
|
|
184
|
+
<h3>Service Values</h3>
|
|
185
|
+
<pre><code>${escapeHtml(envBlock)}</code></pre>
|
|
186
|
+
<h3>Workspace JSON</h3>
|
|
187
|
+
<pre><code>${escapeHtml(workspaceBlock)}</code></pre>
|
|
188
|
+
</div>
|
|
189
|
+
`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function renderWorkspaceSummary(workspace) {
|
|
193
|
+
const clients = Array.isArray(workspace.serviceClients) ? workspace.serviceClients : [];
|
|
194
|
+
return `
|
|
195
|
+
<article class="account-workspace">
|
|
196
|
+
<h3>${escapeHtml(workspace.name || workspace.workspaceId)}</h3>
|
|
197
|
+
<p>${escapeHtml(workspace.workspaceId || "")}</p>
|
|
198
|
+
<dl>
|
|
199
|
+
<div><dt>Roles</dt><dd>${escapeHtml((workspace.roles || []).join(", ") || "member")}</dd></div>
|
|
200
|
+
<div><dt>Service clients</dt><dd>${clients.length}</dd></div>
|
|
201
|
+
</dl>
|
|
202
|
+
</article>
|
|
203
|
+
`;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function escapeHtml(value) {
|
|
207
|
+
return String(value)
|
|
208
|
+
.replace(/&/g, "&")
|
|
209
|
+
.replace(/</g, "<")
|
|
210
|
+
.replace(/>/g, ">")
|
|
211
|
+
.replace(/"/g, """)
|
|
212
|
+
.replace(/'/g, "'");
|
|
213
|
+
}
|
package/website/flow.html
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
package/website/glossary.html
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
package/website/index.html
CHANGED
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
<small>Plan, deliver, run, measure</small>
|
|
18
18
|
</span>
|
|
19
19
|
</div>
|
|
20
|
+
<div class="topbar__actions">
|
|
21
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
22
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
23
|
+
</div>
|
|
20
24
|
</header>
|
|
21
25
|
|
|
22
26
|
<div class="layout">
|
package/website/objects.html
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
package/website/outcomes.html
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
package/website/phase-build.html
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
package/website/phase-weigh.html
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|
package/website/roles.html
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
<span class="brand-mark" aria-hidden="true">DX</span>
|
|
14
14
|
<span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
|
|
15
15
|
</div>
|
|
16
|
+
<div class="topbar__actions">
|
|
17
|
+
<a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
|
|
18
|
+
<a class="topbar__link" href="./account.html">Sign in</a>
|
|
19
|
+
</div>
|
|
16
20
|
</header>
|
|
17
21
|
<div class="layout">
|
|
18
22
|
<aside class="sidebar" aria-label="Documentation pages">
|