specsmd 0.1.2 → 0.1.4

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 (29) hide show
  1. package/flows/aidlc/commands/construction-agent.md +4 -0
  2. package/flows/aidlc/commands/inception-agent.md +4 -0
  3. package/flows/aidlc/commands/master-agent.md +4 -0
  4. package/flows/aidlc/commands/operations-agent.md +4 -0
  5. package/flows/aidlc/skills/construction/bolt-start.md +106 -78
  6. package/flows/aidlc/skills/inception/bolt-plan.md +18 -5
  7. package/flows/aidlc/skills/inception/review.md +1 -1
  8. package/flows/aidlc/skills/inception/units.md +17 -13
  9. package/flows/aidlc/skills/operations/monitor.md +1 -1
  10. package/flows/aidlc/templates/construction/bolt-template.md +25 -4
  11. package/flows/aidlc/templates/construction/bolt-types/ddd-construction-bolt/ddd-01-domain-model-template.md +2 -2
  12. package/flows/aidlc/templates/construction/bolt-types/ddd-construction-bolt/ddd-02-technical-design-template.md +2 -2
  13. package/flows/aidlc/templates/construction/bolt-types/ddd-construction-bolt/ddd-03-test-report-template.md +2 -2
  14. package/flows/aidlc/templates/construction/bolt-types/simple-construction-bolt.md +5 -0
  15. package/flows/aidlc/templates/construction/construction-log-template.md +2 -2
  16. package/flows/aidlc/templates/inception/inception-log-template.md +1 -1
  17. package/flows/aidlc/templates/inception/requirements-template.md +1 -1
  18. package/flows/aidlc/templates/inception/stories-template.md +1 -1
  19. package/flows/aidlc/templates/inception/story-template.md +11 -11
  20. package/flows/aidlc/templates/inception/system-context-template.md +1 -1
  21. package/flows/aidlc/templates/inception/unit-brief-template.md +3 -3
  22. package/flows/aidlc/templates/inception/units-template.md +1 -1
  23. package/lib/analytics/tracker.js +7 -2
  24. package/lib/installer.js +14 -0
  25. package/lib/installers/WindsurfInstaller.js +0 -54
  26. package/package.json +2 -1
  27. package/scripts/artifact-validator.js +594 -0
  28. package/scripts/bolt-complete.js +606 -0
  29. package/scripts/status-integrity.js +598 -0
@@ -56,7 +56,12 @@ class AnalyticsTracker {
56
56
  const Mixpanel = require('mixpanel');
57
57
  this.mixpanel = Mixpanel.init(MIXPANEL_TOKEN, {
58
58
  protocol: 'https',
59
- host: 'api-eu.mixpanel.com' // EU endpoint for GDPR compliance
59
+ host: 'api-eu.mixpanel.com', // EU endpoint for GDPR compliance
60
+ // Note: geolocate: true enables IP-based geolocation for analytics.
61
+ // This data is used solely for aggregate usage insights (e.g., country-level
62
+ // adoption patterns). No personal identifiers are collected. Users can
63
+ // opt out via the --no-telemetry flag or SPECSMD_NO_TELEMETRY env var.
64
+ geolocate: true
60
65
  });
61
66
 
62
67
  // Generate IDs
@@ -117,7 +122,7 @@ class AnalyticsTracker {
117
122
  if (waitForDelivery) {
118
123
  return new Promise((resolve) => {
119
124
  try {
120
- this.mixpanel.track(eventName, eventData, (err) => {
125
+ this.mixpanel.track(eventName, eventData, () => {
121
126
  // Resolve regardless of error - silent failure
122
127
  resolve();
123
128
  });
package/lib/installer.js CHANGED
@@ -250,6 +250,20 @@ async function installFlow(flowKey, toolKeys) {
250
250
 
251
251
  CLIUtils.displayStatus('', 'Installed flow resources', 'success');
252
252
 
253
+ // Step 2.5: Install local scripts for deterministic operations
254
+ // These scripts are version-matched to the installed specsmd version
255
+ const scriptsDir = path.join(specsmdDir, 'scripts');
256
+ await fs.ensureDir(scriptsDir);
257
+
258
+ const sourceScriptsDir = path.join(__dirname, '..', 'scripts');
259
+ if (await fs.pathExists(sourceScriptsDir)) {
260
+ await fs.copy(sourceScriptsDir, scriptsDir);
261
+ CLIUtils.displayStatus('', 'Installed local scripts', 'success');
262
+ }
263
+
264
+ // Note: Scripts are invoked directly via relative path (e.g., node .specsmd/scripts/bolt-complete.js)
265
+ // No npm scripts added to package.json to avoid dependency on package.json for execution
266
+
253
267
  // NOTE: memory-bank/ is NOT created during installation
254
268
  // It will be created when user runs project-init
255
269
  // This allows us to detect if project is initialized by checking for memory-bank/standards/
@@ -1,8 +1,5 @@
1
1
  const ToolInstaller = require('./ToolInstaller');
2
- const fs = require('fs-extra');
3
2
  const path = require('path');
4
- const CLIUtils = require('../cli-utils');
5
- const { theme } = CLIUtils;
6
3
 
7
4
  class WindsurfInstaller extends ToolInstaller {
8
5
  get key() {
@@ -20,57 +17,6 @@ class WindsurfInstaller extends ToolInstaller {
20
17
  get detectPath() {
21
18
  return '.windsurf';
22
19
  }
23
-
24
- /**
25
- * Override to add frontmatter for Windsurf workflows
26
- */
27
- async installCommands(flowPath, config) {
28
- const targetCommandsDir = this.commandsDir;
29
- console.log(theme.dim(` Installing workflows to ${targetCommandsDir}/...`));
30
- await fs.ensureDir(targetCommandsDir);
31
-
32
- const commandsSourceDir = path.join(flowPath, 'commands');
33
-
34
- if (!await fs.pathExists(commandsSourceDir)) {
35
- console.log(theme.warning(` No commands folder found at ${commandsSourceDir}`));
36
- return [];
37
- }
38
-
39
- const commandFiles = await fs.readdir(commandsSourceDir);
40
- const installedFiles = [];
41
-
42
- for (const cmdFile of commandFiles) {
43
- if (cmdFile.endsWith('.md')) {
44
- const sourcePath = path.join(commandsSourceDir, cmdFile);
45
- const prefix = (config && config.command && config.command.prefix) ? `${config.command.prefix}-` : '';
46
-
47
- const targetFileName = `specsmd-${prefix}${cmdFile}`;
48
- const targetPath = path.join(targetCommandsDir, targetFileName);
49
-
50
- // Extract agent name from target filename (e.g., "specsmd-master-agent.md" -> "specsmd-master-agent")
51
- const agentName = targetFileName.replace(/\.md$/, '');
52
-
53
- // Read source content and add Windsurf frontmatter
54
- let content = await fs.readFile(sourcePath, 'utf8');
55
-
56
- // Add Windsurf-specific frontmatter if not present
57
- if (!content.startsWith('---')) {
58
- const frontmatter = `---
59
- description: ${agentName}
60
- ---
61
-
62
- `;
63
- content = frontmatter + content;
64
- }
65
-
66
- await fs.writeFile(targetPath, content);
67
- installedFiles.push(targetFileName);
68
- }
69
- }
70
-
71
- CLIUtils.displayStatus('', `Installed ${installedFiles.length} workflows for ${this.name}`, 'success');
72
- return installedFiles;
73
- }
74
20
  }
75
21
 
76
22
  module.exports = WindsurfInstaller;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specsmd",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Multi-agent orchestration system for AI-native software development. Delivers AI-DLC, Agile, and custom SDLC flows as markdown-based agent systems.",
5
5
  "main": "lib/installer.js",
6
6
  "bin": {
@@ -36,6 +36,7 @@
36
36
  "bin/",
37
37
  "flows/",
38
38
  "lib/",
39
+ "scripts/",
39
40
  "README.md"
40
41
  ],
41
42
  "dependencies": {