Recap of the DevOps section, assembled into one project. Copy this structure to start a formatted, linted, version-controlled and tested Adobe Campaign codebase. Every file below links to the article that explains it in depth.

Project structure

β”œβ”€β”€ .github/workflows/
β”‚   └── ci.yml       # CI/CD jobs to check code format & quality
β”œβ”€β”€ src/             # Adobe Campaign metadata (schemas, deliveries, templates...)
β”‚   └── Administration, Campaign Management, Resources...
β”œβ”€β”€ test/
β”‚   β”œβ”€β”€ unit/        # local unit tests for Adobe Campaign JS (NodeJS)
β”‚   └── integration/ # integration tests for Adobe Campaign JS (on the instance)
β”œβ”€β”€ scripts/         # recurring procedures (mass read/update, exports)
β”œβ”€β”€ .gitignore       # ignore node & windows default files
β”œβ”€β”€ .gitattributes   # enforce line endings (LF)
β”œβ”€β”€ acc.config.json  # project configuration (schemas, default alias)
β”œβ”€β”€ AGENTS.md        # AI assistance (brand & project context)
β”œβ”€β”€ eslint.config.js # lint rules (ES5 + Adobe Campaign globals)
β”œβ”€β”€ package.json     # local tooling (prettier, eslint, jest)
└── prettier.config.mjs # format: tabs, spaces, brackets

Files

.gitignore

Generate it from https://www.toptal.com/developers/gitignore/api/node,windows

Use it to ignore folders node_modules, out… See Version control with git.

.gitattributes

# Normalize line endings to LF on commit
* text=auto eol=lf
*.js   text eol=lf
*.json text eol=lf
*.xml  text eol=lf
*.html text eol=lf
*.css  text eol=lf
*.sql  text eol=lf

Use it to enforce line endings so diffs stay clean across Windows/macOS. See Version control with git. Use crlf if the Adobe Campaign instance is hosted on Windows

prettier.config.mjs

Use it to format the code style: spaces, tabs… See Format with prettier.

eslint.config.js

Use it to catch errors and enforce ES5 rules against the Adobe Campaign globals. See Lint with eslint.

package.json

{
  "scripts": {
    "format": "prettier --write .",
    "format:check": "prettier --check .",
    "lint": "eslint --fix .",
    "lint:check": "eslint ."
  },
  "devDependencies": {
    "@prettier/plugin-xml": "^3",
    "eslint": "^8",
    "prettier": "^3"
  }
}

Use it to install & run local tools (prettier, eslint, jest). See Unit tests with jest and Code coverage.

acc.config.json

See full reference article.

Use it to map the instance metadata to local folders. See also Customize your project configuration.

AGENTS.md

# Project context for AI agents

- Stack: Adobe Campaign Classic, server-side JavaScript (ES5 / SpiderMonkey 1.8.5).
- Source lives in `src/`, mirrored from the instance with `acc`.
- Never use ES6 syntax (no `let`, `const`, arrow functions, template literals).
- Brand voice: concise and friendly; no emojis in transactional emails.

Use it to give AI agents (Claude, Cursor, Copilot) the brand and project context they need. See Boost efficiency with acc CLI and AI.

Folders

src/

The local mirror of your instance metadata, pulled with acc and decomposed into individual source files (.js, .html, .sql…) instead of one big XML.

See Decompose metadata into source files and Customize your project configuration.

test/

  • unit/ pure functions tested locally with jest, no instance needed.
  • integration/ checks that run in a live instance (usually via acc instance exec).

See Unit tests with jest and Code coverage. On-instance testing is on the roadmap.

scripts/

Recurring procedures you run from the command line: bulk exports, mass reads and updates across many deliveries.

See Read deliveries at scale and Update deliveries at scale.

What’s next

Today acc pulls your instance into this structure. Watching for hot reload with acc instance watch is available in early access (test it in a sandbox first), while a full push is on the roadmap.