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.
Files changed (48) hide show
  1. package/README.md +63 -70
  2. package/dist/cli.js +2 -2
  3. package/docs/cost-model.md +2 -2
  4. package/docs/decision-basis.md +5 -11
  5. package/docs/diagrams.md +3 -3
  6. package/docs/index.md +25 -39
  7. package/docs/model.md +12 -20
  8. package/docs/open-questions.md +1 -1
  9. package/docs/taxonomy.md +6 -7
  10. package/docs/workflows.md +3 -3
  11. package/package.json +2 -2
  12. package/templates/process/README.md +10 -10
  13. package/templates/process/controls.yml +19 -19
  14. package/templates/process/cost-model.yml +3 -3
  15. package/templates/process/decision-basis.yml +4 -4
  16. package/templates/process/diagrams/00-decision-basis.mmd +1 -1
  17. package/templates/process/diagrams/00-overview.mmd +1 -1
  18. package/templates/process/diagrams/01-intake-triage.mmd +4 -4
  19. package/templates/process/diagrams/02-product-definition.mmd +3 -3
  20. package/templates/process/diagrams/03-engineering-execution.mmd +1 -1
  21. package/templates/process/diagrams/04-qa-verification.mmd +1 -1
  22. package/templates/process/diagrams/05-product-validation.mmd +1 -1
  23. package/templates/process/diagrams/06-change-release-control.mmd +1 -1
  24. package/templates/process/diagrams/07-deployment-operations.mmd +1 -1
  25. package/templates/process/diagrams/08-support-incident-management.mmd +1 -1
  26. package/templates/process/diagrams/09-problem-improvement.mmd +1 -1
  27. package/templates/process/diagrams/10-risk-control-management.mmd +1 -1
  28. package/templates/process/diagrams/11-audit-evidence-capture.mmd +1 -1
  29. package/templates/process/roles.yml +6 -6
  30. package/templates/process/taxonomy.yml +46 -46
  31. package/templates/process/workflows.yml +29 -29
  32. package/website/account.html +57 -0
  33. package/website/app.js +177 -0
  34. package/website/flow.html +4 -0
  35. package/website/glossary.html +4 -0
  36. package/website/index.html +4 -0
  37. package/website/objects.html +4 -0
  38. package/website/operating-guide.html +4 -0
  39. package/website/outcomes.html +4 -0
  40. package/website/phase-build.html +4 -0
  41. package/website/phase-elicit.html +4 -0
  42. package/website/phase-go-live.html +4 -0
  43. package/website/phase-measure.html +4 -0
  44. package/website/phase-operate.html +4 -0
  45. package/website/phase-orient.html +4 -0
  46. package/website/phase-weigh.html +4 -0
  47. package/website/roles.html +4 -0
  48. package/website/styles.css +217 -1
@@ -1,19 +1,19 @@
1
1
  schema: dxcomplete.workflows.v0
2
- status: draft
2
+ status: current
3
3
  notes:
4
4
  - These workflows are editable templates.
5
- - Add, remove, merge, or split workflows as the model becomes clearer.
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
- draft_purpose: Move from user statement to expectations and requirements with enough detail to support useful cost, benefit, risk, confidence, and Weigh outcomes.
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
- draft_steps:
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
- draft_purpose: Decide whether a signal should become a ticket, statement, requirement, task, risk, decision, change, journal note, or another matching lifecycle concept.
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
- draft_steps:
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
- draft_purpose: Translate expectations into requirements before Weigh, then refine requirement detail after Commitment where needed.
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
- draft_steps:
61
+ steps:
62
62
  - Review linked Statement, Estimate, Benefits, and decisions where available.
63
63
  - Review captured statement and expectations.
64
- - Draft requirement and acceptance criteria.
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
- draft_purpose: Refine committed requirements into tasks and perform implementation work.
73
+ purpose: Refine committed requirements into tasks and perform implementation work.
74
74
  likely_roles:
75
75
  - Engineer
76
- draft_steps:
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
- draft_purpose: Verify completed work against requirements and acceptance criteria.
86
+ purpose: Verify completed work against requirements and acceptance criteria.
87
87
  likely_roles:
88
88
  - Tester
89
89
  - Engineer
90
- draft_steps:
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
- draft_purpose: Decide whether verified work achieves the intended product outcome.
99
+ purpose: Decide whether verified work achieves the intended product outcome.
100
100
  likely_roles:
101
101
  - Owner
102
102
  - End User
103
- draft_steps:
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
- draft_purpose: Record a discrete service change, including change type, plan, execution, rollback, notice, veto, and result.
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
- draft_steps:
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
- draft_purpose: Deploy and run the service safely.
127
+ purpose: Deploy and run the service safely.
128
128
  likely_roles:
129
129
  - Operator
130
130
  - Engineer
131
131
  - Support Agent
132
- draft_steps:
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
- draft_purpose: Keep the inventory of Environments and Components understandable without turning it into monitoring, diagnostics, secret storage, event history, or a runbook.
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
- draft_steps:
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
- draft_purpose: Handle user-facing issues and service-impacting events, using Incident when a specific occurrence needs response history.
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
- draft_steps:
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
- draft_purpose: Convert recurring or root-cause signals into durable improvements through Problem records and linked follow-up.
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
- draft_steps:
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
- draft_purpose: Identify risks and define controls or evidence requirements.
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
- draft_steps:
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
- draft_purpose: Preserve evidence for decisions, verification, controls, releases, deployments, and approvals.
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
- draft_steps:
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, "&amp;")
209
+ .replace(/</g, "&lt;")
210
+ .replace(/>/g, "&gt;")
211
+ .replace(/"/g, "&quot;")
212
+ .replace(/'/g, "&#39;");
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">
@@ -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">
@@ -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">
@@ -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">
@@ -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">