ma-agents 3.18.0-beta.2 → 3.18.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 (168) hide show
  1. package/README.md +2 -2
  2. package/bin/cli.js +29 -32
  3. package/docs/architecture.md +2 -2
  4. package/lib/bmad-cache/cache-manifest.json +0 -12
  5. package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +1 -1
  6. package/lib/bmad.js +33 -34
  7. package/package.json +1 -1
  8. package/scripts/build-bmad-cache.js +18 -9
  9. package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +0 -56
  10. package/lib/bmad-cache/gds/.markdownlint-cli2.yaml +0 -35
  11. package/lib/bmad-cache/gds/.nvmrc +0 -1
  12. package/lib/bmad-cache/gds/.prettierignore +0 -9
  13. package/lib/bmad-cache/gds/CNAME +0 -1
  14. package/lib/bmad-cache/gds/LICENSE +0 -26
  15. package/lib/bmad-cache/gds/README.md +0 -134
  16. package/lib/bmad-cache/gds/_git_preserved/HEAD +0 -1
  17. package/lib/bmad-cache/gds/_git_preserved/config +0 -13
  18. package/lib/bmad-cache/gds/_git_preserved/description +0 -1
  19. package/lib/bmad-cache/gds/_git_preserved/hooks/applypatch-msg.sample +0 -15
  20. package/lib/bmad-cache/gds/_git_preserved/hooks/commit-msg.sample +0 -74
  21. package/lib/bmad-cache/gds/_git_preserved/hooks/fsmonitor-watchman.sample +0 -168
  22. package/lib/bmad-cache/gds/_git_preserved/hooks/post-update.sample +0 -8
  23. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-applypatch.sample +0 -14
  24. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-commit.sample +0 -49
  25. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-merge-commit.sample +0 -13
  26. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-push.sample +0 -53
  27. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-rebase.sample +0 -169
  28. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-receive.sample +0 -24
  29. package/lib/bmad-cache/gds/_git_preserved/hooks/prepare-commit-msg.sample +0 -42
  30. package/lib/bmad-cache/gds/_git_preserved/hooks/push-to-checkout.sample +0 -78
  31. package/lib/bmad-cache/gds/_git_preserved/hooks/sendemail-validate.sample +0 -77
  32. package/lib/bmad-cache/gds/_git_preserved/hooks/update.sample +0 -128
  33. package/lib/bmad-cache/gds/_git_preserved/index +0 -0
  34. package/lib/bmad-cache/gds/_git_preserved/info/exclude +0 -6
  35. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.idx +0 -0
  36. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.pack +0 -0
  37. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.rev +0 -0
  38. package/lib/bmad-cache/gds/_git_preserved/packed-refs +0 -2
  39. package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +0 -1
  40. package/lib/bmad-cache/gds/_git_preserved/shallow +0 -1
  41. package/lib/bmad-cache/gds/eslint.config.mjs +0 -141
  42. package/lib/bmad-cache/gds/package.json +0 -91
  43. package/lib/bmad-cache/gds/prettier.config.mjs +0 -32
  44. package/lib/bmad-cache/gds/src/agents/gds-agent-game-architect/customize.toml +0 -57
  45. package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/customize.toml +0 -59
  46. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/customize.toml +0 -129
  47. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/gametest/qa-index.csv +0 -18
  48. package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/customize.toml +0 -55
  49. package/lib/bmad-cache/gds/src/agents/gds-agent-tech-writer/customize.toml +0 -65
  50. package/lib/bmad-cache/gds/src/module-help.csv +0 -30
  51. package/lib/bmad-cache/gds/src/module.yaml +0 -113
  52. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-brainstorm-game/customize.toml +0 -41
  53. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-brainstorm-game/game-brain-methods.csv +0 -26
  54. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/customize.toml +0 -116
  55. package/lib/bmad-cache/gds/src/workflows/1-preproduction/research/gds-domain-research/customize.toml +0 -41
  56. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-narrative/customize.toml +0 -41
  57. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/game-types.csv +0 -25
  58. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/genre-complexity.csv +0 -26
  59. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/validation-report-template.html +0 -190
  60. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/customize.toml +0 -99
  61. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/scripts/render-validation-html.py +0 -290
  62. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/assets/validation-report-template.html +0 -190
  63. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/customize.toml +0 -84
  64. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/assets/validation-report-template.html +0 -319
  65. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/customize.toml +0 -101
  66. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-check-implementation-readiness/customize.toml +0 -41
  67. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-create-epics-and-stories/customize.toml +0 -41
  68. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/architecture-patterns.yaml +0 -508
  69. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/customize.toml +0 -41
  70. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/decision-catalog.yaml +0 -428
  71. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/engine-mcps.yaml +0 -392
  72. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/pattern-categories.csv +0 -13
  73. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-generate-project-context/customize.toml +0 -41
  74. package/lib/bmad-cache/gds/src/workflows/4-production/gds-code-review/customize.toml +0 -41
  75. package/lib/bmad-cache/gds/src/workflows/4-production/gds-correct-course/customize.toml +0 -41
  76. package/lib/bmad-cache/gds/src/workflows/4-production/gds-create-story/customize.toml +0 -41
  77. package/lib/bmad-cache/gds/src/workflows/4-production/gds-dev-story/customize.toml +0 -41
  78. package/lib/bmad-cache/gds/src/workflows/4-production/gds-investigate/customize.toml +0 -62
  79. package/lib/bmad-cache/gds/src/workflows/4-production/gds-retrospective/customize.toml +0 -41
  80. package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-planning/customize.toml +0 -41
  81. package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-planning/sprint-status-template.yaml +0 -55
  82. package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-status/customize.toml +0 -41
  83. package/lib/bmad-cache/gds/src/workflows/gametest/gds-e2e-scaffold/customize.toml +0 -41
  84. package/lib/bmad-cache/gds/src/workflows/gametest/gds-performance-test/customize.toml +0 -41
  85. package/lib/bmad-cache/gds/src/workflows/gametest/gds-playtest-plan/customize.toml +0 -41
  86. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-automate/customize.toml +0 -41
  87. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-design/customize.toml +0 -41
  88. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-framework/customize.toml +0 -41
  89. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-review/customize.toml +0 -41
  90. package/lib/bmad-cache/gds/src/workflows/gds-document-project/customize.toml +0 -41
  91. package/lib/bmad-cache/gds/src/workflows/gds-document-project/documentation-requirements.csv +0 -12
  92. package/lib/bmad-cache/gds/src/workflows/gds-document-project/templates/project-scan-report-schema.json +0 -160
  93. package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-dev/customize.toml +0 -41
  94. package/lib/bmad-cache/gds/tools/build-docs.mjs +0 -450
  95. package/lib/bmad-cache/gds/website/astro.config.mjs +0 -142
  96. package/lib/bmad-cache/gds/website/public/favicon.ico +0 -0
  97. package/lib/bmad-cache/gds/website/public/img/bmad-dark.png +0 -0
  98. package/lib/bmad-cache/gds/website/public/img/bmad-light.png +0 -0
  99. package/lib/bmad-cache/gds/website/src/components/Banner.astro +0 -71
  100. package/lib/bmad-cache/gds/website/src/components/Header.astro +0 -94
  101. package/lib/bmad-cache/gds/website/src/components/MobileMenuFooter.astro +0 -33
  102. package/lib/bmad-cache/gds/website/src/content/config.ts +0 -6
  103. package/lib/bmad-cache/gds/website/src/content/docs +0 -1
  104. package/lib/bmad-cache/gds/website/src/lib/site-url.mjs +0 -25
  105. package/lib/bmad-cache/gds/website/src/rehype-base-paths.js +0 -88
  106. package/lib/bmad-cache/gds/website/src/rehype-markdown-links.js +0 -117
  107. package/lib/bmad-cache/gds/website/src/styles/custom.css +0 -503
  108. package/lib/bmad-cache/wds/.claude-plugin/marketplace.json +0 -35
  109. package/lib/bmad-cache/wds/.markdownlint-cli2.yaml +0 -38
  110. package/lib/bmad-cache/wds/.nvmrc +0 -1
  111. package/lib/bmad-cache/wds/.prettierignore +0 -9
  112. package/lib/bmad-cache/wds/LICENSE +0 -27
  113. package/lib/bmad-cache/wds/README.md +0 -139
  114. package/lib/bmad-cache/wds/_git_preserved/HEAD +0 -1
  115. package/lib/bmad-cache/wds/_git_preserved/config +0 -13
  116. package/lib/bmad-cache/wds/_git_preserved/description +0 -1
  117. package/lib/bmad-cache/wds/_git_preserved/hooks/applypatch-msg.sample +0 -15
  118. package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +0 -74
  119. package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +0 -168
  120. package/lib/bmad-cache/wds/_git_preserved/hooks/post-update.sample +0 -8
  121. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-applypatch.sample +0 -14
  122. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-commit.sample +0 -49
  123. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-merge-commit.sample +0 -13
  124. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-push.sample +0 -53
  125. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-rebase.sample +0 -169
  126. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-receive.sample +0 -24
  127. package/lib/bmad-cache/wds/_git_preserved/hooks/prepare-commit-msg.sample +0 -42
  128. package/lib/bmad-cache/wds/_git_preserved/hooks/push-to-checkout.sample +0 -78
  129. package/lib/bmad-cache/wds/_git_preserved/hooks/sendemail-validate.sample +0 -77
  130. package/lib/bmad-cache/wds/_git_preserved/hooks/update.sample +0 -128
  131. package/lib/bmad-cache/wds/_git_preserved/index +0 -0
  132. package/lib/bmad-cache/wds/_git_preserved/info/exclude +0 -6
  133. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.idx +0 -0
  134. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.pack +0 -0
  135. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.rev +0 -0
  136. package/lib/bmad-cache/wds/_git_preserved/packed-refs +0 -2
  137. package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +0 -1
  138. package/lib/bmad-cache/wds/_git_preserved/refs/tags/v0.4.3 +0 -1
  139. package/lib/bmad-cache/wds/_git_preserved/shallow +0 -1
  140. package/lib/bmad-cache/wds/eslint.config.mjs +0 -152
  141. package/lib/bmad-cache/wds/package.json +0 -82
  142. package/lib/bmad-cache/wds/prettier.config.mjs +0 -32
  143. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/customize.toml +0 -80
  144. package/lib/bmad-cache/wds/src/agents/wds-agent-mimir-builder/customize.toml +0 -52
  145. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/customize.toml +0 -70
  146. package/lib/bmad-cache/wds/src/module-help.csv +0 -19
  147. package/lib/bmad-cache/wds/src/module.yaml +0 -173
  148. package/lib/bmad-cache/wds/src/scripts/README.md +0 -155
  149. package/lib/bmad-cache/wds/src/scripts/wds-add-object.js +0 -202
  150. package/lib/bmad-cache/wds/src/scripts/wds-add-spacing.js +0 -158
  151. package/lib/bmad-cache/wds/src/scripts/wds-init-page.js +0 -229
  152. package/lib/bmad-cache/wds/src/scripts/wds-init-scenario.js +0 -120
  153. package/lib/bmad-cache/wds/src/scripts/wds-nav.js +0 -201
  154. package/lib/bmad-cache/wds/src/scripts/wds-validate.js +0 -301
  155. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/resources/wds-1-project-brief/templates/platform-requirements.template.yaml +0 -69
  156. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/resources/wds-7-design-system/templates/catalog.template.html +0 -363
  157. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/templates/platform-requirements.template.yaml +0 -69
  158. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/workflow.xml +0 -450
  159. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/design-delivery.template.yaml +0 -104
  160. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/test-scenario.template.yaml +0 -192
  161. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/workflow-specify.xml +0 -387
  162. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.css +0 -164
  163. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.html +0 -18
  164. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.js +0 -430
  165. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/demo-data-template.json +0 -63
  166. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/page-template.html +0 -465
  167. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/work-file-template.yaml +0 -264
  168. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/templates/catalog.template.html +0 -363
@@ -1,164 +0,0 @@
1
- /* ============================================================================
2
- PROTOTYPE DEV MODE STYLES
3
-
4
- Styles for developer/feedback mode that allows copying Object IDs
5
-
6
- Usage: Include these styles in your prototype HTML or CSS file
7
- ============================================================================ */
8
-
9
- /* Dev Mode Toggle Button */
10
- .dev-mode-toggle {
11
- position: fixed;
12
- top: 20px;
13
- right: 20px;
14
- z-index: 9999;
15
- background: #fff;
16
- border: 2px solid #e5e7eb;
17
- border-radius: 8px;
18
- padding: 10px 16px;
19
- display: flex;
20
- align-items: center;
21
- gap: 8px;
22
- cursor: pointer;
23
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
24
- transition: all 0.2s;
25
- font-size: 14px;
26
- font-weight: 500;
27
- color: #6b7280;
28
- }
29
-
30
- .dev-mode-toggle:hover {
31
- background: #f9fafb;
32
- border-color: #d1d5db;
33
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
34
- }
35
-
36
- .dev-mode-toggle.active {
37
- background: #0066CC;
38
- border-color: #0066CC;
39
- color: #fff;
40
- box-shadow: 0 4px 12px rgba(0, 102, 204, 0.3);
41
- }
42
-
43
- .dev-mode-toggle svg {
44
- flex-shrink: 0;
45
- }
46
-
47
- /* Dev Mode Active State */
48
- body.dev-mode-active {
49
- cursor: help !important; /* Show help cursor to indicate special mode */
50
- }
51
-
52
- /* Subtle element highlighting on hover (not Shift held) */
53
- body.dev-mode-active [id]:hover {
54
- outline: 2px solid #6b7280 !important;
55
- outline-offset: 2px !important;
56
- box-shadow: 0 0 0 2px rgba(107, 114, 128, 0.2) !important;
57
- }
58
-
59
- /* Active highlighting when Shift is held (ready to copy) */
60
- body.dev-mode-active.shift-held {
61
- cursor: copy !important;
62
- }
63
-
64
- body.dev-mode-active.shift-held [id]:hover {
65
- outline: 3px solid #10B981 !important;
66
- outline-offset: 3px !important;
67
- box-shadow: 0 0 0 5px rgba(16, 185, 129, 0.4) !important;
68
- }
69
-
70
- /* Dev Mode Tooltip */
71
- .dev-mode-tooltip {
72
- position: fixed;
73
- background: #1F2937;
74
- color: #fff;
75
- padding: 8px 12px;
76
- border-radius: 6px;
77
- font-size: 13px;
78
- font-weight: 600;
79
- font-family: 'Courier New', monospace;
80
- z-index: 10000;
81
- pointer-events: none;
82
- white-space: nowrap;
83
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
84
- transition: background 0.2s;
85
- }
86
-
87
- .dev-mode-tooltip::before {
88
- content: '';
89
- position: absolute;
90
- top: -4px;
91
- left: 8px;
92
- width: 8px;
93
- height: 8px;
94
- background: inherit;
95
- transform: rotate(45deg);
96
- }
97
-
98
- /* Disable only certain interactions when Shift is held in dev mode */
99
- body.dev-mode-active.shift-held button:not(#dev-mode-toggle),
100
- body.dev-mode-active.shift-held input,
101
- body.dev-mode-active.shift-held select,
102
- body.dev-mode-active.shift-held textarea,
103
- body.dev-mode-active.shift-held a {
104
- pointer-events: none !important;
105
- }
106
-
107
- /* But allow the toggle button to work */
108
- body.dev-mode-active #dev-mode-toggle,
109
- body.dev-mode-active #dev-mode-toggle * {
110
- pointer-events: auto !important;
111
- cursor: pointer !important;
112
- }
113
-
114
- /* Feedback overlay (created dynamically) */
115
- @keyframes fadeInOut {
116
- 0% {
117
- opacity: 0;
118
- transform: translate(-50%, -50%) scale(0.9);
119
- }
120
- 20% {
121
- opacity: 1;
122
- transform: translate(-50%, -50%) scale(1);
123
- }
124
- 80% {
125
- opacity: 1;
126
- transform: translate(-50%, -50%) scale(1);
127
- }
128
- 100% {
129
- opacity: 0;
130
- transform: translate(-50%, -50%) scale(0.9);
131
- }
132
- }
133
-
134
- /* Responsive: Adjust toggle button on mobile */
135
- @media (max-width: 768px) {
136
- .dev-mode-toggle {
137
- top: 10px;
138
- right: 10px;
139
- padding: 8px 12px;
140
- font-size: 12px;
141
- }
142
-
143
- .dev-mode-toggle span {
144
- display: none; /* Hide text on mobile, show only icon */
145
- }
146
-
147
- .dev-mode-toggle.active span {
148
- display: inline; /* Show "ON" status */
149
- max-width: 60px;
150
- }
151
- }
152
-
153
- /* Optional: Add visual indicator when Shift is held */
154
- body.dev-mode-active.shift-held .dev-mode-toggle::after {
155
- content: '⬆️';
156
- margin-left: 4px;
157
- animation: pulse 1s infinite;
158
- }
159
-
160
- @keyframes pulse {
161
- 0%, 100% { opacity: 1; transform: scale(1); }
162
- 50% { opacity: 0.7; transform: scale(1.1); }
163
- }
164
-
@@ -1,18 +0,0 @@
1
- <!-- ============================================================================
2
- PROTOTYPE DEV MODE - HTML SNIPPET
3
-
4
- Add this HTML to your prototype page (inside <body>, preferably at the top)
5
- ============================================================================ -->
6
-
7
- <!-- Dev Mode Toggle Button (fixed position, top-right) -->
8
- <button id="dev-mode-toggle" class="dev-mode-toggle" title="Toggle Dev Mode (Ctrl+E)">
9
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
10
- <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path>
11
- <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path>
12
- </svg>
13
- <span>Dev Mode: OFF</span>
14
- </button>
15
-
16
- <!-- Dev Mode Tooltip (shown when hovering over elements in dev mode) -->
17
- <div id="dev-mode-tooltip" class="dev-mode-tooltip" style="display: none;"></div>
18
-
@@ -1,430 +0,0 @@
1
- /* eslint-disable n/no-unsupported-features/node-builtins */
2
- /* global document, window */
3
-
4
- /**
5
- * PROTOTYPE DEV MODE
6
- *
7
- * Developer/feedback mode that allows users to easily copy Object IDs to clipboard
8
- * for providing precise feedback on prototype elements.
9
- *
10
- * Features:
11
- * - Toggle dev mode with button or Ctrl+E
12
- * - Prototype works NORMALLY when dev mode is on
13
- * - Hold Shift + Click any element to copy its Object ID
14
- * - Visual highlights show what will be copied (green when Shift is held)
15
- * - Tooltip shows Object ID on hover
16
- * - Success feedback when copied
17
- *
18
- * Usage:
19
- * 1. Include this script in your prototype HTML
20
- * 2. Add the HTML toggle button and tooltip (see HTML template)
21
- * 3. Add the CSS styles (see CSS template)
22
- * 4. Call initDevMode() on page load
23
- *
24
- * How it works:
25
- * - Activate dev mode (Ctrl+E or click button)
26
- * - Hover over elements to see their Object IDs (gray outline)
27
- * - Hold Shift key (outline turns green)
28
- * - Click while holding Shift to copy Object ID
29
- * - Prototype works normally without Shift held
30
- * - **Shift is disabled when typing in form fields** (input, textarea, etc.)
31
- */
32
-
33
- // ============================================================================
34
- // DEV MODE STATE
35
- // ============================================================================
36
-
37
- let devModeActive = false;
38
- let shiftKeyPressed = false;
39
- let currentHighlightedElement = null;
40
-
41
- // ============================================================================
42
- // INITIALIZATION
43
- // ============================================================================
44
-
45
- function initDevMode() {
46
- const toggleButton = document.querySelector('#dev-mode-toggle');
47
- const tooltip = document.querySelector('#dev-mode-tooltip');
48
-
49
- if (!toggleButton || !tooltip) {
50
- console.warn('⚠️ Dev Mode: Toggle button or tooltip not found');
51
- return;
52
- }
53
-
54
- // Check if user agent supports clipboard API
55
- if (typeof navigator !== 'undefined' && navigator.clipboard) {
56
- // Clipboard API available
57
- } else {
58
- console.warn('⚠️ Clipboard API not supported in this browser');
59
- return;
60
- }
61
-
62
- setupKeyboardShortcuts();
63
- setupToggleButton(toggleButton, tooltip);
64
- setupHoverHighlight(tooltip);
65
- setupClickCopy();
66
-
67
- console.log('%c💡 Dev Mode available: Press Ctrl+E or click the Dev Mode button', 'color: #0066CC; font-weight: bold;');
68
- }
69
-
70
- // ============================================================================
71
- // KEYBOARD SHORTCUTS
72
- // ============================================================================
73
-
74
- function setupKeyboardShortcuts() {
75
- // Track Shift key for container selection
76
- document.addEventListener('keydown', (e) => {
77
- if (e.key === 'Shift') {
78
- // Don't activate if user is typing in a form field
79
- if (isTypingInField()) {
80
- return;
81
- }
82
-
83
- shiftKeyPressed = true;
84
- document.body.classList.add('shift-held');
85
- if (devModeActive) {
86
- console.log('%c⬆️ Shift held: Click any element to copy its Object ID', 'color: #10B981; font-weight: bold;');
87
- }
88
- }
89
-
90
- // Ctrl+E toggle
91
- if (e.ctrlKey && e.key === 'e') {
92
- e.preventDefault();
93
- document.querySelector('#dev-mode-toggle')?.click();
94
- }
95
- });
96
-
97
- document.addEventListener('keyup', (e) => {
98
- if (e.key === 'Shift') {
99
- shiftKeyPressed = false;
100
- document.body.classList.remove('shift-held');
101
- if (devModeActive) {
102
- console.log('%c⬇️ Shift released: Prototype works normally (hold Shift to copy)', 'color: #6b7280;');
103
- }
104
- }
105
- });
106
- }
107
-
108
- // ============================================================================
109
- // TOGGLE BUTTON
110
- // ============================================================================
111
-
112
- function setupToggleButton(toggleButton, tooltip) {
113
- toggleButton.addEventListener('click', function (e) {
114
- e.stopPropagation();
115
- if (typeof globalThis !== 'undefined') {
116
- globalThis.devModeActive = true;
117
- } else if (globalThis.window !== undefined) {
118
- globalThis.devModeActive = true;
119
- }
120
- devModeActive = !devModeActive;
121
-
122
- // Update UI
123
- document.body.classList.toggle('dev-mode-active', devModeActive);
124
- toggleButton.classList.toggle('active', devModeActive);
125
-
126
- const statusText = toggleButton.querySelector('span');
127
- if (statusText) {
128
- statusText.textContent = devModeActive ? 'Dev Mode: ON' : 'Dev Mode: OFF';
129
- }
130
-
131
- // Log status
132
- console.log(`🔧 Dev Mode: ${devModeActive ? 'ACTIVATED' : 'DEACTIVATED'}`);
133
-
134
- if (devModeActive) {
135
- console.log('%c🔧 DEV MODE ACTIVE', 'color: #0066CC; font-size: 16px; font-weight: bold;');
136
- console.log('%c⚠️ Hold SHIFT + Click any element to copy its Object ID', 'color: #FFB800; font-size: 14px; font-weight: bold;');
137
- console.log('%cWithout Shift: Prototype works normally', 'color: #6b7280;');
138
- console.log('%cPress Ctrl+E to toggle Dev Mode', 'color: #6b7280;');
139
- } else {
140
- tooltip.style.display = 'none';
141
- if (currentHighlightedElement) {
142
- clearHighlight();
143
- }
144
- }
145
- });
146
- }
147
-
148
- // ============================================================================
149
- // HOVER HIGHLIGHT
150
- // ============================================================================
151
-
152
- function setupHoverHighlight(tooltip) {
153
- // Show tooltip and highlight on hover
154
- document.addEventListener('mouseover', function (e) {
155
- if (!devModeActive) return;
156
-
157
- // Don't highlight if user is typing in a field
158
- if (isTypingInField()) {
159
- tooltip.style.display = 'none';
160
- clearHighlight();
161
- return;
162
- }
163
-
164
- clearHighlight();
165
-
166
- let element = findElementWithId(e.target);
167
-
168
- if (!element || !element.id || isSystemElement(element.id)) {
169
- tooltip.style.display = 'none';
170
- return;
171
- }
172
-
173
- // Highlight element
174
- highlightElement(element, shiftKeyPressed);
175
- currentHighlightedElement = element;
176
-
177
- // Show tooltip
178
- const prefix = shiftKeyPressed ? '✓ Click to Copy: ' : '⬆️ Hold Shift + Click: ';
179
- tooltip.textContent = prefix + element.id;
180
- tooltip.style.display = 'block';
181
- tooltip.style.background = shiftKeyPressed ? '#10B981' : '#6b7280';
182
- tooltip.style.color = '#fff';
183
-
184
- updateTooltipPosition(e, tooltip);
185
- });
186
-
187
- // Update tooltip position on mouse move
188
- document.addEventListener('mousemove', function (e) {
189
- if (devModeActive && tooltip.style.display === 'block') {
190
- updateTooltipPosition(e, tooltip);
191
- }
192
- });
193
-
194
- // Clear highlight on mouse out
195
- document.addEventListener('mouseout', function (e) {
196
- if (!devModeActive) return;
197
- if (e.target.id) {
198
- tooltip.style.display = 'none';
199
- clearHighlight();
200
- }
201
- });
202
- }
203
-
204
- // ============================================================================
205
- // CLICK TO COPY
206
- // ============================================================================
207
-
208
- function setupClickCopy() {
209
- // Use capture phase to intercept clicks with Shift
210
- document.addEventListener(
211
- 'click',
212
- function (e) {
213
- if (!devModeActive) return;
214
-
215
- // Allow toggle button to work normally
216
- if (isToggleButton(e.target)) return;
217
-
218
- // ONLY copy if Shift is held
219
- if (!shiftKeyPressed) {
220
- // Let prototype work normally without Shift
221
- return;
222
- }
223
-
224
- // Don't intercept if user is clicking in/around a form field
225
- if (isTypingInField() || isFormElement(e.target)) {
226
- return;
227
- }
228
-
229
- // Shift is held and not in a form field - intercept and copy
230
- e.preventDefault();
231
- e.stopPropagation();
232
- e.stopImmediatePropagation();
233
-
234
- let element = findElementWithId(e.target);
235
-
236
- if (!element || !element.id || isSystemElement(element.id)) {
237
- console.log('❌ No Object ID found');
238
- return false;
239
- }
240
-
241
- // Copy to clipboard
242
- const objectId = element.id;
243
- copyToClipboard(objectId);
244
-
245
- // Show feedback
246
- showCopyFeedback(element, objectId);
247
-
248
- return false;
249
- },
250
- true,
251
- ); // Capture phase
252
- }
253
-
254
- // ============================================================================
255
- // HELPER FUNCTIONS
256
- // ============================================================================
257
-
258
- function findElementWithId(element) {
259
- let current = element;
260
- let attempts = 0;
261
-
262
- while (current && !current.id && attempts < 10) {
263
- current = current.parentElement;
264
- attempts++;
265
- }
266
-
267
- return current;
268
- }
269
-
270
- function isSystemElement(id) {
271
- const systemIds = ['app', 'dev-mode-toggle', 'dev-mode-tooltip'];
272
- return systemIds.includes(id);
273
- }
274
-
275
- function isToggleButton(element) {
276
- return element.id === 'dev-mode-toggle' || element.closest('#dev-mode-toggle') || element.classList.contains('dev-mode-toggle');
277
- }
278
-
279
- function isTypingInField() {
280
- const activeElement = document.activeElement;
281
- if (!activeElement) return false;
282
-
283
- const tagName = activeElement.tagName.toLowerCase();
284
- const isEditable = activeElement.isContentEditable;
285
-
286
- // Check if user is currently typing in a form field
287
- return tagName === 'input' || tagName === 'textarea' || tagName === 'select' || isEditable;
288
- }
289
-
290
- function isFormElement(element) {
291
- if (!element) return false;
292
-
293
- const tagName = element.tagName.toLowerCase();
294
- const isEditable = element.isContentEditable;
295
-
296
- // Check if the clicked element is a form element
297
- return tagName === 'input' || tagName === 'textarea' || tagName === 'select' || isEditable;
298
- }
299
-
300
- function highlightElement(element, isShiftHeld) {
301
- const color = isShiftHeld ? '#10B981' : '#6b7280';
302
- const width = isShiftHeld ? '3px' : '2px';
303
- const offset = isShiftHeld ? '3px' : '2px';
304
- const shadowSpread = isShiftHeld ? '5px' : '2px';
305
- const shadowOpacity = isShiftHeld ? '0.4' : '0.2';
306
-
307
- element.style.outline = `${width} solid ${color}`;
308
- element.style.outlineOffset = offset;
309
- element.style.boxShadow = `0 0 0 ${shadowSpread} rgba(${isShiftHeld ? '16, 185, 129' : '107, 114, 128'}, ${shadowOpacity})`;
310
- }
311
-
312
- function clearHighlight() {
313
- if (currentHighlightedElement) {
314
- currentHighlightedElement.style.outline = '';
315
- currentHighlightedElement.style.boxShadow = '';
316
- currentHighlightedElement = null;
317
- }
318
- }
319
-
320
- function updateTooltipPosition(e, tooltip) {
321
- const offset = 15;
322
- let x = e.clientX + offset;
323
- let y = e.clientY + offset;
324
-
325
- // Keep tooltip on screen
326
- const rect = tooltip.getBoundingClientRect();
327
- if (x + rect.width > window.innerWidth) {
328
- x = e.clientX - rect.width - offset;
329
- }
330
- if (y + rect.height > window.innerHeight) {
331
- y = e.clientY - rect.height - offset;
332
- }
333
-
334
- tooltip.style.left = x + 'px';
335
- tooltip.style.top = y + 'px';
336
- }
337
-
338
- function copyToClipboard(text) {
339
- if (typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.writeText) {
340
- navigator.clipboard
341
- .writeText(text)
342
- .then(() => {
343
- console.log(`📋 Copied to clipboard: ${text}`);
344
- })
345
- .catch((error) => {
346
- console.error('Dev Mode error:', error);
347
- fallbackCopy(text);
348
- });
349
- } else {
350
- fallbackCopy(text);
351
- }
352
- }
353
-
354
- function fallbackCopy(text) {
355
- const textarea = document.createElement('textarea');
356
- textarea.value = text;
357
- textarea.style.position = 'fixed';
358
- textarea.style.left = '-999999px';
359
- document.body.append(textarea);
360
- textarea.focus();
361
- textarea.select();
362
-
363
- try {
364
- document.execCommand('copy');
365
- console.log(`📋 Copied (fallback): ${text}`);
366
- } catch (error) {
367
- console.error('Dev Mode error:', error);
368
- }
369
-
370
- textarea.remove();
371
- }
372
-
373
- function showCopyFeedback(element, objectId) {
374
- // Create feedback overlay
375
- const feedback = document.createElement('div');
376
- feedback.textContent = '✓ Copied: ' + objectId;
377
- feedback.style.cssText = `
378
- position: fixed;
379
- top: 50%;
380
- left: 50%;
381
- transform: translate(-50%, -50%);
382
- background: #10B981;
383
- color: #fff;
384
- padding: 16px 32px;
385
- border-radius: 8px;
386
- font-size: 16px;
387
- font-weight: 600;
388
- z-index: 100000;
389
- box-shadow: 0 10px 25px rgba(0,0,0,0.3);
390
- animation: fadeInOut 1.5s ease-in-out;
391
- pointer-events: none;
392
- `;
393
-
394
- document.body.append(feedback);
395
-
396
- setTimeout(() => {
397
- feedback.remove();
398
- }, 1500);
399
-
400
- // Flash element
401
- const originalOutline = element.style.outline;
402
- element.style.outline = '3px solid #10B981';
403
- setTimeout(() => {
404
- element.style.outline = originalOutline;
405
- }, 300);
406
- }
407
-
408
- // Add CSS animation
409
- const style = document.createElement('style');
410
- style.textContent = `
411
- @keyframes fadeInOut {
412
- 0% { opacity: 0; transform: translate(-50%, -50%) scale(0.9); }
413
- 20% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
414
- 80% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
415
- 100% { opacity: 0; transform: translate(-50%, -50%) scale(0.9); }
416
- }
417
- `;
418
- document.head.append(style);
419
-
420
- // ============================================================================
421
- // EXPORT
422
- // ============================================================================
423
-
424
- // Make available globally
425
- globalThis.initDevMode = initDevMode;
426
-
427
- // Export for use in other scripts
428
- if (typeof globalThis !== 'undefined' && globalThis.exports) {
429
- globalThis.exports = { initDevMode };
430
- }
@@ -1,63 +0,0 @@
1
- {
2
- "user": {
3
- "id": "demo-user-001",
4
- "firstName": "[First Name]",
5
- "lastName": "[Last Name]",
6
- "email": "[email@example.com]",
7
- "phoneNumber": "[+1234567890]",
8
- "picture": "",
9
- "role": "owner",
10
- "createdAt": "2024-01-01T00:00:00.000Z",
11
- "updatedAt": "2024-01-01T00:00:00.000Z"
12
- },
13
- "family": {
14
- "id": "demo-family-001",
15
- "name": "[Family Name]",
16
- "description": "[Brief family description]",
17
- "location": "[City, Country]",
18
- "picture": "",
19
- "ownerId": "demo-user-001",
20
- "createdAt": "2024-01-01T00:00:00.000Z",
21
- "updatedAt": "2024-01-01T00:00:00.000Z"
22
- },
23
- "members": [
24
- {
25
- "id": "demo-member-001",
26
- "familyId": "demo-family-001",
27
- "userId": "demo-user-001",
28
- "firstName": "[Member 1 First Name]",
29
- "lastName": "[Member 1 Last Name]",
30
- "email": "[member1@example.com]",
31
- "role": "owner",
32
- "picture": "",
33
- "createdAt": "2024-01-01T00:00:00.000Z"
34
- },
35
- {
36
- "id": "demo-member-002",
37
- "familyId": "demo-family-001",
38
- "userId": "demo-user-002",
39
- "firstName": "[Member 2 First Name]",
40
- "lastName": "[Member 2 Last Name]",
41
- "email": "[member2@example.com]",
42
- "role": "co-owner",
43
- "picture": "",
44
- "createdAt": "2024-01-02T00:00:00.000Z"
45
- }
46
- ],
47
- "dogs": [
48
- {
49
- "id": "demo-dog-001",
50
- "familyId": "demo-family-001",
51
- "name": "[Dog Name]",
52
- "breed": "[Dog Breed]",
53
- "gender": "male",
54
- "birthDate": "2020-05-15",
55
- "color": "[Color]",
56
- "specialNeeds": "[Any special needs or notes]",
57
- "picture": "",
58
- "createdAt": "2024-01-01T00:00:00.000Z",
59
- "updatedAt": "2024-01-01T00:00:00.000Z"
60
- }
61
- ],
62
- "comment": "This is demo data that loads automatically when prototype is opened for the first time. Edit this file to change the demo data. All fields with empty strings ('') are optional."
63
- }