Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Bug Report
description: Something is broken
labels: ["bug"]
body:
- type: textarea
id: what
attributes:
label: What's broken?
description: Describe what's not working.
placeholder: "e.g. The smoke test script fails with a permission error even after completing the challenge."
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
placeholder: |
1. Open Codespace for Adventure 01 — Beginner
2. Run `adventures/01-echoes-lost-in-orbit/beginner/smoke-test.sh`
3. See error: ...
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected behavior
description: What should happen instead?
placeholder: "e.g. The script should pass and print a success message."
validations:
required: true
- type: textarea
id: where
attributes:
label: Where?
description: Link to the relevant page, file, or adventure level.
placeholder: "e.g. https://dynatrace-oss.github.io/open-ecosystem-challenges/01-echoes-lost-in-orbit/beginner"
validations:
required: true
6 changes: 6 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
blank_issues_enabled: false
contact_links:
- name: Questions & Discussions
url: https://community.open-ecosystem.com/c/challenges
about: Ask questions and discuss challenges in the Open Ecosystem community.

32 changes: 32 additions & 0 deletions .github/ISSUE_TEMPLATE/improvement.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Improvement
description: Suggest an improvement or enhancement
labels: ["enhancement"]
body:
- type: textarea
id: what
attributes:
label: What could be improved?
description: Describe the improvement you have in mind.
placeholder: "e.g. The beginner guide for Adventure 01 doesn't explain what Kustomize overlays are, which makes the first objective confusing."
validations:
required: true
- type: textarea
id: where
attributes:
label: Where?
description: Link to the relevant page, file, or adventure level.
placeholder: "e.g. https://dynatrace-oss.github.io/open-ecosystem-challenges/01-echoes-lost-in-orbit/beginner"
validations:
required: true
- type: textarea
id: why
attributes:
label: Why would this help?
description: What problem does this solve or what value does it add?
placeholder: "e.g. Participants without a Kubernetes background get stuck here and there's no hint pointing them in the right direction."
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: Any other approaches you thought about?
placeholder: "e.g. Linking to the Kustomize docs would also work, but a short inline explanation would be less disruptive."
56 changes: 56 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
## What does this PR do?

<!-- Brief description -->

Closes #<!-- issue number, if applicable -->

## Type of PR

- [ ] 💡 Adventure Idea
- [ ] 🗺️ New Adventure Level
- [ ] 📖 Solution Walkthrough
- [ ] 🐛 Bug fix / 📝 Documentation improvement / Other

---

### 💡 Adventure Idea

<!-- Skip or delete this section if this is not an adventure idea PR -->

- [ ] Idea file is placed in `ideas/` (not `ideas/.implemented/`)

---

### 🗺️ New Adventure Level

<!-- Skip or delete this section if this is not a new adventure level PR -->
<!-- Each level ships in its own PR. Use "Part of #" above for earlier levels, "Closes #" for the final one -->

- [ ] Devcontainer tested from scratch in a new Codespace
- [ ] `verify.sh` passes when the challenge is solved
- [ ] `verify.sh` fails with helpful error messages when not solved
- [ ] Docs complete: story, objectives, hints, no spoilers
- [ ] All links in docs work
- [ ] Idea file moved to `ideas/.implemented/` (first level PR only)
- [ ] Tracking issue linked above (`Part of #` for earlier levels, `Closes #` for the last one)

---

### 📖 Solution Walkthrough

<!-- Skip or delete this section if this is not a solution walkthrough PR -->

- [ ] External link (blog post, video, etc.) — linked from the adventure's solutions page
- [ ] In-repo markdown (`adventures/XX-.../docs/solutions/level.md`)
- [ ] The challenge deadline has passed
- [ ] Walkthrough explains *why* things work, not just what to do

---

### 📝 Other

<!-- Skip or delete this section if this is not a bug fix or other change -->

- [ ] Commits are focused and minimal
- [ ] Documentation updated if needed

61 changes: 61 additions & 0 deletions .github/workflows/idea-tracking-issue.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Create Adventure Idea Tracking Issue

on:
pull_request:
types: [closed]

jobs:
create-tracking-issue:
if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'adventure idea')
runs-on: ubuntu-latest
steps:
- name: Create tracking issue
uses: actions/github-script@v8
with:
script: |
const pr = context.payload.pull_request;

const { data: files } = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number,
});

// Only proceed if a file was *added* to ideas/ (not modified or deleted)
const ideaFile = files.find(f =>
f.status === 'added' &&
f.filename.startsWith('ideas/') &&
!f.filename.startsWith('ideas/.implemented/') &&
f.filename.endsWith('.md')
);
if (!ideaFile) {
console.log('No new idea file added — skipping.');
return;
}

// Extract adventure name from PR title: "Adventure Idea: Name" -> "Name"
const titleMatch = pr.title.match(/^Adventure Idea:\s*(.+)$/i);
const adventureName = titleMatch ? titleMatch[1].trim() : pr.title;
const fileUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/${ideaFile.filename}`;

await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `Build Adventure: ${adventureName}`,
labels: ['adventure idea', 'help wanted'],
body: [
`## ${adventureName}`,
'',
'An adventure idea has been approved and is ready to be built! 🎉',
'',
`**Idea:** [\`${ideaFile.filename}\`](${fileUrl})`,
`**Approved in:** ${pr.html_url}`,
'',
'## Want to build it?',
'',
'Comment on this issue to claim it, then follow the [Building Adventures](https://dynatrace-oss.github.io/open-ecosystem-challenges/contributing/adventures/) guide.',
'',
'**Each level should be a separate PR.** Reference this issue with `Part of #<issue>` in earlier PRs and `Closes #<issue>` in the final one.',
].join('\n'),
});

82 changes: 82 additions & 0 deletions .github/workflows/walkthrough-issues.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: Create Solution Walkthrough Issues

on:
pull_request:
types: [closed]

jobs:
create-walkthrough-issues:
if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'new level')
runs-on: ubuntu-latest
steps:
- name: Create walkthrough issues
uses: actions/github-script@v8
with:
script: |
const pr = context.payload.pull_request;
const LEVELS = { beginner: '🟢', intermediate: '🟡', expert: '🔴' };
const LEVEL_ORDER = ['beginner', 'intermediate', 'expert'];

const { data: files } = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number,
});

// Only create issues for newly *added* verify.sh files (= new levels being released)
const newLevels = new Map();
for (const file of files) {
const match = file.filename.match(
/^adventures\/((?!planned)[^/]+)\/(beginner|intermediate|expert)\/verify\.sh$/
);
if (match && file.status === 'added') {
const [, adventure, level] = match;
if (!newLevels.has(adventure)) newLevels.set(adventure, new Set());
newLevels.get(adventure).add(level);
}
}

if (newLevels.size === 0) {
console.log('No new verify.sh files — skipping.');
return;
}

for (const [adventure, levels] of newLevels) {
// "03-the-ai-observatory" -> "03: The AI Observatory"
const nameMatch = adventure.match(/^(\d+)-(.+)$/);
const adventureName = nameMatch
? `${nameMatch[1]}: ${nameMatch[2].replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase())}`
: adventure;

for (const level of LEVEL_ORDER.filter(l => levels.has(l))) {
const emoji = LEVELS[level];
const levelName = level.charAt(0).toUpperCase() + level.slice(1);

await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `Solution Walkthrough: ${adventureName} — ${emoji} ${levelName}`,
labels: ['solution walkthrough'],
body: [
`## ${adventureName} — ${emoji} ${levelName}`,
'',
`Write a solution walkthrough for the **${levelName}** level of **${adventureName}**.`,
'',
'> ⚠️ **Walkthroughs are only accepted after the challenge deadline has passed.**',
'',
'## How to contribute',
'',
'Comment on this issue to claim it, then follow the [Solution Walkthroughs](https://dynatrace-oss.github.io/open-ecosystem-challenges/contributing/solution-walkthroughs/) guide.',
'',
'A walkthrough can be:',
"- **External content** — a blog post, video, or any public resource. Link to it from the adventure's solutions page.",
`- **In-repo** — a markdown file in \`adventures/${adventure}/docs/solutions/${level}.md\``,
'',
"The most useful walkthroughs explain *why* something was broken and how you'd reason your way to the solution.",
'',
`**Adventure added in:** ${pr.html_url}`,
].join('\n'),
});
}
}

2 changes: 1 addition & 1 deletion docs/contributing/adventure-ideas.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ Adventure 01 is a useful reference: Beginner introduces Argo CD ApplicationSets

1. **Create a new file** in `ideas/` named `your-adventure-name.md`
2. **Use the template** below to describe your idea
3. **Open a pull request** with the title `Adventure Idea: Your Adventure Name`
3. **[Open a pull request](https://github.com/dynatrace-oss/open-ecosystem-challenges/compare)** with the title `Adventure Idea: Your Adventure Name`

No issue required. Submit your idea directly as a PR.

Expand Down
6 changes: 4 additions & 2 deletions docs/contributing/adventures.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ An adventure consists of:

Use `00` as the adventure number during development. When your adventure is scheduled for release, maintainers will assign the final number and move it out of `planned/`.

If `adventures/planned/` doesn't exist yet, create it.

```
adventures/planned/00-adventure-name/
├── README.md # Brief intro + link to docs
Expand Down Expand Up @@ -169,7 +171,7 @@ Before submitting:

## Tips

- **Open a draft PR early.** Get feedback on structure before completing everything.
- **Start with one level.** Get it working before building all three.
- **[Open a draft PR early.](https://github.com/dynatrace-oss/open-ecosystem-challenges/compare)** Get feedback on structure before completing everything.
- **Ship one level at a time.** Each level gets its own PR — start with one, get it working, then build the next. Use `Part of #<tracking-issue>` on all but the last PR, and `Closes #<tracking-issue>` on the final one so the tracking issue closes automatically.
- **Test on slow connections.** Codespace startup time matters.
- **Write clear error messages.** Help participants understand what went wrong without giving away the solution.
2 changes: 1 addition & 1 deletion docs/contributing/solution-walkthroughs.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Solution walkthroughs help participants who get stuck and serve as learning reso

## How to Contribute

Browse [walkthrough issues](https://github.com/dynatrace-oss/open-ecosystem-challenges/issues?q=is%3Aissue+is%3Aopen+label%3A%22solution+walkthrough%22), comment to claim a level, and submit your walkthrough as a PR. Walkthroughs can take any form:
Browse [walkthrough issues](https://github.com/dynatrace-oss/open-ecosystem-challenges/issues?q=is%3Aissue+is%3Aopen+label%3A%22solution+walkthrough%22), comment to claim a level, and [submit your walkthrough as a PR](https://github.com/dynatrace-oss/open-ecosystem-challenges/compare). Walkthroughs can take any form:

- **External content** — a blog post, video, or any public resource. Just link to it from the adventure's solutions page.
- **In-repo** — a markdown file in `adventures/XX-adventure-name/docs/solutions/`.
Expand Down