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
crlfif 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
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 viaacc 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.