create-dss-project 0.1.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 (83) hide show
  1. package/bin/create-dss-project.js +4 -0
  2. package/lib/index.js +80 -0
  3. package/lib/project-types.js +74 -0
  4. package/lib/prompts.js +42 -0
  5. package/lib/scaffold.js +169 -0
  6. package/package.json +30 -0
  7. package/template/.github/workflows/dashboard-build.yml +27 -0
  8. package/template/.github/workflows/template-lint.yml +71 -0
  9. package/template/CHANGELOG.md +43 -0
  10. package/template/CLAUDE.md +145 -0
  11. package/template/LICENSE +21 -0
  12. package/template/README.md +201 -0
  13. package/template/STATUS.md +34 -0
  14. package/template/context/competitor-snapshot.md +27 -0
  15. package/template/context/market-snapshot.md +32 -0
  16. package/template/context/pipeline-state.md +36 -0
  17. package/template/context/project-state.md +45 -0
  18. package/template/dashboard/CLAUDE.md +36 -0
  19. package/template/dashboard/DEPLOY.md +60 -0
  20. package/template/dashboard/build-data.js +395 -0
  21. package/template/dashboard/competitors.html +143 -0
  22. package/template/dashboard/css/styles.css +143 -0
  23. package/template/dashboard/data/.gitkeep +0 -0
  24. package/template/dashboard/decisions.html +132 -0
  25. package/template/dashboard/index.html +152 -0
  26. package/template/dashboard/js/app.js +59 -0
  27. package/template/dashboard/js/overview.js +50 -0
  28. package/template/dashboard/js/sidebar.js +62 -0
  29. package/template/dashboard/js/tailwind-config.js +52 -0
  30. package/template/dashboard/package-lock.json +351 -0
  31. package/template/dashboard/package.json +17 -0
  32. package/template/dashboard/pipeline.html +149 -0
  33. package/template/dashboard/research.html +215 -0
  34. package/template/dashboard/robots.txt +2 -0
  35. package/template/dashboard/scoring.html +187 -0
  36. package/template/dashboard/timeline.html +165 -0
  37. package/template/dashboard/vercel.json +5 -0
  38. package/template/dashboard/watch.js +57 -0
  39. package/template/data/.gitkeep +0 -0
  40. package/template/discovery/calls/.gitkeep +0 -0
  41. package/template/discovery/outreach/.gitkeep +0 -0
  42. package/template/discovery/prep/.gitkeep +0 -0
  43. package/template/docs/decks/.gitkeep +0 -0
  44. package/template/docs/executive-summary.md +104 -0
  45. package/template/docs/getting-started.md +274 -0
  46. package/template/docs/memos/evidence-grading.md +27 -0
  47. package/template/docs/memos/housekeeping-reference.md +101 -0
  48. package/template/docs/memos/reference-context.md +30 -0
  49. package/template/docs/output/project-activity.md +8 -0
  50. package/template/docs/output/status-blurb.md +4 -0
  51. package/template/docs/output/work-log.md +8 -0
  52. package/template/docs/skill-authoring-guide.md +212 -0
  53. package/template/memory/MEMORY.md +84 -0
  54. package/template/memory/decisions.md +13 -0
  55. package/template/memory/discovery.md +48 -0
  56. package/template/memory/research.md +33 -0
  57. package/template/memory/scoring.md +34 -0
  58. package/template/project.config.example.json +31 -0
  59. package/template/research/competitors/.gitkeep +0 -0
  60. package/template/research/market/.gitkeep +0 -0
  61. package/template/research/technical/.gitkeep +0 -0
  62. package/template/scripts/.gitkeep +0 -0
  63. package/template/scripts/build-cli-template.sh +32 -0
  64. package/template/scripts/health-check.sh +152 -0
  65. package/template/scripts/reset-to-template.sh +115 -0
  66. package/template/scripts/validate-placeholders.sh +47 -0
  67. package/template/skills/compare-options/SKILL.md +97 -0
  68. package/template/skills/critical-reasoning/SKILL.md +107 -0
  69. package/template/skills/decision/SKILL.md +75 -0
  70. package/template/skills/enrich-entity/SKILL.md +107 -0
  71. package/template/skills/health-check/SKILL.md +144 -0
  72. package/template/skills/onboard/SKILL.md +434 -0
  73. package/template/skills/outreach-sequence/SKILL.md +79 -0
  74. package/template/skills/pipeline-update/SKILL.md +90 -0
  75. package/template/skills/process-call/SKILL.md +96 -0
  76. package/template/skills/rebuild-snapshots/SKILL.md +88 -0
  77. package/template/skills/session-end/SKILL.md +120 -0
  78. package/template/skills/session-start/SKILL.md +93 -0
  79. package/template/skills/synthesise/SKILL.md +108 -0
  80. package/template/skills/weekly-report/SKILL.md +79 -0
  81. package/template/templates/call-notes.md +67 -0
  82. package/template/templates/call-prep.md +65 -0
  83. package/template/templates/entity-teardown.md +58 -0
@@ -0,0 +1,351 @@
1
+ {
2
+ "name": "strategy-project-dashboard",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "strategy-project-dashboard",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "csv-parse": "^5.5.0",
12
+ "marked": "^12.0.0"
13
+ },
14
+ "devDependencies": {
15
+ "concurrently": "^9.2.1"
16
+ }
17
+ },
18
+ "node_modules/ansi-regex": {
19
+ "version": "5.0.1",
20
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
21
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
22
+ "dev": true,
23
+ "license": "MIT",
24
+ "engines": {
25
+ "node": ">=8"
26
+ }
27
+ },
28
+ "node_modules/ansi-styles": {
29
+ "version": "4.3.0",
30
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
31
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
32
+ "dev": true,
33
+ "license": "MIT",
34
+ "dependencies": {
35
+ "color-convert": "^2.0.1"
36
+ },
37
+ "engines": {
38
+ "node": ">=8"
39
+ },
40
+ "funding": {
41
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
42
+ }
43
+ },
44
+ "node_modules/chalk": {
45
+ "version": "4.1.2",
46
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
47
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
48
+ "dev": true,
49
+ "license": "MIT",
50
+ "dependencies": {
51
+ "ansi-styles": "^4.1.0",
52
+ "supports-color": "^7.1.0"
53
+ },
54
+ "engines": {
55
+ "node": ">=10"
56
+ },
57
+ "funding": {
58
+ "url": "https://github.com/chalk/chalk?sponsor=1"
59
+ }
60
+ },
61
+ "node_modules/chalk/node_modules/supports-color": {
62
+ "version": "7.2.0",
63
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
64
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
65
+ "dev": true,
66
+ "license": "MIT",
67
+ "dependencies": {
68
+ "has-flag": "^4.0.0"
69
+ },
70
+ "engines": {
71
+ "node": ">=8"
72
+ }
73
+ },
74
+ "node_modules/cliui": {
75
+ "version": "8.0.1",
76
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
77
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
78
+ "dev": true,
79
+ "license": "ISC",
80
+ "dependencies": {
81
+ "string-width": "^4.2.0",
82
+ "strip-ansi": "^6.0.1",
83
+ "wrap-ansi": "^7.0.0"
84
+ },
85
+ "engines": {
86
+ "node": ">=12"
87
+ }
88
+ },
89
+ "node_modules/color-convert": {
90
+ "version": "2.0.1",
91
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
92
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
93
+ "dev": true,
94
+ "license": "MIT",
95
+ "dependencies": {
96
+ "color-name": "~1.1.4"
97
+ },
98
+ "engines": {
99
+ "node": ">=7.0.0"
100
+ }
101
+ },
102
+ "node_modules/color-name": {
103
+ "version": "1.1.4",
104
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
105
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
106
+ "dev": true,
107
+ "license": "MIT"
108
+ },
109
+ "node_modules/concurrently": {
110
+ "version": "9.2.1",
111
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz",
112
+ "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==",
113
+ "dev": true,
114
+ "license": "MIT",
115
+ "dependencies": {
116
+ "chalk": "4.1.2",
117
+ "rxjs": "7.8.2",
118
+ "shell-quote": "1.8.3",
119
+ "supports-color": "8.1.1",
120
+ "tree-kill": "1.2.2",
121
+ "yargs": "17.7.2"
122
+ },
123
+ "bin": {
124
+ "conc": "dist/bin/concurrently.js",
125
+ "concurrently": "dist/bin/concurrently.js"
126
+ },
127
+ "engines": {
128
+ "node": ">=18"
129
+ },
130
+ "funding": {
131
+ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
132
+ }
133
+ },
134
+ "node_modules/csv-parse": {
135
+ "version": "5.6.0",
136
+ "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz",
137
+ "integrity": "sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==",
138
+ "license": "MIT"
139
+ },
140
+ "node_modules/emoji-regex": {
141
+ "version": "8.0.0",
142
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
143
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
144
+ "dev": true,
145
+ "license": "MIT"
146
+ },
147
+ "node_modules/escalade": {
148
+ "version": "3.2.0",
149
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
150
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
151
+ "dev": true,
152
+ "license": "MIT",
153
+ "engines": {
154
+ "node": ">=6"
155
+ }
156
+ },
157
+ "node_modules/get-caller-file": {
158
+ "version": "2.0.5",
159
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
160
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
161
+ "dev": true,
162
+ "license": "ISC",
163
+ "engines": {
164
+ "node": "6.* || 8.* || >= 10.*"
165
+ }
166
+ },
167
+ "node_modules/has-flag": {
168
+ "version": "4.0.0",
169
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
170
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
171
+ "dev": true,
172
+ "license": "MIT",
173
+ "engines": {
174
+ "node": ">=8"
175
+ }
176
+ },
177
+ "node_modules/is-fullwidth-code-point": {
178
+ "version": "3.0.0",
179
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
180
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
181
+ "dev": true,
182
+ "license": "MIT",
183
+ "engines": {
184
+ "node": ">=8"
185
+ }
186
+ },
187
+ "node_modules/marked": {
188
+ "version": "12.0.2",
189
+ "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz",
190
+ "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==",
191
+ "license": "MIT",
192
+ "bin": {
193
+ "marked": "bin/marked.js"
194
+ },
195
+ "engines": {
196
+ "node": ">= 18"
197
+ }
198
+ },
199
+ "node_modules/require-directory": {
200
+ "version": "2.1.1",
201
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
202
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
203
+ "dev": true,
204
+ "license": "MIT",
205
+ "engines": {
206
+ "node": ">=0.10.0"
207
+ }
208
+ },
209
+ "node_modules/rxjs": {
210
+ "version": "7.8.2",
211
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
212
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
213
+ "dev": true,
214
+ "license": "Apache-2.0",
215
+ "dependencies": {
216
+ "tslib": "^2.1.0"
217
+ }
218
+ },
219
+ "node_modules/shell-quote": {
220
+ "version": "1.8.3",
221
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
222
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
223
+ "dev": true,
224
+ "license": "MIT",
225
+ "engines": {
226
+ "node": ">= 0.4"
227
+ },
228
+ "funding": {
229
+ "url": "https://github.com/sponsors/ljharb"
230
+ }
231
+ },
232
+ "node_modules/string-width": {
233
+ "version": "4.2.3",
234
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
235
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
236
+ "dev": true,
237
+ "license": "MIT",
238
+ "dependencies": {
239
+ "emoji-regex": "^8.0.0",
240
+ "is-fullwidth-code-point": "^3.0.0",
241
+ "strip-ansi": "^6.0.1"
242
+ },
243
+ "engines": {
244
+ "node": ">=8"
245
+ }
246
+ },
247
+ "node_modules/strip-ansi": {
248
+ "version": "6.0.1",
249
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
250
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
251
+ "dev": true,
252
+ "license": "MIT",
253
+ "dependencies": {
254
+ "ansi-regex": "^5.0.1"
255
+ },
256
+ "engines": {
257
+ "node": ">=8"
258
+ }
259
+ },
260
+ "node_modules/supports-color": {
261
+ "version": "8.1.1",
262
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
263
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
264
+ "dev": true,
265
+ "license": "MIT",
266
+ "dependencies": {
267
+ "has-flag": "^4.0.0"
268
+ },
269
+ "engines": {
270
+ "node": ">=10"
271
+ },
272
+ "funding": {
273
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
274
+ }
275
+ },
276
+ "node_modules/tree-kill": {
277
+ "version": "1.2.2",
278
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
279
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
280
+ "dev": true,
281
+ "license": "MIT",
282
+ "bin": {
283
+ "tree-kill": "cli.js"
284
+ }
285
+ },
286
+ "node_modules/tslib": {
287
+ "version": "2.8.1",
288
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
289
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
290
+ "dev": true,
291
+ "license": "0BSD"
292
+ },
293
+ "node_modules/wrap-ansi": {
294
+ "version": "7.0.0",
295
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
296
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
297
+ "dev": true,
298
+ "license": "MIT",
299
+ "dependencies": {
300
+ "ansi-styles": "^4.0.0",
301
+ "string-width": "^4.1.0",
302
+ "strip-ansi": "^6.0.0"
303
+ },
304
+ "engines": {
305
+ "node": ">=10"
306
+ },
307
+ "funding": {
308
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
309
+ }
310
+ },
311
+ "node_modules/y18n": {
312
+ "version": "5.0.8",
313
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
314
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
315
+ "dev": true,
316
+ "license": "ISC",
317
+ "engines": {
318
+ "node": ">=10"
319
+ }
320
+ },
321
+ "node_modules/yargs": {
322
+ "version": "17.7.2",
323
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
324
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
325
+ "dev": true,
326
+ "license": "MIT",
327
+ "dependencies": {
328
+ "cliui": "^8.0.1",
329
+ "escalade": "^3.1.1",
330
+ "get-caller-file": "^2.0.5",
331
+ "require-directory": "^2.1.1",
332
+ "string-width": "^4.2.3",
333
+ "y18n": "^5.0.5",
334
+ "yargs-parser": "^21.1.1"
335
+ },
336
+ "engines": {
337
+ "node": ">=12"
338
+ }
339
+ },
340
+ "node_modules/yargs-parser": {
341
+ "version": "21.1.1",
342
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
343
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
344
+ "dev": true,
345
+ "license": "ISC",
346
+ "engines": {
347
+ "node": ">=12"
348
+ }
349
+ }
350
+ }
351
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "strategy-project-dashboard",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "build": "node build-data.js",
7
+ "start": "node build-data.js && npx serve . -l 4000",
8
+ "dev": "node build-data.js && concurrently \"npx serve . -l 4000\" \"node watch.js\""
9
+ },
10
+ "dependencies": {
11
+ "csv-parse": "^5.5.0",
12
+ "marked": "^12.0.0"
13
+ },
14
+ "devDependencies": {
15
+ "concurrently": "^9.2.1"
16
+ }
17
+ }
@@ -0,0 +1,149 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="robots" content="noindex, nofollow">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="generator" content="DS Strategy Stack by DiffTheEnder (github.com/DiffTheEnder/DSS-Claude-Stack)">
8
+ <title>Pipeline — {{PROJECT_NAME}}</title>
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Instrument+Serif&family=Syne:wght@600;700&display=swap" rel="stylesheet">
12
+ <script src="https://cdn.tailwindcss.com"></script>
13
+ <script>
14
+ tailwind.config = {
15
+ darkMode: 'class',
16
+ theme: { extend: {
17
+ colors: {
18
+ cream: { 50:"#F7F4EF",100:"#f5f2ed",200:"#efe9e0",300:"#e8e0d4",400:"#E3DDD4",white:"#FEFCF9" },
19
+ warmgray: { 100:"#f0ebe3",300:"#d4c8b8",400:"#9B9183",500:"#7D7265",600:"#5C5044",700:"#4a3c2e",900:"#2C2418" },
20
+ warmdark: { 950:"#1A1612",900:"#242018",800:"#2C2720",700:"#3A3530",600:"#4a3f32" },
21
+ accent: { 50:"#F2F7F5",100:"#E3EEEA",200:"#C5D9D4",400:"#2DB892",500:"#0E9C82",600:"#0E7C6B",700:"#0B6358",800:"#084C44",900:"#053B35" },
22
+ },
23
+ fontFamily: { sans:['DM Sans','system-ui','sans-serif'], serif:['Instrument Serif','Georgia','serif'], syne:['Syne','sans-serif'] }
24
+ }}
25
+ }
26
+ </script>
27
+ <link rel="stylesheet" href="css/styles.css">
28
+ </head>
29
+ <body class="bg-cream-50 dark:bg-warmdark-950 text-warmgray-900 dark:text-warmgray-100 min-h-screen flex">
30
+
31
+ <!-- Sidebar (same as index.html) -->
32
+ <aside id="sidebar" class="sidebar flex flex-col shrink-0">
33
+ <a href="index.html" class="sidebar-brand" style="text-decoration:none;color:inherit">
34
+ <svg width="32" height="32" viewBox="0 0 32 32" fill="none">
35
+ <rect x="2" y="2" width="28" height="28" rx="8" stroke="rgba(255,255,255,0.15)" stroke-width="1.5"/>
36
+ <circle cx="16" cy="16" r="3" stroke="#2DB892" stroke-width="1.5"/>
37
+ <line x1="16" y1="6" x2="16" y2="12" stroke="#2DB892" stroke-width="1.5" stroke-linecap="round"/>
38
+ <line x1="16" y1="20" x2="16" y2="26" stroke="#2DB892" stroke-width="1.5" stroke-linecap="round"/>
39
+ <line x1="6" y1="16" x2="12" y2="16" stroke="#2DB892" stroke-width="1.5" stroke-linecap="round"/>
40
+ <line x1="20" y1="16" x2="26" y2="16" stroke="#2DB892" stroke-width="1.5" stroke-linecap="round"/>
41
+ </svg>
42
+ <div>
43
+ <div class="sidebar-title">{{PROJECT_NAME}}</div>
44
+ <div class="sidebar-subtitle">Strategy Dashboard</div>
45
+ </div>
46
+ </a>
47
+ <nav class="sidebar-nav">
48
+ <div class="sidebar-label">Core</div>
49
+ <a href="index.html" class="nav-link">
50
+ <svg class="nav-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><circle cx="8" cy="8" r="6"/><path d="M8 5v3l2 2"/></svg>
51
+ Overview
52
+ </a>
53
+ <a href="pipeline.html" class="nav-link">
54
+ <svg class="nav-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M2 4h12M2 8h8M2 12h5"/></svg>
55
+ Pipeline
56
+ </a>
57
+ <a href="competitors.html" class="nav-link">
58
+ <svg class="nav-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><rect x="2" y="2" width="5" height="5" rx="1"/><rect x="9" y="2" width="5" height="5" rx="1"/><rect x="2" y="9" width="5" height="5" rx="1"/><rect x="9" y="9" width="5" height="5" rx="1"/></svg>
59
+ Competitors
60
+ </a>
61
+ <div class="sidebar-label" style="margin-top: 0.75rem">Strategy</div>
62
+ <a href="decisions.html" class="nav-link">
63
+ <svg class="nav-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M8 2v12M2 8h12"/><circle cx="8" cy="8" r="6"/></svg>
64
+ Decisions
65
+ </a>
66
+ <a href="scoring.html" class="nav-link">
67
+ <svg class="nav-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M3 13l3-4 3 2 4-6"/></svg>
68
+ Scoring
69
+ </a>
70
+ <a href="timeline.html" class="nav-link">
71
+ <svg class="nav-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M2 3h12M2 8h12M2 13h12"/><circle cx="5" cy="3" r="1" fill="currentColor"/><circle cx="10" cy="8" r="1" fill="currentColor"/><circle cx="7" cy="13" r="1" fill="currentColor"/></svg>
72
+ Timeline
73
+ </a>
74
+ <a href="research.html" class="nav-link">
75
+ <svg class="nav-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><circle cx="7" cy="7" r="5"/><path d="M11 11l3 3"/></svg>
76
+ Research Hub
77
+ </a>
78
+ </nav>
79
+ <div style="padding: 0.75rem; border-top: 1px solid rgba(255,248,240,0.06);">
80
+ <button id="dark-toggle" class="nav-link" style="width:100%; border:none; background:none; cursor:pointer">
81
+ <svg class="nav-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M8 1a7 7 0 100 14 5 5 0 010-10"/></svg>Toggle Theme
82
+ </button>
83
+ </div>
84
+ <div style="padding: 0.5rem 0.75rem; border-top: 1px solid rgba(255,248,240,0.06); text-align: center;">
85
+ <a href="https://github.com/DiffTheEnder/DSS-Claude-Stack" target="_blank" rel="noopener" style="font-size: 0.65rem; color: rgba(155,145,131,0.5); text-decoration: none;">Powered by DS Strategy Stack</a>
86
+ </div>
87
+ </aside>
88
+
89
+ <!-- Main Content -->
90
+ <main class="flex-1 ml-[240px] p-8">
91
+ <header class="mb-8">
92
+ <h1 class="font-serif text-3xl mb-2">Pipeline</h1>
93
+ <p class="text-warmgray-400 text-sm">OPTIONAL — Remove this page if your project has no pipeline/outreach component.</p>
94
+ </header>
95
+
96
+ <section class="bg-white dark:bg-warmdark-800 rounded-xl border border-cream-300 dark:border-warmdark-700 overflow-x-auto">
97
+ <table class="w-full text-sm">
98
+ <thead>
99
+ <tr class="border-b border-cream-300 dark:border-warmdark-700">
100
+ <th class="text-left p-3 font-semibold">Name</th>
101
+ <th class="text-left p-3 font-semibold">Status</th>
102
+ <th class="text-left p-3 font-semibold">Contact</th>
103
+ <th class="text-left p-3 font-semibold">Last Contact</th>
104
+ <th class="text-left p-3 font-semibold">Next Action</th>
105
+ </tr>
106
+ </thead>
107
+ <tbody id="pipeline-body">
108
+ <!-- Populated by JS -->
109
+ </tbody>
110
+ </table>
111
+ </section>
112
+ </main>
113
+
114
+ <script src="js/app.js"></script>
115
+ <script>
116
+ // Pipeline page logic — loads entities.json
117
+ document.addEventListener('DOMContentLoaded', async () => {
118
+ initDarkMode();
119
+ initSidebar();
120
+ initNav();
121
+
122
+ try {
123
+ const entities = await loadJSON('entities.json');
124
+ const tbody = document.getElementById('pipeline-body');
125
+
126
+ if (entities.length === 0) {
127
+ tbody.innerHTML = '<tr><td colspan="5" class="p-6 text-center text-warmgray-400">No entities in pipeline yet. Add data to your CSV source of truth.</td></tr>';
128
+ return;
129
+ }
130
+
131
+ entities.forEach(entity => {
132
+ const row = document.createElement('tr');
133
+ row.className = 'border-b border-cream-200 dark:border-warmdark-700 hover:bg-cream-100 dark:hover:bg-warmdark-700 transition-colors';
134
+ row.innerHTML = `
135
+ <td class="p-3 font-medium">${entity.name || entity.Name || '—'}</td>
136
+ <td class="p-3"><span class="inline-block px-2 py-0.5 rounded text-xs font-medium bg-accent-100 dark:bg-accent-900 text-accent-700 dark:text-accent-200">${entity.status || entity.Status || '—'}</span></td>
137
+ <td class="p-3 text-warmgray-500">${entity.contact || entity.Contact || '—'}</td>
138
+ <td class="p-3 text-warmgray-500">${entity.lastContact || entity['Last Contact'] || '—'}</td>
139
+ <td class="p-3 text-warmgray-500">${entity.nextAction || entity['Next Action'] || '—'}</td>
140
+ `;
141
+ tbody.appendChild(row);
142
+ });
143
+ } catch (e) {
144
+ console.warn('Could not load pipeline data:', e.message);
145
+ }
146
+ });
147
+ </script>
148
+ </body>
149
+ </html>