Skip to content
This repository was archived by the owner on May 7, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
eba3f63
Add initial content to branch test
moonshadow2 Feb 5, 2026
44f9701
cleaning files
IanRohrbacher Feb 6, 2026
cdb3164
cleaning files
IanRohrbacher Feb 6, 2026
006be1f
Add Rocky SvelteKit project
moonshadow2 Feb 6, 2026
11e6cc1
Edited README setup steps and Added dev port option
IanRohrbacher Feb 10, 2026
38eadae
Add initial content to branch test
moonshadow2 Feb 5, 2026
349caa1
cleaning files
IanRohrbacher Feb 6, 2026
4410a8f
Add Rocky SvelteKit project
moonshadow2 Feb 6, 2026
35b5026
Edited README setup steps and Added dev port option
IanRohrbacher Feb 10, 2026
a69c8dc
Api key generation demo
ISmaglinski Feb 18, 2026
dbeb41b
Moved to folder
ISmaglinski Feb 18, 2026
3376fe0
Moved to api-key-gen folder
ISmaglinski Feb 18, 2026
17900e9
Moved to api-key-gen folder
ISmaglinski Feb 18, 2026
0f37caf
Moved to api-key-gen folder
ISmaglinski Feb 18, 2026
47f9997
Moved to api-key-gen folder
ISmaglinski Feb 18, 2026
a911b5e
Create README.md for API key generation demo
ISmaglinski Feb 18, 2026
33b79f2
Login page added layout removed
chrisvuletich Feb 18, 2026
e0a534f
login
chrisvuletich Feb 19, 2026
91fec8c
Removed layout.svelte
chrisvuletich Feb 19, 2026
cb32930
Changed to offical kent colors
chrisvuletich Feb 19, 2026
7f4f6d7
removed everything
IanRohrbacher Feb 19, 2026
5b94bcb
this shouldnt be here rn
IanRohrbacher Feb 19, 2026
ed055aa
Add files via upload
zeigenbrod Feb 19, 2026
bde3712
Add files via upload
zeigenbrod Feb 19, 2026
e29e264
moved files into a folder
IanRohrbacher Feb 19, 2026
b038988
Added styles folder
chrisvuletich Feb 22, 2026
3b15745
Added initial route folder structure
chrisvuletich Feb 22, 2026
59fa5e6
Restructured with component based views
chrisvuletich Feb 22, 2026
bd11b09
update readme and add gitignore
IanRohrbacher Feb 23, 2026
e76c36b
Merge branch 'interface' into demo
IanRohrbacher Feb 23, 2026
df5fe8d
fixing the sveltekit folder
IanRohrbacher Feb 23, 2026
87bb351
Merge branch 'burndown-chart' into demo
IanRohrbacher Feb 24, 2026
2908a97
compiling branches
IanRohrbacher Feb 24, 2026
8a8d476
Merge branch 'demo' into development
IanRohrbacher Feb 24, 2026
434c59d
removed old folder
IanRohrbacher Feb 24, 2026
af8cb7b
fixing folder name
IanRohrbacher Feb 24, 2026
23dfa28
creating base folder
IanRohrbacher Feb 24, 2026
1302c3e
Merge branch 'mongita' into development
IanRohrbacher Feb 24, 2026
359cc16
created simple flask server
IanRohrbacher Feb 24, 2026
1dd9e3c
Merge branch 'flask-backend' into development
IanRohrbacher Feb 24, 2026
4108054
Update .gitignore
IanRohrbacher Feb 24, 2026
9c74459
frontend topbar, sidebar
chrisvuletich Feb 25, 2026
f9450af
Update README.md
zeigenbrod Feb 25, 2026
a136835
grave markers in markdown
IanRohrbacher Feb 25, 2026
21a1983
Update main.py | Setting up Monita
zeigenbrod Feb 24, 2026
5b26dc7
remove temp function
IanRohrbacher Feb 25, 2026
d364da1
Add files via upload
zeigenbrod Feb 25, 2026
1c99336
Fixed login and no scroll
IanRohrbacher Feb 25, 2026
2c99918
frontend finalize layout, sidebar, topbar, frame store nav
chrisvuletich Feb 26, 2026
a76f02d
Merge dev into chris/frontend
chrisvuletich Feb 26, 2026
3d76972
Fixed PR: | added h1 for visuals
chrisvuletich Mar 2, 2026
4a9a72d
Added new logo to topbar
chrisvuletich Mar 2, 2026
6471117
Set Up Mongita DB Scheme
d-gurbano Mar 2, 2026
ae997d8
Centralize frames and unify app layout
IanRohrbacher Mar 3, 2026
470a8e6
Merge pull request #105 from Spring-2026-Software-Engineering/chris/f…
IanRohrbacher Mar 3, 2026
057a199
removed mongita folder
IanRohrbacher Mar 3, 2026
7a05b58
Update +layout.svelte
IanRohrbacher Mar 3, 2026
2bea06c
Updated README
d-gurbano Mar 3, 2026
b9e8474
edited readme
d-gurbano Mar 4, 2026
88fcea9
Set Up Mongita DB Scheme
d-gurbano Mar 2, 2026
5d2f4de
Updated README
d-gurbano Mar 3, 2026
63f7077
edited readme
d-gurbano Mar 4, 2026
053f80d
edited gitignore
d-gurbano Mar 4, 2026
1955197
Added test page with working DB tests, and modified Mongita w/ flask(…
Mar 9, 2026
70acad7
Updated README
d-gurbano Mar 17, 2026
2637bcc
Add tests using in-memory Mongita DB
d-gurbano Mar 17, 2026
079c31a
Update test_db.py
d-gurbano Mar 17, 2026
ec87c1f
Update AnalyticsView.svelte
simran0821 Mar 18, 2026
c05e659
Added dashboard card components and a view to switch between card and…
moonshadow2 Mar 16, 2026
582161c
Added right side widget panel and reusable widget cards
chrisvuletich Mar 16, 2026
27bc17f
Merge branch 'development' into mod-database
IanRohrbacher Mar 18, 2026
b4f57a8
Merge pull request #117 from Spring-2026-Software-Engineering/mod-dat…
IanRohrbacher Mar 18, 2026
fa776c6
Reorganize components and extract styles
IanRohrbacher Mar 18, 2026
f22ea2a
Merge branch 'simran0821-patch-1' into development
IanRohrbacher Mar 18, 2026
1f419e4
Add and Fixed analytics from #121
IanRohrbacher Mar 19, 2026
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
2 changes: 2 additions & 0 deletions api-key-gen/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules
db.json
6 changes: 6 additions & 0 deletions api-key-gen/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Api key generation demo
Makes a key under sk_kent_(key) then stores its hash into a db.json file. I also added a 12 hour timeout to the keys which can be changed but after 12 hours the key dies.
To test this start with
1. ```npm install``` in terminal
2. ```npx ts-node api-key-thing.ts generate``` to generate the key and store the hash in a db.json file
3. finally copy the given key and use ```npx ts-node api-key-thing.ts validate sk_kent_(your_key_here)``` gives you a access granted if it worked or access denied just for now and gives you your id and time created/expires.
53 changes: 53 additions & 0 deletions burndown/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Make Milestone and Overall Burndown Chart

### Get to repository in your CLI

Make sure you are logged in to your github account on the CLI, and make sure the repository is
cloned on your device.

Use ```cd Rocky``` to go to the repo on your device. If the repo is kept within other folders,
you will need to add the full path.

## Milestone Chart

1. Go into milestone_burndown.py and change the date bounds for the chart to match the sprint dates.

2. Paste this code in to the CLI, changing the name to match the milestone name:

```
(
echo "closedAt,createdAt,number,state,title"
gh issue list --state all --limit 1000 \
--milestone "Sprint 3 | Setting up demo" \
--json closedAt,createdAt,number,state,title \
--jq '.[] | [.closedAt, .createdAt, .number, .state, .title] | @csv'
) > milestone_issues.csv
```


3. Run milestoneBurndown.py in your CLI like this:

```
Python3 milestoneBurndown.py
```

## Overall Chart

1. paste this code in to the CLI:

```
(
echo "closedAt,createdAt,number,state,title"
gh issue list --state all --limit 1000 \
--json closedAt,createdAt,number,state,title \
--jq '.[] | [.closedAt, .createdAt, .number, .state, .title] | @csv'
) > issues.csv
```


2. Run it in your CLI like this:

```
python3 burndown.py
```

73 changes: 73 additions & 0 deletions burndown/burndown.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path
import sys


CSV_FILE = "issues.csv"
CREATED_COLUMN = "createdAt"
CLOSED_COLUMN = "closedAt"

PROJECT_START = pd.Timestamp("2026-02-11")
PROJECT_END = pd.Timestamp("2026-04-20")


# load CSV
file_path = Path(CSV_FILE)
if not file_path.is_file():
print(f"Error: File '{CSV_FILE}' not found.")
sys.exit(1)

df = pd.read_csv(CSV_FILE, encoding='utf-8-sig', quotechar='"')
df.columns = df.columns.str.strip()
print("Columns found:", df.columns.tolist())

# Convert dates
def parse_datetime(series):
series = pd.to_datetime(series, errors='coerce', utc=True)
return series.dt.tz_convert(None)

df[CREATED_COLUMN] = parse_datetime(df[CREATED_COLUMN])
df[CLOSED_COLUMN] = parse_datetime(df[CLOSED_COLUMN])

# Date ranges
today = pd.Timestamp.today().normalize()

all_dates = pd.date_range(PROJECT_START, PROJECT_END) # for axis + ideal
actual_dates = pd.date_range(PROJECT_START, min(today, PROJECT_END)) # blue only

total_issues = df.shape[0]


# Actual burndown (blue)
remaining = []
for date in actual_dates:
open_issues = df[
df[CLOSED_COLUMN].isna() | (df[CLOSED_COLUMN] > date)
].shape[0]
remaining.append(open_issues)


# Ideal burndown (red)
ideal_line = [
total_issues - (total_issues * i / (len(all_dates) - 1))
for i in range(len(all_dates))
]

# Plot
plt.figure(figsize=(12,6))

plt.plot(actual_dates, remaining, marker='o', label='Actual') # stops at today
plt.plot(all_dates, ideal_line, linestyle='--', color='red', label='Ideal') # full range

plt.title("Delta Burndown Chart")
plt.xlabel("Date")
plt.ylabel("Remaining Issues")
plt.grid(True)
plt.xticks(rotation=45)
plt.ylim(0, total_issues + 1)
plt.xlim(PROJECT_START, PROJECT_END)

plt.legend()
plt.tight_layout()
plt.show()
6 changes: 6 additions & 0 deletions burndown/commandToGetCSV.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
(
echo "closedAt,createdAt,number,state,title"
gh issue list --state all --limit 1000 \
--json closedAt,createdAt,number,state,title \
--jq '.[] | [.closedAt, .createdAt, .number, .state, .title] | @csv'
) > issues.csv
74 changes: 74 additions & 0 deletions burndown/milestone_burndown.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path
import sys


CSV_FILE = "milestone_issues.csv"
CREATED_COLUMN = "createdAt"
CLOSED_COLUMN = "closedAt"

PROJECT_START = pd.Timestamp("2026-02-18")
PROJECT_END = pd.Timestamp("2026-02-25")


# load CSV
file_path = Path(CSV_FILE)
if not file_path.is_file():
print(f"Error: File '{CSV_FILE}' not found.")
sys.exit(1)

df = pd.read_csv(CSV_FILE, encoding='utf-8-sig', quotechar='"')
df.columns = df.columns.str.strip()
print("Columns found:", df.columns.tolist())

# Convert dates
def parse_datetime(series):
series = pd.to_datetime(series, errors='coerce', utc=True)
return series.dt.tz_convert(None)

df[CREATED_COLUMN] = parse_datetime(df[CREATED_COLUMN])
df[CLOSED_COLUMN] = parse_datetime(df[CLOSED_COLUMN])

# Date ranges
today = pd.Timestamp.today().normalize()

all_dates = pd.date_range(PROJECT_START, PROJECT_END) # for axis + ideal
actual_dates = pd.date_range(PROJECT_START, min(today, PROJECT_END)) # blue only

total_issues = df.shape[0]


# Actual burndown (blue)
remaining = []
for date in actual_dates:
open_issues = df[
df[CLOSED_COLUMN].isna() | (df[CLOSED_COLUMN] > date)
].shape[0]
remaining.append(open_issues)


# Ideal burndown (red)
ideal_line = [
total_issues - (total_issues * i / (len(all_dates) - 1))
for i in range(len(all_dates))
]

# Plot
plt.figure(figsize=(12,6))

plt.plot(actual_dates, remaining, marker='o', label='Actual') # stops at today
plt.plot(all_dates, ideal_line, linestyle='--', color='red', label='Ideal') # full range

plt.title("Delta Sprint 03 Burndown Chart")
plt.xlabel("Date")
plt.ylabel("Remaining Issues")
plt.grid(True)
plt.xticks(rotation=45)
plt.ylim(0, total_issues + 1)
plt.xlim(PROJECT_START, PROJECT_END)

plt.legend()
plt.tight_layout()
plt.show()

6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions rocky-backend/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Created by venv; see https://docs.python.org/3/library/venv.html
*
!test_db.py
Comment on lines +2 to +3

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

* here will hide nearly the entire backend from source control.

Ignoring everything and only unignoring test_db.py will cause new backend code/docs/config to be skipped unless manually force-added. That’s a high-risk default for maintainability and CI reliability.

Suggested safer `.gitignore` shape
-*
-!test_db.py
-__pycache__
-../mongita
+__pycache__/
+*.py[cod]
+.pytest_cache/
+.mypy_cache/
+.venv/
+venv/
+mongita/
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@rocky-backend/.gitignore` around lines 2 - 3, The .gitignore currently uses a
global ignore pattern "*" with an exception for "!test_db.py", which hides the
entire repository from source control; remove or replace the broad "*" entry and
instead list specific ignore patterns (e.g., build/, *.pyc, .env, node_modules,
dist/, etc.) so that source folders and config are tracked, and remove the
inverted-exception "!test_db.py" (or convert to explicit allow rules) so only
intended files are ignored; locate the lines containing the "*" and
"!test_db.py" tokens and replace them with a conservative set of ignores that do
not exclude the backend code, docs, or config.

__pycache__
../mongita
83 changes: 83 additions & 0 deletions rocky-backend/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Create and run Virtual environment

```cmd
REM Create
cd .\rocky-backend
py -3 -m venv .venv
REM Activate
.venv\Scripts\activate
```

> If activation is blocked, run this first in PowerShell:
> `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser`

# Install Dependencies

```cmd
pip install -r requirements.txt
```

# Running Flask

```cmd
python main.py flask --app main run --debug

OR

python main.py

```

# Adding a New Collection

To add a new collection (e.g. `assignments`), open `main.py` and follow these steps:

### 1. Register the collection (after the existing ones)
```python
assignments = db["assignments"]
```

### 2. Add routes

```python
@app.route("/assignments", methods=["POST"])
def create_assignment():
data = request.json
data["created_at"] = datetime.now(timezone.utc).isoformat()
assignments.insert_one(data)
return jsonify({"message": "Assignment created"})

@app.route("/assignments", methods=["GET"])
def get_assignments():
result = list(assignments.find())
for a in result:
a["_id"] = str(a["_id"])
return jsonify(result)

@app.route("/assignments/<assignment_id>", methods=["GET"])
def get_assignment(assignment_id):
assignment = assignments.find_one({"_id": ObjectId(assignment_id)})
if not assignment:
return jsonify({"error": "Assignment not found"}), 404
assignment["_id"] = str(assignment["_id"])
return jsonify(assignment)

@app.route("/assignments/<assignment_id>", methods=["PUT"])
def update_assignment(assignment_id):
data = request.json
assignments.update_one({"_id": ObjectId(assignment_id)}, {"$set": data})
return jsonify({"message": "Assignment updated"})

@app.route("/assignments/<assignment_id>", methods=["DELETE"])
def delete_assignment(assignment_id):
assignments.delete_one({"_id": ObjectId(assignment_id)})
return jsonify({"message": "Assignment deleted"})
```

### 3. Test with Postman / Thunder Client
- **POST** `http://127.0.0.1:5000/assignments` with `Content-Type: application/json` and a JSON body
- **GET** `http://127.0.0.1:5000/assignments` to retrieve all
- **DELETE** `http://127.0.0.1:5000/assignments/<id>` to remove one

> Data is stored on disk in `mongita/rocky_db/<collection_name>/` — stopping Flask does not erase data.

Loading
Loading