multimodel-dev-os 2.0.1 → 2.8.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 (81) hide show
  1. package/.ai/intelligence/README.md +14 -0
  2. package/.ai/intelligence/apply-log.schema.json +65 -0
  3. package/.ai/intelligence/feedback-log.example.jsonl +2 -0
  4. package/.ai/intelligence/feedback.schema.json +47 -0
  5. package/.ai/intelligence/improvement-proposal.schema.json +70 -0
  6. package/.ai/intelligence/learning-rules.example.md +18 -0
  7. package/.ai/intelligence/memory.schema.json +97 -0
  8. package/.ai/plugins/README.md +30 -0
  9. package/.ai/plugins/plugin.example.yaml +32 -0
  10. package/.ai/policies/approval-gates.md +35 -0
  11. package/.ai/policies/memory-policy.md +30 -0
  12. package/.ai/policies/self-improvement-policy.md +39 -0
  13. package/.ai/proposals/README.md +44 -0
  14. package/.ai/proposals/apply-operation.example.json +22 -0
  15. package/.ai/registries/capabilities.yaml +73 -0
  16. package/.ai/registries/tools.yaml +84 -0
  17. package/.ai/registries/workflows.yaml +217 -0
  18. package/.ai/schema/plugin.schema.json +56 -0
  19. package/README.md +116 -138
  20. package/assets/adapter-sync-flow.svg +84 -0
  21. package/assets/architecture-preview.svg +46 -31
  22. package/assets/onboarding-flow.svg +79 -0
  23. package/assets/social-preview.svg +1 -1
  24. package/assets/terminal-demo.svg +22 -23
  25. package/bin/multimodel-dev-os.js +3472 -7
  26. package/docs/.vitepress/config.js +46 -7
  27. package/docs/5-day-roadmap.md +9 -9
  28. package/docs/CLI.md +260 -34
  29. package/docs/adapter-sync.md +27 -0
  30. package/docs/adapters.md +16 -0
  31. package/docs/agent-handoff.md +40 -0
  32. package/docs/approved-proposal-apply.md +156 -0
  33. package/docs/architecture.md +31 -7
  34. package/docs/capability-registry.md +24 -0
  35. package/docs/comparison.md +72 -25
  36. package/docs/compatibility.md +2 -2
  37. package/docs/dashboard.md +105 -0
  38. package/docs/demo.md +23 -60
  39. package/docs/demos/adapter-sync.md +103 -0
  40. package/docs/demos/existing-repo-onboarding.md +125 -0
  41. package/docs/demos/index.md +91 -0
  42. package/docs/demos/multi-agent-handoff.md +88 -0
  43. package/docs/demos/release-check.md +109 -0
  44. package/docs/demos/safe-improvement-loop.md +119 -0
  45. package/docs/distribution.md +195 -0
  46. package/docs/faq.md +91 -24
  47. package/docs/feedback-learning.md +33 -0
  48. package/docs/future-proof-architecture.md +22 -0
  49. package/docs/hash-compressed-memory.md +72 -0
  50. package/docs/improvement-proposals.md +70 -0
  51. package/docs/index.md +192 -81
  52. package/docs/installers.md +18 -4
  53. package/docs/launch-kit.md +97 -49
  54. package/docs/learning-rules.md +36 -0
  55. package/docs/npm-publishing.md +6 -6
  56. package/docs/plugin-authoring.md +99 -0
  57. package/docs/plugin-hooks.md +80 -0
  58. package/docs/public/assets/adapter-sync-flow.svg +84 -0
  59. package/docs/public/assets/onboarding-flow.svg +79 -0
  60. package/docs/public/llms-full.txt +47 -4
  61. package/docs/public/llms.txt +55 -2
  62. package/docs/public/sitemap.xml +85 -0
  63. package/docs/quickstart.md +82 -22
  64. package/docs/real-repo-onboarding.md +27 -0
  65. package/docs/repository-command-center.md +68 -0
  66. package/docs/self-improving-codebase.md +46 -0
  67. package/docs/template-recommendation.md +22 -0
  68. package/docs/templates-guide.md +11 -0
  69. package/docs/tool-registry.md +21 -0
  70. package/docs/tui-safety.md +59 -0
  71. package/docs/use-cases.md +21 -0
  72. package/docs/v2-roadmap.md +78 -71
  73. package/docs/workflow-orchestration.md +62 -0
  74. package/examples/adapter-sync/README.md +45 -0
  75. package/examples/command-center/README.md +59 -0
  76. package/examples/real-repo-onboarding/README.md +53 -0
  77. package/examples/safe-improvement-loop/README.md +48 -0
  78. package/package.json +1 -1
  79. package/scripts/install.ps1 +1 -1
  80. package/scripts/install.sh +1 -1
  81. package/scripts/verify.js +107 -3
@@ -0,0 +1,62 @@
1
+ # Workflow Orchestration
2
+
3
+ MultiModel Dev OS `v2.5.0` features a built-in **Workflow Runner** designed to orchestrate codebase diagnostic pipelines safely.
4
+
5
+ ---
6
+
7
+ ## 1. CLI Commands
8
+
9
+ Workflows are registered in [.ai/registries/workflows.yaml](file:///.ai/registries/workflows.yaml) and can be executed via the following subcommands:
10
+
11
+ ### List Registered Workflows
12
+ Prints name, risk, and summary of all active workflows:
13
+ ```bash
14
+ npx multimodel-dev-os workflow list
15
+ ```
16
+
17
+ ### Show Workflow Specifications
18
+ Displays details, memory write permissions, code modification permissions, and individual logical steps:
19
+ ```bash
20
+ npx multimodel-dev-os workflow show repo-health
21
+ ```
22
+
23
+ ### Plan Workflow Execution (Dry-Run)
24
+ Prints the execution sequence, command lists, and expected outputs without executing any logic:
25
+ ```bash
26
+ npx multimodel-dev-os workflow plan repo-health
27
+ ```
28
+
29
+ ### Run Workflow
30
+ Executes the workflow steps sequentially:
31
+ ```bash
32
+ npx multimodel-dev-os workflow run repo-health
33
+ ```
34
+
35
+ > [!TIP]
36
+ > You can also run, plan, and list workflows interactively through the [TUI Dashboard](file:///f:/multimodel-dev-os/docs/dashboard.md) under the **Quality Gates & Diagnostics** or **Memory & Intelligence** menus.
37
+
38
+ ---
39
+
40
+ ## 2. Standard Built-in Workflows
41
+
42
+ MultiModel Dev OS defines 5 baseline workflows:
43
+
44
+ 1. **`repo-health`** (Low Risk): Scans framework signals, performs advisory doctor audits, and verifies file structures.
45
+ 2. **`memory-refresh`** (Medium Risk): Assesses memory differences and incremental refreshes.
46
+ 3. **`feedback-review`** (Low Risk): Lists active developer logs and compiles rules to `learning-rules.md`.
47
+ 4. **`proposal-review`** (Low Risk): Inspects codebase proposals, checks status counts, and displays audit apply logs.
48
+ 5. **`release-check`** (Low Risk): Verifies codebase structures, executes release doctors, and runs package pack checks.
49
+
50
+ ---
51
+
52
+ ## 3. Strict Safety Gates
53
+
54
+ The workflow engine enforces strict safety boundaries:
55
+
56
+ * **No File Modifications**: Allowed workflows only execute read-only checkups and incremental metadata updates (memory file compilation, feedback summaries).
57
+ * **No Shell Execution**: Shell command execution from `workflows.yaml` is prohibited. Steps map directly to internal Javascript CLI functions.
58
+ * **No Autonomy**: Any step requiring code changes (e.g. applying proposals) stops and outputs manual next-step instructions for the developer.
59
+
60
+ ## 4. Bundled Registry Fallback
61
+
62
+ If the repository does not have a local `.ai/registries/workflows.yaml` registry file initialized yet, the workflow runner will automatically fall back to the bundled registry package templates and output a notice. This allows running read-only diagnostics prior to full project onboarding.
@@ -0,0 +1,45 @@
1
+ # Example: Adapter Sync
2
+
3
+ Sync your AGENTS.md rules to `.cursorrules`, `CLAUDE.md`, `.vscode/settings.json`, and more — automatically.
4
+
5
+ ## Prerequisites
6
+
7
+ - Node.js 18+
8
+ - A MultiModel Dev OS workspace (`npx multimodel-dev-os@latest init`)
9
+
10
+ ## Commands
11
+
12
+ ```bash
13
+ # Check which adapters are enabled/disabled
14
+ npx multimodel-dev-os@latest adapter status
15
+
16
+ # Preview diff for a specific adapter
17
+ npx multimodel-dev-os@latest adapter diff cursor
18
+
19
+ # Sync all enabled adapters (requires approval)
20
+ npx multimodel-dev-os@latest adapter sync all --approved
21
+
22
+ # Verify workspace health
23
+ npx multimodel-dev-os@latest validate
24
+ ```
25
+
26
+ ## Expected Result
27
+
28
+ ```
29
+ 🔄 Syncing adapters...
30
+ CREATE .cursorrules
31
+ CREATE CLAUDE.md
32
+ CREATE .vscode/settings.json
33
+ ✅ 3 adapters synced.
34
+ ```
35
+
36
+ ## Safety
37
+
38
+ - `adapter status` and `adapter diff` are read-only
39
+ - `adapter sync` requires `--approved` flag
40
+ - Existing files need `--force` to overwrite
41
+ - All overwrites create `.bak` backups
42
+
43
+ ## Full Demo
44
+
45
+ See the [complete walkthrough](/demos/adapter-sync) for step-by-step instructions.
@@ -0,0 +1,59 @@
1
+ # Example: Command Center
2
+
3
+ Use the repository command center to get a compact operational dashboard and run automated workflows.
4
+
5
+ ## Prerequisites
6
+
7
+ - Node.js 18+
8
+ - A MultiModel Dev OS workspace (`npx multimodel-dev-os@latest init`)
9
+
10
+ ## Commands
11
+
12
+ ```bash
13
+ # View compact project dashboard
14
+ npx multimodel-dev-os@latest status
15
+
16
+ # List available workflows
17
+ npx multimodel-dev-os@latest workflow list
18
+
19
+ # Dry-run a workflow to see what would execute
20
+ npx multimodel-dev-os@latest workflow plan repo-health
21
+
22
+ # Run a workflow (read-only, safe execution boundaries)
23
+ npx multimodel-dev-os@latest workflow run repo-health
24
+
25
+ # Build and view session handoff
26
+ npx multimodel-dev-os@latest handoff build
27
+ npx multimodel-dev-os@latest handoff show
28
+ ```
29
+
30
+ ## Expected Result
31
+
32
+ ```
33
+ 📊 Repository Status: my-project
34
+ Version: 1.0.0
35
+ Frameworks: nextjs, typescript
36
+ Memory: fresh (updated 2 min ago)
37
+ Feedback entries: 3
38
+ Proposals: 1 draft, 0 applied
39
+ ```
40
+
41
+ ## Available Workflows
42
+
43
+ | Workflow | Purpose |
44
+ |----------|---------|
45
+ | `repo-health` | Run validate, doctor, and scan checks |
46
+ | `memory-refresh` | Update hash-compressed memory index |
47
+ | `feedback-review` | Summarize pending feedback entries |
48
+ | `proposal-review` | Review and display proposal statuses |
49
+ | `release-check` | Pre-flight release verification |
50
+
51
+ ## Safety
52
+
53
+ - `status`, `workflow list`, and `workflow plan` are read-only
54
+ - `workflow run` is restricted to safe, non-destructive CLI functions
55
+ - No proposals are applied, no shell commands are executed destructively
56
+
57
+ ## Full Demo
58
+
59
+ See the [release check walkthrough](/demos/release-check) for the verification workflow.
@@ -0,0 +1,53 @@
1
+ # Example: Real Repo Onboarding
2
+
3
+ Onboard an existing codebase into MultiModel Dev OS safely — no breaking changes, automatic backups.
4
+
5
+ ## Prerequisites
6
+
7
+ - Node.js 18+
8
+ - An existing project directory with source code
9
+
10
+ ## Commands
11
+
12
+ ```bash
13
+ # Step 1: Analyze your project (read-only)
14
+ npx multimodel-dev-os@latest onboard analyze
15
+
16
+ # Step 2: Get template recommendations (read-only)
17
+ npx multimodel-dev-os@latest onboard recommend
18
+
19
+ # Step 3: Generate onboarding plan (writes to .ai/intelligence/, gitignored)
20
+ npx multimodel-dev-os@latest onboard plan
21
+
22
+ # Step 4: Apply configs (creates files, requires approval)
23
+ npx multimodel-dev-os@latest onboard apply --approved
24
+
25
+ # Step 5: Verify completeness
26
+ npx multimodel-dev-os@latest onboard status
27
+ ```
28
+
29
+ ## Expected Result
30
+
31
+ ```
32
+ 📊 Onboarding Status
33
+ Completeness: 100%
34
+ Root files: AGENTS.md ✓ MEMORY.md ✓ TASKS.md ✓ RUNBOOK.md ✓
35
+ Config: .ai/config.yaml ✓
36
+ ```
37
+
38
+ ## Files Created
39
+
40
+ - `AGENTS.md`, `MEMORY.md`, `TASKS.md`, `RUNBOOK.md`
41
+ - `.ai/config.yaml` and `.ai/context/` directory
42
+ - `.ai/intelligence/onboarding.plan.json` (gitignored)
43
+ - `.ai/intelligence/onboarding.report.md` (gitignored)
44
+
45
+ ## Safety
46
+
47
+ - Steps 1-3 are fully read-only
48
+ - Step 4 never overwrites existing files without `--force`
49
+ - All overwrites create `.bak` backups automatically
50
+
51
+ ## Full Demo
52
+
53
+ See the [complete walkthrough](/demos/existing-repo-onboarding) for expected terminal output and detailed explanations.
@@ -0,0 +1,48 @@
1
+ # Example: Safe Improvement Loop
2
+
3
+ Capture developer corrections, propose improvements, validate safety gates, and apply changes with full audit trails.
4
+
5
+ ## Prerequisites
6
+
7
+ - Node.js 18+
8
+ - A MultiModel Dev OS workspace (`npx multimodel-dev-os@latest init`)
9
+
10
+ ## Commands
11
+
12
+ ```bash
13
+ # Record developer feedback
14
+ npx multimodel-dev-os@latest feedback add "Always use TypeScript strict mode" --type preference
15
+
16
+ # Compile feedback into learning rules
17
+ npx multimodel-dev-os@latest feedback summarize
18
+
19
+ # Draft an improvement proposal
20
+ npx multimodel-dev-os@latest improve propose --title "Add strict mode config"
21
+
22
+ # Review all proposals
23
+ npx multimodel-dev-os@latest improve review
24
+
25
+ # Validate a proposal's safety gates (12 checks)
26
+ npx multimodel-dev-os@latest improve validate .ai/proposals/proposal-XXXX.md
27
+
28
+ # Preview changes without modifying files
29
+ npx multimodel-dev-os@latest improve diff .ai/proposals/proposal-XXXX.md
30
+
31
+ # Apply approved proposal with audit logging
32
+ npx multimodel-dev-os@latest improve apply .ai/proposals/proposal-XXXX.md --approved
33
+
34
+ # View the audit log
35
+ npx multimodel-dev-os@latest improve log
36
+ ```
37
+
38
+ ## Safety
39
+
40
+ - Feedback logging, proposal drafting, review, and diff are non-destructive
41
+ - `improve apply` requires explicit `--approved` flag
42
+ - 12 safety gates validated before any apply
43
+ - Protected paths blocked: `.git/`, `.env`, `node_modules/`, `apply-log.jsonl`
44
+ - All operations audited with SHA-256 pre/post file hashes
45
+
46
+ ## Full Demo
47
+
48
+ See the [complete walkthrough](/demos/safe-improvement-loop) for detailed explanations and expected output.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "multimodel-dev-os",
3
- "version": "2.0.1",
3
+ "version": "2.8.0",
4
4
  "bin": {
5
5
  "multimodel-dev-os": "bin/multimodel-dev-os.js"
6
6
  },
@@ -11,7 +11,7 @@ param(
11
11
  [switch]$Help
12
12
  )
13
13
 
14
- $Version = "2.0.1"
14
+ $Version = "2.8.0"
15
15
  $RepoUrl = "https://raw.githubusercontent.com/rizvee/multimodel-dev-os/main"
16
16
 
17
17
  if ($Help) {
@@ -7,7 +7,7 @@ set -euo pipefail
7
7
  # --all (install all adapters)
8
8
  # --dry-run (show what would be created without creating)
9
9
 
10
- VERSION="2.0.1"
10
+ VERSION="2.8.0"
11
11
  REPO_URL="https://raw.githubusercontent.com/rizvee/multimodel-dev-os/main"
12
12
  CAVEMAN=false
13
13
  DRY_RUN=false
package/scripts/verify.js CHANGED
@@ -231,6 +231,21 @@ checkFile('docs/v2-migration.md');
231
231
  checkFile('docs/v2-release-checklist.md');
232
232
  checkFile('docs/package-safety.md');
233
233
 
234
+ // --- v2.1.0 Intelligence Layer Documentation ---
235
+ console.log('\nIntelligence Layer Documentation:');
236
+ checkFile('docs/future-proof-architecture.md');
237
+ checkFile('docs/self-improving-codebase.md');
238
+ checkFile('docs/feedback-learning.md');
239
+ checkFile('docs/hash-compressed-memory.md');
240
+ checkFile('docs/capability-registry.md');
241
+ checkFile('docs/tool-registry.md');
242
+ checkFile('docs/improvement-proposals.md');
243
+ checkFile('docs/learning-rules.md');
244
+ checkFile('docs/approved-proposal-apply.md');
245
+ checkFile('docs/repository-command-center.md');
246
+ checkFile('docs/workflow-orchestration.md');
247
+ checkFile('docs/agent-handoff.md');
248
+
234
249
  // --- Model & Adapter Registries ---
235
250
  console.log('\nModel & Adapter Registries:');
236
251
  checkFile('.ai/models/registry.yaml');
@@ -250,6 +265,28 @@ checkFile('.ai/schema/config.schema.json');
250
265
  checkFile('.ai/schema/template.schema.json');
251
266
  checkFile('.ai/schema/adapter.schema.json');
252
267
 
268
+ // --- v2.1.0 Intelligence Layer (Schemas, Policies, Registries) ---
269
+ console.log('\nIntelligence Layer Schemas:');
270
+ checkFile('.ai/intelligence/memory.schema.json');
271
+ checkFile('.ai/intelligence/feedback.schema.json');
272
+ checkFile('.ai/intelligence/README.md');
273
+ checkFile('.ai/intelligence/feedback-log.example.jsonl');
274
+ checkFile('.ai/intelligence/learning-rules.example.md');
275
+ checkFile('.ai/intelligence/improvement-proposal.schema.json');
276
+ checkFile('.ai/intelligence/apply-log.schema.json');
277
+ checkFile('.ai/proposals/README.md');
278
+ checkFile('.ai/proposals/apply-operation.example.json');
279
+
280
+ console.log('\nIntelligence Layer Policies:');
281
+ checkFile('.ai/policies/self-improvement-policy.md');
282
+ checkFile('.ai/policies/memory-policy.md');
283
+ checkFile('.ai/policies/approval-gates.md');
284
+
285
+ console.log('\nIntelligence Layer Registries:');
286
+ checkFile('.ai/registries/capabilities.yaml');
287
+ checkFile('.ai/registries/tools.yaml');
288
+ checkFile('.ai/registries/workflows.yaml');
289
+
253
290
  // --- Test Blueprints ---
254
291
  console.log('\nTest Manuals:');
255
292
  checkFile('tests/README.md');
@@ -377,6 +414,9 @@ verifyRegistryParsed('.ai/models/routing-presets.yaml', 'presets');
377
414
  verifyRegistryParsed('.ai/models/local-models.yaml', 'local_engines');
378
415
  verifyRegistryParsed('.ai/adapters/registry.yaml', 'adapters');
379
416
  verifyRegistryParsed('.ai/templates/registry.yaml', 'templates');
417
+ verifyRegistryParsed('.ai/registries/capabilities.yaml', 'capabilities');
418
+ verifyRegistryParsed('.ai/registries/tools.yaml', 'tools');
419
+ verifyRegistryParsed('.ai/registries/workflows.yaml', 'workflows');
380
420
 
381
421
  // --- CLI & Packaging Pre-Flight Tests ---
382
422
  console.log('\nRunning CLI & Packaging Pre-Flight Tests...');
@@ -408,11 +448,70 @@ try {
408
448
  console.log(` ${GREEN}✓${NC} CLI help displays v${expectedVersion}`);
409
449
  pass++;
410
450
  }
451
+
452
+ if (helpOutput.includes('scan') && helpOutput.includes('memory') && helpOutput.includes('status') && helpOutput.includes('workflow') && helpOutput.includes('handoff')) {
453
+ console.log(` ${GREEN}✓${NC} CLI help includes scan, memory, status, workflow, and handoff commands`);
454
+ pass++;
455
+ } else {
456
+ console.error(` ${RED}✗${NC} CLI help is missing scan, memory, status, workflow, or handoff commands`);
457
+ fail++;
458
+ }
411
459
  } catch (e) {
412
460
  console.error(` ${RED}✗${NC} node bin/multimodel-dev-os.js --help failed: ${e.message}`);
413
461
  fail++;
414
462
  }
415
463
 
464
+ // Verify docs mention memory build
465
+ try {
466
+ const mdContent = readFileSync(join(projectRoot, 'docs', 'hash-compressed-memory.md'), 'utf8');
467
+ if (mdContent.includes('memory build')) {
468
+ console.log(` ${GREEN}✓${NC} docs/hash-compressed-memory.md mentions 'memory build'`);
469
+ pass++;
470
+ } else {
471
+ console.error(` ${RED}✗${NC} docs/hash-compressed-memory.md does not mention 'memory build'`);
472
+ fail++;
473
+ }
474
+ } catch (e) {
475
+ console.error(` ${RED}✗${NC} docs check failed: ${e.message}`);
476
+ fail++;
477
+ }
478
+
479
+ // Verify no generated memory or feedback logs or proposals are committed/tracked in git root/intelligence folder
480
+ try {
481
+ const checkUntracked = (relPath) => {
482
+ if (existsSync(join(projectRoot, relPath))) {
483
+ console.error(` ${RED}✗${NC} ${relPath} should not be tracked/committed!`);
484
+ fail++;
485
+ } else {
486
+ console.log(` ${GREEN}✓${NC} ${relPath} is not tracked/committed`);
487
+ pass++;
488
+ }
489
+ };
490
+ checkUntracked('.ai/intelligence/memory.hash.json');
491
+ checkUntracked('.ai/intelligence/memory.summary.md');
492
+ checkUntracked('.ai/intelligence/feedback-log.jsonl');
493
+ checkUntracked('.ai/intelligence/learning-rules.md');
494
+ checkUntracked('.ai/intelligence/handoff.md');
495
+ checkUntracked('.ai/proposals/apply-log.jsonl');
496
+
497
+ // also check if any proposal-*.md file exists directly in projectRoot/proposals (since it shouldn't be tracked)
498
+ const proposalsDir = join(projectRoot, '.ai', 'proposals');
499
+ if (existsSync(proposalsDir)) {
500
+ const files = readdirSync(proposalsDir);
501
+ const hasRuntimeProposals = files.some(f => f.startsWith('proposal-') && f !== 'proposal-template.md' && f.endsWith('.md'));
502
+ if (hasRuntimeProposals) {
503
+ console.error(` ${RED}✗${NC} Runtime proposals should not be committed/tracked!`);
504
+ fail++;
505
+ } else {
506
+ console.log(` ${GREEN}✓${NC} No runtime proposals committed`);
507
+ pass++;
508
+ }
509
+ }
510
+ } catch (e) {
511
+ console.error(` ${RED}✗${NC} Tracking verification of generated files failed: ${e.message}`);
512
+ fail++;
513
+ }
514
+
416
515
  // Verify npm pack dry-run shows current version dynamically
417
516
  try {
418
517
  const packOutput = execSync('npm pack --dry-run', { cwd: projectRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
@@ -447,12 +546,17 @@ try {
447
546
 
448
547
  // --- Package Safety & Hygiene Checks ---
449
548
  console.log('\nPackage Safety & Hygiene Checks:');
450
- if (existsSync(join(projectRoot, '.npmrc'))) {
549
+ if (existsSync(join(projectRoot, '.npmrc')) && process.env.MMDO_ALLOW_PUBLISH !== 'true') {
451
550
  console.error(` ${RED}✗ .npmrc file exists in package root (security risk)${NC}`);
452
551
  fail++;
453
552
  } else {
454
- console.log(` ${GREEN}✓${NC} No .npmrc file present in package root`);
455
- pass++;
553
+ if (existsSync(join(projectRoot, '.npmrc'))) {
554
+ console.log(` ${YELLOW}!${NC} .npmrc file present in package root (allowed via MMDO_ALLOW_PUBLISH)`);
555
+ warn++;
556
+ } else {
557
+ console.log(` ${GREEN}✓${NC} No .npmrc file present in package root`);
558
+ pass++;
559
+ }
456
560
  }
457
561
 
458
562
  const checkExamplesHygiene = (dir) => {