@troylar/sightline 0.0.0-stage → 1.120.2
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.
- package/CHANGELOG.md +1882 -0
- package/CONTRIBUTING.md +67 -0
- package/LICENSE +21 -0
- package/README.md +153 -2
- package/THIRD-PARTY-NOTICES.md +121 -0
- package/bin/sightline.js +78 -0
- package/dist/sightline-app.py +406 -0
- package/dist/sightline-assistant.py +551 -0
- package/dist/sightline-jira-sync.py +2513 -0
- package/dist/sightline.html +14124 -0
- package/docs/assistant-workflow.md +472 -0
- package/docs/availability.md +54 -0
- package/docs/bundled-skills.md +46 -0
- package/docs/getting-started.md +99 -0
- package/docs/images/assistant-dark.png +0 -0
- package/docs/images/assistant-light.png +0 -0
- package/docs/images/bundled-skills-dark.png +0 -0
- package/docs/images/bundled-skills-light.png +0 -0
- package/docs/images/planning-decisions-dark.svg +46 -0
- package/docs/images/planning-decisions-light.svg +46 -0
- package/docs/images/planning-decisions-mobile-dark.svg +40 -0
- package/docs/images/planning-decisions-mobile-light.svg +40 -0
- package/docs/images/planning-story-dark.svg +32 -0
- package/docs/images/planning-story-light.svg +32 -0
- package/docs/images/planning-story-mobile-dark.svg +33 -0
- package/docs/images/planning-story-mobile-light.svg +33 -0
- package/docs/images/review-dark.png +0 -0
- package/docs/images/review-light.png +0 -0
- package/docs/images/roadmap-dark.png +0 -0
- package/docs/images/roadmap-light.png +0 -0
- package/docs/images/roadmap-map-dark.svg +53 -0
- package/docs/images/roadmap-map-light.svg +53 -0
- package/docs/images/roadmap-map-mobile-dark.svg +37 -0
- package/docs/images/roadmap-map-mobile-light.svg +37 -0
- package/docs/images/timeline-dark.png +0 -0
- package/docs/images/timeline-light.png +0 -0
- package/docs/images/today-dark.png +0 -0
- package/docs/images/today-light.png +0 -0
- package/docs/jira.md +66 -0
- package/docs/large-roadmaps.md +93 -0
- package/docs/onedrive.md +62 -0
- package/docs/performance-workspaces.md +39 -0
- package/docs/roadmap-planning-example.md +92 -0
- package/docs/roadmap.md +232 -0
- package/docs/screenshots.md +57 -0
- package/docs/skill-evaluation.md +71 -0
- package/docs/skills.md +85 -0
- package/docs/team-planning.md +66 -0
- package/docs/usability-test.md +215 -0
- package/docs/workspace-validation.md +152 -0
- package/docs/workspaces.md +105 -0
- package/examples/northstar/blank-plan.json +21 -0
- package/examples/northstar/brain-dump.txt +1 -0
- package/examples/northstar/jira/issues.json +1256 -0
- package/examples/northstar/jira/status.json +1542 -0
- package/examples/northstar/plan.json +341 -0
- package/examples/northstar/roadmap-session-amendments.json +42 -0
- package/examples/northstar/sightline-amendments.json +41 -0
- package/package.json +53 -4
- package/skills/sightline-edit-plan/SKILL.md +35 -0
- package/skills/sightline-meeting-to-plan/SKILL.md +34 -0
- package/skills/sightline-plan-roadmap/SKILL.md +34 -0
- package/skills/sightline-planning-guide/SKILL.md +29 -0
- package/skills/sightline-review-plan/SKILL.md +28 -0
- package/skills/sightline-sort-jira/SKILL.md +56 -0
- package/skills/sightline-status/SKILL.md +26 -0
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Contribute to Sightline
|
|
2
|
+
|
|
3
|
+
Start with [vision.md](vision.md), the product charter, then [AGENTS.md](AGENTS.md) and [CLAUDE.md](CLAUDE.md).
|
|
4
|
+
The app stays one self-contained HTML file, with separate plan files and optional trusted helpers.
|
|
5
|
+
|
|
6
|
+
## Build and verify
|
|
7
|
+
|
|
8
|
+
You need Node.js 18+, Python 3.10+, Bash and `timeout` on PATH. On macOS, GNU coreutils can provide the timeout command;
|
|
9
|
+
on Windows use a Bash environment with those commands available.
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm ci
|
|
13
|
+
./build.sh
|
|
14
|
+
./test/run.sh
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Edit **src/sightline.template.html**, never generated **dist/** files. Build before testing: harnesses execute
|
|
18
|
+
the built HTML. See AGENTS.md for focused checks, deterministic dates and the exact runner requirements.
|
|
19
|
+
|
|
20
|
+
## Keep contributions reviewable
|
|
21
|
+
|
|
22
|
+
State whether the change touches Jira facts, the plan, viewer preferences or values computed from both.
|
|
23
|
+
For behavior changes add regression coverage in the relevant harness, and prove a fix's check fails on the old
|
|
24
|
+
build. Keep unrelated refactors out. User-visible changes need an entry in **src/releases.json**; the build
|
|
25
|
+
generates the changelog. The npm version must match the newest release.
|
|
26
|
+
|
|
27
|
+
Every feature that lets people create, edit or delete something must be doable by external assistants too. In the
|
|
28
|
+
same change, add the matching assistant actions (stable ids, preconditions, how Sightline detects they're done, and a
|
|
29
|
+
review level), export the data in the assistant context, update the companion skill and the protocol docs, and test
|
|
30
|
+
it at each assistant level.
|
|
31
|
+
|
|
32
|
+
Use `type(scope): description` commits. Describe the problem, resulting behavior and validation in the PR.
|
|
33
|
+
Report local tests, CI, deployment and real-world validation separately.
|
|
34
|
+
|
|
35
|
+
## Every example is invented
|
|
36
|
+
|
|
37
|
+
Never commit real plans, Jira output, credentials, employer/client identifiers, private screenshots or personal
|
|
38
|
+
filesystem paths. Generate synthetic examples with `python3 tools/make-docs-demo.py`. Review the intended diff
|
|
39
|
+
and run `./tools/check-private.sh` after staging. A missing external private-terms file means that scan skipped;
|
|
40
|
+
it doesn't prove the contribution is safe.
|
|
41
|
+
|
|
42
|
+
## Maintain the visual guide
|
|
43
|
+
|
|
44
|
+
Screenshots in **docs/images/** are captured from the built app using the invented Northstar plan. Keep the light
|
|
45
|
+
and dark versions paired, show actual UI and describe any prepared proposals as examples. Never fabricate a live
|
|
46
|
+
AI reply or imply a screenshot verifies cloud sync. [Screenshot capture notes](docs/screenshots.md).
|
|
47
|
+
|
|
48
|
+
## Prepare a release
|
|
49
|
+
|
|
50
|
+
Run the build and full suite, inspect `npm pack --dry-run`, then test the real packed tarball in a disposable
|
|
51
|
+
folder. Keep npm's runtime dependencies empty. The package should contain the built HTML, CLI, six skills,
|
|
52
|
+
trusted helpers, synthetic example and documentation, with no local credentials or generated mailbox files.
|
|
53
|
+
Git tags and release assets must match the tested source commit and package version. Publication is a separate,
|
|
54
|
+
deliberate action after validation.
|
|
55
|
+
|
|
56
|
+
## Keep the first-session promise
|
|
57
|
+
|
|
58
|
+
The README starts with a working source-build path. Before advertising npm or a release asset, run the
|
|
59
|
+
[public availability checks](docs/availability.md#before-changing-the-advertised-download-route); a dry run
|
|
60
|
+
or changelog entry is not publication evidence.
|
|
61
|
+
|
|
62
|
+
Keep the [prepared brain-dump session](docs/getting-started.md) reproducible. Its notes, proposal file and
|
|
63
|
+
before/after table must agree. Validate proposals against the invented Northstar plan and inspect the rendered
|
|
64
|
+
storyboard in light/dark and narrow/wide layouts. Keep its prepared-example label visible.
|
|
65
|
+
|
|
66
|
+
Keep newer capabilities version-labeled until their matching source or artifact is public. Documentation-only
|
|
67
|
+
updates do not need an application version bump.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Troy Larson
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,154 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Sightline
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(max-width: 640px) and (prefers-color-scheme: dark)" srcset="docs/images/roadmap-map-mobile-dark.svg">
|
|
5
|
+
<source media="(max-width: 640px)" srcset="docs/images/roadmap-map-mobile-light.svg">
|
|
6
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/images/roadmap-map-dark.svg">
|
|
7
|
+
<img src="docs/images/roadmap-map-light.svg" alt="A big roadmap. A clearer way through. An illustrative planning map connects meeting notes, Jira work, and requests to workstreams, shared dependencies, and decisions about scope and capacity." width="1280">
|
|
8
|
+
</picture>
|
|
9
|
+
|
|
10
|
+
**Sightline is a shared planning workspace for teams managing a large, changing roadmap—with their own AI assistant.**
|
|
11
|
+
|
|
12
|
+
You have requests in meeting notes, work in Jira, and several teams depending on one another. Everyone knows
|
|
13
|
+
part of the plan. Sightline connects the outcomes, delivery work, people, and decisions so you can work through
|
|
14
|
+
the whole picture together. Your assistant helps organize the complexity; you decide what changes.
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<a href="docs/roadmap-planning-example.md"><b>See a planning session</b></a> /
|
|
18
|
+
<a href="docs/getting-started.md"><b>Try the example</b></a> /
|
|
19
|
+
<a href="docs/assistant-workflow.md"><b>Bring your AI</b></a>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
## 1. Get the whole roadmap into view
|
|
23
|
+
|
|
24
|
+
What are we trying to deliver? What is agreed, and what is still an idea? Start with outcomes across quarters
|
|
25
|
+
and workstreams. Keep later work recoverable without turning every rough request into a dated commitment.
|
|
26
|
+
|
|
27
|
+
<a href="https://raw.githubusercontent.com/troylar/sightline-planner/main/docs/images/roadmap-light.png" aria-label="Open full-size roadmap screenshot"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/images/roadmap-dark.png"><img src="docs/images/roadmap-light.png" alt="Actual Sightline Roadmap: customer outcomes across four quarters and workstreams, with later work counted outside the window." width="1440"></picture></a>
|
|
28
|
+
|
|
29
|
+
*Actual app, invented Northstar plan. A target quarter expresses intent; it does not prove capacity.*
|
|
30
|
+
|
|
31
|
+
## 2. Connect the roadmap to the work behind it
|
|
32
|
+
|
|
33
|
+
Move from the quarter-level discussion to initiatives, tasks, milestones, and dependencies. Keep work
|
|
34
|
+
**From Jira** alongside work **Added here**. Use saved views to focus on a team or workstream while keeping
|
|
35
|
+
hidden work findable.
|
|
36
|
+
|
|
37
|
+
<a href="https://raw.githubusercontent.com/troylar/sightline-planner/main/docs/images/timeline-light.png" aria-label="Open full-size timeline screenshot"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/images/timeline-dark.png"><img src="docs/images/timeline-light.png" alt="Actual Sightline Timeline: initiatives and tasks across workstreams, with Jira context and plan work together." width="1440"></picture></a>
|
|
38
|
+
|
|
39
|
+
*Jira owns issue facts. Sightline owns the plan around them. Arranging work here does not update Jira.*
|
|
40
|
+
|
|
41
|
+
Roadmap uses the whole plan; Timeline and Capacity retain their own views and filters.
|
|
42
|
+
[Understand views and scope](docs/workspaces.md).
|
|
43
|
+
|
|
44
|
+
## 3. Use AI to work through the complexity
|
|
45
|
+
|
|
46
|
+
Bring the messy version: requests, constraints, meeting notes, or a brain dump. Your external AI coding tool
|
|
47
|
+
reads the supplied planning context, reconciles the input against existing work, and helps you think through choices.
|
|
48
|
+
|
|
49
|
+
> Account for every request. Match it to existing work, flag a possible duplicate, retain it as an idea, or
|
|
50
|
+
> identify a decision. Suggest an arrangement around outcomes. Keep commitments separate from suggestions.
|
|
51
|
+
> Show what we need to know about capacity before deciding what fits. Do not change the plan yet.
|
|
52
|
+
|
|
53
|
+
<picture>
|
|
54
|
+
<source media="(max-width: 640px) and (prefers-color-scheme: dark)" srcset="docs/images/planning-decisions-mobile-dark.svg">
|
|
55
|
+
<source media="(max-width: 640px)" srcset="docs/images/planning-decisions-mobile-light.svg">
|
|
56
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/images/planning-decisions-dark.svg">
|
|
57
|
+
<img src="docs/images/planning-decisions-light.svg" alt="Illustrative planning exercise: ten rough notes become three decisions. Clarify overlapping launch scope; resolve a shared specialist and migration dependency; complete demand evidence when 8 scheduled points exceed 6 configured points and five issues are unestimated." width="1280">
|
|
58
|
+
</picture>
|
|
59
|
+
|
|
60
|
+
*An invented exercise, not a screenshot or captured AI response. [Follow all ten source notes through the planning session](docs/roadmap-planning-example.md).*
|
|
61
|
+
|
|
62
|
+
Compare scope, sequencing, and workload options in the conversation. Then ask for proposals for the changes
|
|
63
|
+
you choose. Sightline does not provide an automatic scenario simulator.
|
|
64
|
+
|
|
65
|
+
**Capacity needs evidence.** Known load, availability, missing estimates, and dependencies matter. An outcome
|
|
66
|
+
count alone cannot tell you what fits. Automatic export of capacity, dependencies, risks, and decisions requires
|
|
67
|
+
**1.96.0+**; public **1.94.0** has narrower roadmap context, so supply additional evidence deliberately. Even the
|
|
68
|
+
richer export covers known scheduled Jira points and configured availability, not every form of demand.
|
|
69
|
+
[Capacity reasoning](docs/large-roadmaps.md#3-ask-what-actually-constrains-delivery) · [Build availability](docs/availability.md).
|
|
70
|
+
|
|
71
|
+
## 4. Review changes before they become the plan
|
|
72
|
+
|
|
73
|
+
See before/after values. Apply, edit, or skip each proposal. Use Undo for a just-applied plan edit. Your
|
|
74
|
+
assistant's conversation and proposal file do not silently change the shared plan.
|
|
75
|
+
|
|
76
|
+
<a href="https://raw.githubusercontent.com/troylar/sightline-planner/main/docs/images/review-light.png" aria-label="Open full-size review screenshot"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/images/review-dark.png"><img src="docs/images/review-light.png" alt="Actual Sightline proposal review: two prepared wording changes, their before and after values, and Apply, Skip, and Edit controls." width="1440"></picture></a>
|
|
77
|
+
|
|
78
|
+
*Actual review of prepared Northstar wording changes. With an external coding tool, your conversation stays
|
|
79
|
+
in that tool; the nearby in-app chat controls are optional.*
|
|
80
|
+
|
|
81
|
+
[Try a prepared review yourself](docs/getting-started.md#review-two-changes): move one outcome to an earlier
|
|
82
|
+
quarter and capture another as an unscheduled idea. No AI account needed.
|
|
83
|
+
|
|
84
|
+
## 5. Keep the plan useful between meetings
|
|
85
|
+
|
|
86
|
+
Find attention items in **Today**, current work in **Sprint**, and the delivery conversation in **Status update**.
|
|
87
|
+
Use **Customer release notes** for customer wording. Return to Roadmap for the broader direction.
|
|
88
|
+
|
|
89
|
+
<a href="https://raw.githubusercontent.com/troylar/sightline-planner/main/docs/images/today-light.png" aria-label="Open full-size today screenshot"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/images/today-dark.png"><img src="docs/images/today-light.png" alt="Actual Sightline Today view: team attention and upcoming work, with Jira freshness and coverage." width="1440"></picture></a>
|
|
90
|
+
|
|
91
|
+
*The same invented plan, viewed for daily attention. Check scope and freshness before relying on the summary.*
|
|
92
|
+
|
|
93
|
+
Have your assistant prepare a review, turn meeting notes into proposed updates, or draft an explanation of what
|
|
94
|
+
changed from supplied evidence. [Run a team planning session](docs/team-planning.md) · [Explore the six planning skills](docs/skills.md).
|
|
95
|
+
|
|
96
|
+
## How it works
|
|
97
|
+
|
|
98
|
+
**One HTML app. A separate plan file. Your own AI tool.**
|
|
99
|
+
|
|
100
|
+
- Open Sightline in desktop Chrome or Edge. Your plan is JSON or YAML; share it through your team's file service.
|
|
101
|
+
- Connect a private assistant folder. Sightline writes context; your file-capable assistant writes proposals; you review them here. Your tool supplies the model connection.
|
|
102
|
+
- Optionally add the read-only Jira Data Center helper. The page reads its local outputs and never contacts Jira.
|
|
103
|
+
|
|
104
|
+
There is no planning server or account to set up. Shared files need coordinated editing and handoffs: locks are
|
|
105
|
+
advisory, author names are not verified identities, and a local save does not prove cloud delivery. Use file-service
|
|
106
|
+
permissions for access. The page makes no network requests: its font is embedded too.
|
|
107
|
+
|
|
108
|
+
[Assistant setup](docs/assistant-workflow.md) · [Jira setup](docs/jira.md) · [Sharing and recovery](docs/onedrive.md).
|
|
109
|
+
|
|
110
|
+
## Install
|
|
111
|
+
|
|
112
|
+
Sightline is one HTML file you open in Chrome or Edge, plus optional planning skills for your AI assistant and an
|
|
113
|
+
optional read-only Jira helper. It never writes to Jira. With Node.js 18 or later:
|
|
114
|
+
|
|
115
|
+
```sh
|
|
116
|
+
npx @troylar/sightline install my-sightline
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
That creates **my-sightline/** with **sightline.html**, the planning skills in **.sightline/skills/**, and an invented
|
|
120
|
+
example plan in **example/**. Open **my-sightline/sightline.html** and choose **File → Open shared plan…** to open
|
|
121
|
+
**example/plan.json**, or start your own plan. It never replaces a file that's already there; to update, install into
|
|
122
|
+
a new folder and open your plan from the new app. `npx @troylar/sightline helpers` prints the folder that holds the
|
|
123
|
+
Python helpers (the Jira sync and the assistant tools), which need Python 3.10 or later.
|
|
124
|
+
|
|
125
|
+
## Try it with an invented team plan
|
|
126
|
+
|
|
127
|
+
To build from source instead, you need Git, Node.js 18+, Python 3.10+, and Bash:
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
git clone https://github.com/troylar/sightline-planner.git sightline
|
|
131
|
+
cd sightline
|
|
132
|
+
npm ci
|
|
133
|
+
./build.sh
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Open **dist/sightline.html** in Chrome or Edge. Choose **File → Open shared plan…** and select
|
|
137
|
+
**examples/northstar/plan.json**. [Follow the first-session walkthrough](docs/getting-started.md).
|
|
138
|
+
|
|
139
|
+
Or give your coding assistant the repository link and ask:
|
|
140
|
+
|
|
141
|
+
> Clone Sightline into a new folder, read its project instructions, install its development dependencies,
|
|
142
|
+
> and build the HTML. Tell me where to open it and the Northstar example. Preserve any existing checkout.
|
|
143
|
+
|
|
144
|
+
[Check which version each install route gives you](docs/availability.md).
|
|
145
|
+
|
|
146
|
+
## Documentation
|
|
147
|
+
|
|
148
|
+
| Plan | Connect | Operate |
|
|
149
|
+
| --- | --- | --- |
|
|
150
|
+
| [Worked planning session](docs/roadmap-planning-example.md) | [Your AI assistant](docs/assistant-workflow.md) | [Team planning](docs/team-planning.md) |
|
|
151
|
+
| [Large roadmaps and capacity](docs/large-roadmaps.md) | [Jira Data Center](docs/jira.md) | [Views and scope](docs/workspaces.md) |
|
|
152
|
+
| [First session](docs/getting-started.md) | [Planning skills](docs/skills.md) | [Shared-file recovery](docs/onedrive.md) |
|
|
153
|
+
|
|
154
|
+
[Contributing](CONTRIBUTING.md) · [Release history](CHANGELOG.md) · [MIT license](LICENSE) · [Third-party notices](THIRD-PARTY-NOTICES.md).
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
The built HTML includes [js-yaml 4.1.0](https://github.com/nodeca/js-yaml),
|
|
4
|
+
Copyright (C) 2011-2015 by Vitaly Puzrin, under the MIT License:
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in
|
|
14
|
+
all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
|
+
THE SOFTWARE.
|
|
23
|
+
|
|
24
|
+
The built HTML embeds the [Instrument Sans](https://github.com/Instrument/instrument-sans) font (Latin and Latin
|
|
25
|
+
Extended), Copyright 2022 The Instrument Sans Project Authors, under the SIL Open Font License, Version 1.1:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Copyright 2022 The Instrument Sans Project Authors (https://github.com/Instrument/instrument-sans)
|
|
29
|
+
|
|
30
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
31
|
+
This license is copied below, and is also available with a FAQ at:
|
|
32
|
+
https://scripts.sil.org/OFL
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
-----------------------------------------------------------
|
|
36
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
37
|
+
-----------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
PREAMBLE
|
|
40
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
41
|
+
development of collaborative font projects, to support the font creation
|
|
42
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
43
|
+
open framework in which fonts may be shared and improved in partnership
|
|
44
|
+
with others.
|
|
45
|
+
|
|
46
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
47
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
48
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
49
|
+
redistributed and/or sold with any software provided that any reserved
|
|
50
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
51
|
+
however, cannot be released under any other type of license. The
|
|
52
|
+
requirement for fonts to remain under this license does not apply
|
|
53
|
+
to any document created using the fonts or their derivatives.
|
|
54
|
+
|
|
55
|
+
DEFINITIONS
|
|
56
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
57
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
58
|
+
include source files, build scripts and documentation.
|
|
59
|
+
|
|
60
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
61
|
+
copyright statement(s).
|
|
62
|
+
|
|
63
|
+
"Original Version" refers to the collection of Font Software components as
|
|
64
|
+
distributed by the Copyright Holder(s).
|
|
65
|
+
|
|
66
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
67
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
68
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
69
|
+
new environment.
|
|
70
|
+
|
|
71
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
72
|
+
writer or other person who contributed to the Font Software.
|
|
73
|
+
|
|
74
|
+
PERMISSION & CONDITIONS
|
|
75
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
76
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
77
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
78
|
+
Software, subject to the following conditions:
|
|
79
|
+
|
|
80
|
+
1) Neither the Font Software nor any of its individual components,
|
|
81
|
+
in Original or Modified Versions, may be sold by itself.
|
|
82
|
+
|
|
83
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
84
|
+
redistributed and/or sold with any software, provided that each copy
|
|
85
|
+
contains the above copyright notice and this license. These can be
|
|
86
|
+
included either as stand-alone text files, human-readable headers or
|
|
87
|
+
in the appropriate machine-readable metadata fields within text or
|
|
88
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
89
|
+
|
|
90
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
91
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
92
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
93
|
+
presented to the users.
|
|
94
|
+
|
|
95
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
96
|
+
Software shall not be used to promote, endorse or advertise any
|
|
97
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
98
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
99
|
+
permission.
|
|
100
|
+
|
|
101
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
102
|
+
must be distributed entirely under this license, and must not be
|
|
103
|
+
distributed under any other license. The requirement for fonts to
|
|
104
|
+
remain under this license does not apply to any document created
|
|
105
|
+
using the Font Software.
|
|
106
|
+
|
|
107
|
+
TERMINATION
|
|
108
|
+
This license becomes null and void if any of the above conditions are
|
|
109
|
+
not met.
|
|
110
|
+
|
|
111
|
+
DISCLAIMER
|
|
112
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
113
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
114
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
115
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
116
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
117
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
118
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
119
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
120
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
121
|
+
```
|
package/bin/sightline.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
// Install trusted package assets only. Existing, different files are never replaced.
|
|
4
|
+
const fs = require('node:fs');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const root = path.resolve(__dirname, '..');
|
|
7
|
+
const pkg = require('../package.json');
|
|
8
|
+
|
|
9
|
+
function filesUnder(dir, prefix = '') {
|
|
10
|
+
return fs.readdirSync(dir, {withFileTypes:true}).flatMap(entry => {
|
|
11
|
+
if (entry.isSymbolicLink()) throw new Error('Package assets cannot contain symbolic links.');
|
|
12
|
+
const rel = path.join(prefix, entry.name);
|
|
13
|
+
return entry.isDirectory() ? filesUnder(path.join(dir, entry.name), rel) : [rel];
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function checkPath(target) {
|
|
17
|
+
const full = path.resolve(target), parts = full.slice(path.parse(full).root.length).split(path.sep);
|
|
18
|
+
let at = path.parse(full).root;
|
|
19
|
+
for (const part of parts) {
|
|
20
|
+
at = path.join(at, part);
|
|
21
|
+
if (fs.existsSync(at) || (()=>{try { return fs.lstatSync(at).isSymbolicLink(); } catch { return false; }})()) {
|
|
22
|
+
if (fs.lstatSync(at).isSymbolicLink()) throw new Error('Choose a destination without symbolic links.');
|
|
23
|
+
if (at !== full && !fs.statSync(at).isDirectory()) throw new Error('A destination parent is a file. Your files were kept.');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function install(target, skillsOnly) {
|
|
28
|
+
const dest = path.resolve(target);
|
|
29
|
+
const assets = filesUnder(path.join(root, 'skills')).map(rel => ({
|
|
30
|
+
from:path.join(root, 'skills', rel), to:path.join(dest, skillsOnly ? '' : '.sightline/skills', rel)
|
|
31
|
+
}));
|
|
32
|
+
if (!skillsOnly) {
|
|
33
|
+
assets.unshift({from:path.join(root, 'dist/sightline.html'), to:path.join(dest, 'sightline.html')});
|
|
34
|
+
assets.push(...filesUnder(path.join(root, 'examples/northstar')).map(rel => ({
|
|
35
|
+
from:path.join(root, 'examples/northstar', rel), to:path.join(dest, 'example', rel)
|
|
36
|
+
})));
|
|
37
|
+
}
|
|
38
|
+
// Check the whole batch before writing, including existing links and edited skills.
|
|
39
|
+
for (const asset of assets) {
|
|
40
|
+
checkPath(asset.to);
|
|
41
|
+
if (fs.existsSync(asset.to) && (!fs.statSync(asset.to).isFile() || !fs.readFileSync(asset.to).equals(fs.readFileSync(asset.from)))) {
|
|
42
|
+
throw new Error('A destination file already differs. Your files were kept. Install into a new folder to update.');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
let written = 0;
|
|
46
|
+
for (const asset of assets) {
|
|
47
|
+
if (fs.existsSync(asset.to)) continue;
|
|
48
|
+
fs.mkdirSync(path.dirname(asset.to), {recursive:true});
|
|
49
|
+
// Exclusive creation also refuses a file that appeared after the checks above.
|
|
50
|
+
fs.writeFileSync(asset.to, fs.readFileSync(asset.from), {flag:'wx'}); written++;
|
|
51
|
+
}
|
|
52
|
+
console.log(skillsOnly ? `Skills ready in ${dest}` : `Open ${path.join(dest, 'sightline.html')} in Chrome or Edge.`);
|
|
53
|
+
console.log(`${written} files installed. Existing identical files were kept.`);
|
|
54
|
+
if (!skillsOnly) console.log('Planning skills: .sightline/skills. Try the invented plan in example/plan.json. Your own plans are kept separate.');
|
|
55
|
+
}
|
|
56
|
+
function main(args) {
|
|
57
|
+
if (!args.length || ['--help','-h','help'].includes(args[0])) {
|
|
58
|
+
console.log(`Sightline ${pkg.version} — your team's work, in plain sight.
|
|
59
|
+
|
|
60
|
+
sightline install [folder] Install the HTML app and planning skills
|
|
61
|
+
sightline skills --to <folder> Install only the planning skills
|
|
62
|
+
sightline helpers Print the trusted Python helper directory
|
|
63
|
+
sightline --version Show the package version
|
|
64
|
+
|
|
65
|
+
Install defaults to ./sightline. Existing different files are never overwritten.
|
|
66
|
+
Use a new folder for an update, then open your existing plan from the new app.
|
|
67
|
+
Docs: https://github.com/troylar/sightline-planner#readme`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (args[0] === '--version' && args.length === 1) return console.log(pkg.version);
|
|
71
|
+
if (args[0] === 'helpers' && args.length === 1) return console.log(path.join(root, 'dist')); // the helpers stamped with this app's version
|
|
72
|
+
if (args[0] === 'install' && args.length <= 2 && (!args[1] || !args[1].startsWith('-'))) return install(args[1] || 'sightline', false);
|
|
73
|
+
if (args[0] === 'skills' && args.length === 3 && args[1] === '--to' && !args[2].startsWith('-')) return install(args[2], true);
|
|
74
|
+
throw new Error('Unknown command or argument. Run sightline --help.');
|
|
75
|
+
}
|
|
76
|
+
try { main(process.argv.slice(2)); } catch (error) {
|
|
77
|
+
console.error('Sightline: ' + error.message); process.exitCode = 1;
|
|
78
|
+
}
|